# index.md # Weblate Documentation #### NOTE Weblate’s documentation is available in various languages and versions. Expand the “Read the Docs” panel at the bottom of the sidebar to see the list. Welcome to the official documentation of [Weblate](https://weblate.org), the libre software web-based continuous localization system. The table of contents in the sidebar should let you easily access the documentation for your topic of interest. You can also use the search function in the top-left corner. ## First time here? Read the [Weblate basics](https://docs.weblate.org/en/latest/user/basic.md) to get an overview of what Weblate does. ## Joining a translation project If you would like to contribute to a project as a translator, read about [Translating using Weblate](https://docs.weblate.org/en/latest/user/translating.md). ## Starting a translation project For starting your own project on our cloud service Hosted Weblate, refer to [Translation projects](https://docs.weblate.org/en/latest/admin/projects.md). For self-hosting your own Weblate clone, read our [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md). ## FAQ Check our [Frequently Asked Questions](https://docs.weblate.org/en/latest/faq.md). ## Community Learn more about [Contributing to Weblate](https://docs.weblate.org/en/latest/contributing/index.md#contributing). # admin/access.md # Access control Weblate comes with a fine-grained privilege system to assign user permissions for the whole instance with predefined roles, or by assigning one or more groups of permissions to users for everything, or individual projects, components, glossaries, and so on. ## Project access control #### NOTE Projects running the gratis Libre plan on Hosted Weblate are always Public. You can switch to the paid plan if you want to restrict access to your project. Limit user access to individual projects by selecting a different [Access control](https://docs.weblate.org/en/latest/admin/projects.md#project-access-control) setting. The available options are: Public : Visible to everybody.
Any authenticated user can contribute.
VCS repository might be exposed to everybody.
**Choose this for open-source projects, or when your Weblate instance is private or locked-down.** Protected : Visible to everybody.
Only chosen users can contribute.
Only chosen users can access VCS repository.
**Choose this to gain visibility, but still have control over who can contribute.** Private : Visible only to chosen users.
Only chosen users can contribute.
Only chosen users can access VCS repository.
**Choose this for projects that should not be exposed publicly at all.** Custom : Visible only to chosen users.
Only chosen users can contribute.
Only chosen users can access VCS repository.
Not available on Hosted Weblate.
You will have to set up all the permissions using [Site-wide access control](https://docs.weblate.org/en/latest/admin/access.md#custom-acl).
**Choose this on your own Weblate instance if you want to define access in a specific, finely customizable way.** Access control can be changed in the Access tab of the configuration (Operations ↓ Settings) of each respective project. ![image](screenshots/project-access.webp) The default can also be changed by setting [`DEFAULT_ACCESS_CONTROL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ACCESS_CONTROL). Private and Custom projects can make their [Public sharing](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing) engage pages and status widgets anonymously accessible without making the rest of the project public. Public sharing is disabled by default for these projects. #### NOTE Aggregate statistics include Private projects and [restricted components](https://docs.weblate.org/en/latest/admin/projects.md#component-restricted), including in site-wide, language, and workspace summaries. Object listings, names, and actions in the web interface and API remain permission-filtered, so these aggregates do not grant access to the underlying projects or components. #### NOTE Generic incoming [notification hooks](https://docs.weblate.org/en/latest/api.md#hooks) are an explicit compatibility exception to identifier confidentiality. When supplied with a matching repository URL, their diagnostic response includes match counts and, when an update is scheduled, the project/component slug and API URL. This also applies to Private projects and restricted components, except components managed through an authenticated integration. The API URL does not bypass access control, and no project content or credentials are included. See [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching). #### NOTE Instance administrators can modify the default permission sets available to users in Public, Protected, and Private projects by using [custom settings](https://docs.weblate.org/en/latest/admin/access.md#custom-acl). #### SEE ALSO [Access control](https://docs.weblate.org/en/latest/admin/projects.md#project-access-control) ## Workspace access control Workspace-scoped teams are documented in [Workspace access control](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-acl). ## Managing per-project access control For Public, Protected and Private projects: Granting users Manage project access (see [List of privileges](https://docs.weblate.org/en/latest/admin/access.md#privileges)) allows them to assign other users in Public, Protected and Private (but not Custom) projects via adding them to teams. These are the default teams provided with Weblate; teams can be added or modified by users with sufficient privileges: Administration : All available permissions for the project. Review : Approve translations in a review.
Available only if [review workflow](https://docs.weblate.org/en/latest/workflows.md#reviews) is on. For Protected and Private projects only: Translate : Translate the project and upload translations made offline. Sources : Edit source strings (if allowed in the [project settings](https://docs.weblate.org/en/latest/admin/projects.md#component-manage-units)) and source-string info. Languages : Manage translated languages (add or remove translations). Glossary : Manage glossary (add, remove, and upload entries). Memory : Manage translation memory. Screenshots : Manage screenshots (add, remove, and associate them to source strings). Automatic translation : Can use automatic translation. VCS : Manage VCS and access the exported repository. Billing : Access billing info and settings (see [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing)). ![image](screenshots/manage-users.webp) These features are available on the Access control page in the project’s menu Operations ↓ Users. #### HINT You can limit teams to languages or components, and assign them designated access roles (see [List of privileges](https://docs.weblate.org/en/latest/admin/access.md#privileges)). ### Team administrators #### Versionadded Added in version 4.15. Each team can have team administrators, who can add and remove users within the team. This is useful in case you want to build self-governed teams. ### Inviting new users Adding existing users will send them invitation to confirm. With [`REGISTRATION_OPEN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_OPEN) the administrator can also invite new users using e-mail. Invited users have to complete the registration process to get access to the project. It is not required to have any site-wide privileges in order to do so, access management permission on the project’s scope (e.g. a membership in the Administration team) would be sufficient. #### HINT If the invited user missed the validity of the invitation, a new invitation has to be created. The same kind of invitations are available site-wide from the [management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface) on the Users tab. Both project administrators and site administrators can also invite multiple users at once by pasting whitespace-separated e-mail addresses. All invitations created in one bulk action use the selected team, and site-wide bulk invites also apply the selected superuser flag. Site-wide user management is controlled by the global `user.edit` permission. Unlike project access management, this is a trusted administrative permission which allows editing user accounts across the whole instance. It includes adding or removing the managed account from any site-wide, workspace, or project team, and granting or revoking superuser status, even for the caller’s own account. These actions do not require the Manage teams permission or separate authority over the affected team. Treat `user.edit` as effectively equivalent to superuser access, not as a limited helpdesk permission. To delegate access management within a narrower scope, use a project Administration team or a [team administrator](https://docs.weblate.org/en/latest/admin/access.md#team-admins) instead. Site administrators can also disable password authentication for a user. The Regenerate API key option is enabled by default so that the current personal API key stops working. Clear it only when the current API key should remain active. Bulk invitations are processed individually. Invalid addresses and addresses with an already pending invitation are skipped while valid invitations are still created and sent. #### Versionchanged Changed in version 5.0: Weblate now does not automatically create accounts or add users to the teams. This is only done after confirmation from the user. ### Blocking users #### Versionadded Added in version 4.7. If users misbehave in your project, you can block them from contributing. With the relevant permissions blocked, users can still see the project, but won’t be able to contribute. ### Cleaning up user contributions When blocking spam or abusive accounts, project administrators can also clean up the user’s existing contributions in that project. Use Operations ↓ Users, block the user, and select the cleanup actions in the block form. For users who are already blocked, use Clean up user contributions in the blocked users list. The available cleanup actions are: * Revert user edits reverts the latest editable translations by the user. * Reject user suggestions rejects pending suggestions by the user. * Delete user comments deletes comments by the user. Site administrators with the site-wide `user.edit` permission can perform the same bulk cleanup across all projects from the [management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface) on the Users tab. Open the user’s profile, select the Edit tab, and use Contribution cleanup. ### Per-project permission management You can set your projects to Protected or Private (see [Project access control](https://docs.weblate.org/en/latest/admin/access.md#acl)), and [manage users access](https://docs.weblate.org/en/latest/admin/access.md#manage-acl) per-project. By default this prevents Weblate from granting access provided by Users and Viewers [default teams](https://docs.weblate.org/en/latest/admin/access.md#default-teams) due to these teams’ own configuration. This doesn’t prevent you from granting permissions to those projects site-wide by altering default teams, creating a new one, or creating additional custom settings for individual component as described in [Site-wide access control](https://docs.weblate.org/en/latest/admin/access.md#custom-acl) below. One of the main benefits of managing permissions through the Weblate user interface is that you can delegate it to other users without giving them the superuser privilege. In order to do so, add them to the Administration team of the project. This project-scoped delegation is separate from the site-wide `user.edit` permission. Membership in a project Administration team allows managing access only for that project, while `user.edit` grants site-wide user management in the Weblate UI and API and should be assigned only to fully trusted site administrators. ### Per-project access tokens #### Versionadded Added in version 4.10. You can define project-scoped access tokens in API access tab. The API tokens can have expiry date set, and their permissions can be customized by team memberships same as with users. #### SEE ALSO * [Authentication tokens](https://docs.weblate.org/en/latest/api.md#api-tokens) * [Expiration of user accounts](https://docs.weblate.org/en/latest/admin/access.md#expiring-accounts) ## Site-wide access control #### NOTE This feature is unavailable on Hosted Weblate. The permission system is based on roles defining a set of permissions, and teams linking roles to users and translations, read [Users, roles, teams, and permissions](https://docs.weblate.org/en/latest/admin/access.md#auth-model) for more details. The most powerful features of the Weblate’s access control system can be configured in the [Management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface). You can use it to manage permissions of any project. You don’t necessarily have to switch it to Custom [access control](https://docs.weblate.org/en/latest/admin/access.md#acl) to utilize it. However you must have superuser privileges in order to use it. If you are not interested in details of implementation, and just want to create a simple-enough configuration based on the defaults, or don’t have a site-wide access to the whole Weblate installation (like on [Hosted Weblate](https://hosted.weblate.org/)), please refer to the [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl) section. ### Site-wide permission management To manage permissions for a whole instance at once, add users to appropriate [default teams](https://docs.weblate.org/en/latest/admin/access.md#default-teams): * Users (this is done by default by the [automatic team assignment](https://docs.weblate.org/en/latest/admin/access.md#autoteam)). * Reviewers (if you are using [review workflow](https://docs.weblate.org/en/latest/workflows.md#reviews) with dedicated reviewers). * Managers (if you want to delegate most of the management operations to somebody else). You should keep all projects configured as Public (see [Project access control](https://docs.weblate.org/en/latest/admin/access.md#acl)), otherwise the site-wide permissions provided by membership in the Users and Reviewers teams won’t have any effect. You may also grant some additional permissions of your choice to the default teams. For example, you may want to give a permission to manage screenshots to all the Users. You can define some new custom teams as well. If you want to keep managing your permissions site-wide for these teams, choose an appropriate value for the Project selection (e.g. All projects or All public projects). ### Custom permissions for languages, components or projects You can create your own dedicated teams to manage permissions for distinct objects such as languages, components, and projects. Although these teams can only grant additional privileges, you can’t revoke any permission granted by site-wide or per-project teams by adding another custom team. **Example:** > Restricting translation to Czech to a selected set of translators, > (while keeping translations to other languages public): > 1. Remove the permission to translate Czech from all users. In the > default configuration this can be done by altering the Users > [default team](https://docs.weblate.org/en/latest/admin/access.md#default-teams). Built-in teams reject this change in > the team management UI, use the > [Django admin interface](https://docs.weblate.org/en/latest/admin/admin.md#admin-interface) instead. > #### Group Users > | All languages | Turned off | > |-----------------|---------------| > | Languages | All but Czech | > 2. Add a dedicated team for Czech translators. > #### Group Czech translators > | Roles | Power users | > |-------------------|---------------------| > | Project selection | All public projects | > | All languages | Turned off | > | Languages | Czech | > 3. Add users you wish to give the permissions to into this team. Management permissions this way is powerful, but can be quite a tedious job. You can only delegate it to other users by granting them Superuser status. ## Users, roles, teams, and permissions The authentication models consist of several objects: Permission : Individual permission defined by Weblate. Permissions cannot be assigned to users, only through assignment of roles. Role : A role defines a set of permissions (and can be reused in several places). User : A user can belong to several teams. Group : Groups connect roles and users with authentication objects (projects, languages, components, and component lists). #### NOTE A team can have no roles assigned to it, in that case access to browse the project by anyone is assumed (see below). ### Project-browsing access A user has to be a member of a team linked to the project, or any component inside that project. Having membership is enough, no specific permissions are needed to browse the project (this is used in the default Viewers team, see [List of teams](https://docs.weblate.org/en/latest/admin/access.md#default-teams)). ### Component-browsing access Granting browsing access to a user in one project gives it access to any component with derived browsing permissions. With [Restricted access](https://docs.weblate.org/en/latest/admin/projects.md#component-restricted) on, access to components (or component lists) are granted explicitly. ### Scope of teams The scope of the permission assigned by the roles in the teams are applied by the following rules: - If the team specifies any Component list, all the permissions given to members of that team are granted for all the components in the component lists attached to the team, and an access with no additional permissions is granted for all the projects these components are in. Components and Projects are ignored. Using huge component lists might have a performance impact, please consider giving access via projects instead. - If the team specifies any Components, all the permissions given to the members of that team are granted for all the components attached to the team, and an access with no additional permissions is granted for all the projects these components are in. Projects are ignored. - Otherwise, if the team specifies any Projects, either by directly listing them or by having Projects selection set to a value like All public projects, all those permissions are applied to all the projects, which effectively grants the same permissions to access all projects [unrestricted components](https://docs.weblate.org/en/latest/admin/projects.md#component-restricted). - The restrictions imposed by a team’s Languages are applied separately, when it’s verified if a user has access to perform certain actions. Namely, it’s applied only to actions directly related to the translation process itself like reviewing, saving translations, adding suggestions, etc. Individual team memberships can further limit these permissions to selected languages. Leaving the per-member language limit empty applies no additional limit beyond the team language selection. The same language limit can be set when inviting new users to a project team. When a per-member language limit is set, the membership grants only permissions that can be evaluated for one of those languages. Project-wide, component-wide and global permissions from that team are not granted for that member. - The VCS permissions to commit, push, reset, and update are evaluated on the component that owns the repository. A member needs component-wide permission on that owner, even when starting an operation from a linked component in another project. Permissions on linked components neither grant this authority nor restrict the owner’s authorized users. A per-member language limit cannot grant these permissions. Linking a component accepts the owner’s authority over the shared checkout. Repository operations affect the whole checkout and its linked components. They do not grant access to otherwise inaccessible component pages. Project-wide repository status and operations include repositories for which the member has permission on the owner. Other repositories are listed separately and are not inspected or changed. An operation is denied when none of the project’s repositories are available to it. - The Manage reports permission applies to the complete selected report scope. It grants access to report data from restricted components and, at workspace scope, private projects even when those descendants are not otherwise visible to the user. Grant it only to users trusted with all report data in that scope. Complete workspace reports are unavailable to regular users until they configure two-factor authentication when any project in the workspace enforces it. Superusers and bot accounts are exempt. - The Edit component settings permission allows administrative operations that can affect repository contents. For example, users can choose files through component settings or install and configure component add-ons. For a [linked component](https://docs.weblate.org/en/latest/vcs.md#internal-urls), these operations use the complete shared checkout. Grant this permission only to users trusted by the repository owner with that checkout. Ordinary translation permissions do not grant this administrative access. Repository-wide VCS permissions protect explicit commit, push, reset, and update operations. They are not required for Weblate’s normal background commit and push of translation changes made through an authorized component. #### HINT Use All languages or Project selection to automate inclusion of all languages or projects. ![image](screenshots/team-scope.webp) **Example:** > A project `foo` with the components: `foo/bar` and > `foo/baz`, with reviewing and management rights, in the > following team: > #### Group Spanish Admin-Reviewers > | Roles | Review strings, Manage repository | > |------------|-------------------------------------| > | Components | foo/bar | > | Languages | Spanish | > Members of that team will have these permissions (assuming the default role settings): > - General (browsing) access to the whole project `foo` including both > components in it: `foo/bar` and `foo/baz`. > - Review strings in `foo/bar` Spanish translation (not elsewhere). > - Manage VCS for the whole `foo/bar` repository e.g. commit pending > changes made by translators for all languages. ## Automatic team assignments While editing the Team, you can specify Automatic assignments, which is a list of regular expressions used to automatically assign newly created users to a team based on their e-mail addresses. This assignment only happens upon account creation. The most common use-case for the feature is to assign all new users to some default team. This behavior is used for the default Users and Guest teams (see [List of teams](https://docs.weblate.org/en/latest/admin/access.md#default-teams)). Use regular expression `^.*$` to match all users. ![image](screenshots/team-automatic-assignments.webp) Another use-case for this option might be to give some additional privileges to employees of your company by default. Assuming all of them use corporate e-mail addresses on your domain, this can be accomplished with an expression like `^.*@mycompany.com`. #### NOTE Automatic team assignment to Users and Viewers is always recreated when upgrading from one Weblate version to another. If you want to turn it off, set the regular expression to `^$` (which won’t match anything). #### NOTE Bulk inviting through the user interface creates invitations. Existing users still have to confirm the invitation before they become team members. ## Default teams and roles After installation, a default set of teams is created (see [List of teams](https://docs.weblate.org/en/latest/admin/access.md#default-teams)). These roles and teams are created upon installation. The built-in roles are always kept up to date by the database migration when upgrading. You can’t actually change them, please define a new role if you want to define your own set of permissions. ### List of privileges | Scope | Permission | Built-in roles | |-------------------------------------------|---------------------------------------|--------------------------| | Changes | Download changes | Administration | | Comments | Post comment | Administration | | Edit source | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | Delete comment | Administration | | | Resolve comment | Administration | | | Translation coordinator | | | | Review strings | | | | Component | Edit component settings | Administration | | Lock component, preventing translations | Administration | | | Manage repository | | | | Glossary | Add glossary entry | Administration | | Manage glossary | | | | Power user | | | | Translation coordinator | | | | Add glossary terminology | Administration | | | Manage glossary | | | | Translation coordinator | | | | Edit glossary entry | Administration | | | Manage glossary | | | | Power user | | | | Translation coordinator | | | | Delete glossary entry | Administration | | | Manage glossary | | | | Power user | | | | Translation coordinator | | | | Upload glossary entries | Administration | | | Manage glossary | | | | Power user | | | | Translation coordinator | | | | Automatic suggestions | Use automatic suggestions | Administration | | Edit source | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | Translation memory | Edit translation memory | Administration | | Manage translation memory | | | | Delete translation memory | Administration | | | Manage translation memory | | | | Projects | Edit project settings | Administration | | Manage project access | Administration | | | Reports | Manage reports | Administration | | Workspace administration | | | | Screenshots | Add screenshot | Administration | | Translation coordinator | | | | Manage screenshots | | | | Edit screenshot | Administration | | | Translation coordinator | | | | Manage screenshots | | | | Delete screenshot | Administration | | | Translation coordinator | | | | Manage screenshots | | | | Source strings | Edit additional string info | Administration | | Edit source | | | | Strings | Add new string | Administration | | Remove a string | Administration | | | Dismiss failing check | Administration | | | Edit source | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | Edit strings | Administration | | | Edit source | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | Review strings | Administration | | | Translation coordinator | | | | Review strings | | | | Bulk edit strings | Administration | | | Bulk editing | | | | Edit string when suggestions are enforced | Administration | | | Translation coordinator | | | | Review strings | | | | Edit source strings | Administration | | | Edit source | | | | Power user | | | | Translation coordinator | | | | Suggestions | Accept suggestion | Administration | | Edit source | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | Add suggestion | Administration | | | Edit source | | | | Add suggestion | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | Delete suggestion | Administration | | | Power user | | | | Translation coordinator | | | | Vote on suggestion | Administration | | | Edit source | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | Translations | Add language for translation | Administration | | Power user | | | | Translation coordinator | | | | Manage languages | | | | Perform automatic translation | Administration | | | Automatic translation | | | | Delete existing translation | Administration | | | Manage languages | | | | Download translation file | Administration | | | Edit source | | | | Access repository | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | Manage languages | | | | Add several languages for translation | Administration | | | Manage languages | | | | Uploads | Define author of uploaded translation | Administration | | Overwrite existing strings with upload | Administration | | | Edit source | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | Upload translations | Administration | | | Edit source | | | | Power user | | | | Translation coordinator | | | | Review strings | | | | Translate | | | | VCS | Access the internal repository | Administration | | Access repository | | | | Power user | | | | Translation coordinator | | | | Manage repository | | | | Commit changes to the internal repository | Administration | | | Manage repository | | | | Push change from the internal repository | Administration | | | Manage repository | | | | Reset changes in the internal repository | Administration | | | Manage repository | | | | View upstream repository location | Administration | | | Access repository | | | | Power user | | | | Translation coordinator | | | | Manage repository | | | | Update the internal repository | Administration | | | Manage repository | | | | Announcements | Post announcements | Administration | | Translation coordinator | | | | Delete announcements | Administration | | | Translation coordinator | | | | Workspaces | Edit workspace settings | Workspace administration | | Add projects to workspace | Workspace administration | | | Add workspace projects | | | | Manage workspace access | Workspace administration | | | Site wide privileges | Use management interface | | | Manage site configuration | | | | Add new projects | Add new projects | | | Add new workspaces | Add new projects | | | Add language definitions | | | | Manage language definitions | | | | Manage teams | | | | View team info | | | | Manage users | | | | View user info | | | | Manage roles | | | | View role info | | | | Manage announcements | | | | Manage translation memory | | | | Manage machinery | | | | Manage component lists | | | | Manage billing | | | | Manage site-wide add-ons | | | #### WARNING Roles do not have a separate scope; the permissions in a role determine its scope. A role containing a permission listed under Site wide privileges grants that permission across the Weblate instance when assigned through a site-wide team. The team’s project selection does not narrow these permissions. Site-wide privileges are not granted to any default role. Treat custom roles containing them as trusted administrative access because some are effectively equivalent to superuser status. For example, `user.edit` allows users to change their own team memberships and grant themselves superuser status. ### List of built-in roles | Administration | * Post announcements
* Delete announcements
* Download changes
* Post comment
* Delete comment
* Resolve comment
* Edit component settings
* Lock component, preventing translations
* Add glossary entry
* Delete glossary entry
* Edit glossary entry
* Add glossary terminology
* Upload glossary entries
* Use automatic suggestions
* Delete translation memory
* Edit translation memory
* Edit project settings
* Manage project access
* Manage reports
* Add screenshot
* Delete screenshot
* Edit screenshot
* Edit additional string info
* Accept suggestion
* Add suggestion
* Delete suggestion
* Vote on suggestion
* Add language for translation
* Add several languages for translation
* Perform automatic translation
* Delete existing translation
* Download translation file
* Add new string
* Bulk edit strings
* Dismiss failing check
* Remove a string
* Edit strings
* Edit string when suggestions are enforced
* Review strings
* Edit source strings
* Define author of uploaded translation
* Overwrite existing strings with upload
* Upload translations
* Access the internal repository
* Commit changes to the internal repository
* Push change from the internal repository
* Reset changes in the internal repository
* Update the internal repository
* View upstream repository location | |---------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Edit source | * Post comment
* Use automatic suggestions
* Edit additional string info
* Accept suggestion
* Add suggestion
* Vote on suggestion
* Download translation file
* Dismiss failing check
* Edit strings
* Edit source strings
* Overwrite existing strings with upload
* Upload translations | | Add suggestion | * Add suggestion | | Access repository | * Download translation file
* Access the internal repository
* View upstream repository location | | Manage glossary | * Add glossary entry
* Delete glossary entry
* Edit glossary entry
* Add glossary terminology
* Upload glossary entries | | Power user | * Post comment
* Add glossary entry
* Delete glossary entry
* Edit glossary entry
* Upload glossary entries
* Use automatic suggestions
* Accept suggestion
* Add suggestion
* Delete suggestion
* Vote on suggestion
* Add language for translation
* Download translation file
* Dismiss failing check
* Edit strings
* Edit source strings
* Overwrite existing strings with upload
* Upload translations
* Access the internal repository
* View upstream repository location | | Translation coordinator | * Post announcements
* Delete announcements
* Post comment
* Resolve comment
* Add glossary entry
* Delete glossary entry
* Edit glossary entry
* Add glossary terminology
* Upload glossary entries
* Use automatic suggestions
* Add screenshot
* Delete screenshot
* Edit screenshot
* Accept suggestion
* Add suggestion
* Delete suggestion
* Vote on suggestion
* Add language for translation
* Download translation file
* Dismiss failing check
* Edit strings
* Edit string when suggestions are enforced
* Review strings
* Edit source strings
* Overwrite existing strings with upload
* Upload translations
* Access the internal repository
* View upstream repository location | | Review strings | * Post comment
* Resolve comment
* Use automatic suggestions
* Accept suggestion
* Add suggestion
* Vote on suggestion
* Download translation file
* Dismiss failing check
* Edit strings
* Edit string when suggestions are enforced
* Review strings
* Overwrite existing strings with upload
* Upload translations | | Translate | * Post comment
* Use automatic suggestions
* Accept suggestion
* Add suggestion
* Vote on suggestion
* Download translation file
* Dismiss failing check
* Edit strings
* Overwrite existing strings with upload
* Upload translations | | Manage languages | * Add language for translation
* Add several languages for translation
* Delete existing translation
* Download translation file | | Bulk editing | * Bulk edit strings | | Automatic translation | * Perform automatic translation | | Manage translation memory | * Delete translation memory
* Edit translation memory | | Manage screenshots | * Add screenshot
* Delete screenshot
* Edit screenshot | | Manage repository | * Lock component, preventing translations
* Access the internal repository
* Commit changes to the internal repository
* Push change from the internal repository
* Reset changes in the internal repository
* Update the internal repository
* View upstream repository location | | Workspace administration | * Manage reports
* Add projects to workspace
* Edit workspace settings
* Manage workspace access | | Add workspace projects | * Add projects to workspace | | Add new projects | * Add new projects
* Add new workspaces | ### List of teams The following teams are created upon installation (or after executing [`setupgroups`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-setupgroups)) and you are free to modify them. The migration will, however, re-create them if you delete or rename them. Guests : Defines permissions for non-authenticated users.
This team only contains anonymous users (see [`ANONYMOUS_USER_NAME`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ANONYMOUS_USER_NAME)).
Remove roles from this team to limit permissions for non-authenticated users.
Default roles: Add suggestion, Access repository Viewers : This role ensures the visibility of public projects to all users. By default, all users are members of this team.
By default, [automatic team assignment](https://docs.weblate.org/en/latest/admin/access.md#autoteam) makes all new accounts members of this team when they join.
Default roles: none Users : Default team for all users.
By default, [automatic team assignment](https://docs.weblate.org/en/latest/admin/access.md#autoteam) makes all new accounts members of this team when they join.
Default roles: Power user Reviewers : Group for reviewers (see [Translation workflows](https://docs.weblate.org/en/latest/workflows.md#workflows)).
Default roles: Review strings Managers : Group for administrators.
Default roles: Administration Project creators : #### Versionadded Added in version 5.1.
Users who can create new projects.
Default roles: Add new projects #### WARNING Never remove the predefined Weblate teams and users, as that can lead to unexpected problems! If you have no use for them, simply remove all their privileges instead. ## Additional access restrictions If you want to use your Weblate installation in a less public manner, i.e. allow new users on an invitational basis only, it can be done by configuring Weblate in such a way that only known users have an access to it. In order to do so, you can set [`REGISTRATION_OPEN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_OPEN) to `False` to prevent registrations of any new users, and set [`REQUIRE_LOGIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REQUIRE_LOGIN) to `True` to require signing in to access all the site pages. This is basically the way to lock your Weblate installation. Additionally, changing [`DEFAULT_ACCESS_CONTROL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ACCESS_CONTROL) to `100` will make all newly created projects private, requiring explicit access to be granted. #### HINT You can use built-in [Inviting new users](https://docs.weblate.org/en/latest/admin/access.md#invite-user) to add new users. ## Expiration of user accounts Each account can have an expiry set. After the expiration, the account will be automatically disabled. This is used for [Per-project access tokens](https://docs.weblate.org/en/latest/admin/access.md#project-api), but can be utilized for regular users as well. # admin/addons.md # Add-ons Add-ons provide ways to customize and automate the translation workflow. Admins can add and manage add-ons from the Operations ↓ Add-ons menu of each respective translation project or component. Add-ons can be also installed site-wide in [Management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface). #### HINT You can also configure add-ons using [API](https://docs.weblate.org/en/latest/api.md#addons-api), [`DEFAULT_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ADDONS), or [`install_addon`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-install_addon). Add-ons that opt in to manual triggering can be run from add-on management or using the [API](https://docs.weblate.org/en/latest/api.md#addons-api). Results are recorded in the add-on activity log. ![image](screenshots/addons.webp) ## Events that trigger add-ons ### Add-on installation Triggered when add-on is being installed. ### Component update Triggered whenever a change happens in a component such as: * Strings are changed in the repository. * A string is added. * A new translation is added. ### Daily Triggered daily, but add-ons usually split the daily load between components depending on [`BACKGROUND_TASKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BACKGROUND_TASKS). ### Event change Triggered after a Change event is created. ### Manual trigger Triggered when an add-on is run manually from add-on management or the API. ### Repository post-add Triggered just after the new translation is added and committed. ### Repository post-commit Triggered just after the changes are committed. ### Repository post-push Triggered just after the repository is pushed upstream. ### Repository post-remove Triggered just after a translation is removed. ### Repository post-update Triggered whenever new changes are pulled from the upstream repository. ### Repository pre-commit Triggered just before the changes are committed. ### Repository pre-push Triggered just before the repository is pushed upstream. ### Repository pre-update Triggered just before the repository update is attempted. ### Unit post-save Triggered just after the string is saved. ### Unit post-sync Triggered after the string is synchronized with the VCS. ### Unit pre-create Triggered just after the newly created string is saved. ## Built-in add-ons ### Automatic translation * **Add-on ID:** `weblate.autotranslate.autotranslate` * **Configuration:** | `mode` | Automatic translation mode | #### Available choices:

| `suggest` | Add as suggestion |
|-------------|-----------------------------|
| `translate` | Add as translation |
| `fuzzy` | Add as “Needing edit” |
| `approved` | Add as approved translation | | |---------------|----------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `q` | Query | Please note that translating all strings will discard all existing translations. | | `auto_source` | Source of automated translations | #### Available choices:

| `others` | Other translation components |
|------------|--------------------------------|
| `mt` | Machine translation | | | `component` | Component | Enter a source component ID. With 30 or more eligible source components, a project/component path is also accepted. In that case, component and project operations also accept a component slug from the target project. Leave blank to use eligible components from each target component’s project. | | `engines` | Machine translation engines | [Machine translation engines](https://docs.weblate.org/en/latest/admin/addons.md#addon-choice-engines) | | `threshold` | Score threshold | | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Component update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-component-update), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily), [Event change](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-event-change) Automatically translates strings using machine translation or other components. #### SEE ALSO * [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation) * [Keeping translations same across components](https://docs.weblate.org/en/latest/admin/continuous.md#translation-consistency) * [Priority of machine translation and translation memory services](https://docs.weblate.org/en/latest/admin/machine.md#mt-translation-services-priority) * [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings) ### JavaScript localization CDN #### Versionadded Added in version 4.2. * **Add-on ID:** `weblate.cdn.cdnjs` * **Configuration:** | `threshold` | Translation threshold | The percentage of translated strings that must be present for translation to be included. | |----------------|---------------------------------|---------------------------------------------------------------------------------------------| | `css_selector` | CSS selector | CSS selector to detect localizable elements. | | `cookie_name` | Language cookie name | Name of cookie which stores language preference. | | `files` | Extract strings from HTML files | List of filenames in current repository or remote URLs to parse for translatable strings. | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily), [Repository post-commit](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-commit), [Repository post-remove](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-remove), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Publishes translations into content delivery network for use in JavaScript or HTML localization. Can be used to localize static HTML pages, or to load localization in the JavaScript code. Generates a unique URL for your component you can include in HTML pages to localize them. See [Translating HTML and JavaScript using Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#weblate-cdn) for more details. #### NOTE This add-on requires additional configuration on the Weblate server. [`LOCALIZE_CDN_PATH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_PATH) configures where generated files will be written (on a filesystem), and [`LOCALIZE_CDN_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_URL) defines where they will be served (URL). Serving of the files is not done by Weblate and has to be set up externally (typically using a CDN service). This add-on is configured on Hosted Weblate and serves the files via `https://weblate-cdn.com/`. #### SEE ALSO * [Configuring Weblate CDN add-on](https://docs.weblate.org/en/latest/devel/html.md#cdn-addon-config) * [Translating HTML and JavaScript using Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#weblate-cdn) * [Localization CDN](https://docs.weblate.org/en/latest/admin/optionals.md#cdn-server-security) * [String extraction for Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#cdn-addon-extract) * [HTML localization using Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#cdn-addon-html) ### Translation files CDN #### Versionadded Added in version 2026.5. * **Add-on ID:** `weblate.cdn.files` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Component update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-component-update), [Repository post-commit](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-commit), [Repository post-remove](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-remove), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Publishes translation files into a content delivery network. Publishes translation files without converting them to another format. Files are written below the add-on specific CDN directory and served from `LOCALIZE_CDN_URL//`. Single-file translations use the language code and original file extension, for example `cs.json` or `de.po`. Multi-file translations are served below the language code using paths relative to the translation directory. Monolingual components include the source language file, while bilingual components publish only target-language files. See [Localization CDN](https://docs.weblate.org/en/latest/admin/optionals.md#cdn-server-security) for secure serving guidance. ### Remove blank strings #### Versionadded Added in version 4.4. * **Add-on ID:** `weblate.cleanup.blank` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Repository post-commit](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-commit), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Removes strings without a translation from translation files. Use this to not have any empty strings in translation files (for example if your localization library displays them as missing instead of falling back to the source string). #### SEE ALSO [Does Weblate update translation files besides translations?](https://docs.weblate.org/en/latest/faq.md#faq-cleanup) ### Cleanup translation files * **Add-on ID:** `weblate.cleanup.generic` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update), [Repository pre-commit](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-pre-commit) Update all translation files to match the monolingual base file. For most file formats, this means removing stale translation keys no longer present in the base file. For formats containing additional content besides translation strings (such as [HTML files](https://docs.weblate.org/en/latest/formats/html.md#html), [Windows RC files](https://docs.weblate.org/en/latest/formats/winrc.md#winrc), or [OpenDocument Format](https://docs.weblate.org/en/latest/formats/odf.md#odf)) this also brings the translation file in sync with the base file. For a one-time cleanup of a single translation file, use Cleanup unused in [Repository maintenance](https://docs.weblate.org/en/latest/admin/continuous.md#repository-maintenance) on that translation instead of installing the add-on. #### SEE ALSO [Does Weblate update translation files besides translations?](https://docs.weblate.org/en/latest/faq.md#faq-cleanup) ### Add missing languages * **Add-on ID:** `weblate.consistency.languages` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily), [Repository post-add](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-add) Ensures a consistent set of languages is used for all components within a project. #### NOTE The components shared from other projects are not considered in this. Missing languages are checked once every 24 hours, and when new languages are added in Weblate. Unlike most others, this add-on affects the whole project. #### HINT Auto-translate the newly added strings with [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate). ### Component discovery * **Add-on ID:** `weblate.discovery.discovery` * **Configuration:** | `match` | Regular expression to match translation files against | The regular expression must define a named group for component. Also define a named group for language when matching translation files. When the file mask is set, omit language and match the monolingual base or new base file instead. | |-------------------------|-----------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `file_format` | File format | [File format](https://docs.weblate.org/en/latest/admin/addons.md#addon-choice-file-format) | | `name_template` | Customize the component name | Use Django template syntax. This template must include {{ component }}. | | `base_file_template` | Define the monolingual base filename | Leave empty for bilingual translation files. When set, this template must include {{ component }}. | | `new_base_template` | Define the base file for new translations | Filename of file used for creating new translations. For gettext choose .pot file. This template must include {{ component }}. | | `intermediate_template` | Intermediate language file | Filename of intermediate translation file. In most cases this is a translation file provided by developers and is used when creating actual source strings. This template must include {{ component }}. | | `filemask_template` | Define the file mask | Leave empty to match translation files directly. When set, discovery matches the monolingual base or new base file and uses this template as the file mask. Include a language wildcard and {{ component }}, for example locale/ */{{ component }}.po or docs/{{ component }}_*.md. | | `language_regex` | Language filter | Regular expression to filter translation files against when scanning for file mask. | | `copy_addons` | Clone add-ons from the main component to the newly created ones | | | `remove` | Remove components for inexistent files | | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Automatically adds or removes project components based on file changes in the version control system. The matching is done using regular expressions enabling complex configuration, but some knowledge is required to do so. Usually the regular expression to match translation files has to contain two named groups to match component and language. When creating components from a monolingual base or new base file, omit the language group and match that source file instead. All named groups in the regular expression can be used as variables in the template fields. #### Discovery requirements To discover a component successfully, the configuration has to do all of the following: * The regular expression must define a `component` named group. Matching translation files also requires a `language` named group. * Template fields used to name or locate per-component files must include `{{ component }}`, so the rendered value actually changes for each discovered component. * For monolingual formats, the component must contain a file matching `base_file_template` and at least one translation file matching `match`, unless you set the file mask (see below). #### Discovering components without translation files Set Define the file mask to discover components from a monolingual base or new base file alone, even when no translation files exist yet. In that mode: * Configure Regular expression to match translation files against to match the monolingual base or new base file, and omit the `language` group. Keep full control over the `component` capture, for example `locale/(?P[^/]+)\.pot` or `docs/(?P[^/_]+)\.md`. * Fill Define the file mask with a path that includes both a language wildcard and `{{ component }}`, for example `locale/*/{{ component }}.po` or `docs/{{ component }}_*.md`. * Keep using the other filename templates with any named groups from the match expression. #### Worked example: `news_.md` This is a common filename-based language variant layout: * `docs/news_en.md` * `docs/news_cs.md` * `docs/guide_en.md` Use the Filename-based language variants preset for a starting point, then choose the matching file format and review the populated values. Regular expression: : `(?:(?P.*/))?(?P.+?)_(?P[A-Za-z]{2,3}(?:[_-][A-Za-z0-9]+)*)\.(?P[^/.]+)` Component name: : `{{ component }}` Discovered file masks: : - `docs/news_*.md` - `docs/guide_*.md` In this example, `{{ component }}` resolves to the basename before the language suffix, so `docs/news_en.md`, `docs/news_pt_BR.md`, and `docs/news_pt-BR.md` all become the `news` component. You can use Django template markup in all filename fields, for example: `{{ component }}` : Component name parsed from the `component` match group `{{ component|title }}` : Component filename with upper case first letter `{{ path }}: {{ component }}` : Custom match group from the regular expression Once you hit Save, a preview of matching components will be presented, from where you can check whether the configuration actually matches your needs: ![image](screenshots/addon-discovery.webp) #### Component discovery examples The worked example above covers the most common filename-based variant layout. The following examples show other repository structures you can match. ##### One folder per language One folder per language containing translation files for components. Regular expression: : `(?P[^/.]*)/(?P[^/]*)\.po` Matching files: : - `cs/application.po` - `cs/website.po` - `de/application.po` - `de/website.po` ##### Gettext locales layout Usual structure for storing gettext PO files. Regular expression: : `locale/(?P[^/.]*)/LC_MESSAGES/(?P[^/]*)\.po` Matching files: : - `locale/cs/LC_MESSAGES/application.po` - `locale/cs/LC_MESSAGES/website.po` - `locale/de/LC_MESSAGES/application.po` - `locale/de/LC_MESSAGES/website.po` ##### Complex filenames Using both component and language name within filename. Regular expression: : `src/locale/(?P[^/]*)\.(?P[^/.]*)\.po` Matching files: : - `src/locale/application.cs.po` - `src/locale/website.cs.po` - `src/locale/application.de.po` - `src/locale/website.de.po` ##### Repeated language code Using language in both path and filename. Regular expression: : `locale/(?P[^/.]*)/(?P[^/]*)/(?P=language)\.po` Matching files: : - `locale/cs/application/cs.po` - `locale/cs/website/cs.po` - `locale/de/application/de.po` - `locale/de/website/de.po` ##### Split Android strings Android resource strings, split into several files. Regular expression: : `res/values-(?P[^/.]*)/strings-(?P[^/]*)\.xml` Matching files: : - `res/values-cs/strings-about.xml` - `res/values-cs/strings-help.xml` - `res/values-de/strings-about.xml` - `res/values-de/strings-help.xml` ##### Matching multiple paths Multi-module Maven project with Java properties translations. Regular expression: : `(?P.+/)(?P[^/]*)/src/main/resources/ApplicationResources_(?P[^/.]*)\.properties` Component name: : `{{ originalHierarchy }}: {{ component }}` Matching files: : - `parent/module1/submodule/src/main/resources/ApplicationResources_fr.properties` - `parent/module1/submodule/src/main/resources/ApplicationResource_es.properties` - `parent/module2/src/main/resources/ApplicationResource_de.properties` - `parent/module2/src/main/resources/ApplicationResource_ro.properties` #### HINT Component discovery add-on uses [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls). It’s a convenient way to share VCS setup between multiple components. Linked components use the local repository of the main component set up by filling `weblate://project/main-component` into the [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo) field (in Operations ↓ Settings ↓ Version control system) of each respective component. This saves time with configuration and system resources too. #### HINT Ensure the new component contains the full set of translatable languages with [Add missing languages](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-consistency-languages). #### SEE ALSO * [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup) * [`import_project`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_project) ### Fedora Messaging #### Versionadded Added in version 5.15. * **Add-on ID:** `weblate.fedora_messaging.publish` * **Configuration:** | `amqp_url` | AMQP broker URL | The AMQP broker URL to connect to. | |-----------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------| | `topic_prefix` | Topic prefix | Optional prefix to prepend to generated message topics. | | `publish_timeout` | Publish timeout | How many seconds to wait for the broker delivery acknowledgement. | | `connection_attempts` | Connection attempts | How many times to try connecting to the broker. | | `retry_delay` | Retry delay | How many seconds to wait between connection attempts. | | `ca_cert` | CA certificate bundle (PEM) | Paste only PEM certificate blocks, each starting with “—–BEGIN CERTIFICATE—–” and ending with “—–END CERTIFICATE—–“. | | `client_key` | Client private key (PEM) | Paste a single unencrypted PEM private key block. Encrypted private keys are not supported. | | `client_cert` | Client certificate (PEM) | Paste only the PEM certificate block starting with “—–BEGIN CERTIFICATE—–”; do not paste the output from “openssl x509 -text”. | | `event_filter` | Change events to trigger | Choose which change events should trigger this add-on.
[Change events to trigger](https://docs.weblate.org/en/latest/admin/addons.md#addon-choice-event-filter) | | `events` | Selected change events | [Selected change events](https://docs.weblate.org/en/latest/admin/addons.md#addon-choice-events) | * **Triggers:** [Event change](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-event-change) Sends notifications to a Fedora Messaging compatible AMQP exchange. Fedora Messaging is AMQP-based publisher for all changes happening in Weblate. You can hook additional services on changes happening in Weblate using this. #### Message topic All messages have topic `weblate.....`. When configured, `topic_prefix` is prepended to this topic using a single dot separator, for example `org.fedoraproject.weblate.project_backed_up.website`. The action is lowercase textual representation of action with underscores instead of space, for example `resource_updated`; see [Selected change events](https://docs.weblate.org/en/latest/admin/addons.md#change-actions) for all action identifiers. The remaining parts match Weblate object path segments. For example, a project backup event for the `website` project uses `weblate.project_backed_up.website`. A translation change in the `website` project, `frontend` component, and Czech translation uses `weblate.translation_changed.website.frontend.cs`. The same change in the `frontend` component inside the `parent` and `child` categories uses `weblate.translation_changed.website.parent.child.frontend.cs`. #### Message body The body consists of following fields (given that they are available for the event): `change_id` : Numerical ID of change `action` : Verbose name of the change. `timestamp` : ISO formatted timestamp `target` : New value of the change (eg. new translation of the string) `old` : Old value of the change (eg. previous translation of the string) `source` : Source string. `url` : Absolute URL to view the related object. `author` : Author username (this can be different from user for example when accepting suggestions) `user` : Acting username `project` : Project slug `component` : Component slug `translation` : Translation language code #### Message headers There are additional headers which you might utilize for routing as well: `action` : Verbose name of the change. `project` : Project slug `component` : Component slug #### Example messages Repository merge event: ```json { "id": 1, "action": "Merged repository", "timestamp": "2017-06-15T11:30:47.325000+00:00", "url": "http://example.com/projects/test/test/", "component": "test" } ``` New source string event: ```json { "id": 2, "action": "New source string", "timestamp": "2017-06-15T11:30:47.372000+00:00", "url": "http://example.com/translate/test/test/cs/?checksum=6412684aaf018e8e", "component": "test", "translation": "cs", "source": ["Hello, world!\n"] } ``` Resource update event: ```json { "id": 6, "action": "Resource update", "timestamp": "2017-06-15T11:30:47.410000+00:00", "url": "http://example.com/projects/test/test/cs/", "project": "test", "component": "test", "translation": "cs" } { "id": 7, "action": "Resource update", "timestamp": "2017-06-15T11:30:47.510000+00:00", "url": "http://example.com/projects/test/test/de/", "project": "test", "component": "test", "translation": "de" } { "id": 8, "action": "Resource update", "timestamp": "2017-06-15T11:30:47.595000+00:00", "url": "http://example.com/projects/test/test/it/", "project": "test", "component": "test", "translation": "it" } ``` Project removal event: ```json { "id": 9, "action": "Removed project", "timestamp": "2019-10-17T15:57:08.559420+00:00", "target": "test", "user": "testuser" } ``` New contributor event: ```json { "id": 11, "action": "New contributor", "timestamp": "2019-10-17T15:57:08.759960+00:00", "url": "http://example.com/translate/test/test/cs/?checksum=6412684aaf018e8e", "author": "testuser", "user": "testuser", "project": "test", "component": "test", "translation": "cs", "source": ["Hello, world!\n"] } ``` New translation event: ```json { "id": 12, "action": "New translation", "timestamp": "2019-10-17T15:57:08.772591+00:00", "url": "http://example.com/translate/test/test/cs/?checksum=6412684aaf018e8e", "target": ["Ahoj svete!\n"], "author": "testuser", "user": "testuser", "project": "test", "component": "test", "translation": "cs", "source": ["Hello, world!\n"] } ``` #### SEE ALSO * [Configuring Fedora Messaging](https://fedora-messaging.readthedocs.io/en/stable/user-guide/configuration.html) * [Weblate Messaging](https://docs.weblate.org/en/latest/contributing/schemas.md#schema-messaging) ### Bulk edit * **Add-on ID:** `weblate.flags.bulk` * **Configuration:** | `q` | Query | | |-----------------|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `state` | State to set | #### Available choices:

| `-1` | Do not change |
|--------|---------------------------------|
| `10` | Needs editing |
| `11` | Needs editing (Needs rewriting) |
| `12` | Needs editing (Needs checking) |
| `20` | Translated |
| `30` | Approved | | | `add_flags` | Translation flags to add | | | `remove_flags` | Translation flags to remove | | | `add_labels` | Labels to add | | | `remove_labels` | Labels to remove | | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Component update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-component-update) Bulk edit flags, labels, or states of strings. **Examples:** #### Label new strings automatically | Search query | `NOT has:label` | |----------------|-------------------| | Labels to add | *recent* | #### Marking all [App store metadata files](https://docs.weblate.org/en/latest/formats/appstore.md#appstore) changelog strings read-only | Search query | `language:en AND key:changelogs/` | |--------------------------|-------------------------------------| | Translation flags to add | `read-only` | #### Marking certain strings read-only | Search query | `source:r"^\`\`[.a-zA-Z0-9_-]*\`\`$" AND language:en` | |--------------------------|---------------------------------------------------------| | Translation flags to add | `read-only` | #### SEE ALSO * [Bulk edit](https://docs.weblate.org/en/latest/user/translating.md#bulk-edit) * [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) * [String labels](https://docs.weblate.org/en/latest/devel/translations.md#labels) ### Flag unchanged translations as “Needs rewriting” * **Add-on ID:** `weblate.flags.same_edit` * **Configuration:** This add-on has no configuration. * **Triggers:** [Unit pre-create](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-unit-pre-create) Whenever a new translatable string is imported from the VCS and it matches a source string, it is flagged as needing rewriting in Weblate. Especially useful for file formats that include source strings for untranslated strings. #### HINT You might also want to tighthen the [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same) check by adding `strict-same` flag to [Translation flags](https://docs.weblate.org/en/latest/admin/projects.md#component-check-flags). #### SEE ALSO [Translation states](https://docs.weblate.org/en/latest/workflows.md#states) ### Flag new source strings as “Needs checking” * **Add-on ID:** `weblate.flags.source_edit` * **Configuration:** This add-on has no configuration. * **Triggers:** [Unit pre-create](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-unit-pre-create) Whenever a new source string is imported from the VCS, it is flagged as needing checking in Weblate. This way you can easily filter and edit source strings written by the developers. #### SEE ALSO [Translation states](https://docs.weblate.org/en/latest/workflows.md#states) ### Flag new translations as “Needs rewriting” * **Add-on ID:** `weblate.flags.target_edit` * **Configuration:** This add-on has no configuration. * **Triggers:** [Unit pre-create](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-unit-pre-create) Whenever a new translatable string is imported from the VCS, it is flagged as needing rewriting in Weblate. This way you can easily filter and edit translations created by the developers. #### SEE ALSO [Translation states](https://docs.weblate.org/en/latest/workflows.md#states) ### Flag updated translations from repository as “Needs rewriting” * **Add-on ID:** `weblate.flags.target_repo_update` * **Configuration:** This add-on has no configuration. * **Triggers:** [Unit post-sync](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-unit-post-sync) Whenever a string translation is changed from the VCS, it is flagged as needing rewriting in Weblate. Especially useful if translation files are often updated manually or by an external service. #### SEE ALSO [Translation states](https://docs.weblate.org/en/latest/workflows.md#states) ### Fill read-only strings with source #### Versionadded Added in version 4.18. * **Add-on ID:** `weblate.generate.fill_read_only` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Component update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-component-update), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily) Fills in translation of read-only strings with source string. ### Statistics generator * **Add-on ID:** `weblate.generate.generate` * **Configuration:** | `scope` | Output scope | #### Available choices:

| `translation` | One file per translation |
|-----------------|----------------------------|
| `component` | One file per component | | |------------|---------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `filename` | Name of generated file | | | `template` | Content of generated file | | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Component update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-component-update), [Repository post-add](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-add), [Repository post-remove](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-remove), [Repository pre-commit](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-pre-commit) Generates a file containing detailed info about the translation status. You can use a Django template in both filename and content, see [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup) for a detailed markup description. For example generating a summary file for each translation: Name of generated file : `locale/{{ language_code }}.json` Content : ```json { "language": "{{ language_code }}", "strings": "{{ stats.all }}", "translated": "{{ stats.translated }}", "last_changed": "{{ stats.last_changed }}", "last_author": "{{ stats.last_author }}", } ``` #### Component-wide output Set Output scope to One file per component to maintain one locale list or statistics file for the entire component. The default, One file per translation, preserves existing configurations. Component output is generated on installation and configuration changes. It is updated when translations are committed, languages are added or removed, and component files are reloaded. Language metadata changes are included on the next such update or when the add-on is reconfigured. Unchanged output does not create a new commit. Both modes support component and project variables in filenames and content. In component mode, the content additionally receives `translations`, ordered by repository language code. Each item provides: * `language_code`: the language code used in the repository. * `language_name`: the English language name. * `language_native_name`: the name translated into its own language using Weblate’s catalogs, with an English fallback when unavailable. * `language_direction`: `ltr` or `rtl`. * `filename` and `url`: the translation filename and Weblate URL. * `is_source`: whether this is the component’s source translation. * `stats`: the same statistics available in translation mode. The source translation is included. Templates can exclude it using `{% if not item.is_source %}`. Statistics use Weblate’s completion semantics. Custom language names are retained; there is no external locale-data lookup. For example, generate `locales.json` for a website: ```django [ {% for item in translations %} { "code": {{ item.language_code|json }}, "file": {{ item.filename|json }}, "name": {{ item.language_native_name|json }}, "dir": {{ item.language_direction|json }} }{% if not forloop.last %},{% endif %} {% endfor %} ] ``` Or generate `languages.py` for an application: ```django names = { {% for item in translations %} {{ item.language_code|python }}: {{ item.language_native_name|python }}, {% endfor %} } completeness = { {% for item in translations %} {{ item.language_code|python }}: {{ item.stats.translated_percent|python }}, {% endfor %} } ``` The `json` and `python` filters serialize complete values, including string quotes and escaping. Do not add quotes around their output. They also support lists and dictionaries; `{{ translations|json }}` exports all available data. Dates and times are serialized as ISO-formatted strings. #### SEE ALSO [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup) ### Prefill translation with source #### Versionadded Added in version 4.11. * **Add-on ID:** `weblate.generate.prefill` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Component update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-component-update), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily) Fills in translation strings with source string. All untranslated strings in the component will be filled with the source string, and marked as needing edit. Use this when you can not have empty strings in the translation files. .. AUTOGENERATED START: weblate.generate.pseudolocale .. This section is automatically generated by ./manage.py list_addons. Do not edit manually. ### Pseudolocale generation #### Versionadded Added in version 4.5. * **Add-on ID:** `weblate.generate.pseudolocale` * **Configuration:** | `source` | Source strings | | |--------------------|---------------------------|------------------------------------------------------------------------------------------| | `target` | Target translation | All strings in this translation will be overwritten | | `prefix` | Prepended static text | | | `var_prefix` | Prepended variable text | | | `suffix` | Appended static text | | | `var_suffix` | Appended variable text | | | `var_multiplier` | Variable text multiplier | How many times to repeat the variable text depending on the length of the source string. | | `include_readonly` | Include read-only strings | | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Component update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-component-update), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily) Generates a translation by adding prefix and suffix to source strings automatically. Pseudolocales are useful to find strings that are not prepared for localization. This is done by altering all translatable source strings to make it easy to spot unaltered strings when running the application in the pseudolocale language. Finding strings whose localized counterparts might not fit the layout is also possible. Using the variable parts makes it possible to look for strings which might not fit into the user interface after the localization - it extends the text based on the source string length. The variable texts are repeated by length of the text multiplied by the multiplier. For example `Hello world` with variable text `_` and variable multiplier of 1 becomes `Hello world___________` - the text is repeated once for each character in the source string. The strings will be generated using following pattern: Prepended static text Prepended variable text Source string Appended variable text Appended static text #### HINT You can use real languages for testing, but there are dedicated pseudolocales available in Weblate - en_XA and ar_XB. #### HINT You can use this add-on to start translation to a new locale of an existing language or similar language. Once you add the translation to the component, follow to the add-on. *Example:* If you have fr and want to start fr_CA translation, simply set fr as the source, fr_CA as the target, and leave the prefix and suffix blank. Uninstall the add-on once you have the new translation filled to prevent Weblate from changing the translations made after the copying. ### Update ALL_LINGUAS variable in the “configure” file * **Add-on ID:** `weblate.gettext.configure` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily), [Repository post-add](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-add), [Repository post-remove](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-remove) Updates the ALL_LINGUAS variable in “configure”, “configure.in” or “configure.ac” files, when a translation is added or removed. Updates the ALL_LINGUAS variable in `configure`, `configure.in` or any `configure.ac` files, when a translation is added or removed. ### Customize gettext output #### Versionremoved Removed in version 5.13: Replaced by [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). ### Update gettext template (Django) #### Versionadded Added in version 5.17. * **Add-on ID:** `weblate.gettext.django` * **Configuration:** | `interval` | Update frequency | How often the add-on should update the POT file when the component is refreshed.

#### Available choices:

| `daily` | Daily |
|-----------|---------|
| `weekly` | Weekly |
| `monthly` | Monthly | | |--------------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `normalize_header` | Normalize POT header | Updates gettext headers and replaces placeholder POT comments. | | `location_mode` | Source locations | Choose how extraction writes source locations to the POT file. Use this to keep locations in the template while omitting them from translated PO files.

#### Available choices:

| `file` | Use file format settings |
|----------|-----------------------------------|
| `keep` | Extract locations to the POT file |
| `omit` | Do not extract locations | | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Manual trigger](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-manual-trigger), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Updates the gettext template using Django’s built-in makemessages command. This add-on updates the template configured in [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base). It is available for gettext PO components, and the component must define a template for new translations. The selected update frequency applies to automatic runs after repository refreshes. Installing or reconfiguring the add-on runs it immediately, and manual runs from add-on management or the API also bypass the frequency schedule. After a successful update, Weblate commits the changed template and reloads source strings. The template update does not update translation PO files by itself. Keep [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) installed when translation files should follow template changes automatically. The install form for this add-on can install that add-on, but existing add-on settings do not show that installation option again. #### Django requirements This add-on requires **xgettext** and **msguniq**. It runs Weblate’s internal extraction wrapper for Django messages instead of invoking a project’s **manage.py makemessages**, so it does not load project Django settings or applications. The template for new translations must use the `django` or `djangojs` domain. Supported template names are `django.pot`, `djangojs.pot`, `django.po`, and `djangojs.po`. Weblate infers the source directory from the template path and skips repository locale directories while extracting. ### Update LINGUAS file * **Add-on ID:** `weblate.gettext.linguas` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily), [Repository post-add](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-add), [Repository post-remove](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-remove) Updates the LINGUAS file when a translation is added or removed. ### Update POT file (Meson) #### Versionadded Added in version 5.17. * **Add-on ID:** `weblate.gettext.meson` * **Configuration:** | `interval` | Update frequency | How often the add-on should update the POT file when the component is refreshed.

#### Available choices:

| `daily` | Daily |
|-----------|---------|
| `weekly` | Weekly |
| `monthly` | Monthly | | |---------------------|--------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `normalize_header` | Normalize POT header | Updates gettext headers and replaces placeholder POT comments. | | `location_mode` | Source locations | Choose how extraction writes source locations to the POT file. Use this to keep locations in the template while omitting them from translated PO files.

#### Available choices:

| `file` | Use file format settings |
|----------|-----------------------------------|
| `keep` | Extract locations to the POT file |
| `omit` | Do not extract locations | | | `data_dirs` | ITS data directories | Newline-separated repository-relative directories containing an its subdirectory, for example po for po/its. Earlier directories override later directories and bundled rules. | | `comment_mode` | Code comments | Choose whether xgettext should extract no comments, all comments, or only comments marked with a specific tag.

#### Available choices:

| `off` | Do not extract comments |
|----------|---------------------------|
| `all` | Extract all comments |
| `tagged` | Extract comments with tag | | | `comment_tag` | Comment tag | Tag passed to xgettext for comment extraction when using tagged comment mode. | | `checks` | xgettext checks | Additional xgettext validation checks to enable for extracted messages.

#### Available choices:

| `ellipsis-unicode` | ellipsis-unicode |
|----------------------|--------------------|
| `space-ellipsis` | space-ellipsis |
| `quote-unicode` | quote-unicode |
| `bullet-unicode` | bullet-unicode | | | `keyword` | Additional keywords | Newline-separated extra keywords passed to xgettext using –keyword. | | `keyword_exclusive` | Use keywords exclusively | When enabled, passes `--keyword` without a value to xgettext before the additional keyword, disabling all default keywords so that only the keyword specified above is recognized. | | `preset` | Meson preset | Built-in xgettext argument preset matching Meson gettext integration. The GLib preset adds the keyword and format-flag options used by Meson’s gettext helper.

#### Available choices:

| `glib` | GLib |
|----------|--------| | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Manual trigger](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-manual-trigger), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Updates the gettext template using Meson gettext conventions. This add-on updates the template configured in [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base). It is available for gettext PO components, and the component must define a template for new translations. The selected update frequency applies to automatic runs after repository refreshes. Installing or reconfiguring the add-on runs it immediately, and manual runs from add-on management or the API also bypass the frequency schedule. After a successful update, Weblate commits the changed template and reloads source strings. The template update does not update translation PO files by itself. Keep [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) installed when translation files should follow template changes automatically. The install form for this add-on can install that add-on, but existing add-on settings do not show that installation option again. #### Meson requirements This add-on requires **xgettext**; it does not invoke Meson. It follows Meson gettext conventions by reading `POTFILES` or `POTFILES.in` from the gettext directory and passing the GLib keyword and format-flag preset to **xgettext**. The gettext directory is the directory containing the template configured in [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base). It must contain `meson.build` and `POTFILES` or `POTFILES.in`. A Meson project `meson.build` must be present in that directory or one of its parent directories. If both `POTFILES` and `POTFILES.in` exist, `POTFILES` is used. An adjacent `POTFILES.skip` excludes listed source files from extraction. Configure this add-on from the existing Meson gettext setup. In most Meson projects, the gettext directory is `po/`, the template is named after the gettext domain, and `po/meson.build` calls Meson’s gettext helper. Use the same template path in [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base), for example `po/example.pot`, and keep `POTFILES` or `POTFILES.in` next to that `meson.build` file. Weblate does not read the source file list from `meson.build`. It uses `POTFILES` or `POTFILES.in`, matching Meson’s gettext convention. When the Meson project uses a non-default gettext directory or domain, mirror that layout in the component template path. ### Generate MO files * **Add-on ID:** `weblate.gettext.mo` * **Configuration:** | `path` | Path of generated MO file | If not specified, the location of the PO file will be used. | |----------|---------------------------------|----------------------------------------------------------------------------------| | `fuzzy` | Include strings needing editing | Strings needing editing (fuzzy) are typically not ready for use as translations. | * **Triggers:** [Repository pre-commit](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-pre-commit) Automatically generates a MO file for every changed PO file. The location of the generated MO file can be customized and the field for it uses [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup). #### NOTE If a translation is removed, its PO file will be deleted from the repository, but the MO file generated by this add-on will not. The MO file must be removed from the upstream manually. ### Update PO files to match POT (msgmerge) #### Versionchanged Changed in version 5.13: Settings configuration has been moved to [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). * **Add-on ID:** `weblate.gettext.msgmerge` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Updates all PO files (as configured by “File mask”) to match the POT file (as configured by “Template for new translations”) using msgmerge. This add-on is essential when working with gettext PO files where the POT (template) file is updated with new strings or changes to existing strings. When the POT file is updated in the repository, this add-on automatically merges those changes into all language PO files, ensuring that: * New translatable strings appear in all languages * Removed strings are marked as obsolete * Modified strings are marked as needing review (fuzzy) Most msgmerge command-line options can be set up through file format parameters configuration. Enable the `po_remove_obsolete` parameter to remove obsolete `#~` entries when PO files are saved. #### SEE ALSO * [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) * [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base) * **msgmerge** * [Does Weblate update translation files besides translations?](https://docs.weblate.org/en/latest/faq.md#faq-cleanup) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) ### Update POT file (Sphinx) #### Versionadded Added in version 5.17. * **Add-on ID:** `weblate.gettext.sphinx` * **Configuration:** | `interval` | Update frequency | How often the add-on should update the POT file when the component is refreshed.

#### Available choices:

| `daily` | Daily |
|-----------|---------|
| `weekly` | Weekly |
| `monthly` | Monthly | | |--------------------|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `normalize_header` | Normalize POT header | Updates gettext headers and replaces placeholder POT comments. | | `location_mode` | Source locations | Choose how extraction writes source locations to the POT file. Use this to keep locations in the template while omitting them from translated PO files.

#### Available choices:

| `file` | Use file format settings |
|----------|-----------------------------------|
| `keep` | Extract locations to the POT file |
| `omit` | Do not extract locations | | | `filter_mode` | Filtering | Optionally remove strings that are not useful to translate after Sphinx extraction.

#### Available choices:

| `none` | None |
|----------------|-----------------------|
| `weblate_docs` | Weblate documentation | | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Manual trigger](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-manual-trigger), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Updates the gettext template using Sphinx’s gettext builder without loading project configuration. This add-on updates the template configured in [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base). It is available for gettext PO components, and the component must define a template for new translations. The selected update frequency applies to automatic runs after repository refreshes. Installing or reconfiguring the add-on runs it immediately, and manual runs from add-on management or the API also bypass the frequency schedule. After a successful update, Weblate commits the changed template and reloads source strings. The template update does not update translation PO files by itself. Keep [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) installed when translation files should follow template changes automatically. The install form for this add-on can install that add-on, but existing add-on settings do not show that installation option again. #### Sphinx requirements This add-on requires **sphinx-build**, provided by the `sphinx` installation extra. The template for new translations must be a `.pot` file below a `locales` directory. The directory before `locales` is used as the Sphinx source directory and must contain `conf.py`. Extraction uses Weblate’s bundled Sphinx configuration and does not load the project configuration. Weblate runs the Sphinx gettext builder, normalizes source references to paths relative to the source directory, and copies the generated template back to the configured template path. ### Update POT file (xgettext) #### Versionadded Added in version 5.17. * **Add-on ID:** `weblate.gettext.xgettext` * **Configuration:** | `interval` | Update frequency | How often the add-on should update the POT file when the component is refreshed.

#### Available choices:

| `daily` | Daily |
|-----------|---------|
| `weekly` | Weekly |
| `monthly` | Monthly | | |---------------------|--------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `normalize_header` | Normalize POT header | Updates gettext headers and replaces placeholder POT comments. | | `location_mode` | Source locations | Choose how extraction writes source locations to the POT file. Use this to keep locations in the template while omitting them from translated PO files.

#### Available choices:

| `file` | Use file format settings |
|----------|-----------------------------------|
| `keep` | Extract locations to the POT file |
| `omit` | Do not extract locations | | | `data_dirs` | ITS data directories | Newline-separated repository-relative directories containing an its subdirectory, for example po for po/its. Earlier directories override later directories and bundled rules. | | `comment_mode` | Code comments | Choose whether xgettext should extract no comments, all comments, or only comments marked with a specific tag.

#### Available choices:

| `off` | Do not extract comments |
|----------|---------------------------|
| `all` | Extract all comments |
| `tagged` | Extract comments with tag | | | `comment_tag` | Comment tag | Tag passed to xgettext for comment extraction when using tagged comment mode. | | `checks` | xgettext checks | Additional xgettext validation checks to enable for extracted messages.

#### Available choices:

| `ellipsis-unicode` | ellipsis-unicode |
|----------------------|--------------------|
| `space-ellipsis` | space-ellipsis |
| `quote-unicode` | quote-unicode |
| `bullet-unicode` | bullet-unicode | | | `keyword` | Additional keywords | Newline-separated extra keywords passed to xgettext using –keyword. | | `keyword_exclusive` | Use keywords exclusively | When enabled, passes `--keyword` without a value to xgettext before the additional keyword, disabling all default keywords so that only the keyword specified above is recognized. | | `input_mode` | Input source | Choose whether xgettext should read source files from glob patterns or from a POTFILES/POTFILES.in manifest.

#### Available choices:

| `patterns` | Source file patterns |
|--------------|------------------------|
| `potfiles` | POTFILES manifest | | | `language` | xgettext language | Programming language passed to xgettext, for example Python or C. Leave blank to let xgettext guess the language from file extensions. | | `source_patterns` | Source file patterns | Newline-separated repository-relative glob patterns for files to extract with xgettext. | | `potfiles_path` | POTFILES path | Repository-relative path to POTFILES or POTFILES.in. Entries are resolved relative to the repository root. If present next to the manifest, POTFILES.skip excludes listed files from extraction. | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Manual trigger](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-manual-trigger), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Updates the gettext template using xgettext on selected source files. This add-on updates the template configured in [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base). It is available for gettext PO components, and the component must define a template for new translations. The selected update frequency applies to automatic runs after repository refreshes. Installing or reconfiguring the add-on runs it immediately, and manual runs from add-on management or the API also bypass the frequency schedule. After a successful update, Weblate commits the changed template and reloads source strings. The template update does not update translation PO files by itself. Keep [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) installed when translation files should follow template changes automatically. The install form for this add-on can install that add-on, but existing add-on settings do not show that installation option again. #### xgettext requirements This add-on requires **xgettext**. Configure either source file patterns or a `POTFILES` / `POTFILES.in` manifest. Source file patterns are repository-relative glob patterns and only matching repository files are passed to **xgettext**. Entries in `POTFILES` or `POTFILES.in` are resolved relative to the repository root. They must be relative paths, stay inside the repository, and point to existing files. Blank lines and lines starting with `#` are ignored. If a `POTFILES.skip` file exists next to the manifest, its entries are excluded from extraction. Automatic repository refresh runs are skipped unless the changed files match the configured source patterns, match files listed in the manifest, change a watched manifest, or change the add-on configuration. Start from the build-system extraction setup when configuring this add-on. Autotools projects usually keep gettext inputs in `po/POTFILES.in` and options such as the gettext domain and **xgettext** flags in `po/Makevars` or related `Makefile.am` files. Use manifest mode with the same `POTFILES.in` when its entries are plain repository-relative source paths, and copy relevant extraction behavior into the add-on settings, for example the language, comment extraction, checks, and additional keyword. For other build systems, use the source list or extraction command they already run as the source of truth. CMake, custom Makefiles, npm scripts, or project specific extraction scripts often call **xgettext** directly or generate an intermediate file list. Configure source patterns for simple layouts, or use manifest mode when the project maintains a plain file list. If a build-system manifest contains transformations or prefixes that are not file paths, convert it to plain repository-relative paths before using it as `POTFILES`. #### Mixed source formats and ITS rules Leave xgettext language blank to extract messages from different formats into the same POT. Include all inputs in the source patterns or `POTFILES`, for example: ```text common/messages.py qt/application.desktop qt/application.policy data/application.metainfo.xml ``` Desktop entries use the native **xgettext** parser. Weblate bundles ITS rules for Polkit policies, AppStream/MetaInfo, GSettings, GTK Builder, and Shared MIME Info. These rules are included in the Weblate package, including Docker installations; no additional system packages are required for these formats. The [Update POT file (Meson)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-meson) add-on uses the same rules. Extraction follows upstream gettext and ITS behavior. In particular, desktop extraction includes keys such as `Name`, `GenericName`, and `Comment`; Polkit rules select `description` and `message` elements without filtering by `gettext-domain`. Use untranslated policy sources: upstream Polkit rules also select elements carrying `xml:lang`. For custom XML formats or overrides, configure ITS data directories. Enter one repository-relative directory per line, in priority order. Each must contain an `its/` subdirectory with `.loc` locating rules and `.its` extraction rules. For example, enter `po` for `po/its/example.loc` and `po/its/example.its`, or `.` for `its/` at the repository root. In API add-on configuration, use a list: `"data_dirs": ["po", "data"]`. Earlier directories take precedence over later ones, followed by Weblate’s bundled rules and gettext’s system rules. The directories are passed through `GETTEXTDATADIRS`. Configure them explicitly even when using Meson; Weblate does not read `data_dirs` from `meson.build` or inherit an administrator’s `GETTEXTDATADIRS` environment variable. Rule directories and files must stay inside the repository and must not be symbolic links. A locating rule’s `target` must name an existing `.its` file in the same directory. DTDs, entity declarations, and external rule references are not supported. Weblate validates project-local rules before extraction and reports invalid rules as add-on errors. Changes, additions, or deletions in the configured `its/` directories trigger extraction even when source files have not changed. #### SEE ALSO [GNU gettext ITS rules](https://www.gnu.org/software/gettext/manual/html_node/ITS-Rules.html) and [locating rules](https://www.gnu.org/software/gettext/manual/html_node/Locating-Rules.html). ### Squash Git commits * **Add-on ID:** `weblate.git.squash` * **Configuration:** | `squash` | Commit squashing | #### Available choices:

| `all` | All commits into one |
|------------|------------------------|
| `language` | Per language |
| `file` | Per file |
| `author` | Per author | | |-------------------|--------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `append_trailers` | Append trailers to squashed commit message | Trailer lines are lines that look similar to RFC 822 e-mail headers, at the end of the otherwise free-form part of a commit message, such as ‘Co-authored-by: …’. | | `commit_message` | Commit message | This commit message will be used instead of the combined commit messages from the squashed commits. | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Repository post-commit](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-commit) Squash Git commits prior to pushing changes. #### HINT To avoid unnecessary conflicts, it is recommended to configure automatic receiving of upstream changes by webhooks or API, see [Updating repositories](https://docs.weblate.org/en/latest/admin/continuous.md#update-vcs). Git commits can be squashed prior to pushing changes in one of the following modes: * All commits into one * Per language * Per file * Per author Original commit messages are kept, but authorship is lost unless Per author is selected, or the commit message is customized to include it. The original commit messages can optionally be overridden with a custom commit message. Trailers (commit lines like `Co-authored-by: …`) can optionally be removed from the original commit messages and appended to the end of the squashed commit message. This also generates proper `Co-authored-by:` credit for every translator. ### Customize JSON output #### Versionchanged Changed in version 5.12: Avoid spaces after separators option added. #### Versionremoved Removed in version 5.13: Replaced by [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). ### Reset repository to upstream #### Versionadded Added in version 5.17. * **Add-on ID:** `weblate.hosted.reset` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily) Discards all changes in the Weblate repository each night. ### Format the Java properties file * **Add-on ID:** `weblate.properties.sort` * **Configuration:** | `case_sensitive` | Enable case-sensitive key sorting | | |--------------------|-------------------------------------|----| * **Triggers:** [Repository pre-commit](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-pre-commit) Formats and sorts the Java properties file. * Consolidates newlines to Unix ones. * Uppercase formatting of Unicode escape sequences (in case they are present). * Strips blank lines and comments. * Sorts the strings by the keys. * Drops duplicate strings. ### Stale comment removal * **Add-on ID:** `weblate.removal.comments` * **Configuration:** | `age` | Days to keep | | |---------|----------------|----| * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily) Set a timeframe for removal of comments. This can be useful to remove old comments which might have become outdated. Use with care as comments getting old does not mean they have lost their importance. ### Stale suggestion removal * **Add-on ID:** `weblate.removal.suggestions` * **Configuration:** | `age` | Days to keep | | |---------|------------------|--------------------------------------------------------------------------------------------------------------------------------| | `votes` | Voting threshold | Threshold for removal. Leave empty to remove suggestions regardless of votes. This field has no effect with voting turned off. | * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Daily](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-daily) Set a timeframe for removal of suggestions. Can be very useful in connection with suggestion voting (see [Peer review](https://docs.weblate.org/en/latest/workflows.md#peer-review)) to remove suggestions which don’t receive enough positive votes in a given timeframe. ### Update RESX files * **Add-on ID:** `weblate.resx.update` * **Configuration:** This add-on has no configuration. * **Triggers:** [Add-on installation](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-add-on-installation), [Repository post-update](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-repository-post-update) Update all translation files to match the monolingual upstream base file. Unused strings are removed, and new ones added as copies of the source string. #### HINT Use [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) if you only want to remove stale translation keys. #### SEE ALSO [Does Weblate update translation files besides translations?](https://docs.weblate.org/en/latest/faq.md#faq-cleanup) ### Slack Webhooks #### Versionadded Added in version 5.12. * **Add-on ID:** `weblate.webhook.slack` * **Configuration:** | `webhook_url` | Webhook URL | | |-----------------|--------------------------|------------------------------------------------------------------------------------------------------------------------------------| | `event_filter` | Change events to trigger | Choose which change events should trigger this add-on.
[Change events to trigger](https://docs.weblate.org/en/latest/admin/addons.md#addon-choice-event-filter) | | `events` | Selected change events | [Selected change events](https://docs.weblate.org/en/latest/admin/addons.md#addon-choice-events) | * **Triggers:** [Event change](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-event-change) Sends notification to a Slack channel based on selected events. #### WARNING The notification content might show HTML tags. This is a known issue that will be soon addressed; see [https://github.com/WeblateOrg/weblate/issues/15056](https://github.com/WeblateOrg/weblate/issues/15056). #### HINT To obtain a webhook URL, follow the steps outlined in the [Slack Incoming Webhooks documentation](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks) ### Webhook #### Versionadded Added in version 5.11. #### Versionchanged Changed in version 5.15: Compliance of the secret length with the specification is now validated. * **Add-on ID:** `weblate.webhook.webhook` * **Configuration:** | `webhook_url` | Webhook URL | | |-----------------|--------------------------|------------------------------------------------------------------------------------------------------------------------------------| | `secret` | Webhook secret | The Standard Webhooks secret is a base64 encoded string. | | `event_filter` | Change events to trigger | Choose which change events should trigger this add-on.
[Change events to trigger](https://docs.weblate.org/en/latest/admin/addons.md#addon-choice-event-filter) | | `events` | Selected change events | [Selected change events](https://docs.weblate.org/en/latest/admin/addons.md#addon-choice-events) | * **Triggers:** [Event change](https://docs.weblate.org/en/latest/admin/addons.md#addon-event-event-change) Sends notifications to external services based on selected events, following the Standard Webhooks specification. The request payload complies with the [Weblate Messaging](https://docs.weblate.org/en/latest/contributing/schemas.md#schema-messaging) schema. The `action` field uses the action name listed in [Selected change events](https://docs.weblate.org/en/latest/admin/addons.md#change-actions). The OpenAPI description can also be found at `/api/docs/`. Sample request body: ```json { "change_id": 99, "action": "Translation changed", "timestamp": "2019-08-24T14:15:22Z", "target": "Nazdar svete!", "old": "Nazdar!", "source": "Hello, world", "url": "/translate/project-slug/component-slug/cs/?checksum=46add148a53cab6f", "author": "author-username", "user": "user-username", "project": "project-slug", "component": "component-slug", "translation": "cs" } ``` Sample request body with categories: ```json { "change_id": 8910, "action": "Component renamed", "timestamp": "2025-06-11T07:15:09Z", "target": ["new-name"], "old": ["component-slug"], "url": "/projects/project-slug/parent-category/child-category/sub-category/component-slug/", "user": "testuser", "project": "project-slug", "component": "component-slug", "category": [ "sub-category", "child-category", "parent-category" ] } ``` Sample request headers: ```json { "webhook-id": "7f1c5477f6275a69af7b83236c20cb1a", "webhook-timestamp": "1748505623.044281", "webhook-signature": "v1,Ceo5qEr07ixe2NLpvHk3FH9bwy/WavXrAFQ/9tdO6mc=" } ``` The `webhook-signature` is a space separated list of HMAC signatures generated using the `secret` string, the request payload, the `webhook-timestamp`, and the `webhook-id`. This ensures the authenticity and integrity of the webhook request. The provided `secret` is a base64 encoded string between 24 bytes (192 bits) and 64 bytes (512 bits). It can be prefixed with `whsec_` for easy identification. To verify a request, you can use the `Webhook.verify` method from the `standardwebhooks` library or an implementation of the “Standard Webhooks Specification”. #### SEE ALSO * [Standard Webhooks Specification](https://github.com/standard-webhooks/standard-webhooks/blob/main/spec/standard-webhooks.md) * [Weblate Messaging](https://docs.weblate.org/en/latest/contributing/schemas.md#schema-messaging) * [Python library for Standard Webhooks](https://pypi.org/project/standardwebhooks/) The [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) mode Add as approved translation creates approved strings when reviews are enabled for the target language. If the project settings or a language workflow override disable reviews, it creates translated strings instead. The configured mode is preserved, including for project-wide and site-wide add-ons whose targets have different review settings. Configuring this mode requires the usual add-on management permission; it does not require the configuring user to be a reviewer. The [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) add-on stops with an error if the repository scan exceeds 100,000 paths or matching translation files would require more than 1,000,000 path-to-mask comparisons. The comparison limit is checked using the number of repository paths multiplied by the number of file masks. These fixed limits bound resource consumption when repository content determines the masks. When either limit is exceeded, discovery does not create or remove components. ## Obsolete add-ons ### Contributors in comment #### Versionremoved Removed in version 2026.10: Replaced by [Contributor comments](https://docs.weblate.org/en/latest/formats/gettext.md#gettext-contributor-comments). Existing installations of `weblate.gettext.authors` are migrated to the `gettext` value of the `po_contributor_comments` file format parameter for each affected PO component. This includes components covered by category-, project-, and site-wide installations. New components default to disabled unless their file format parameters are copied from another component. Remove `weblate.addons.gettext.GettextAuthorComments` from custom [`WEBLATE_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_ADDONS) lists and `weblate.gettext.authors` entries from [`DEFAULT_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ADDONS). Configure [Contributor comments](https://docs.weblate.org/en/latest/formats/gettext.md#gettext-contributor-comments) instead. ### Customize XML output #### Versionadded Added in version 4.15. #### Versionremoved Removed in version 5.13: Replaced by [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). ### Customize YAML output #### Versionremoved Removed in version 5.13: Replaced by [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). ## Common add-on parameters ### Machine translation engines #### Available choices: | `alibaba` | Alibaba | |------------------------------|-----------------------------------| | `aws` | Amazon Translate | | `anthropic` | Anthropic | | `apertium-apy` | Apertium APy | | `microsoft-translator` | Azure AI Translator | | `azure-openai` | Azure OpenAI | | `baidu` | Baidu | | `cyrtranslit` | CyrTranslit | | `deepl` | DeepL | | `glosbe` | Glosbe | | `google-translate-api-v3` | Google Cloud Translation Advanced | | `google-translate` | Google Cloud Translation Basic | | `ltengine` | LTEngine | | `libretranslate` | LibreTranslate | | `mistral` | Mistral | | `modernmt` | ModernMT | | `mymemory` | MyMemory | | `netease-sight` | Netease Sight | | `ollama` | Ollama | | `openai` | OpenAI | | `sap-translation-hub` | SAP Translation Hub | | `systran` | Systran | | `weblate` | Weblate | | `weblate-translation-memory` | Weblate Translation Memory | | `yandex` | Yandex | | `yandex-v2` | Yandex v2 | | `youdao-zhiyun` | Youdao Zhiyun | | `tmserver` | tmserver | ### File format #### Available choices: | `apple-xliff` | XLIFF 1.2 with Apple extensions | |-------------------------|----------------------------------------------------| | `appstore` | App store metadata files | | `arb` | ARB file | | `aresource` | Android String Resource | | `asciidoc` | AsciiDoc file | | `ass` | Advanced SubStation Alpha subtitle file | | `catkeys` | Haiku catkeys | | `cmp-resource` | Compose Multiplatform Resource | | `csv` | CSV file | | `csv-multi` | Multivalue CSV file | | `csv-simple` | Simple CSV file | | `dokuwiki` | DokuWiki text file | | `dtd` | DTD file | | `flatxml` | Flat XML file | | `fluent` | Fluent file | | `formatjs` | Format.JS JSON file | | `go-i18n-json` | go-i18n v1 JSON file | | `go-i18n-json-v2` | go-i18n v2 JSON file | | `go-i18n-toml` | go-i18n TOML file | | `gotext` | gotext JSON file | | `gwt` | GWT properties | | `html` | HTML file | | `i18next` | i18next JSON file v3 | | `i18nextv4` | i18next JSON file v4 | | `idml` | IDML file | | `ini` | INI file | | `islu` | Inno Setup INI file | | `joomla` | Joomla language file | | `json` | JSON file | | `json-nested` | JSON nested structure file | | `laravel` | Laravel PHP strings | | `markdown` | Markdown file | | `mdx` | MDX file | | `mediawiki` | MediaWiki text file | | `mi18n-lang` | @draggable/i18n lang file | | `moko-resource` | Mobile Kotlin Resource | | `nextcloud-json` | Nextcloud JSON file | | `odf` | OpenDocument file | | `php` | PHP strings | | `plainxliff` | XLIFF 1.2 translation file | | `po` | gettext PO file | | `po-mono` | gettext PO file (monolingual) | | `poxliff` | XLIFF 1.2 with gettext extensions | | `properties` | Java Properties | | `rc` | RC file | | `resjson` | RESJSON file | | `resourcedictionary` | ResourceDictionary file | | `resx` | .NET resource file | | `ruby-yaml` | Ruby YAML file | | `srt` | SubRip subtitle file | | `ssa` | SubStation Alpha subtitle file | | `strings` | iOS strings | | `stringsdict` | Stringsdict file | | `sub` | MicroDVD subtitle file | | `tbx` | TermBase eXchange file | | `toml` | TOML file | | `ts` | Qt Linguist translation file (version 2) | | `ts1` | Qt Linguist translation file (version 1) | | `txt` | Plain text file | | `webextension` | WebExtension JSON file | | `wxl` | WixLocalization file | | `xliff` | XLIFF 1.2 with placeables support | | `xliff2` | XLIFF 2.0 translation file | | `xliff2-placeables` | XLIFF 2.0 translation file with placeables support | | `xlsx` | Excel Open XML | | `xwiki-fullpage` | XWiki Full Page | | `xwiki-java-properties` | XWiki Java Properties | | `xwiki-page-properties` | XWiki Page Properties | | `yaml` | YAML file | ### Change events to trigger #### Available choices: | `content` | Translation content events | |-------------|------------------------------| | `all` | All change events | | `custom` | Selected change events | ### Selected change events The following change actions can appear in notification payloads. Fedora Messaging uses the identifier column in message topics, while webhook payloads use the name column in the `action` field. #### Available choices: | ID | Identifier | Name | Description | |-------|------------------------------------------|----------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `0` | `resource_updated` | Resource updated | A translation file was synchronized with its repository. | | `1` | `translation_completed` | Translation completed | A language translation became fully translated after an individual edit. Automatic translation, uploads, and bulk edits do not emit this event. | | `2` | `translation_changed` | Translation changed | An existing translation was edited by a user. | | `3` | `comment_added` | Comment added | A comment was added to a string. | | `4` | `suggestion_added` | Suggestion added | A translation suggestion was added. | | `5` | `translation_added` | Translation added | A previously untranslated string was translated by a user. | | `6` | `automatically_translated` | Automatically translated | A translation was added or changed by automatic translation. This is emitted instead of Translation added or Translation changed. | | `7` | `suggestion_accepted` | Suggestion accepted | A translation suggestion was accepted as the translation. | | `8` | `translation_reverted` | Translation reverted | A translation was restored to an earlier value. | | `9` | `translation_uploaded` | Translation uploaded | A translation was added or changed by a translation file upload. This is emitted instead of Translation added or Translation changed. | | `13` | `source_string_added` | Source string added | A source string was added outside repository or upload updates. | | `14` | `component_locked` | Component locked | A component was locked for translation. | | `15` | `component_unlocked` | Component unlocked | A component was unlocked for translation. | | `17` | `changes_committed` | Changes committed | Pending component changes were committed. | | `18` | `changes_pushed` | Changes pushed | Repository changes were pushed upstream. | | `19` | `repository_reset` | Repository reset | A repository was reset to its upstream state. | | `20` | `repository_merged` | Repository merged | Upstream repository changes were merged. | | `21` | `repository_rebased` | Repository rebased | Repository changes were rebased on upstream. | | `22` | `repository_merge_failed` | Repository merge failed | Merging upstream repository changes failed. | | `23` | `repository_rebase_failed` | Repository rebase failed | Rebasing repository changes failed. | | `24` | `parsing_failed` | Parsing failed | Weblate could not parse a translation file. | | `25` | `translation_removed` | Translation removed | A language translation was removed. | | `26` | `suggestion_removed` | Suggestion removed | A translation suggestion was removed. | | `27` | `translation_replaced` | Translation replaced | A translation was changed by a search-and-replace operation. This is emitted instead of Translation changed. | | `28` | `repository_push_failed` | Repository push failed | Pushing repository changes upstream failed. | | `29` | `suggestion_removed_during_cleanup` | Suggestion removed during cleanup | An obsolete translation suggestion was removed during cleanup. | | `30` | `source_string_changed` | Source string changed | A source string was edited in Weblate. | | `31` | `string_added` | String added | A new string was added in Weblate. | | `32` | `bulk_status_changed` | Bulk status changed | The translation state of one or more strings was changed in bulk. | | `33` | `visibility_changed` | Visibility changed | Project or component visibility was changed. | | `34` | `user_added` | User added | A user was granted access. | | `35` | `user_removed` | User removed | A user’s access was removed. | | `36` | `translation_approved` | Translation approved | A translation was approved during review. | | `37` | `marked_for_edit` | Marked for edit | A translation was marked as needing editing. | | `38` | `component_removed` | Component removed | A translation component was removed. | | `39` | `project_removed` | Project removed | A translation project was removed. | | `41` | `project_renamed` | Project renamed | A translation project was renamed. | | `42` | `component_renamed` | Component renamed | A translation component was renamed. | | `43` | `moved_component` | Moved component | A component was moved within a project. | | `45` | `contributor_joined` | Contributor joined | A user made their first contribution to a translation. | | `46` | `announcement_posted` | Announcement posted | An announcement was posted. | | `47` | `alert_triggered` | Alert triggered | A component alert was triggered. | | `48` | `language_added` | Language added | A language translation was added. | | `49` | `language_requested` | Language requested | A user requested a new language. | | `50` | `project_created` | Project created | A translation project was created. | | `51` | `component_created` | Component created | A translation component was created. | | `52` | `user_invited` | User invited | A user was invited to a project. | | `53` | `repository_notification_received` | Repository notification received | Weblate received a repository notification from a code host. | | `54` | `translation_replaced_file_by_upload` | Translation replaced file by upload | A translation file was replaced by an uploaded file. | | `55` | `license_changed` | License changed | Project or component license information changed. | | `56` | `contributor_license_agreement_changed` | Contributor license agreement changed | The contributor license agreement was changed. | | `57` | `screenshot_added` | Screenshot added | A screenshot was associated with a string. | | `58` | `screenshot_uploaded` | Screenshot uploaded | A screenshot image was uploaded. | | `59` | `string_updated_in_the_repository` | String updated in the repository | A string was changed while synchronizing from the repository. | | `60` | `add-on_installed` | Add-on installed | An add-on was installed. | | `61` | `add-on_configuration_changed` | Add-on configuration changed | An add-on’s configuration was changed. | | `62` | `add-on_uninstalled` | Add-on uninstalled | An add-on was uninstalled. | | `63` | `string_removed` | String removed | A string was removed from a translation. | | `64` | `comment_removed` | Comment removed | A string comment was removed. | | `65` | `comment_resolved` | Comment resolved | A string comment was marked as resolved. | | `66` | `explanation_updated` | Explanation updated | The explanation for a source string was updated. | | `67` | `category_removed` | Category removed | A component category was removed. | | `68` | `category_renamed` | Category renamed | A component category was renamed. | | `69` | `category_moved` | Category moved | A component category was moved. | | `70` | `saving_string_failed` | Saving string failed | Weblate could not save a changed string. | | `71` | `string_added_in_the_repository` | String added in the repository | A new string was found while synchronizing from the repository. | | `72` | `string_updated_in_the_upload` | String updated in the upload | A string was changed while processing an uploaded file. | | `73` | `string_added_in_the_upload` | String added in the upload | A new string was found while processing an uploaded file. | | `74` | `translation_updated_by_source_upload` | Translation updated by source upload | A translation was synchronized after uploading a source file. | | `75` | `component_translation_completed` | Component translation completed | All language translations in a component became fully translated after an individual edit. Automatic translation, uploads, and bulk edits do not emit this event. | | `76` | `applied_enforced_check` | Applied enforced check | A translation was marked as needing editing by an enforced check. | | `77` | `propagated_change` | Propagated change | A translation edit was propagated to another matching string. | | `78` | `file_uploaded` | File uploaded | A file was uploaded to a translation. | | `79` | `extra_flags_updated` | Extra flags updated | Additional source-string flags were updated. | | `80` | `font_uploaded` | Font uploaded | A font was uploaded. | | `81` | `font_changed` | Font changed | An uploaded font was changed. | | `82` | `font_removed` | Font removed | An uploaded font was removed. | | `83` | `forced_synchronization_of_translations` | Forced synchronization of translations | Translation files were forcibly synchronized with the repository. | | `84` | `forced_rescan_of_translations` | Forced rescan of translations | Translation files were forcibly rescanned for changes. | | `85` | `screenshot_removed` | Screenshot removed | A screenshot was removed. | | `86` | `label_added` | Label added | A label was added to a string. | | `87` | `label_removed` | Label removed | A label was removed from a string. | | `88` | `repository_cleanup` | Repository cleanup | The repository working tree was cleaned up. | | `89` | `source_string_added_in_the_upload` | Source string added in the upload | A source string was added while processing an uploaded file. | | `90` | `source_string_added_in_the_repository` | Source string added in the repository | A source string was added while synchronizing from the repository. | | `91` | `project_backed_up` | Project backed up | A project backup was created. | | `92` | `project_restored` | Project restored | A project was restored from a backup. | | `93` | `component_restored` | Component restored | A component was restored from a backup. | | `94` | `user_edit_reverted` | User edit reverted | All selected edits by a user were reverted. | | `95` | `project_setting_changed` | Project setting changed | A project setting was changed. | | `96` | `component_setting_changed` | Component setting changed | A component setting was changed. | | `97` | `user_access_changed` | User access changed | A user’s access permissions were changed. | | `98` | `workspace_created` | Workspace created | A workspace was created. | | `99` | `workspace_setting_changed` | Workspace setting changed | A workspace setting was changed. | | `100` | `project_moved` | Project moved | A project was moved into or out of a workspace. | | `101` | `remote_repository_updated` | Remote repository updated | A remote repository update was completed. | | `102` | `remote_repository_update_failed` | Remote repository update failed | Updating a remote repository failed. | | `103` | `alert_dismissed` | Alert dismissed | A component alert was dismissed. | | `104` | `alert_reopened` | Alert reopened | A component alert was reopened after its context changed. | ## Customizing list of add-ons The list of add-ons is configured by [`WEBLATE_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_ADDONS). To add another add-on, simply include the absolute class name in this setting. ## Writing add-on You can write your own add-ons too, create a subclass of [`weblate.addons.base.BaseAddon`](https://docs.weblate.org/en/latest/contributing/addons.md#weblate.addons.base.BaseAddon) to define the add-on metadata, and then implement a callback to do the processing. #### SEE ALSO [Developing add-ons](https://docs.weblate.org/en/latest/contributing/addons.md) ## Executing scripts from add-on Add-ons can also be used to execute external scripts. This used to be integrated in Weblate, but now you have to write some code to wrap your script with an add-on. ```python # Copyright © Michal Čihař # # SPDX-License-Identifier: GPL-3.0-or-later """Example pre commit script.""" from __future__ import annotations from typing import ClassVar from django.utils.translation import gettext_lazy from weblate.addons.events import AddonEvent from weblate.addons.scripts import BaseScriptAddon class ExamplePreAddon(BaseScriptAddon): # Event used to trigger the script events: ClassVar[set[AddonEvent]] = { AddonEvent.EVENT_PRE_COMMIT, } # Name of the addon, has to be unique name = "weblate.example.pre" # Verbose name and long description verbose = gettext_lazy("Execute script before commit") description = gettext_lazy("This add-on executes a script.") # Script to execute script = "/bin/true" # File to add in commit (for pre commit event) # does not have to be set add_file = "po/{{ language_code }}.po" ``` For installation instructions see [Custom quality checks, add-ons, automatic suggestions and auto-fixes](https://docs.weblate.org/en/latest/admin/customize.md#custom-addon-modules). The script is executed with the current directory set to the root of the VCS repository for any given component. Additionally, the following environment variables are available: ### WL_VCS Version control system used. ### WL_REPO Upstream repository URL. ### WL_PATH Absolute path to VCS repository. ### WL_BRANCH Repository branch configured in the current component. ### WL_FILEMASK File mask for current component. ### WL_TEMPLATE Filename of template for monolingual translations (can be empty). ### WL_NEW_BASE Filename of the file used for creating new translations (can be empty). ### WL_FILE_FORMAT File format used in current component. ### WL_LANGUAGE Language of currently processed translation (not available for component-level hooks). ### WL_PREVIOUS_HEAD Previous HEAD after update (only available after running the post-update hook). ### WL_COMPONENT_SLUG Component slug used to construct URL. ### WL_PROJECT_SLUG Project slug used to construct URL. ### WL_COMPONENT_NAME Component name. ### WL_PROJECT_NAME Project name. ### WL_COMPONENT_URL Component URL. ### WL_ENGAGE_URL Project engage URL. #### SEE ALSO [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) ### Post-update repository processing Can be used to update translation files when the VCS upstream source changes. To achieve this, please remember Weblate only sees files committed to the VCS, so you need to commit changes as a part of the script. For example with Gulp you can do it using following code: ```sh #! /bin/sh gulp --gulpfile gulp-i18n-extract.js git commit -m 'Update source strings' src/languages/en.lang.json ``` ### Pre-commit processing of translations Use the commit script to automatically change a translation before it is committed to the repository. It is passed as a single parameter consisting of the filename of a current translation. ### Add-on activity logging Add-on activity log keeps track of the add-on execution and can be used to keep track of add-on activity. Each entry records whether processing is pending, successful, failed, or skipped. Skipped entries include the reason the add-on did not run, such as an incompatible component, no relevant changes, or a configured schedule that is not due yet. A successful entry can still mean that the add-on checked its inputs but found nothing to change. For scope-wide add-ons that process components independently, the activity log contains a separate entry for each component. The logs can be pruned after a certain time interval by configuring the [`ADDON_ACTIVITY_LOG_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ADDON_ACTIVITY_LOG_EXPIRY). # admin/admin.md # Management interface The management interface offer administration settings under the `/manage/` URL. It is available for users signed in with admin privileges, accessible by using the wrench icon top right: ![image](screenshots/support.webp) It includes basic overview of your Weblate: * Support status, see [Getting support for Weblate](https://docs.weblate.org/en/latest/admin/support.md). * Backups, see [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md). * Shared translation memory, see [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md). * [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance) to review Weblate health and length of Celery queues. * SSH keys management, see [SSH repositories](https://docs.weblate.org/en/latest/vcs.md#ssh-repos). * Alerts overview for all components, see [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts). * Users and teams, see [Site-wide access control](https://docs.weblate.org/en/latest/admin/access.md#custom-acl); site administrators can also [clean up user contributions](https://docs.weblate.org/en/latest/admin/access.md#cleanup-user-contributions). * [Appearance customization](https://docs.weblate.org/en/latest/admin/admin.md#manage-appearance). * Configure [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup). * Configure site-wide addons, see [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons). ## Performance report This page provides an overview of Weblate configuration and performance status. Configuration errors indicate issues present in your environment. It covers missing optional dependencies (see [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps)), configuration issues or delayed processing of background tasks (see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery)). System checks lists possible configuration issues. These can be silenced using [`SILENCED_SYSTEM_CHECKS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SILENCED_SYSTEM_CHECKS), see also [Deployment checklist](https://docs.djangoproject.com/en/stable/howto/deployment/checklist/). Celery queues provides overview of Celery queues. These typically should be close to zero. The same can be obtained on the command line using [`celery_queues`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-celery_queues). HTTP environment allows you to see HTTP environment observed by Weblate. This is useful when debugging reverse proxy configuration, see [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy). HTTP headers shows complete HTTP request headers to provide additional information. System encoding should list `UTF-8` encoding in all processes. This needs to be configured in your system, see [System locales and encoding](https://docs.weblate.org/en/latest/admin/install.md#production-encoding). Connectivity shows latencies to the database, cache, Celery, and the filesystems used for data and cache directories. This might be useful to diagnose connectivity and storage performance issues. ![image](screenshots/performance-report.webp) ## Appearance customization #### Versionadded Added in version 4.4. #### NOTE The colors are currently used in both dark and light theme, so be careful when choosing them. Colors, fonts, and page appearance can be customized here. ![image](screenshots/appearance-settings.webp) If you are looking for more customization, see [Customizing Weblate](https://docs.weblate.org/en/latest/admin/customize.md). ## The Django admin interface #### WARNING Use with caution as this is a low level interface. You should not need it in most cases as most things are comfortably approachable through Weblate UI or API. Here you can manage objects stored in the database, such as users, translations and other settings. In the Reports section, you can check the status of your site, tweak it for [Production setup](https://docs.weblate.org/en/latest/admin/install.md#production), or manage SSH keys used to access [Accessing repositories](https://docs.weblate.org/en/latest/vcs.md#vcs-repos). Use the Weblate UI or API for normal operations such as creating projects, creating components, managing users, or posting announcements. ### Project and component creation Projects and components are created from the regular Weblate UI. Projects serve as containers for translation components, and components can use bilingual or monolingual translation files. See [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) and [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for the available settings, and [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) for how bilingual and monolingual formats differ. #### SEE ALSO * [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects) * [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) # admin/announcements.md # Announcements #### Versionchanged Changed in version 4.0: In prior releases this feature was called whiteboard messages. Provide info to your translators by posting announcements, site-wide, per project, category, component, or language. Announce the purpose, deadlines, status, or specify targets for translation. The users will receive notification on the announcements for watched projects (unless they opt out). This can be useful for various things from announcing the purpose of the website to specifying targets for translations. The announcements can posted on each level in the Operations menu, using Post announcement: ![Image showing an announcement that reads: "Translations will be used only if they reach 60%" atop the dashboard view.](screenshots/announcement-project.webp) The announcements are shown based on their specified context: No context specified > Shown on dashboard (landing page). Project specified > Shown within the project, including all its components and translations. Project and language specified > Shown within the project for the specified language, including all its > translations. Category specified > Shown within the category, including all its components and translations. Category and language specified > Shown on the category-language page and for translations in that language > within the category and its subcategories. Post these announcements from > the category-language page using Operations > > Post announcement. > This also applies to shared components linked into the category. Posting > and deleting these announcements requires permission for the category’s > project and language. Announcements from linked categories are only shown > to users who can access the category’s project. Component specified > Shown for a given component and all its translations. Language specified > Shown on the language overview and all translations in that language. This is how it looks on the language overview page: ![Image showing an announcement that reads: "Czech translators rock!" atop the Czech language overview.](screenshots/announcement-language.webp) # admin/auth.md # Authentication ## User registration The default setup for Weblate is to use python-social-auth, a form on the website to handle registration of new users. After confirming their e-mail a new user can contribute or authenticate by using one of the third party services. You can also turn off registration of new users using [`REGISTRATION_OPEN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_OPEN). The authentication attempts are subject to [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit). ## Authentication backends Weblate relies on Django for the authentication. This includes built-in password-based authentication, social authentication, and third-party authentication backends for Django. Using Django’s built-in authentication means you can import the user database of other Django-based projects (see [Migrating from Pootle](https://docs.weblate.org/en/latest/admin/upgrade.md#pootle-migration)). #### SEE ALSO [Authentication settings](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-auth) describes how to configure authentication in the official Docker image. ## Social authentication Thanks to [Welcome to Python Social Auth’s documentation!](https://python-social-auth.readthedocs.io/en/latest/index.html), Weblate support authentication using many third party services such as GitLab, Ubuntu, Fedora, etc. Please check their documentation for generic configuration instructions in [Django Framework](https://python-social-auth.readthedocs.io/en/latest/configuration/django.html). #### NOTE By default, Weblate relies on third-party authentication services to provide a validated e-mail address. If some of the services you want to use don’t support this, please enforce e-mail validation on the Weblate side by configuring FORCE_EMAIL_VALIDATION for them. For example: ```python SOCIAL_AUTH_OPENSUSE_FORCE_EMAIL_VALIDATION = True ``` #### SEE ALSO [Pipeline](https://python-social-auth.readthedocs.io/en/latest/pipeline.html) Enabling individual backends is quite easy, it’s just a matter of adding an entry to the [`AUTHENTICATION_BACKENDS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-AUTHENTICATION_BACKENDS) setting and possibly adding keys needed for a given authentication method. Please note that some backends do not provide user e-mail by default, you have to request it explicitly, otherwise Weblate will not be able to properly credit contributions users make. #### HINT Most of the authentication backends require HTTPS. Once HTTPS is enabled in your web server please configure Weblate to report it properly using [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS), or by [`WEBLATE_ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ENABLE_HTTPS) in the Docker container. #### SEE ALSO [Python Social Auth backend](https://python-social-auth.readthedocs.io/en/latest/backends/index.html) ### OpenID authentication For OpenID-based services it’s usually just a matter of enabling them. The following section enables OpenID authentication for OpenSUSE, Fedora and Ubuntu: ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.email.EmailAuth", "social_core.backends.suse.OpenSUSEOpenId", "social_core.backends.ubuntu.UbuntuOpenId", "social_core.backends.fedora.FedoraOpenId", "weblate.accounts.auth.WeblateUserBackend", ) ``` #### SEE ALSO [OpenID](https://python-social-auth.readthedocs.io/en/latest/backends/openid.html) ### GitHub authentication You need to register an OAuth application on GitHub and then tell Weblate all its secrets: ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.github.GithubOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Social auth backends setup SOCIAL_AUTH_GITHUB_KEY = "GitHub Client ID" SOCIAL_AUTH_GITHUB_SECRET = "GitHub Client Secret" SOCIAL_AUTH_GITHUB_SCOPE = ["user:email"] ``` The GitHub should be configured to have callback URL as `https://WEBLATE SERVER/accounts/complete/github/`. There are similar authentication backends for GitHub for Organizations and GitHub for Teams. Their settings are named `SOCIAL_AUTH_GITHUB_ORG_*` and `SOCIAL_AUTH_GITHUB_TEAM_*`, and they require additional setting of the scope - `SOCIAL_AUTH_GITHUB_ORG_NAME` or `SOCIAL_AUTH_GITHUB_TEAM_ID`. Their callback URLs are `https://WEBLATE SERVER/accounts/complete/github-org/` and `https://WEBLATE SERVER/accounts/complete/github-teams/`. #### NOTE Weblate provided callback URL during the authentication includes configured domain. In case you get errors about URL mismatch, you might want to fix this, see [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site). #### SEE ALSO [GitHub](https://python-social-auth.readthedocs.io/en/latest/backends/github.html) ### GitHub EE authentication You need to register an OAuth App on GitHub EE and then tell Weblate all its secrets: ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.github_enterprise.GithubEnterpriseOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Social auth backends setup SOCIAL_AUTH_GITHUB_ENTERPRISE_KEY = "GitHub OAuth App Client ID" SOCIAL_AUTH_GITHUB_ENTERPRISE_SECRET = "GitHub OAuth App Client Secret" SOCIAL_AUTH_GITHUB_ENTERPRISE_URL = "https://git.example.com/" SOCIAL_AUTH_GITHUB_ENTERPRISE_API_URL = "https://git.example.com/api/v3/" SOCIAL_AUTH_GITHUB_ENTERPRISE_SCOPE = ["user:email"] ``` The GitHub OAuth App should be configured to have callback URL as `https://WEBLATE SERVER/accounts/complete/github-enterprise/`. Instead GitHub OAuth App, GitHub App can also be used. With GitHub App permissions can be granted on repositories, organisation and/or user level. If you decide to use GitHub App, you need to enable Access: Read-only permission for Users - and Organisation - . #### NOTE Weblate provided callback URL during the authentication includes configured domain. In case you get errors about URL mismatch, you might want to fix this, see [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site). #### SEE ALSO [Backend classes](https://python-social-auth.readthedocs.io/en/latest/backends/github_enterprise.html) ### Bitbucket authentication You need to register an application on Bitbucket and then tell Weblate all its secrets: ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.bitbucket.BitbucketOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Social auth backends setup SOCIAL_AUTH_BITBUCKET_OAUTH2_KEY = "Bitbucket Client ID" SOCIAL_AUTH_BITBUCKET_OAUTH2_SECRET = "Bitbucket Client Secret" SOCIAL_AUTH_BITBUCKET_OAUTH2_VERIFIED_EMAILS_ONLY = True ``` #### NOTE Weblate provided callback URL during the authentication includes configured domain. In case you get errors about URL mismatch, you might want to fix this, see [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site). #### SEE ALSO [Bitbucket](https://python-social-auth.readthedocs.io/en/latest/backends/bitbucket.html) ### Google OAuth 2 To use Google OAuth 2, you need to register an OAuth application at <[https://console.developers.google.com/](https://console.developers.google.com/)>. The redirect URL is `https://WEBLATE SERVER/accounts/complete/google-oauth2/`. ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.google.GoogleOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Social auth backends setup SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "Client ID" SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "Client secret" ``` #### NOTE Weblate provided callback URL during the authentication includes configured domain. In case you get errors about URL mismatch, you might want to fix this, see [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site). #### SEE ALSO [Google](https://python-social-auth.readthedocs.io/en/latest/backends/google.html) ### Facebook OAuth 2 As per usual with OAuth 2 services, you need to register your application with Facebook. Once this is done, you can set up Weblate to use it: The redirect URL is `https://WEBLATE SERVER/accounts/complete/facebook/`. ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.facebook.FacebookOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Social auth backends setup SOCIAL_AUTH_FACEBOOK_KEY = "key" SOCIAL_AUTH_FACEBOOK_SECRET = "secret" SOCIAL_AUTH_FACEBOOK_SCOPE = ["email", "public_profile"] ``` #### NOTE Weblate provided callback URL during the authentication includes configured domain. In case you get errors about URL mismatch, you might want to fix this, see [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site). #### SEE ALSO [Facebook](https://python-social-auth.readthedocs.io/en/latest/backends/facebook.html) ### GitLab OAuth 2 For using GitLab OAuth 2, you need to register an application at <[https://gitlab.com/profile/applications](https://gitlab.com/profile/applications)>. The redirect URL is `https://WEBLATE SERVER/accounts/complete/gitlab/` and ensure you mark the read_user scope. ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.gitlab.GitLabOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Social auth backends setup SOCIAL_AUTH_GITLAB_KEY = "Application ID" SOCIAL_AUTH_GITLAB_SECRET = "Secret" SOCIAL_AUTH_GITLAB_SCOPE = ["read_user"] # If you are using your own GitLab # SOCIAL_AUTH_GITLAB_API_URL = 'https://gitlab.example.com/' ``` #### NOTE Weblate provided callback URL during the authentication includes configured domain. In case you get errors about URL mismatch, you might want to fix this, see [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site). #### SEE ALSO [GitLab](https://python-social-auth.readthedocs.io/en/latest/backends/gitlab.html) ### Gitea OAuth 2 For using Gitea OAuth 2, you need to register an application at `https://GITEA SERVER/user/settings/applications`. The redirect URL is `https://WEBLATE SERVER/accounts/complete/gitea/`. ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.gitea.GiteaOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Social auth backends setup SOCIAL_AUTH_GITEA_KEY = "" SOCIAL_AUTH_GITEA_SECRET = "" # If you are using your own Gitea SOCIAL_AUTH_GITEA_API_URL = "https://gitea.example.com/" ``` #### NOTE Weblate provided callback URL during the authentication includes configured domain. In case you get errors about URL mismatch, you might want to fix this, see [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site). #### NOTE The configuration above also works with Forgejo; for an example of production deployment with Forgejo, see [Codeberg Translate](https://translate.codeberg.org). #### SEE ALSO [Gitea](https://python-social-auth.readthedocs.io/en/latest/backends/gitea.html) ### Microsoft Entra ID Azure Active Directory (Azure AD) is now Microsoft Entra ID. Weblate keeps the `azuread-oauth2` and `azuread-tenant-oauth2` backend names for compatibility with the underlying Python Social Auth backends and existing deployments. Weblate can be configured to use common or specific tenants for authentication. The redirect URL is `https://WEBLATE SERVER/accounts/complete/azuread-oauth2/` for common and `https://WEBLATE SERVER/accounts/complete/azuread-tenant-oauth2/` for tenant-specific authentication. You will need following: * *Application (client) ID* is available on the app registration overview in the Microsoft Entra admin center. *Object ID* is not used in Weblate. * *Directory (tenant) ID* is needed for tenant scoped authentication, what is usually desired. * *Secret value* is displayed once you create a client secret for the app registration. *Secret ID* is not used in Weblate. ```python # Microsoft Entra ID common # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.azuread.AzureADOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # OAuth2 keys SOCIAL_AUTH_AZUREAD_OAUTH2_KEY = "" SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET = "" ``` ```python # Microsoft Entra ID with Tenant # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.azuread_tenant.AzureADTenantOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Application (client) ID SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY = "" # Secret value SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET = "" # Directory (tenant) ID SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID = "" ``` #### NOTE Weblate provided callback URL during the authentication includes configured domain. In case you get errors about URL mismatch, you might want to fix this, see [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site). #### SEE ALSO [Microsoft Azure Active Directory](https://python-social-auth.readthedocs.io/en/latest/backends/azuread.html) ### Slack For using Slack OAuth 2, you need to register an application at <[https://api.slack.com/apps](https://api.slack.com/apps)>. The redirect URL is `https://WEBLATE SERVER/accounts/complete/slack/`. ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.slack.SlackOAuth2", "social_core.backends.email.EmailAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Social auth backends setup SOCIAL_AUTH_SLACK_KEY = "" SOCIAL_AUTH_SLACK_SECRET = "" ``` #### NOTE Weblate provided callback URL during the authentication includes configured domain. In case you get errors about URL mismatch, you might want to fix this, see [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site). #### SEE ALSO [Slack](https://python-social-auth.readthedocs.io/en/latest/backends/slack.html) ### Overriding authentication method names and icons You can override the authentication method display name and icon using settings as `SOCIAL_AUTH__IMAGE` and `SOCIAL_AUTH__TITLE`. For example overriding naming for Auth0 would look like: ```python SOCIAL_AUTH_AUTH0_IMAGE = "custom.svg" SOCIAL_AUTH_AUTH0_TITLE = "Custom auth" ``` ### Turning off password authentication E-mail and password authentication can be turned off by removing `social_core.backends.email.EmailAuth` from [`AUTHENTICATION_BACKENDS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-AUTHENTICATION_BACKENDS). Always keep `weblate.accounts.auth.WeblateUserBackend` there, it is needed for core Weblate functionality. Disabling e-mail authentication will disable all e-mail related functionality – user invitation or password reset feature. #### TIP You can still use password authentication for the admin interface, for users you manually create there. Just navigate to `/admin/login/`. For example authentication using only the openSUSE Open ID provider can be achieved using the following: ```python # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.suse.OpenSUSEOpenId", "weblate.accounts.auth.WeblateUserBackend", ) ``` ## Password authentication The default `settings.py` comes with a reasonable set of [`AUTH_PASSWORD_VALIDATORS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-AUTH_PASSWORD_VALIDATORS) that ensures that weak passwords are not allowed. You can customize this setting to match your password policy. Additionally you can also install [django-zxcvbn-password-validator](https://github.com/Pierre-Sassoulas/django-zxcvbn-password-validator) which gives quite realistic estimates of password difficulty and allows rejecting passwords below a certain threshold. #### SEE ALSO * [`PASSWORD_MINIMAL_STRENGTH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PASSWORD_MINIMAL_STRENGTH) * [`WEBLATE_MIN_PASSWORD_SCORE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_MIN_PASSWORD_SCORE) * [Password security](https://docs.weblate.org/en/latest/security/passwords.md) ## SAML authentication #### Versionadded Added in version 4.1.1. #### Versionchanged Changed in version 5.12: The dependencies for SAML authentication are no longer included in the default `all` extras. You need to include `saml` while installing the Weblate package using pip (`uv pip install Weblate[all,saml]`). Please follow the Python Social Auth instructions for configuration. Notable differences: * Weblate supports single IDP which has to be called `weblate` in `SOCIAL_AUTH_SAML_ENABLED_IDPS`. * The SAML XML metadata URL is `/accounts/metadata/saml/`, which is also an entity ID. * The sign-in URL is `/accounts/complete/saml/` (also known as ACS URL). * Following settings are automatically filled in: `SOCIAL_AUTH_SAML_SP_ENTITY_ID`, `SOCIAL_AUTH_SAML_TECHNICAL_CONTACT`, `SOCIAL_AUTH_SAML_SUPPORT_CONTACT` Example configuration: ```default # Authentication configuration AUTHENTICATION_BACKENDS = ( "social_core.backends.email.EmailAuth", "social_core.backends.saml.SAMLAuth", "weblate.accounts.auth.WeblateUserBackend", ) # Social auth backends setup SOCIAL_AUTH_SAML_SP_ENTITY_ID = f"https://{SITE_DOMAIN}/accounts/metadata/saml/" SOCIAL_AUTH_SAML_SP_PUBLIC_CERT = "-----BEGIN CERTIFICATE-----" SOCIAL_AUTH_SAML_SP_PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----" SOCIAL_AUTH_SAML_ENABLED_IDPS = { "weblate": { "entity_id": "https://idp.testshib.org/idp/shibboleth", "url": "https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO", "x509cert": "MIIEDjCCAvagAwIBAgIBADA ... 8Bbnl+ev0peYzxFyF5sQA==", } } SOCIAL_AUTH_SAML_ORG_INFO = { "en-US": { "name": "example", "displayname": "Example Inc.", "url": "http://example.com" } } SOCIAL_AUTH_SAML_TECHNICAL_CONTACT = { "givenName": "Tech Gal", "emailAddress": "technical@example.com" } SOCIAL_AUTH_SAML_SUPPORT_CONTACT = { "givenName": "Support Guy", "emailAddress": "support@example.com" } ``` You can generate a new pair of keys using: ```sh openssl req -newkey rsa:4096 -new -x509 -days 3652 -nodes -out saml.crt -keyout saml.key ``` The default configuration extracts user details from following attributes, configure your IdP to provide them: | Attribute | SAML URI reference | |-------------|-------------------------------------| | Full name | `urn:oid:2.5.4.3` | | First name | `urn:oid:2.5.4.42` | | Last name | `urn:oid:2.5.4.4` | | E-mail | `urn:oid:0.9.2342.19200300.100.1.3` | | Username | `urn:oid:0.9.2342.19200300.100.1.1` | When configuring Weblate SP in your IdP, it is recommended to choose persistent Name ID format. #### HINT Some identity providers (such as Microsoft Entra ID with multi-factor authentication) require disabling the default `requestedAuthnContext` in the SAML security configuration: ```python SOCIAL_AUTH_SAML_SECURITY_CONFIG = {"requestedAuthnContext": False} ``` In Docker, set [`WEBLATE_SAML_SECURITY_CONFIG`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SAML_SECURITY_CONFIG) instead. #### HINT The example above and the Docker image define an IdP called `weblate`. You might need to configure this string as Relay in your IdP. #### NOTE Weblate authentication relies on the `RelayState` parameter to be passed through the authentication process. This needs to be configured with some identity providers: * [How to Send a Custom RelayState with Okta](https://support.okta.com/help/s/article/How-to-send-a-custom-relaystate-to-application-through-idp-initiated-authentication-urls) #### SEE ALSO * [Configuring SAML in Docker](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-saml) * [SAML](https://python-social-auth.readthedocs.io/en/latest/backends/saml.html) ## LDAP authentication LDAP authentication can be best achieved using the django-auth-ldap package. You can install it via usual means: ```sh # Using PyPI uv pip install 'django-auth-ldap>=1.3.0' # Using apt-get apt-get install python-django-auth-ldap ``` #### HINT This package is included in the Docker container, see [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md). #### NOTE There are some incompatibilities in the Python LDAP 3.1.0 module, which might prevent you from using that version. If you get error [AttributeError: ‘module’ object has no attribute ‘_trace_level’](https://github.com/python-ldap/python-ldap/issues/226), downgrading python-ldap to 3.0.0 might help. Once you have the package installed, you can hook it into the Django authentication: ```python # Add LDAP backed, keep Django one if you want to be able to sign in # even without LDAP for admin account AUTHENTICATION_BACKENDS = ( "django_auth_ldap.backend.LDAPBackend", "weblate.accounts.auth.WeblateUserBackend", ) # LDAP server address AUTH_LDAP_SERVER_URI = "ldaps://ldap.example.net" # DN to use for authentication AUTH_LDAP_USER_DN_TEMPLATE = "cn=%(user)s,o=Example" # Depending on your LDAP server, you might use a different DN # like: # AUTH_LDAP_USER_DN_TEMPLATE = 'ou=users,dc=example,dc=com' # List of attributes to import from LDAP upon sign in # Weblate stores full name of the user in the full_name attribute AUTH_LDAP_USER_ATTR_MAP = { "full_name": "name", # Use the following if your LDAP server does not have full name # Weblate will merge them later # 'first_name': 'givenName', # 'last_name': 'sn', # Email is required for Weblate (used in VCS commits) "email": "mail", } # Optional: route "Forgot your password?" to your LDAP self-service page PASSWORD_RESET_URL = "https://id.example.net/password-reset/" # Hide the registration form REGISTRATION_OPEN = False ``` #### NOTE You should remove `'social_core.backends.email.EmailAuth'` from the [`AUTHENTICATION_BACKENDS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-AUTHENTICATION_BACKENDS) setting, otherwise users will be able to set their password in Weblate, and authenticate using that. Keeping `'weblate.accounts.auth.WeblateUserBackend'` is still needed in order to make permissions and facilitate anonymous users. It will also allow you to sign in using a local admin account, if you have created it (e.g. by using [`createadmin`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-createadmin)). ### Using bind password If you can not use direct bind for authentication, you will need to use search, and provide a user to bind for the search. For example: ```python import ldap from django_auth_ldap.config import LDAPSearch AUTH_LDAP_BIND_DN = "" AUTH_LDAP_BIND_PASSWORD = "" AUTH_LDAP_USER_SEARCH = LDAPSearch( "ou=users,dc=example,dc=com", ldap.SCOPE_SUBTREE, "(uid=%(user)s)" ) ``` ### Active Directory integration ```python import ldap from django_auth_ldap.config import LDAPSearch, NestedActiveDirectoryGroupType AUTH_LDAP_BIND_DN = "CN=ldap,CN=Users,DC=example,DC=com" AUTH_LDAP_BIND_PASSWORD = "password" # User and group search objects and types AUTH_LDAP_USER_SEARCH = LDAPSearch( "CN=Users,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)" ) # Make selected group a superuser in Weblate AUTH_LDAP_USER_FLAGS_BY_GROUP = { # is_superuser means user has all permissions "is_superuser": "CN=weblate_AdminUsers,OU=Groups,DC=example,DC=com", } # Map groups from AD to Weblate AUTH_LDAP_GROUP_SEARCH = LDAPSearch( "OU=Groups,DC=example,DC=com", ldap.SCOPE_SUBTREE, "(objectClass=group)" ) AUTH_LDAP_GROUP_TYPE = NestedActiveDirectoryGroupType() AUTH_LDAP_FIND_GROUP_PERMS = True # Optionally enable group mirroring from LDAP to Weblate # AUTH_LDAP_MIRROR_GROUPS = True ``` #### SEE ALSO * [Django Authentication Using LDAP](https://django-auth-ldap.readthedocs.io/en/latest/index.html) * [Authentication](https://django-auth-ldap.readthedocs.io/en/latest/authentication.html) ## CAS authentication CAS authentication can be achieved using a package such as [Django CAS NG](https://github.com/django-cas-ng/django-cas-ng). Step one is disclosing the e-mail field of the user via CAS. This has to be configured on the CAS server itself, and requires you run at least CAS v2 since CAS v1 doesn’t support attributes at all. Step two is updating Weblate to use your CAS server and attributes. To install [Django CAS NG](https://github.com/django-cas-ng/django-cas-ng): ```sh uv pip install django-cas-ng ``` Once you have the package installed you can hook it up to the Django authentication system by modifying the `settings.py` file: ```python # Add CAS backed, keep the Django one if you want to be able to sign in # even without LDAP for the admin account AUTHENTICATION_BACKENDS = ( "django_cas_ng.backends.CASBackend", "weblate.accounts.auth.WeblateUserBackend", ) # CAS server address CAS_SERVER_URL = "https://cas.example.net/cas/" # Add django_cas_ng somewhere in the list of INSTALLED_APPS INSTALLED_APPS = (..., "django_cas_ng") ``` Finally, a signal can be used to map the e-mail field to the user object. For this to work you have to import the signal from the django-cas-ng package and connect your code with this signal. Doing this in settings file can cause problems, therefore it’s suggested to put it: - In your app config’s [`django.apps.AppConfig.ready()`](https://docs.djangoproject.com/en/stable/ref/applications/#django.apps.AppConfig.ready) method - In the project’s `urls.py` file (when no models exist) ```python from django_cas_ng.signals import cas_user_authenticated from django.dispatch import receiver @receiver(cas_user_authenticated) def update_user_email_address(sender, user=None, attributes=None, **kwargs): # If your CAS server does not always include the email attribute # you can wrap the next two lines of code in a try/catch block. user.email = attributes["email"] user.save() ``` ## Configuring third party Django authentication Generally any Django authentication plugin should work with Weblate. Just follow the instructions for the plugin, just remember to keep the Weblate user backend installed. #### SEE ALSO * [LDAP authentication](https://docs.weblate.org/en/latest/admin/auth.md#ldap-auth) * [CAS authentication](https://docs.weblate.org/en/latest/admin/auth.md#cas-auth) Typically the installation will consist of adding an authentication backend to [`AUTHENTICATION_BACKENDS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-AUTHENTICATION_BACKENDS) and installing an authentication app (if there is any) into [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS): ```python AUTHENTICATION_BACKENDS = ( # Add authentication backend here "weblate.accounts.auth.WeblateUserBackend", ) INSTALLED_APPS += ( # Install authentication app here ) ``` # Two-factor authentication #### Versionadded Added in version 5.7. #### HINT Two-factor authentication adds another layer of security to your account by requiring more than just a password to sign in. Weblate supports the following second factors: Security keys (WebAuthn) : Both, Passkeys and security keys are supported.
Passkeys validate your identity using touch, facial recognition, a device password, or a PIN as they include user verification.
Security keys are WebAuthn credentials that can only be used as a second factor of authentication, and these only validate user presence.
When signing in on a new computer or in a different browser, your passkey might not be available. Use a device where the passkey is available, or connect your registered security key. A verification error can mean that the request timed out, was canceled, or that the credential is unavailable; it does not identify the exact cause.
You can also select another configured verification method on the sign-in page, such as Use recovery codes. If you cannot use any configured method, contact the site administrator for help. Authenticator apps (TOTP) : Authenticator apps and browser extensions like Aegis, Bitwarden, Google Authenticator, 1Password, Authy, Microsoft Authenticator, etc. generate time-based one-time passwords that are used as a second factor to verify your identity when prompted during sign-in.
Registration becomes active only after you verify a code from the app. Complete registration within 24 hours; otherwise start again with a new QR code. Each registration can be completed only once. After registering, wait for the next code before using the app to sign in.
Only one registration can be pending per account. Opening registration in another browser session shows the same QR code until registration is completed or expires. Recovery codes : Recovery codes can be used to access your account if you lose access to your device and cannot receive two-factor authentication codes.
Keep your recovery codes as safe as your password. We recommend saving them with a password manager such as Bitwarden, 1Password, Authy, or Keeper. ![image](screenshots/authentication.webp) Each user can configure this in [Account](https://docs.weblate.org/en/latest/user/profile.md#profile-account) and second factor will be required to sign in addition to the existing authentication method. This can be enforced for users at the project (see [Enforced two-factor authentication](https://docs.weblate.org/en/latest/admin/projects.md#project-enforced-2fa)) or team level. In site-wide deployments, this can also be used to enforce two-factor authentication for all users by enabling it on the default Users team, which is assigned automatically to new users by [automatic team assignment](https://docs.weblate.org/en/latest/admin/access.md#autoteam). The permissions of a team with enforced two-factor authentication won’t be applied to users who do not have it configured. # admin/backup.md # Backing up and moving Weblate ## Project level backups #### Versionadded Added in version 4.14. The project backups all translation content from Weblate (project, components, translations, string comments, suggestions or checks). It is suitable for transferring a project to another Weblate instance. You can perform a project backup in Operations ↓ Backups. The backup can be restored when creating a project (see [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects)). #### NOTE Project backups can also be created, listed, and downloaded through the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) since version 2026.7; The backups currently do not include access control information and history. The comments and suggestions are backed up with the username of the user who did create them. Upon import it is assigned to a matching user. If there is no user with such username, it is assigned to anonymous user. The generated backups are kept on the server as configured by [`PROJECT_BACKUP_KEEP_DAYS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_KEEP_DAYS) and [`PROJECT_BACKUP_KEEP_COUNT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_KEEP_COUNT) (it defaults to keep at most 3 backups for 30 days). Import validation of uploaded project backups can be tuned using [`PROJECT_BACKUP_IMPORT_MAX_MEMBERS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_MEMBERS), [`PROJECT_BACKUP_IMPORT_MAX_TOTAL_UNCOMPRESSED_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_TOTAL_UNCOMPRESSED_SIZE), [`PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE), [`PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE), and [`PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_RATIO`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_RATIO). The complete backup is validated before restoring any data. Invalid object fields, references, repository paths, URLs, regular expressions, or screenshot files cause the import to be rejected without creating a partial project. Use the generated file to import project when [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects) or in [`import_projectbackup`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_projectbackup). #### NOTE Restoring of the backup might fail if the restoring server has different set of [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) or different configuration of [`SIMPLIFY_LANGUAGES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SIMPLIFY_LANGUAGES). The restore will tell you which language codes could not be processed and you can then add missing language definitions manually. ## Automated backup using BorgBackup Weblate has built-in support for creating service backups using [BorgBackup](https://www.borgbackup.org/). Borg creates space-effective encrypted backups which can be safely stored in the cloud. The backups can be controlled in the management interface from the Backups tab. #### Versionchanged Changed in version 4.4.1: PostgreSQL databases are included in the automated backups. The backups using Borg are incremental and Weblate is configured to keep following backups: * Daily backups for 14 days back * Weekly backups for 8 weeks back * Monthly backups for 6 months back ![image](screenshots/backups.webp) ### Borg encryption key [BorgBackup](https://www.borgbackup.org/) creates encrypted backups and you wouldn’t be able to restore them without the passphrase. The passphrase is generated when adding a new backup service and you should copy it and keep it in a secure place. If you are using [Weblate provisioned backup storage](https://docs.weblate.org/en/latest/admin/backup.md#cloudbackup), please backup your private SSH key too, as it’s used to access your backups. #### SEE ALSO [borg init](https://borgbackup.readthedocs.io/en/stable/usage/init.html) ### Customizing backup * The database backup can be configured via [`DATABASE_BACKUP`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATABASE_BACKUP). * The backup creation can be customized using [`BORG_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BORG_EXTRA_ARGS). ## Weblate provisioned backup storage The easiest way of backing up your Weblate instance is purchasing the [backup service at weblate.org](https://weblate.org/support/#backup). This is how you get it running: 1. Purchase the Backup service on [https://weblate.org/support/#backup](https://weblate.org/support/#backup). 2. Enter the obtained key in the management interface, see [Integrating support](https://docs.weblate.org/en/latest/admin/support.md#activate-support). 3. Weblate connects to the cloud service and obtains access info for the backups. 4. Turn on the new backup configuration from the Backups tab. 5. Backup your Borg credentials to be able to restore the backups, see [Borg encryption key](https://docs.weblate.org/en/latest/admin/backup.md#borg-keys). #### HINT The manual step of turning everything on is there for your safety. Without your consent no data is sent to the backup repository obtained through the registration process. ## Using custom backup storage You can also use your own storage for the backups. SSH can be used to store backups in the remote destination, the target server needs to have [BorgBackup](https://www.borgbackup.org/) installed. #### SEE ALSO [General](https://borgbackup.readthedocs.io/en/stable/usage/general.html) in the Borg documentation ### Local filesystem It is recommended to specify the absolute path for the local backup, for example /path/to/backup. The directory has to be writable by the user running Weblate (see [Filesystem permissions](https://docs.weblate.org/en/latest/admin/install.md#file-permissions)). If it doesn’t exist, Weblate attempts to create it but needs the appropriate permissions to do so. #### HINT When running Weblate in Docker, please ensure the backup location is exposed as a volume from the Weblate container. Otherwise the backups will be discarded by Docker upon restarting the container it is in. One option is to place backups into an existing volume, for example `/app/data/borgbackup`. This is an existing volume in the container. You can also add a new container for the backups in the Docker Compose file for example by using `/borgbackup`: ```yaml services: weblate: volumes: - /home/weblate/data:/app/data - /home/weblate/borgbackup:/borgbackup ``` The directory where backups will be stored has to be owned by UID 1000, otherwise Weblate won’t be able to write the backups there. ### Remote backups For creating remote backups, you will have to install [BorgBackup](https://www.borgbackup.org/) onto another server that’s accessible for your Weblate deployment via SSH using the Weblate SSH key: 1. Prepare a server where your backups will be stored. 2. Install the SSH server on it (you will get it by default with most Linux distributions). 3. Install [BorgBackup](https://www.borgbackup.org/) on that server; most Linux distributions have packages available (see [Installation](https://borgbackup.readthedocs.io/en/stable/installation.html)). 4. Choose an existing user or create a new user that will be used for backing up. 5. Add Weblate SSH key to the user’s .ssh/authorized_keys file, so that Weblate can SSH to the server without a password (see [Weblate SSH key](https://docs.weblate.org/en/latest/vcs.md#weblate-ssh-key)). 6. Create a user-writable directory where Weblate can remotely set up the Borg backup repository, for example in the home directory (i.e. `/home/borg/backups`). 7. Configure the backup location in Weblate as `user@host:/home/borg/backups` or `ssh://user@host:port/home/borg/backups`. 8. Once enabled, the backups will be triggered automatically daily. You can also manually trigger a backup from the Weblate UI or using [backup](https://docs.weblate.org/en/latest/admin/management.md#backup-management-command). #### HINT [Weblate provisioned backup storage](https://docs.weblate.org/en/latest/admin/backup.md#cloudbackup) provides you automated remote backups without any effort. #### SEE ALSO * [Weblate SSH key](https://docs.weblate.org/en/latest/vcs.md#weblate-ssh-key) * [General](https://borgbackup.readthedocs.io/en/stable/usage/general.html) ## Restoring from BorgBackup 1. Restore access to your backup repository and prepare your backup passphrase. 2. List all the backups on the server using `borg list REPOSITORY`. 3. Restore the desired backup to the current directory using `borg extract REPOSITORY::ARCHIVE`. 4. Restore the database from the SQL dump placed in the `backup` directory in the Weblate data dir (see [Dumped data for backups](https://docs.weblate.org/en/latest/admin/backup.md#backup-dumps)). 5. Copy the Weblate configuration (`backups/settings.py`, see [Dumped data for backups](https://docs.weblate.org/en/latest/admin/backup.md#backup-dumps)) to the correct location, see [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration). When using Docker container, the settings file is already included in the container and you should restore the original environment variables. The `environment.yml` file might help you with this (see [Dumped data for backups](https://docs.weblate.org/en/latest/admin/backup.md#backup-dumps)). 6. Copy the whole restored data dir to the location configured by [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR). When using Docker container place the data into the data volume, see [Docker container volumes](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume). Please ensure the files have correct ownership and permissions, see [Filesystem permissions](https://docs.weblate.org/en/latest/admin/install.md#file-permissions). The Borg session might look like this: ```console $ borg list /tmp/xxx Enter passphrase for key /tmp/xxx: 2019-09-26T14:56:08 Thu, 2019-09-26 14:56:08 [de0e0f13643635d5090e9896bdaceb92a023050749ad3f3350e788f1a65576a5] $ borg extract /tmp/xxx::2019-09-26T14:56:08 Enter passphrase for key /tmp/xxx: ``` #### SEE ALSO * [borg list](https://borgbackup.readthedocs.io/en/stable/usage/list.html) * [borg extract](https://borgbackup.readthedocs.io/en/stable/usage/extract.html) ## Restoring Docker based setup The following steps assume the official Docker Compose setup using the bundled PostgreSQL and Valkey services, see [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md). If your deployment uses an external database or a customized Compose file, adapt the database and volume steps to that environment. Start with a Docker Compose checkout matching the restored deployment. Restore your original Compose overrides, secrets, and environment variables. The `environment.yml` file from [Dumped data for backups](https://docs.weblate.org/en/latest/admin/backup.md#backup-dumps) can help with this, but it is not imported automatically. 1. Restore the backup archive using [Restoring from BorgBackup](https://docs.weblate.org/en/latest/admin/backup.md#restore-borg) or unpack your manual backup so that the Weblate data directory and `backups/database.sql` are available. 2. Stop the services which can write to the database or data volume: ```shell docker compose stop weblate cache ``` 3. Recreate the PostgreSQL volume. ```shell docker compose stop database docker compose rm -v database docker volume remove weblate-docker_postgres-data ``` The volume name depends on the Compose project name and can differ from `weblate-docker_postgres-data`. Check your setup before removing any volume. 4. Start the database service: ```shell docker compose up -d database ``` 5. Restore the database dump: ```shell cat backups/database.sql | docker compose exec -T database psql --username weblate --dbname weblate ``` Check that the database name matches [`POSTGRES_DB`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-POSTGRES_DB) and the user matches [`POSTGRES_USER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-POSTGRES_USER) in your Compose configuration. 6. Restore the Weblate data directory to the Docker data volume mounted as `/app/data`, see [Docker container volumes](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume). Files in this volume have to be owned by UID 1000, see [Filesystem permissions](https://docs.weblate.org/en/latest/admin/install.md#file-permissions). 7. Start the remaining services and follow the logs: ```shell docker compose up -d docker compose logs -f ``` The Weblate container performs database migrations on startup. If you are also upgrading Weblate, follow [Upgrading the Docker container](https://docs.weblate.org/en/latest/admin/install/docker.md#upgrading-docker). 8. Refresh the repositories after the restore: ```shell docker compose exec --user weblate weblate weblate updategit --all ``` #### SEE ALSO * [Dumped data for backups](https://docs.weblate.org/en/latest/admin/backup.md#backup-dumps) * [Upgrading PostgreSQL container](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-postgres-upgrade) * [Docker container volumes](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume) ## Manual backup Depending on what you want to save, back up the type of data Weblate stores in each respective place. #### HINT If you are doing the manual backups, you might want to silence Weblate’s warning about a lack of backups by adding `weblate.I028` to [`SILENCED_SYSTEM_CHECKS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SILENCED_SYSTEM_CHECKS) in `settings.py` or [`WEBLATE_SILENCED_SYSTEM_CHECKS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SILENCED_SYSTEM_CHECKS) for Docker. ```python SILENCED_SYSTEM_CHECKS.append("weblate.I028") ``` ### Database The actual storage location depends on your database setup. #### HINT The database is the most important storage. Set up regular backups of your database. Without the database, all the translations are gone. #### Native database backup The recommended approach is to save a dump of the database using database-native tools such as **pg_dump**. It usually performs better than Django backup, and it restores complete tables with all their data. You can restore this backup in a newer Weblate release, it will perform all the necessary migrations when running in [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate). Please consult [Upgrading Weblate](https://docs.weblate.org/en/latest/admin/upgrade.md) on more detailed info on how to upgrade between versions. #### Django database backup Alternatively, you can back up your database using Django’s [`dumpdata`](https://docs.djangoproject.com/en/stable/ref/django-admin/#django-admin-dumpdata) command. That way the backup is database agnostic and can be used in case you want to change the database backend. Prior to restoring the database you need to be running exactly the same Weblate version the backup was made on. This is necessary as the database structure does change between releases and you would end up corrupting the data in some way. After installing the same version, run all database migrations using [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate). Afterwards some entries will already be created in the database and you will have them in the database backup as well. The recommended approach is to delete such entries manually using the management shell (see [Invoking management commands](https://docs.weblate.org/en/latest/admin/management.md#invoke-manage)): ```console weblate shell >>> from weblate.auth.models import User >>> User.objects.get(username='anonymous').delete() ``` ### Files If you have enough backup space, simply back up the whole [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR). This is a safe bet even if it includes some files you don’t want. The following sections describe what you should back up and what you can skip in detail. #### Dumped data for backups #### Versionchanged Changed in version 4.7: The environment dump was added as `environment.yml` to help in restoring in the Docker environments. Stored in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) `/backups`. Weblate dumps various data here, and you can include these files for more complete backups. The files are updated daily (requires a running Celery beats server, see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery)). Currently, this includes: * Weblate settings as `settings.py` (there is also expanded version in `settings-expanded.py`). * PostgreSQL database backup as `database.sql`. * Environment dump as `environment.yml`. The database backups are saved as plain text by default, but they can also be compressed or entirely skipped using [`DATABASE_BACKUP`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATABASE_BACKUP). To restore the database backup, load it using database tools, for example: ```shell psql --file=database.sql weblate ``` #### Version control repositories Stored in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) `/vcs`. The version control repositories contain a copy of your upstream repositories with Weblate changes. If you have [Push on commit](https://docs.weblate.org/en/latest/admin/projects.md#component-push-on-commit) enabled for all your translation components, all Weblate changes are included upstream. No need to back up the repositories on the Weblate side as they can be cloned again from the upstream location with no data loss. #### SSH and GPG keys Stored in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) `/ssh` and [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) `/home`. If you are using SSH or GPG keys generated by Weblate, you should back up these locations. Otherwise you will lose the private keys and you will have to regenerate new ones. Generated SSH wrapper scripts are stored in [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) and do not need to be backed up. #### User uploaded files Stored in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) `/media`. You should back up all user uploaded files (e.g. [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots)). #### Celery tasks The Celery task queue might contain some info, but is usually not needed for a backup. At most you will lose updates not yet been processed to translation memory. It is recommended to perform the fulltext or repository update upon restoration anyhow, so there is no problem in losing these. #### SEE ALSO [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) ### Command-line for manual backup Using a cron job, you can set up a Bash command to be executed on a daily basis, for example: ```console $ tar -Jcf ~/backup/weblate-backup-$(date -u +%Y-%m-%d_%H%M%S).xz backups vcs ssh home media fonts secret ``` You can adjust the list of folders and files to your needs. To avoid saving the translation memory (in backups folder), you can use: ```console $ tar -Jcf ~/backup/weblate-backup-$(date -u +%Y-%m-%d_%H%M%S).xz backups/database.sql backups/settings.py vcs ssh home media fonts secret ``` ## Restoring manual backup 1. Restore all data you have backed up. 2. Update all repositories using [`updategit`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-updategit). ```sh weblate updategit --all ``` ## Moving a Weblate installation Relocate your installation to a different system by following the backing up and restoration instructions above. #### SEE ALSO * [Upgrading from Python 2 to Python 3 in the Weblate 3.11.1 documentation](https://docs.weblate.org/en/weblate-3.11.1/admin/upgrade.html#upgrading-from-python-2-to-python-3) * [Migrating from other databases to PostgreSQL](https://docs.weblate.org/en/latest/admin/upgrade.md#database-migration) # admin/checks.md # Checks and fixups ## Custom automatic fixups You can also implement your own automatic fixup in addition to the standard ones and include them in [`AUTOFIX_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTOFIX_LIST). The automatic fixes are powerful, but can also cause damage; be careful when writing one. For example, the following automatic fixup would replace every occurrence of the string `foo` in a translation with `bar`: ```python from __future__ import annotations from typing import TYPE_CHECKING from weblate.trans.autofixes.base import AutoFix if TYPE_CHECKING: from weblate.trans.models import Unit class ReplaceFooWithBar(AutoFix): """Replace foo with bar.""" # Might be localized using gettext_lazy name = "Foobar" def fix_single_target( self, target: str, source: str, unit: Unit ) -> tuple[str, bool]: if "foo" in target: return target.replace("foo", "bar"), True return target, False ``` To install custom checks, provide a fully-qualified path to the Python class in the [`AUTOFIX_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTOFIX_LIST), see [Custom quality checks, add-ons, automatic suggestions and auto-fixes](https://docs.weblate.org/en/latest/admin/customize.md#custom-check-modules). ## Customizing behavior using flags You can fine-tune Weblate’s behavior by using flags. The flags provide visual feedback to the translators and help them to improve their translation. The flags are merged from following sources: * Source string additional flags: * [Additional info on source strings](https://docs.weblate.org/en/latest/admin/translating.md#additional) describes manual editing. * [Bulk edit](https://docs.weblate.org/en/latest/user/translating.md#bulk-edit) can be used to apply flags in batch. * [Bulk edit](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-flags-bulk) add-on can apply flags automatically. * Per-string flags extracted from the file format, see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats). * Translation flags (currently only `read-only` flag for bilingual source string or when monolingual template editing is turned off). * File-format specific flags. * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) ([Translation flags](https://docs.weblate.org/en/latest/admin/projects.md#component-check-flags)). * [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) ([Translation flags](https://docs.weblate.org/en/latest/admin/projects.md#project-check-flags)). The flags are comma-separated; if they have parameters, they are separated with colon. You can use quotes to include whitespaces or special characters in the string. For example: ```text placeholders:"special:value":"other value", regex:.* ``` Both single and double quotes are accepted, special characters are being escaped using backslash: ```text placeholders:"quoted \"string\"":'single \'quoted\'' ``` ```text placeholders:r"^#*" ``` To verify that translators do not change the heading of a Markdown document. A failing check will be triggered if the string `### Index` is translated as `# Indice`. ```text placeholders:r"\]\([^h].*?\)" ``` To ensure that internal links are not being translated (i.e. [test](../checks) does not become [test](../chequeos). The flags defined on a higher level can be discarded using the `discard:NAME` syntax. For example, if a component is configured to `safe-html`, you can add `discard:safe-html` to the string flags to skip it for this particular string. Here is a list of flags currently accepted: `read-only` : The string is read-only and should not be edited in Weblate, see [Read-only strings](https://docs.weblate.org/en/latest/formats.md#read-only-strings). `terminology` : Used in [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary). Copies the string into all glossary languages so it can be used consistently in all translations. Also useful in combination with `read-only`, for example in product names. `priority:N` : Priority of the string. Higher priority strings are presented first for translation. The default priority is 100, the higher priority a string has, the earlier it is offered for translation. `xml-text` : Treat text as XML document, affects [XML syntax](https://docs.weblate.org/en/latest/user/checks.md#check-xml-invalid) and [XML markup](https://docs.weblate.org/en/latest/user/checks.md#check-xml-tags). `font-family:NAME` : Define font-family for rendering checks, see [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts). `font-weight:WEIGHT` : Define font-weight for rendering checks, see [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts). `font-size:SIZE` : Define font-size for rendering checks, see [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts). `font-spacing:SPACING` : Define letter spacing for rendering checks, see [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts). `icu-flags:FLAGS` : Define flags for customizing the behavior of the [ICU MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format) quality check. `icu-tag-prefix:PREFIX` : Set a required prefix for XML tags for the [ICU MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format) quality check. `placeholders:NAME:NAME2:...` : Placeholder strings expected in translation, see [Placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-placeholders). `replacements:FROM:TO:FROM2:TO2...` : Replacements to perform when checking resulting text parameters (for example in [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) or [Maximum length of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-length)). The typical use case for this is to expand placeables to ensure that the text fits even with long values, for example: `replacements:%s:"John Doe"`. `variants:SOURCE` : Mark this string as a variant of string with matching source. See [String variants](https://docs.weblate.org/en/latest/devel/translations.md#variants). `regex:REGEX` : Regular expression to match translation, see [Regular expression](https://docs.weblate.org/en/latest/user/checks.md#check-regex). `discard:NAME` : Discards flag defined on a higher level. `forbidden` : Indicates forbidden translation in a glossary, see [Forbidden translations](https://docs.weblate.org/en/latest/user/glossary.md#glossary-forbidden). `strict-same` : Make the [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same) avoid using the built-in words exceptions. `strict-format` : Make format checks enforce using format even for plural forms with a single value, see [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats). `case-insensitive` : Adjust checks behavior to be case-insensitive. Currently affects only [Placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-placeholders) quality check. `accelerator` : Specify the single punctuation accelerator marker, for example `accelerator:&`, `accelerator:_`, or `accelerator:~`. Enables the [Accelerator key](https://docs.weblate.org/en/latest/user/checks.md#check-accelerator) quality check. `asciidoc-text` : Treat a text as an AsciiDoc document, affects [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same). Enables the [AsciiDoc markup](https://docs.weblate.org/en/latest/user/checks.md#check-asciidoc-markup) quality check. `bbcode-text` : Treat a text as an Bulletin Board Code (BBCode) document, affects [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same). Enables the [BBCode markup](https://docs.weblate.org/en/latest/user/checks.md#check-bbcode) quality check. `check-glossary` : Enables the [Does not follow glossary](https://docs.weblate.org/en/latest/user/checks.md#check-check-glossary) quality check. `fluent-parts` : Enables the [Fluent parts](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-parts) quality check. `fluent-references` : Enables the [Fluent references](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-references) quality check. `fluent-target-inner-html` : Enables the [Fluent translation inner HTML](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-target-inner-html) quality check. `fluent-target-syntax` : Enables the [Fluent translation syntax](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-target-syntax) quality check. `angularjs-format` : Enables the [AngularJS interpolation string](https://docs.weblate.org/en/latest/user/checks.md#check-angularjs-format) quality check. `automattic-components-format` : Enables the [Automattic components formatting](https://docs.weblate.org/en/latest/user/checks.md#check-automattic-components-format) quality check. `c-format` : Enables the [C format](https://docs.weblate.org/en/latest/user/checks.md#check-c-format) quality check. `c-sharp-format` : Enables the [C# format](https://docs.weblate.org/en/latest/user/checks.md#check-c-sharp-format) quality check. `csharp-format` : Enables the [C# format](https://docs.weblate.org/en/latest/user/checks.md#check-c-sharp-format) quality check. `es-format` : Enables the [ECMAScript template literals](https://docs.weblate.org/en/latest/user/checks.md#check-es-format) quality check. `i18next-interpolation` : Enables the [i18next interpolation](https://docs.weblate.org/en/latest/user/checks.md#check-i18next-interpolation) quality check. `icu-message-format` : Enables the [ICU MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format) and [ICU MessageFormat syntax](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format-syntax) quality checks. `java-printf-format` : Enables the [Java format](https://docs.weblate.org/en/latest/user/checks.md#check-java-printf-format) quality check. `java-format` : Enables the [Java MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-java-format) quality check. `auto-java-messageformat` : Treat a text as conditional Java MessageFormat, enabling [Java MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-java-format) only when the source contains Java MessageFormat placeholders. Enables the [Java MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-java-format) quality check. `javascript-format` : Enables the [JavaScript format](https://docs.weblate.org/en/latest/user/checks.md#check-javascript-format) quality check. `laravel-format` : Enables the [Laravel format](https://docs.weblate.org/en/latest/user/checks.md#check-laravel-format) quality check. `lua-format` : Enables the [Lua format](https://docs.weblate.org/en/latest/user/checks.md#check-lua-format) quality check. `object-pascal-format` : Enables the [Object Pascal format](https://docs.weblate.org/en/latest/user/checks.md#check-object-pascal-format) quality check. `objc-format` : Enables the [Objective-C format](https://docs.weblate.org/en/latest/user/checks.md#check-objc-format) quality check. `percent-placeholders` : Enables the [Percent placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-percent-placeholders) quality check. `perl-brace-format` : Enables the [Perl brace format](https://docs.weblate.org/en/latest/user/checks.md#check-perl-brace-format) quality check. `perl-format` : Enables the [Perl format](https://docs.weblate.org/en/latest/user/checks.md#check-perl-format) quality check. `php-format` : Enables the [PHP format](https://docs.weblate.org/en/latest/user/checks.md#check-php-format) quality check. `python-brace-format` : Enables the [Python brace format](https://docs.weblate.org/en/latest/user/checks.md#check-python-brace-format) quality check. `python-format` : Enables the [Python format](https://docs.weblate.org/en/latest/user/checks.md#check-python-format) quality check. `qt-format` : Enables the [Qt format](https://docs.weblate.org/en/latest/user/checks.md#check-qt-format) quality check. `qt-plural-format` : Enables the [Qt plural format](https://docs.weblate.org/en/latest/user/checks.md#check-qt-plural-format) quality check. `ruby-format` : Enables the [Ruby format](https://docs.weblate.org/en/latest/user/checks.md#check-ruby-format) quality check. `scheme-format` : Enables the [Scheme format](https://docs.weblate.org/en/latest/user/checks.md#check-scheme-format) quality check. `vue-format` : Enables the [Vue I18n formatting](https://docs.weblate.org/en/latest/user/checks.md#check-vue-format) quality check. `rst-text` : Treat a text as an reStructuredText document, affects [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same). Enables the [Inconsistent reStructuredText](https://docs.weblate.org/en/latest/user/checks.md#check-rst-references) and [reStructuredText syntax error](https://docs.weblate.org/en/latest/user/checks.md#check-rst-syntax) quality checks. `md-text` : Treat a text as a Markdown document, and provide Markdown syntax highlighting on the translation text area. Enables the [Markdown links](https://docs.weblate.org/en/latest/user/checks.md#check-md-link), [Markdown references](https://docs.weblate.org/en/latest/user/checks.md#check-md-reflink) and [Markdown syntax](https://docs.weblate.org/en/latest/user/checks.md#check-md-syntax) quality checks. `max-length` : Enables the [Maximum length of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-length) quality check. `max-lines` : Enables the [Maximum number of lines](https://docs.weblate.org/en/latest/user/checks.md#check-max-lines) quality check. `max-size` : Enables the [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) quality check. `placeholders` : Enables the [Placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-placeholders) quality check. `regex` : Enables the [Regular expression](https://docs.weblate.org/en/latest/user/checks.md#check-regex) quality check. `safe-mdx` : Enables the [Safe MDX](https://docs.weblate.org/en/latest/user/checks.md#check-safe-mdx) quality check. `safe-html` : Enables the [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html) quality check. `auto-safe-html` : Treat a text as conditional HTML, enabling [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html) only for plain text or source strings that contain standard HTML markup or valid custom elements. This is useful for extended Markdown variants such as MDX, where angle-bracket syntax may not be HTML. Enables the [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html) quality check. `url` : The string should consist of only a URL. Enables the [URL](https://docs.weblate.org/en/latest/user/checks.md#check-url) quality check. `fluent-source-inner-html` : Enables the [Fluent source inner HTML](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-source-inner-html) quality check. `fluent-source-syntax` : Enables the [Fluent source syntax](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-source-syntax) quality check. `ignore-all-checks` : Ignore all quality checks. `ignore-accelerator` : Skip the [Accelerator key](https://docs.weblate.org/en/latest/user/checks.md#check-accelerator) quality check. `ignore-asciidoc-markup` : Skip the [AsciiDoc markup](https://docs.weblate.org/en/latest/user/checks.md#check-asciidoc-markup) quality check. `ignore-bbcode` : Skip the [BBCode markup](https://docs.weblate.org/en/latest/user/checks.md#check-bbcode) quality check. `ignore-xml-chars-around-tags` : Skip the [Chars around XML tags](https://docs.weblate.org/en/latest/user/checks.md#check-xml-chars-around-tags) quality check. `ignore-duplicate` : Skip the [Consecutive duplicated words](https://docs.weblate.org/en/latest/user/checks.md#check-duplicate) quality check. `ignore-check-glossary` : Skip the [Does not follow glossary](https://docs.weblate.org/en/latest/user/checks.md#check-check-glossary) quality check. `ignore-double-space` : Skip the [Double space](https://docs.weblate.org/en/latest/user/checks.md#check-double-space) quality check. `ignore-fluent-parts` : Skip the [Fluent parts](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-parts) quality check. `ignore-fluent-references` : Skip the [Fluent references](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-references) quality check. `ignore-fluent-target-inner-html` : Skip the [Fluent translation inner HTML](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-target-inner-html) quality check. `ignore-fluent-target-syntax` : Skip the [Fluent translation syntax](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-target-syntax) quality check. `ignore-angularjs-format` : Skip the [AngularJS interpolation string](https://docs.weblate.org/en/latest/user/checks.md#check-angularjs-format) quality check. `ignore-automattic-components-format` : Skip the [Automattic components formatting](https://docs.weblate.org/en/latest/user/checks.md#check-automattic-components-format) quality check. `ignore-c-format` : Skip the [C format](https://docs.weblate.org/en/latest/user/checks.md#check-c-format) quality check. `ignore-c-sharp-format` : Skip the [C# format](https://docs.weblate.org/en/latest/user/checks.md#check-c-sharp-format) quality check. `ignore-es-format` : Skip the [ECMAScript template literals](https://docs.weblate.org/en/latest/user/checks.md#check-es-format) quality check. `ignore-i18next-interpolation` : Skip the [i18next interpolation](https://docs.weblate.org/en/latest/user/checks.md#check-i18next-interpolation) quality check. `ignore-icu-message-format` : Skip the [ICU MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format) quality check. `ignore-java-printf-format` : Skip the [Java format](https://docs.weblate.org/en/latest/user/checks.md#check-java-printf-format) quality check. `ignore-java-format` : Skip the [Java MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-java-format) quality check. `ignore-javascript-format` : Skip the [JavaScript format](https://docs.weblate.org/en/latest/user/checks.md#check-javascript-format) quality check. `ignore-laravel-format` : Skip the [Laravel format](https://docs.weblate.org/en/latest/user/checks.md#check-laravel-format) quality check. `ignore-lua-format` : Skip the [Lua format](https://docs.weblate.org/en/latest/user/checks.md#check-lua-format) quality check. `ignore-object-pascal-format` : Skip the [Object Pascal format](https://docs.weblate.org/en/latest/user/checks.md#check-object-pascal-format) quality check. `ignore-objc-format` : Skip the [Objective-C format](https://docs.weblate.org/en/latest/user/checks.md#check-objc-format) quality check. `ignore-percent-placeholders` : Skip the [Percent placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-percent-placeholders) quality check. `ignore-perl-brace-format` : Skip the [Perl brace format](https://docs.weblate.org/en/latest/user/checks.md#check-perl-brace-format) quality check. `ignore-perl-format` : Skip the [Perl format](https://docs.weblate.org/en/latest/user/checks.md#check-perl-format) quality check. `ignore-php-format` : Skip the [PHP format](https://docs.weblate.org/en/latest/user/checks.md#check-php-format) quality check. `ignore-python-brace-format` : Skip the [Python brace format](https://docs.weblate.org/en/latest/user/checks.md#check-python-brace-format) quality check. `ignore-python-format` : Skip the [Python format](https://docs.weblate.org/en/latest/user/checks.md#check-python-format) quality check. `ignore-qt-format` : Skip the [Qt format](https://docs.weblate.org/en/latest/user/checks.md#check-qt-format) quality check. `ignore-qt-plural-format` : Skip the [Qt plural format](https://docs.weblate.org/en/latest/user/checks.md#check-qt-plural-format) quality check. `ignore-ruby-format` : Skip the [Ruby format](https://docs.weblate.org/en/latest/user/checks.md#check-ruby-format) quality check. `ignore-scheme-format` : Skip the [Scheme format](https://docs.weblate.org/en/latest/user/checks.md#check-scheme-format) quality check. `ignore-vue-format` : Skip the [Vue I18n formatting](https://docs.weblate.org/en/latest/user/checks.md#check-vue-format) quality check. `ignore-translated` : Skip the [Has been translated](https://docs.weblate.org/en/latest/user/checks.md#check-translated) quality check. `ignore-inconsistent` : Skip the [Inconsistent](https://docs.weblate.org/en/latest/user/checks.md#check-inconsistent) quality check. `ignore-rst-references` : Skip the [Inconsistent reStructuredText](https://docs.weblate.org/en/latest/user/checks.md#check-rst-references) quality check. `ignore-kashida` : Skip the [Kashida letter used](https://docs.weblate.org/en/latest/user/checks.md#check-kashida) quality check. `ignore-md-link` : Skip the [Markdown links](https://docs.weblate.org/en/latest/user/checks.md#check-md-link) quality check. `ignore-md-reflink` : Skip the [Markdown references](https://docs.weblate.org/en/latest/user/checks.md#check-md-reflink) quality check. `ignore-md-syntax` : Skip the [Markdown syntax](https://docs.weblate.org/en/latest/user/checks.md#check-md-syntax) quality check. `ignore-max-length` : Skip the [Maximum length of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-length) quality check. `ignore-max-lines` : Skip the [Maximum number of lines](https://docs.weblate.org/en/latest/user/checks.md#check-max-lines) quality check. `ignore-max-size` : Skip the [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) quality check. `ignore-escaped-newline` : Skip the [Mismatched \\n](https://docs.weblate.org/en/latest/user/checks.md#check-escaped-newline) quality check. `ignore-end-colon` : Skip the [Mismatched colon](https://docs.weblate.org/en/latest/user/checks.md#check-end-colon) quality check. `ignore-end-ellipsis` : Skip the [Mismatched ellipsis](https://docs.weblate.org/en/latest/user/checks.md#check-end-ellipsis) quality check. `ignore-end-exclamation` : Skip the [Mismatched exclamation mark](https://docs.weblate.org/en/latest/user/checks.md#check-end-exclamation) quality check. `ignore-end-stop` : Skip the [Mismatched full stop](https://docs.weblate.org/en/latest/user/checks.md#check-end-stop) quality check. `ignore-end-interrobang` : Skip the [Mismatched interrobang](https://docs.weblate.org/en/latest/user/checks.md#check-end-interrobang) quality check. `ignore-end-question` : Skip the [Mismatched question mark](https://docs.weblate.org/en/latest/user/checks.md#check-end-question) quality check. `ignore-end-semicolon` : Skip the [Mismatched semicolon](https://docs.weblate.org/en/latest/user/checks.md#check-end-semicolon) quality check. `ignore-newline-count` : Skip the [Mismatching line breaks](https://docs.weblate.org/en/latest/user/checks.md#check-newline-count) quality check. `ignore-plurals` : Skip the [Missing plurals](https://docs.weblate.org/en/latest/user/checks.md#check-plurals) quality check. `ignore-multiple-capital` : Skip the [Multiple capitals](https://docs.weblate.org/en/latest/user/checks.md#check-multiple-capital) quality check. `ignore-kabyle-characters` : Skip the [Non‑standard characters in Kabyle](https://docs.weblate.org/en/latest/user/checks.md#check-kabyle-characters) quality check. `ignore-placeholders` : Skip the [Placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-placeholders) quality check. `ignore-prohibited-initial-character` : Skip the [Prohibited initial character](https://docs.weblate.org/en/latest/user/checks.md#check-prohibited-initial-character) quality check. `ignore-punctuation-spacing` : Skip the [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#check-punctuation-spacing) quality check. `ignore-regex` : Skip the [Regular expression](https://docs.weblate.org/en/latest/user/checks.md#check-regex) quality check. `ignore-rst-syntax` : Skip the [reStructuredText syntax error](https://docs.weblate.org/en/latest/user/checks.md#check-rst-syntax) quality check. `ignore-reused` : Skip the [Reused translation](https://docs.weblate.org/en/latest/user/checks.md#check-reused) quality check. `ignore-safe-mdx` : Skip the [Safe MDX](https://docs.weblate.org/en/latest/user/checks.md#check-safe-mdx) quality check. `ignore-same-plurals` : Skip the [Same plurals](https://docs.weblate.org/en/latest/user/checks.md#check-same-plurals) quality check. `ignore-begin-newline` : Skip the [Starting newline](https://docs.weblate.org/en/latest/user/checks.md#check-begin-newline) quality check. `ignore-begin-space` : Skip the [Starting spaces](https://docs.weblate.org/en/latest/user/checks.md#check-begin-space) quality check. `ignore-end-newline` : Skip the [Trailing newline](https://docs.weblate.org/en/latest/user/checks.md#check-end-newline) quality check. `ignore-end-space` : Skip the [Trailing space](https://docs.weblate.org/en/latest/user/checks.md#check-end-space) quality check. `ignore-same` : Skip the [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same) quality check. `ignore-safe-html` : Skip the [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html) quality check. `ignore-url` : Skip the [URL](https://docs.weblate.org/en/latest/user/checks.md#check-url) quality check. `ignore-xml-tags` : Skip the [XML markup](https://docs.weblate.org/en/latest/user/checks.md#check-xml-tags) quality check. `ignore-xml-invalid` : Skip the [XML syntax](https://docs.weblate.org/en/latest/user/checks.md#check-xml-invalid) quality check. `ignore-zero-width-space` : Skip the [Zero-width space](https://docs.weblate.org/en/latest/user/checks.md#check-zero-width-space) quality check. `ignore-ellipsis` : Skip the [Ellipsis](https://docs.weblate.org/en/latest/user/checks.md#check-ellipsis) quality check. `ignore-fluent-source-inner-html` : Skip the [Fluent source inner HTML](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-source-inner-html) quality check. `ignore-fluent-source-syntax` : Skip the [Fluent source syntax](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-source-syntax) quality check. `ignore-icu-message-format` : Skip the [ICU MessageFormat syntax](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format-syntax) quality check. `ignore-long-untranslated` : Skip the [Long untranslated](https://docs.weblate.org/en/latest/user/checks.md#check-long-untranslated) quality check. `ignore-multiple-failures` : Skip the [Multiple failing checks](https://docs.weblate.org/en/latest/user/checks.md#check-multiple-failures) quality check. `ignore-unnamed-format` : Skip the [Multiple unnamed variables](https://docs.weblate.org/en/latest/user/checks.md#check-unnamed-format) quality check. `ignore-source-max-length` : Skip the [Source string length](https://docs.weblate.org/en/latest/user/checks.md#check-source-max-length) quality check. `ignore-optional-plural` : Skip the [Unpluralised](https://docs.weblate.org/en/latest/user/checks.md#check-optional-plural) quality check. #### NOTE Generally the rule is named `ignore-*` for any check, using its identifier, so you can use this even for your custom checks. These flags are understood both in [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) settings, per source string settings and in the translation file itself (for example in GNU gettext). ## Location-based flags Some flags are added to strings by default, based on their locations. This means that certain checks will be automatically enabled depending on where the string is used. * `rst-text`: This flag is automatically added to strings in reStructuredText files, if location extension is `.rst`. * `md-text`: This flag is automatically added to strings in Markdown and MDX files, if location extension is `.md`, `.markdown`, or `.mdx`. ## Enforcing checks The enforced checks cannot be dismissed and mark string as Needs editing (see [Translation states](https://docs.weblate.org/en/latest/workflows.md#states)). This prevents translators from hiding such checks. #### HINT Turning on check enforcing doesn’t enable it automatically. Some checks have to be turned on by adding the corresponding flag to the string or component flags. This is best used with checks that can cause serious issues when used like checks for [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats). Using for style checks like [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same) is not recommended because dismissal is sometimes a reasonable approach in these. The [Translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) can then be used to exclude strings needing editing from being committed to the version control. #### SEE ALSO * [Translation states](https://docs.weblate.org/en/latest/workflows.md#states) * [Enforced checks](https://docs.weblate.org/en/latest/admin/projects.md#component-enforced-checks) * [Translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) * [Additional info on source strings](https://docs.weblate.org/en/latest/admin/translating.md#additional) * [Translation flags](https://docs.weblate.org/en/latest/admin/projects.md#component-check-flags) ## Managing fonts #### HINT Fonts uploaded into Weblate are used purely for purposes of the [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) check, they do not have an effect in Weblate user interface. The [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) check used to calculate dimensions of the rendered text needs font to be loaded into Weblate and selected using a translation flag (see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks)). Weblate font management tool in Fonts under the Operations menu of your translation project provides interface to upload and manage fonts. TrueType or OpenType fonts can be uploaded, set up font-groups and use those in the check. The font-groups allow you to define different fonts for different languages, which is typically needed for non-latin languages: ![image](screenshots/font-group-edit.webp) The font-groups are identified by name, which can not contain whitespace or special characters, so that it can be easily used in the check definition: ![image](screenshots/font-group-list.webp) Font-family and style are automatically recognized after uploading them: ![image](screenshots/font-edit.webp) You can have a number of fonts loaded into Weblate: ![image](screenshots/font-list.webp) To use the fonts for checking the string length, pass it the appropriate flags (see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks)). You will probably need the following ones: `max-size:500` / `max-size:300:5` : Defines maximal width in pixels and, optionally, the maximum number of lines. Word wrapping is applied when more than one line is configured. `font-family:ubuntu` : Defines font group to use by specifying its identifier. `font-size:22` : Defines font size in pixels. ## Writing own checks A wide range of quality checks are built-in, (see [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks)), though they might not cover everything you want to check. The list of performed checks can be adjusted using [`CHECK_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CHECK_LIST), and you can also add custom checks. 1. Subclass the weblate.checks.Check 2. Set a few attributes. 3. Implement either the `check` (if you want to deal with plurals in your code) or the `check_single` method (which does it for you). Some examples: To install custom checks, provide a fully-qualified path to the Python class in the [`CHECK_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CHECK_LIST), see [Custom quality checks, add-ons, automatic suggestions and auto-fixes](https://docs.weblate.org/en/latest/admin/customize.md#custom-check-modules). ### Checking translation text does not contain “foo” This is a pretty simple check which just checks whether the translation is missing the string “foo”. ```python """Simple quality check example.""" from __future__ import annotations from typing import TYPE_CHECKING from django.utils.translation import gettext_lazy from weblate.checks.base import TargetCheck if TYPE_CHECKING: from weblate.trans.models import Unit class FooCheck(TargetCheck): # Used as identifier for check, should be unique # Has to be shorter than 50 characters check_id = "foo" # Short name used to display failing check # Might be localized using gettext_lazy name = "Foo check" # Description for failing check description = gettext_lazy("Your translation is foo") # Real check code def check_single(self, source: str, target: str, unit: Unit) -> bool: return "foo" in target ``` ### Checking that Czech translation text plurals differ Check using language info to verify the two plural forms in Czech language are not same. ```python """Quality check example for Czech plurals.""" from __future__ import annotations from django.utils.translation import gettext_lazy from weblate.checks.base import TargetCheck class PluralCzechCheck(TargetCheck): # Used as identifier for check, should be unique # Has to be shorter than 50 characters check_id = "foo" # Short name used to display failing check # Might be localized using gettext_lazy name = "Foo check" # Description for failing check description = gettext_lazy("Your translation is foo") # Real check code def check_target_unit(self, sources, targets, unit) -> bool: if unit.translation.language.is_base({"cs"}): return targets[1] == targets[2] return False def check_single(self, source, target, unit) -> bool: """We don't check target strings here.""" return False ``` # admin/code-hosting.md # Code-hosting integrations Weblate integrates with code-hosting sites in several separate places: repository access, incoming notifications, and pushing translations back. The exact setup depends on whether you use Hosted Weblate or run your own Weblate instance, and on whether Weblate should push directly or create pull or merge requests. Use this page as a provider-oriented checklist. The individual setting pages remain the canonical reference for setting syntax. ## Setup overview 1. Grant Weblate access to the repository. * For GitHub repositories on Hosted Weblate, use the [Hosted Weblate app](https://github.com/apps/hosted-weblate) from Weblate’s Connect GitHub account flow. The App gives Hosted Weblate repository access without inviting the hosted weblate user. * For other Hosted Weblate repositories, and for direct SSH pushes outside the GitHub App workflow, add the hosted weblate user where it is available, see [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push). * For self-hosted Weblate, create a dedicated code-hosting user and grant access using Weblate’s SSH key or an HTTPS token, see [Accessing repositories on code-hosting sites (GitHub, GitLab, Bitbucket, Azure DevOps, …)](https://docs.weblate.org/en/latest/vcs.md#vcs-repos-code-hosting). 2. Configure [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo) so Weblate can clone the repository. 3. Configure incoming notifications so Weblate pulls changes soon after a push. The repository webhook or app must point to the matching Weblate hook URL, and the project must have [Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks) enabled. Component [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo) must match a repository URL from the webhook payload; see [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching). 4. Decide how Weblate should push translations back: * Use [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) or [Mercurial](https://docs.weblate.org/en/latest/vcs.md#vcs-mercurial) and [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) to push directly. * Use a provider-specific VCS backend, such as GitHub or GitLab, to create pull or merge requests. These backends need API credentials in the Weblate settings. 5. Optionally set [Push branch](https://docs.weblate.org/en/latest/admin/projects.md#component-push-branch) when Weblate should push to a branch in the upstream repository instead of using a fork where supported. ## Pushing changes from Weblate Each translation component can have a push URL set up (see [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push)), and in that case Weblate will be able to push changes to the remote repository. Weblate can also be configured to automatically push changes on every commit; this is enabled by default, see [Push on commit](https://docs.weblate.org/en/latest/admin/projects.md#component-push-on-commit). If you do not want changes to be pushed automatically, you can push manually under Repository maintenance or using the API via [`wlc push`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-arg-push). In case you do not want direct pushes by Weblate, there is support for [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests), [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests), [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests), [Pagure merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-merge-requests), [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests), or [Gerrit review requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gerrit) reviews. You can activate these by choosing GitHub, GitLab, Gitea, Gerrit, Azure DevOps, or Pagure as [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) in [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component). Overall, following options are available with Git, Mercurial, GitHub, GitLab, Gitea, Pagure, Azure DevOps, Gerrit, Bitbucket Data Center and Bitbucket Cloud: | Desired setup | [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) | [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) | [Push branch](https://docs.weblate.org/en/latest/admin/projects.md#component-push-branch) | |------------------------------------------------|---------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|------------------------------------------------------------------------------------| | No push | [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) | empty | empty | | Push directly | [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) | SSH URL | empty | | Push to separate branch | [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) | SSH URL | Branch name | | No push | [Mercurial](https://docs.weblate.org/en/latest/vcs.md#vcs-mercurial) | empty | empty | | Push directly | [Mercurial](https://docs.weblate.org/en/latest/vcs.md#vcs-mercurial) | SSH URL | empty | | GitHub pull request from fork | [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests) | empty | empty | | GitHub pull request from branch | [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests) | SSH URL [1](#empty) | Branch name | | GitLab merge request from fork | [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests) | empty | empty | | GitLab merge request from branch | [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests) | SSH URL [1](#empty) | Branch name | | Gitea merge request from fork | [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests) | empty | empty | | Gitea merge request from branch | [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests) | SSH URL [1](#empty) | Branch name | | Pagure merge request from fork | [Pagure merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-merge-requests) | empty | empty | | Pagure merge request from branch | [Pagure merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-merge-requests) | SSH URL [1](#empty) | Branch name | | Azure DevOps pull request from fork | [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests) | empty | empty | | Azure DevOps pull request from branch | [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests) | SSH URL [1](#empty) | Branch name | | Gerrit review | [Gerrit review requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gerrit) | SSH URL | Target branch name (optional) | | Bitbucket Data Center pull request from fork | [Bitbucket Data Center pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-data-center-pull-requests) | empty | empty | | Bitbucket Data Center pull request from branch | [Bitbucket Data Center pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-data-center-pull-requests) | SSH URL [1](#empty) | Branch name | | Bitbucket Cloud pull request from fork | [Bitbucket Cloud pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-cloud-pull-requests) | empty | empty | | Bitbucket Cloud pull request from branch | [Bitbucket Cloud pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-cloud-pull-requests) | SSH URL [1](#empty) | Branch name | * **[1]** Can be empty in case [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo) supports pushing. ## GitHub ### GitHub repository access #### Hosted Weblate GitHub App On Hosted Weblate, the recommended setup is to connect the [Hosted Weblate app](https://github.com/apps/hosted-weblate) from the Weblate workspace where your project lives. Use the Connect GitHub account flow, install the App on the GitHub user or organization that owns your repositories, grant it access to the repositories you want to translate, and import components from the connected GitHub account. The App-backed workflow uses GitHub installation access tokens for cloning, pushing translation branches, creating pull requests, and receiving incoming notifications. You do not need to invite the Hosted Weblate weblate GitHub user or configure a separate repository webhook for components imported this way. Use the Hosted Weblate weblate GitHub user only when you intentionally configure direct SSH pushes outside the GitHub App workflow, see [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push). #### HTTPS with personal access token For a single private repository, HTTPS access with an access token is usually the simplest setup when the provider supports Git over HTTPS. Use the provider-required username and token in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo). Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). The token needs read access for cloning and write access for pushing. Provider-specific VCS backends that create pull or merge requests might require separate API credentials. To use this approach: 1. Create a personal access token as described in [Creating an access token for command-line use](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token). 2. Include the token in your repository URL: `https://username:token@github.com/owner/repo.git`. This is suitable when you are starting with Weblate or working with a single repository. #### SSH with a dedicated user For setups with multiple repositories, use SSH access with a dedicated code hosting user for Weblate. Add Weblate’s public SSH key to that user, grant the user access to the repositories, and use SSH URLs in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), for example `git@example.com:group/project.git`. Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). This also avoids provider restrictions on SSH key reuse. Some code hosting sites allow a public SSH key to be added only once, or only to a single user or deploy key entry. Keeping Weblate’s SSH key on a dedicated user lets that user be granted access to multiple repositories without reusing the key in several places. This keeps personal, project, or API access tokens out of repository URLs. Provider API credentials are still needed when using a provider-specific VCS backend to create pull or merge requests; those credentials are configured separately from the Git repository URL. For GitHub, create a dedicated user, for example `weblate-bot`, and use GitHub SSH URLs for your repositories, for example `git@github.com:owner/repo.git`. On Hosted Weblate, use this SSH-user workflow only for direct SSH pushes outside the recommended [Hosted Weblate app](https://github.com/apps/hosted-weblate) workflow. #### NOTE When using GitHub for pull requests, the [Push branch](https://docs.weblate.org/en/latest/admin/projects.md#component-push-branch) configuration affects the behavior: if not set, the project is forked and changes are pushed through a fork. If set, changes are pushed to the upstream repository and the chosen branch. ### GitHub notifications Weblate comes with native support for GitHub. If you are using Hosted Weblate, use the [Hosted Weblate app](https://github.com/apps/hosted-weblate) from Weblate’s Connect GitHub account flow. It uses GitHub App webhooks, so you do not need to configure a separate Webhook in GitHub. Components imported from the connected GitHub account also use the App for repository access and pull requests, without inviting the Hosted Weblate weblate GitHub user. The [Hosted Weblate legacy app](https://github.com/apps/hosted-weblate-legacy) is kept for existing webhook-only setups. Its deliveries use the generic GitHub webhook URL and are authenticated using a separate webhook secret configured by the Hosted Weblate operator. Use it only when you need the legacy app to deliver GitHub notifications to Hosted Weblate. For self-hosted Weblate, register the GitHub App using the in-app registration flow described below. Weblate generates the App manifest, GitHub returns the credentials, and they are stored in the database - there is no settings-based configuration. #### Registering the GitHub App from Weblate The fastest way to add the GitHub App is to let Weblate generate a GitHub App manifest with the correct permissions, events, and webhook URL pre-filled: 1. Sign in to Weblate with an account that has management access. 2. Open Manage → Code-hosting connections → Register Weblate GitHub App. 3. Fill in the form. The GitHub host defaults to `github.com`; change it to your GitHub Enterprise hostname if needed. Leave Organization blank to register the App under your personal account, or enter an organization slug to register it under that org. 4. Click Continue to GitHub and confirm on GitHub’s Create GitHub App page (you can still rename the App there). 5. GitHub redirects back to Weblate, which exchanges the temporary code for the App ID, private key, webhook secret, and slug and stores them in the database. The Connect GitHub account button is available immediately afterwards. The manifest requests the permissions and event subscriptions Weblate needs (`Contents` and `Pull requests` read/write, `Metadata` read-only, `Organization administration` read-only, `Workflows` read/write, and the `Installation`, `Meta` and `Push` events), and sets the callback, setup and per-app webhook URLs automatically, so no manual GitHub App configuration is required. GitHub delivers the `Installation` and `Installation repositories` events to all GitHub Apps by default. GitHub only offers accounts where the signed-in GitHub user can install or request the app. If an organization is not shown during the install flow, check the user’s organization role and the organization’s GitHub App installation restrictions. On GitHub.com, public apps can be installed on other accounts; private apps can only be installed on the account that owns the app. #### Connecting a workspace Connected GitHub accounts are bound to a Weblate [workspace](https://docs.weblate.org/en/latest/admin/workspaces.md#workspaces). A user with project administration rights for any project in a workspace can connect a GitHub account on that workspace. After connecting, every project in the workspace can import components from repositories the GitHub App installation has access to. For organization accounts, Weblate verifies that the install-time GitHub user can administer the organization installation. Projects that are not in a workspace cannot connect a GitHub account through the GitHub App. Removing a connected GitHub account also uninstalls the App from GitHub when no other Weblate workspace uses that installation. If another workspace still uses the installation, Weblate removes only the selected workspace connection. Components imported through that connection lose access to their repositories. Removing a workspace uninstalls its connected accounts the same way. Weblate removes the connection even when GitHub no longer knows about the installation, and keeps it only when GitHub could not be reached, so that the removal can be retried. Components imported through the GitHub App flow use the dedicated GitHub (via Weblate GitHub app) VCS backend. The component settings UI keeps the repository URL read-only to prevent the App-issued credentials from being redirected to an unrelated repository. #### Migrating existing components Weblate reports an informational diagnostic for Git and GitHub pull request components that can be migrated to a registered Weblate GitHub App. Follow the Migrate to GitHub App link from the diagnostic to review all eligible components in the workspace. Connect or update the GitHub account for the workspace, grant the App access to the listed repositories, and select the components to migrate. Weblate changes the selected components to the GitHub (via Weblate GitHub app) VCS backend, replaces their repository addresses with canonical HTTPS clone URLs, and removes separate push URLs because the App authenticates pushes to the source repository. #### App webhook URL Each registered Weblate GitHub App has its own webhook URL containing an opaque token that uniquely identifies a single registered App: ```text https://weblate.example.com/hooks/integrations// ``` Components using the GitHub (via Weblate GitHub app) VCS backend are matched only through this dedicated endpoint. All generic forge webhook endpoints exclude them from matching and response diagnostics, including `/hooks/github/`. Legacy GitHub App deliveries sent to the generic endpoint can match only components using a non-App VCS backend. If you are not using a GitHub App, add the Weblate webhook in the repository settings (Webhooks) to receive notifications on every push to a GitHub repository, as shown on the image below: ![image](images/github-settings.png) The Payload URL consists of your Weblate URL appended by `/hooks/github/`, for example for the Hosted Weblate service, this is `https://hosted.weblate.org/hooks/github/`. You can leave other values at default settings. Weblate can handle both content types and consumes just the push event. #### SEE ALSO * [`POST /hooks/github/`](https://docs.weblate.org/en/latest/api.md#post--hooks-github-) * [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push) ### GitHub pull requests This adds a thin layer atop [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) using the [GitHub API](https://docs.github.com/en/rest) to allow pushing translation changes as pull requests, instead of pushing directly to the repository. [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) pushes changes directly to a repository, while the GitHub backend creates pull requests. The latter is not needed for merely accessing Git repositories. To create pull requests, select GitHub as [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) and configure [`GITHUB_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITHUB_CREDENTIALS). For GitHub.com, use `api.github.com` as the API host. The token must allow Weblate to read and write repository contents and create pull requests. If Weblate should fork private repositories, the token might also need administration access. ## GitLab ### GitLab repository access #### HTTPS with personal or project access token For a single private repository, HTTPS access with an access token is usually the simplest setup when the provider supports Git over HTTPS. Use the provider-required username and token in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo). Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). The token needs read access for cloning and write access for pushing. Provider-specific VCS backends that create pull or merge requests might require separate API credentials. For GitLab, the token needs write_repository scope to be able to push changes to the repository. The project access token requires Developer role for pushing. The URL needs to contain a username. For a personal access token, it is the actual username: `https://user:personal_access_token@gitlab.com/example/example.git`. For project access tokens it can be a non-blank value: `https://example:project_access_token@gitlab.com/example/example.git`. #### NOTE The rules for using project access tokens have changed between GitLab releases, the non-blank value is the current requirement, but older versions had different expectations (project name, bot user name). Check GitLab documentation matching your version if unsure. #### SSH with a dedicated user For setups with multiple repositories, use SSH access with a dedicated code hosting user for Weblate. Add Weblate’s public SSH key to that user, grant the user access to the repositories, and use SSH URLs in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), for example `git@example.com:group/project.git`. Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). This also avoids provider restrictions on SSH key reuse. Some code hosting sites allow a public SSH key to be added only once, or only to a single user or deploy key entry. Keeping Weblate’s SSH key on a dedicated user lets that user be granted access to multiple repositories without reusing the key in several places. This keeps personal, project, or API access tokens out of repository URLs. Provider API credentials are still needed when using a provider-specific VCS backend to create pull or merge requests; those credentials are configured separately from the Git repository URL. For GitLab, create a dedicated user and use GitLab SSH URLs, for example `git@gitlab.com:group/project.git`. For Hosted Weblate repositories on GitLab, add the hosted weblate user with the required repository permissions, see [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push). ### GitLab notifications Weblate has support for GitLab hooks. Add a project webhook with destination to `/hooks/gitlab/` URL on your Weblate installation, for example `https://hosted.weblate.org/hooks/gitlab/`. #### SEE ALSO * [`POST /hooks/gitlab/`](https://docs.weblate.org/en/latest/api.md#post--hooks-gitlab-) * [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push) ### GitLab merge requests This adds a thin layer atop [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) using the [GitLab API](https://docs.gitlab.com/api/) to allow pushing translation changes as merge requests instead of pushing directly to the repository. There is no need to use this to access Git repositories, ordinary [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) works the same, the only difference is how pushing to a repository is handled. With [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) changes are pushed directly to the repository, while the GitLab backend creates a merge request. To create merge requests, select GitLab as [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) and configure [`GITLAB_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITLAB_CREDENTIALS). The [Push branch](https://docs.weblate.org/en/latest/admin/projects.md#component-push-branch) configuration affects where Weblate pushes changes before opening the merge request. If it is not set, the project is forked and changes are pushed through a fork. If it is set, changes are pushed to the upstream repository and chosen branch. ## Gitea, Forgejo, and Codeberg ### Gitea, Forgejo, and Codeberg repository access #### HTTPS with an access token For a single private repository, HTTPS access with an access token is usually the simplest setup when the provider supports Git over HTTPS. Use the provider-required username and token in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo). Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). The token needs read access for cloning and write access for pushing. Provider-specific VCS backends that create pull or merge requests might require separate API credentials. #### SSH with a dedicated user For setups with multiple repositories, use SSH access with a dedicated code hosting user for Weblate. Add Weblate’s public SSH key to that user, grant the user access to the repositories, and use SSH URLs in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), for example `git@example.com:group/project.git`. Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). This also avoids provider restrictions on SSH key reuse. Some code hosting sites allow a public SSH key to be added only once, or only to a single user or deploy key entry. Keeping Weblate’s SSH key on a dedicated user lets that user be granted access to multiple repositories without reusing the key in several places. This keeps personal, project, or API access tokens out of repository URLs. Provider API credentials are still needed when using a provider-specific VCS backend to create pull or merge requests; those credentials are configured separately from the Git repository URL. For Hosted Weblate repositories on Codeberg, add the hosted weblate user with the required repository permissions, see [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push). ### Gitea notifications Weblate has support for Gitea webhooks. Add a Gitea Webhook for Push events event with destination to `/hooks/gitea/` URL on your Weblate installation, for example `https://hosted.weblate.org/hooks/gitea/`. This can be done in Webhooks under repository Settings. #### SEE ALSO * [Webhooks in Gitea manual](https://docs.gitea.com/usage/repository/webhooks) * [`POST /hooks/gitea/`](https://docs.weblate.org/en/latest/api.md#post--hooks-gitea-) * [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push) ### Forgejo notifications Weblate has support for Forgejo webhooks. Add a Forgejo Webhook for Push events event with destination to `/hooks/forgejo/` URL on your Weblate installation, for example `https://hosted.weblate.org/hooks/forgejo/`. This can be done in Webhooks under repository Settings. #### SEE ALSO * [Webhooks in Forgejo documentation](https://forgejo.org/docs/latest/user/webhooks/) * [`POST /hooks/forgejo/`](https://docs.weblate.org/en/latest/api.md#post--hooks-forgejo-) * [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push) ### Gitea pull requests #### Versionadded Added in version 4.12. This adds a thin layer atop [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) using the [Gitea API](https://docs.gitea.com/development/api-usage) to allow pushing translation changes as pull requests instead of pushing directly to the repository. There is no need to use this to access Git repositories, ordinary [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) works the same, the only difference is how pushing to a repository is handled. With [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) changes are pushed directly to the repository, while the Gitea backend creates pull requests. To create pull requests, select Gitea as [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) and configure [`GITEA_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITEA_CREDENTIALS). ## Bitbucket ### Bitbucket repository access #### HTTPS with an access token For a single private repository, HTTPS access with an access token is usually the simplest setup when the provider supports Git over HTTPS. Use the provider-required username and token in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo). Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). The token needs read access for cloning and write access for pushing. Provider-specific VCS backends that create pull or merge requests might require separate API credentials. #### SSH with a dedicated user For setups with multiple repositories, use SSH access with a dedicated code hosting user for Weblate. Add Weblate’s public SSH key to that user, grant the user access to the repositories, and use SSH URLs in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), for example `git@example.com:group/project.git`. Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). This also avoids provider restrictions on SSH key reuse. Some code hosting sites allow a public SSH key to be added only once, or only to a single user or deploy key entry. Keeping Weblate’s SSH key on a dedicated user lets that user be granted access to multiple repositories without reusing the key in several places. This keeps personal, project, or API access tokens out of repository URLs. Provider API credentials are still needed when using a provider-specific VCS backend to create pull or merge requests; those credentials are configured separately from the Git repository URL. For Hosted Weblate repositories on Bitbucket, add the hosted weblate user with the required repository permissions, see [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push). To push directly, use [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) or [Mercurial](https://docs.weblate.org/en/latest/vcs.md#vcs-mercurial) with [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push). ### Bitbucket notifications Weblate has support for Bitbucket webhooks. Add a webhook which triggers upon repository push, with destination to `/hooks/bitbucket/` URL on your Weblate installation, for example `https://hosted.weblate.org/hooks/bitbucket/`. ![image](images/bitbucket-settings.png) #### SEE ALSO * [`POST /hooks/bitbucket/`](https://docs.weblate.org/en/latest/api.md#post--hooks-bitbucket-) * [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push) ### Bitbucket Data Center pull requests #### Versionadded Added in version 4.16. This adds a thin layer atop [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) using the [Bitbucket Data Center API](https://developer.atlassian.com/server/bitbucket/) to allow pushing translation changes as pull requests instead of pushing directly to the repository. #### WARNING This does not support Bitbucket Cloud API. There is no need to use this to access Git repositories, ordinary [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) works the same, the only difference is how pushing to a repository is handled. With [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) changes are pushed directly to the repository, while the Bitbucket Data Center backend creates a pull request. To create pull requests, select Bitbucket Data Center as [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) and configure [`BITBUCKETSERVER_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BITBUCKETSERVER_CREDENTIALS). ### Bitbucket Cloud pull requests #### Versionadded Added in version 5.8. This adds a thin layer atop [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) using the [Bitbucket Cloud API](https://developer.atlassian.com/cloud/bitbucket/) to allow pushing translation changes as pull requests instead of pushing directly to the repository. #### WARNING This is different from Bitbucket Data Center API. There is no need to use this to access Git repositories, ordinary [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) works the same, the only difference is how pushing to a repository is handled. With [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) changes are pushed directly to the repository, while the Bitbucket Cloud backend creates a pull request. To create pull requests, select Bitbucket Cloud as [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) and configure [`BITBUCKETCLOUD_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BITBUCKETCLOUD_CREDENTIALS). ## Azure DevOps ### Azure Repos repository access #### HTTPS with an access token For a single private repository, HTTPS access with an access token is usually the simplest setup when the provider supports Git over HTTPS. Use the provider-required username and token in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo). Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). The token needs read access for cloning and write access for pushing. Provider-specific VCS backends that create pull or merge requests might require separate API credentials. Use the HTTPS clone URL shown by Azure Repos for the repository. #### SSH with a dedicated user For setups with multiple repositories, use SSH access with a dedicated code hosting user for Weblate. Add Weblate’s public SSH key to that user, grant the user access to the repositories, and use SSH URLs in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), for example `git@example.com:group/project.git`. Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). This also avoids provider restrictions on SSH key reuse. Some code hosting sites allow a public SSH key to be added only once, or only to a single user or deploy key entry. Keeping Weblate’s SSH key on a dedicated user lets that user be granted access to multiple repositories without reusing the key in several places. This keeps personal, project, or API access tokens out of repository URLs. Provider API credentials are still needed when using a provider-specific VCS backend to create pull or merge requests; those credentials are configured separately from the Git repository URL. Use the SSH URL shown by Azure Repos for the repository. ### Azure Repos notifications Weblate has support for Azure Repos webhooks. Add a webhook for Code pushed event with destination to `/hooks/azure/` URL on your Weblate installation, for example `https://hosted.weblate.org/hooks/azure/`. This can be done in Service hooks under Project settings. #### SEE ALSO * [Web hooks in Azure DevOps manual](https://learn.microsoft.com/en-us/azure/devops/service-hooks/services/webhooks?view=azure-devops) * [`POST /hooks/azure/`](https://docs.weblate.org/en/latest/api.md#post--hooks-azure-) * [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push) ### Azure DevOps pull requests This adds a thin layer atop [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) using the [Azure DevOps API](https://learn.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-7.2) to allow pushing translation changes as pull requests, instead of pushing directly to the repository. [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) pushes changes directly to a repository, while the Azure DevOps backend creates pull requests. The latter is not needed for merely accessing Git repositories. To create pull requests, select Azure DevOps as [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) and configure [`AZURE_DEVOPS_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AZURE_DEVOPS_CREDENTIALS). ## Pagure ### Pagure repository access #### HTTPS with an access token For a single private repository, HTTPS access with an access token is usually the simplest setup when the provider supports Git over HTTPS. Use the provider-required username and token in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo). Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). The token needs read access for cloning and write access for pushing. Provider-specific VCS backends that create pull or merge requests might require separate API credentials. #### SSH with a dedicated user For setups with multiple repositories, use SSH access with a dedicated code hosting user for Weblate. Add Weblate’s public SSH key to that user, grant the user access to the repositories, and use SSH URLs in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), for example `git@example.com:group/project.git`. Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). This also avoids provider restrictions on SSH key reuse. Some code hosting sites allow a public SSH key to be added only once, or only to a single user or deploy key entry. Keeping Weblate’s SSH key on a dedicated user lets that user be granted access to multiple repositories without reusing the key in several places. This keeps personal, project, or API access tokens out of repository URLs. Provider API credentials are still needed when using a provider-specific VCS backend to create pull or merge requests; those credentials are configured separately from the Git repository URL. ### Pagure notifications Weblate has support for Pagure hooks. Add a webhook with destination to `/hooks/pagure/` URL on your Weblate installation, for example `https://hosted.weblate.org/hooks/pagure/`. This can be done in Activate Web-hooks under Project options: ![image](images/pagure-webhook.png) #### SEE ALSO * [`POST /hooks/pagure/`](https://docs.weblate.org/en/latest/api.md#post--hooks-pagure-) * [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push) ### Pagure merge requests #### Versionadded Added in version 4.3.2. This adds a thin layer atop [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) using the [Pagure API](https://pagure.io/api/0/) to allow pushing translation changes as merge requests instead of pushing directly to the repository. There is no need to use this to access Git repositories, ordinary [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) works the same, the only difference is how pushing to a repository is handled. With [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) changes are pushed directly to the repository, while the Pagure backend creates a merge request. To create merge requests, select Pagure as [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) and configure [`PAGURE_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PAGURE_CREDENTIALS). ## Other workflows ### Gitee repository access #### HTTPS with an access token For a single private repository, HTTPS access with an access token is usually the simplest setup when the provider supports Git over HTTPS. Use the provider-required username and token in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo). Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). The token needs read access for cloning and write access for pushing. Provider-specific VCS backends that create pull or merge requests might require separate API credentials. #### SSH with a dedicated user For setups with multiple repositories, use SSH access with a dedicated code hosting user for Weblate. Add Weblate’s public SSH key to that user, grant the user access to the repositories, and use SSH URLs in [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), for example `git@example.com:group/project.git`. Configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) only when Weblate should push changes directly or when the chosen workflow requires a push URL, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). This also avoids provider restrictions on SSH key reuse. Some code hosting sites allow a public SSH key to be added only once, or only to a single user or deploy key entry. Keeping Weblate’s SSH key on a dedicated user lets that user be granted access to multiple repositories without reusing the key in several places. This keeps personal, project, or API access tokens out of repository URLs. Provider API credentials are still needed when using a provider-specific VCS backend to create pull or merge requests; those credentials are configured separately from the Git repository URL. ### Gitee notifications Weblate has support for Gitee webhooks. Add a WebHook for Push event with destination to `/hooks/gitee/` URL on your Weblate installation, for example `https://hosted.weblate.org/hooks/gitee/`. This can be done in WebHooks under repository Management. #### SEE ALSO * [Webhooks in Gitee manual](https://help.gitee.com/webhook) * [`POST /hooks/gitee/`](https://docs.weblate.org/en/latest/api.md#post--hooks-gitee-) * [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push) ### Gerrit review requests Gerrit support adds a thin layer atop [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) using the [git-review](https://pypi.org/project/git-review/) tool to allow pushing translation changes as Gerrit review requests, instead of pushing them directly to the repository. The optional [Push branch](https://docs.weblate.org/en/latest/admin/projects.md#component-push-branch) setting selects the target branch for the Gerrit review. Leave it empty to use [Repository branch](https://docs.weblate.org/en/latest/admin/projects.md#component-branch). Use the short branch name, such as `main`; Weblate and `git-review` push the review to `refs/for/` automatically. Gerrit push options can be appended after `%` in either setting, for example `main%topic=l10n`. Gerrit interprets these options as the configured Weblate Gerrit account and applies its own permissions. The Gerrit documentation has the details on the configuration necessary to set up such repositories. There is no separate code-hosting credential setting for this backend. ### Docker credentials For Docker installations, code-hosting API credentials can also be provided through environment variables, see [Code-hosting sites credentials](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-vcs-config). # admin/componentlists.md # Component Lists Specify multiple lists of components to appear as options on the user dashboard, from which users can pick one as their default view. See [Dashboard](https://docs.weblate.org/en/latest/user/profile.md#dashboard) to learn more. #### HINT A status will be presented for each component list presented on the dashboard. Each component list has a name displayed to the user and a slug used in the URL. Component lists can be managed using the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). Instance administrators can also use the low-level [The Django admin interface](https://docs.weblate.org/en/latest/admin/admin.md#admin-interface) when direct database-object management is necessary. #### HINT Change dashboard settings for anonymous users from the admin interface, altering what dashboard is presented to unauthenticated users. ## Automatic component lists Add components to the list automatically based on their slug by creating Automatic component list assignment rules. * Useful for maintaining component lists for large installations, or in case you want to have one component list with all components on your Weblate installation. #### HINT Make a component list containing all the components of your Weblate installation. 1. Define Automatic component list assignment with `^.*$` as regular expression in both the project and the component fields. # admin/config.md # Configuration All settings are stored in `settings.py` (as is usual for Django). #### NOTE After changing any of these settings, you need to restart Weblate — both WSGI and Celery processes. In case it is run as `mod_wsgi`, you need to restart Apache to reload the configuration. #### SEE ALSO Please also check [Django’s documentation](https://docs.djangoproject.com/en/stable/ref/settings/) for parameters configuring Django itself. ## ADMINS_CONTACT Configures where contact form sends e-mails. If not configured, e-mail addresses from [`ADMINS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ADMINS) are used. Configure this as a list of e-mail addresses: ```python ADMINS_CONTACT = ["admin@example.com", "support@example.com"] ``` #### SEE ALSO * [`CONTACT_FORM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CONTACT_FORM) * [`ADMINS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ADMINS) ## ALLOWED_ASSET_DOMAINS #### Versionadded Added in version 5.14. Configures which domains are allowed for fetching assets in Weblate. This enhances security by preventing loading assets from untrusted sources. Assets are downloaded once by the Weblate server and stored locally, rather than being served directly from external domains to users. The allowlist is applied to the initial URL and to every HTTP redirect target before Weblate follows it. Redirects to hosts outside of this allowlist are rejected. It expects a list of host/domain names. You can use fully qualified names (e.g `www.example.com`) or prepend with a period as a wildcard to match all subdomains (e.g `.example.com` will match `cdn.example.com` or `static.example.com`). Defaults to `["*"]`, which allows all domains. **Example** ```python ALLOWED_ASSET_DOMAINS = [ # Allows only cdn.anotherdomain.org "cdn.anotherdomain.org", # Allows example.com and all its subdomains ".example.com", ] ``` This is currently used in the following places: * Screenshot uploads, see [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots) * Remote HTML downloads for the [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) add-on #### SEE ALSO * [`ALLOWED_ASSET_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_SIZE) * [`ASSET_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_RESTRICT_PRIVATE) * [`ASSET_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_PRIVATE_ALLOWLIST) ## ALLOWED_MACHINERY_DOMAINS Configures which custom machinery domains are explicitly allowed in project-level machine translation configuration. This setting applies only to machinery services and does not affect [`ALLOWED_ASSET_DOMAINS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_DOMAINS). It expects a list of host/domain names. You can use fully qualified names or prepend with a period as a wildcard to match all subdomains. Defaults to `[]`. The allowlist affects project-managed machinery in two ways: it permits the configured endpoint during outbound validation, and it marks matching hosts as trusted when deciding whether remote provider error details or response bodies can be shown to the user. Matching hosts are also exempt from private-target restrictions. For direct connections, Weblate does not resolve, pin, or verify the peer address of matching hosts. Only add hosts or domains whose network destinations are trusted. When a configured [HTTP proxy](https://docs.weblate.org/en/latest/admin/install.md#http-proxy) is used, the proxy is trusted to resolve the destination hostname. ## ALLOWED_ASSET_SIZE #### Versionadded Added in version 5.14. Configures size limit in bytes for fetching or uploading assets into Weblate. Defaults to 10 MB. #### SEE ALSO * [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots) * [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts) * [`ALLOWED_ASSET_DOMAINS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_DOMAINS) ## ASSET_PRIVATE_ALLOWLIST #### Versionadded Added in version 2025.5. Defines hostnames or domains exempt from [`ASSET_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_RESTRICT_PRIVATE) for remote asset downloads that enforce private-target checks. Entries follow Django host matching semantics, so values such as `assets.internal.example` or `.internal.example` can be used. This does not replace [`ALLOWED_ASSET_DOMAINS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_DOMAINS); remote assets must still match the asset domain allowlist. Default configuration: ```python ASSET_PRIVATE_ALLOWLIST = [] ``` #### SEE ALSO * [`ALLOWED_ASSET_DOMAINS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_DOMAINS) * [`ASSET_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_RESTRICT_PRIVATE) ## ASSET_RESTRICT_PRIVATE #### Versionadded Added in version 2025.5. Reject remote asset URLs pointing to internal or non-public addresses unless the target host is included in [`ASSET_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_PRIVATE_ALLOWLIST). On by default. When enabled, hostnames that cannot be resolved during validation are rejected unless they are explicitly included in [`ASSET_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_PRIVATE_ALLOWLIST). This currently applies to screenshot URL uploads and remote HTML downloads for the [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) add-on. #### SEE ALSO * [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots) * [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) * [`ALLOWED_ASSET_DOMAINS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_DOMAINS) * [`ASSET_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_PRIVATE_ALLOWLIST) ## ALTCHA_COST #### Versionadded Added in version 2025.5. Argon2id time cost for the ALTCHA proof-of-work challenge. Defaults to `3`. Replaces `ALTCHA_MAX_NUMBER`, which applied to the removed ALTCHA widget v2. ## ALTCHA_MEMORY_COST #### Versionadded Added in version 2025.5. Argon2id memory cost in KiB. Defaults to `65536`. ## ALTCHA_PARALLELISM #### Versionadded Added in version 2025.5. Argon2id parallelism factor. Defaults to `1`. #### SEE ALSO [ALTCHA Proof of Work Mechanism](https://altcha.org/docs/integration/proof-of-work-captcha/) ## ANONYMOUS_USER_NAME Username of users that are not signed in. #### SEE ALSO [Access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) ## AUDITLOG_EXPIRY The maximum number of days Weblate will keep audit logs containing information about the account activity. Defaults to 180 days. ## AUTH_LOCK_ATTEMPTS Maximum number of failed authentication attempts before rate limiting is applied. This is currently applied in the following locations: * Sign in. Deletes the account password, preventing the user from signing in without requesting a new password. * Second-factor sign in. Deletes the account password after this many rejected second-factor submissions since the last successful second-factor sign in. This also invalidates pending password sign-ins. Other authentication methods and API tokens remain usable. * Password reset. Prevents new e-mails from being sent, avoiding spamming users with too many password-reset attempts. Defaults to 10. #### SEE ALSO [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) ## AUTO_UPDATE Updates all repositories on a daily basis. Every hour, Weblate queues updates for repositories whose component ID modulo 24 matches the current UTC hour. This distributes updates throughout the day. For example, component ID `25` is selected during the hour from 01:00 to 01:59 UTC. Linked components use the schedule of the component that owns their shared repository. The assigned hour determines when updates are queued, not when they finish. Execution can be delayed by queued tasks or repository operations. Restarting Celery does not change the assigned hour. This setting does not provide a configurable update time window. #### HINT Useful if you are not using [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks) to update Weblate repositories automatically. #### NOTE On/off options exist in addition to string selection for backward compatibility. The options are: `"none"` : No daily updates. `"remote"` also `False` : Fetch remote changes without merging them into the working copy. This is the default; `False` does not disable daily updates. `"full"` also `True` : Fetch remote changes and merge them into the working copy. #### NOTE Automatic updates require that [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) is working. Restart Celery after changing this setting for the new value to take effect. ## AVATAR_URL_PREFIX Prefix for constructing avatar URLs as: `${AVATAR_URL_PREFIX}/avatar/${MAIL_HASH}?${PARAMS}`. The following services are known to work: Gravatar (default), as per [https://gravatar.com/](https://gravatar.com/) : `AVATAR_URL_PREFIX = 'https://www.gravatar.com/'` Libravatar, as per [https://www.libravatar.org/](https://www.libravatar.org/) : `AVATAR_URL_PREFIX = 'https://www.libravatar.org/'` #### SEE ALSO * [Avatar caching](https://docs.weblate.org/en/latest/admin/install.md#production-cache-avatar) * [`ENABLE_AVATARS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_AVATARS) * [Avatars](https://docs.weblate.org/en/latest/admin/optionals.md#avatars) ## AUTH_TOKEN_VALID How long the authentication token and temporary password from password reset e-mails is valid for. Set in number of seconds, defaulting to 172800 (2 days). ## AUTH_PASSWORD_DAYS How many days Weblate rejects reusing a previously used password for a user. The checking is based on the audit log, [`AUDITLOG_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUDITLOG_EXPIRY) needs to be at least same as this. #### NOTE Password changes made prior to Weblate 2.15 will not be accounted for in this policy. Defaults to 180 days. ## AUTOFIX_LIST List of automatic fixes to apply when saving a string. #### NOTE Provide a fully-qualified path to the Python class that implements the autofixer interface. Available fixes are described at [Automatic fixups](https://docs.weblate.org/en/latest/user/checks.md#autofix). You can select which ones to use: ```python AUTOFIX_LIST = ( "weblate.trans.autofixes.whitespace.SameBookendingWhitespace", "weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis", ) ``` #### SEE ALSO * [Automatic fixups](https://docs.weblate.org/en/latest/user/checks.md#autofix) * [Custom automatic fixups](https://docs.weblate.org/en/latest/admin/checks.md#custom-autofix) * [Custom quality checks, add-ons, automatic suggestions and auto-fixes](https://docs.weblate.org/en/latest/admin/customize.md#custom-modules) ## BACKGROUND_TASKS #### Versionadded Added in version 4.5.2. Defines how often lengthy maintenance tasks should be triggered for a component. Right now this controls: * [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) add-on * [Checks and fixups](https://docs.weblate.org/en/latest/admin/checks.md) recalculation Possible choices: * `monthly` (this is the default) * `weekly` * `daily` * `never` #### NOTE Increasing the frequency is not recommended when Weblate contains thousands of components. ## BASIC_LANGUAGES #### Versionadded Added in version 4.4. List of languages to offer users for starting a new translation. When not specified, a built-in list is used (which includes all commonly used languages, but without country specific variants). This only limits non privileged users to add unwanted languages. Project admins are still presented with the full selection of languages defined in Weblate. #### NOTE This does not define new languages for Weblate — it only filters existing ones in the database. **Example:** ```python BASIC_LANGUAGES = {"cs", "it", "ja", "en"} ``` #### SEE ALSO [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) ## BORG_EXTRA_ARGS #### Versionadded Added in version 4.9. You can pass additional arguments to **borg create** when built-in backups are triggered. **Example:** ```python BORG_EXTRA_ARGS = ["--exclude", "vcs/"] ``` #### SEE ALSO * [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md#backup) * [borg create](https://borgbackup.readthedocs.io/en/stable/usage/create.html) ## CACHE_DIR #### Versionadded Added in version 4.16. Directory where Weblate stores cache files. Defaults to `cache` subfolder in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR). Change this to local or temporary filesystem if [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) is on a network filesystem. Weblate stores generated helper files here and executes some of them, so [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) has to be writable and mounted on a filesystem that allows execution. Avoid using `noexec` mount options for this directory. The Docker container uses a separate volume for this, see [Docker container volumes](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume). The following subdirectories usually exist: `ssh` : Generated helper files used for VCS access. `fonts` : **font-config** cache for [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts). `avatar` : Cached user avatars, see [Avatars](https://docs.weblate.org/en/latest/admin/optionals.md#avatars). `static` : Default location for static Django files, specified by [`STATIC_ROOT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STATIC_ROOT). See [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files). `tesseract` : OCR trained data for [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots). ## CSP_SCRIPT_SRC, CSP_IMG_SRC, CSP_CONNECT_SRC, CSP_STYLE_SRC, CSP_FONT_SRC, CSP_FORM_SRC Customize the *Content-Security-Policy* header for Weblate. The header is automatically generated based on enabled integrations with third-party services (Matomo, Google Analytics, Sentry, …). All these default to an empty list. **Example:** ```python # Enable Cloudflare Javascript optimizations CSP_SCRIPT_SRC = ["ajax.cloudflare.com"] ``` #### SEE ALSO * [Content security policy](https://docs.weblate.org/en/latest/admin/install.md#csp) * [Content Security Policy (CSP)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP) ## CHECK_LIST List of quality checks to perform on a translation. #### NOTE Provide a fully-qualified path to the Python class implementing the check interface. Adjust the list of checks to include ones relevant to you. All built-in [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks) are turned on by default, from where you can change these settings. By default they are commented out in [Sample configuration](https://docs.weblate.org/en/latest/admin/sample.md#sample-configuration) so that default values are used. New checks are then carried out for each new Weblate version. You can turn off all checks: ```python CHECK_LIST = () ``` You can turn on only a few: ```python CHECK_LIST = ( "weblate.checks.chars.BeginNewlineCheck", "weblate.checks.chars.EndNewlineCheck", "weblate.checks.chars.MaxLengthCheck", ) ``` #### NOTE Changing this setting only affects newly changed translations. Existing checks will still be stored in the database. To also apply changes to the stored translations, run [`updatechecks`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-updatechecks). #### SEE ALSO * [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks) * [Writing own checks](https://docs.weblate.org/en/latest/admin/checks.md#own-checks) * [Custom quality checks, add-ons, automatic suggestions and auto-fixes](https://docs.weblate.org/en/latest/admin/customize.md#custom-modules) ## COMMIT_PENDING_HOURS Number of hours between committing pending changes by way of the background task. #### SEE ALSO * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) * [Age of changes to commit](https://docs.weblate.org/en/latest/admin/projects.md#component-commit-pending-age) * [Running maintenance tasks](https://docs.weblate.org/en/latest/admin/install.md#production-cron) * [`commit_pending`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-commit_pending) ## COMPONENT_ZIP_UPLOAD_MAX_SIZE #### Versionadded Added in version 5.17.1. Configures the maximum size, in bytes, for uploaded component ZIP files. Defaults to 50 MB. In Docker, configure this using the `WEBLATE_COMPONENT_ZIP_UPLOAD_MAX_SIZE` environment variable. #### SEE ALSO * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) ## CONTACT_FORM #### Versionadded Added in version 4.6. Configures how e-mail from the contact form is being sent. Choose a configuration that matches the configuration of your mail server. `"reply-to"` : The sender is used as *Reply-To*, this is the default behaviour. `"from"` : The sender is used as *From*. Your mail server needs to allow sending such e-mails. `"disabled"` : Disables the contact form entirely.
#### Versionadded Added in version 5.15. #### SEE ALSO [`ADMINS_CONTACT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ADMINS_CONTACT) ## DATA_DIR The folder Weblate stores all data in. It contains links to VCS repositories, a fulltext index and various configuration files for external tools. The following subdirectories usually exist: `home` : Home directory used for invoking scripts. `ssh` : SSH keys and configuration. `media` : Default location for Django media files, specified by [`MEDIA_ROOT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-MEDIA_ROOT). Contains uploaded screenshots, see [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots). `vcs` : Version-control repositories for translations. `backups` : Daily backup data. Please check [Dumped data for backups](https://docs.weblate.org/en/latest/admin/backup.md#backup-dumps) for details. `fonts`: : User-uploaded fonts, see [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts). `cache` : Various caches. Can be placed elsewhere using [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR).
The Docker container uses a separate volume for this, see [Docker container volumes](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume). #### NOTE This directory has to be writable by Weblate. Running it as WSGI means the `www-data` user should have write access to it. The easiest way to achieve this is to make the user the owner of the directory: ```sh sudo chown www-data:www-data -R $DATA_DIR ``` Defaults to `/home/weblate/data`, but it is expected to be configured. #### SEE ALSO * [Filesystem permissions](https://docs.weblate.org/en/latest/admin/install.md#file-permissions) * [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md) * [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) ## DATABASE_BACKUP Whether the database backups should be stored as plain text, compressed or skipped. The authorized values are: * `"plain"` * `"compressed"` * `"none"` #### SEE ALSO [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md#backup) ## DEFAULT_ACCESS_CONTROL The default access-control setting for new projects: `0` : Public `1` : Protected `100` : Private `200` : Custom Use Custom if you are managing ACL manually, which means not relying on the internal Weblate management. #### SEE ALSO * [Project access control](https://docs.weblate.org/en/latest/admin/access.md#acl) * [Access control](https://docs.weblate.org/en/latest/admin/projects.md#project-access-control) ## DEFAULT_AUTO_WATCH #### Versionadded Added in version 4.5. Configures whether Automatically watch projects on contribution should be turned on for new users. Defaults to `True`. #### SEE ALSO [Notifications](https://docs.weblate.org/en/latest/user/profile.md#notifications) ## DEFAULT_RESTRICTED_COMPONENT #### Versionadded Added in version 4.1. The default value for component restriction. #### SEE ALSO * [Restricted access](https://docs.weblate.org/en/latest/admin/projects.md#component-restricted) * [Scope of teams](https://docs.weblate.org/en/latest/admin/access.md#perm-check) ## DEFAULT_ADD_MESSAGE, DEFAULT_ADDON_MESSAGE, DEFAULT_COMMIT_MESSAGE, DEFAULT_DELETE_MESSAGE, DEFAULT_MERGE_MESSAGE Default commit messages for different operations, please check [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for details. The built-in defaults follow Conventional Commits and include Weblate links where available. Changing these settings affects newly created defaults; existing message templates can be reset in the settings forms with Restore site default. For inherited values, restoring the site default also disables inheritance for that message. #### SEE ALSO * [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup) * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) * [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/latest/admin/projects.md#component-commit-message) ## DEFAULT_ADDONS Default add-ons to install for every created component. #### NOTE This setting affects only newly created components. Example: ```python DEFAULT_ADDONS = { # Add-on with no parameters "weblate.flags.target_edit": {}, # Add-on with parameters "weblate.autotranslate.autotranslate": { "mode": "suggest", "filter_type": "todo", "auto_source": "mt", "component": "", "engines": ["weblate-translation-memory"], "threshold": "80", }, } ``` #### SEE ALSO * [`install_addon`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-install_addon) * [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md) * [`WEBLATE_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_ADDONS) ## DEFAULT_COMMITER_EMAIL Committer e-mail address, defaulting to `noreply@weblate.org`. #### SEE ALSO [`DEFAULT_COMMITER_NAME`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_COMMITER_NAME) ## DEFAULT_COMMITER_NAME Committer name, defaulting to `Weblate`. #### SEE ALSO [`DEFAULT_COMMITER_EMAIL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_COMMITER_EMAIL) ## DEFAULT_LANGUAGE #### Versionadded Added in version 4.3.2. [Source language](https://docs.weblate.org/en/latest/admin/projects.md#component-source-language) for any new components. Defaults to en. The matching language object needs to exist in the database. #### SEE ALSO * [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) * [Source language](https://docs.weblate.org/en/latest/admin/projects.md#component-source-language) ## DEFAULT_MERGE_STYLE [Merge style](https://docs.weblate.org/en/latest/admin/projects.md#component-merge-style) for any new components. * rebase - default * merge #### SEE ALSO * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) * [Merge style](https://docs.weblate.org/en/latest/admin/projects.md#component-merge-style) ## DEFAULT_SHARED_TM Configures the default value of [Use shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-shared-tm) and [Contribute to shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-shared-tm). ## DEFAULT_TRANSLATION_REVIEW #### Versionadded Added in version 5.16. Configures the default value for [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review), turned off by default. ## DEFAULT_SOURCE_REVIEW #### Versionadded Added in version 5.16. Configures the default value for [Enable source reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-source-review), turned off by default. ## DEFAULT_AUTOCLEAN_TM #### Versionadded Added in version 5.13. Configures the default value of [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-autoclean-tm). ## DEFAULT_TRANSLATION_PROPAGATION Default setting for translation propagation, defaults to `True`. #### SEE ALSO * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) * [Allow translation propagation](https://docs.weblate.org/en/latest/admin/projects.md#component-allow-translation-propagation) ## DEFAULT_PULL_MESSAGE Configures the default title and message for pull requests. The built-in default follows Conventional Commits and includes Weblate links and translation status. ## ENABLE_AVATARS Whether to turn on Gravatar-based avatars for users. On by default. Avatars are fetched and cached on the server, lowering the risk of leaking private info, speeding up the user experience. #### SEE ALSO * [Avatar caching](https://docs.weblate.org/en/latest/admin/install.md#production-cache-avatar) * [`AVATAR_URL_PREFIX`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AVATAR_URL_PREFIX) * [Avatars](https://docs.weblate.org/en/latest/admin/optionals.md#avatars) ## ENABLE_HOOKS Whether to turn on anonymous remote hooks. #### SEE ALSO [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks) ## ENABLE_HTTPS #### Versionchanged Changed in version 5.7: Weblate now requires https for WebAuthn support. Whether to send links to Weblate as HTTPS or HTTP. This setting affects sent e-mails and generated absolute URLs. In the default configuration this is also used for several Django settings related to HTTPS — it enables secure cookies, toggles HSTS or enables redirection to a HTTPS URL. The HTTPS redirection might be problematic in some cases and you might hit an issue with infinite redirection in case you are using a reverse proxy doing an SSL termination which does not correctly pass protocol headers to Django. Please tweak your reverse proxy configuration to emit *X-Forwarded-Proto* or *Forwarded* headers or configure [`SECURE_PROXY_SSL_HEADER`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECURE_PROXY_SSL_HEADER) to let Django correctly detect the SSL status. In case this is disabled, Weblate will fail to start with an `otp_webauthn.E031` error. You can silence this error by adding it to [`SILENCED_SYSTEM_CHECKS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SILENCED_SYSTEM_CHECKS), but still WebAuthn will not work for sites without HTTPS. #### SEE ALSO * [`SESSION_COOKIE_SECURE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SESSION_COOKIE_SECURE) * [`CSRF_COOKIE_SECURE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-CSRF_COOKIE_SECURE) * [`SECURE_SSL_REDIRECT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECURE_SSL_REDIRECT) * [`SECURE_PROXY_SSL_HEADER`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECURE_PROXY_SSL_HEADER) * [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site) ## ENABLE_SHARING Turn on/off the Community menu so users can share translation progress on social networks. #### SEE ALSO [Building the translation community](https://docs.weblate.org/en/latest/devel/share.md#promotion) ## EXTRA_HTML_HEAD #### Versionadded Added in version 4.15. Insert additional markup into the HTML header. Can be used for verification of site ownership, for example: ```python EXTRA_HTML_HEAD = '' ``` #### WARNING No sanitization is performed on the string. It is inserted as-is into the HTML header. ## GET_HELP_URL #### Versionadded Added in version 4.5.2. URL where support for your Weblate instance can be found. ## GITEA_CREDENTIALS #### Versionadded Added in version 4.12. List for credentials for Gitea servers. ```python GITEA_CREDENTIALS = { "try.gitea.io": { "username": "weblate", "token": "your-api-token", }, } ``` The configuration dictionary consists of credentials defined for each API host. The layout is same for almost all version control integrations and is described at [Configuring version control credentials](https://docs.weblate.org/en/latest/admin/config.md#settings-credentials). #### SEE ALSO * [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md) * [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests) * [Creating a Gitea personal access token](https://docs.gitea.com/development/api-usage) ## GITLAB_CREDENTIALS #### Versionadded Added in version 4.3. List for credentials for GitLab servers. ```python GITLAB_CREDENTIALS = { "gitlab.com": { "username": "weblate", "token": "your-api-token", }, } ``` #### NOTE The personal access token needs the api scope to be able to use the API. The configuration dictionary consists of credentials defined for each API host. The layout is same for almost all version control integrations and is described at [Configuring version control credentials](https://docs.weblate.org/en/latest/admin/config.md#settings-credentials). #### SEE ALSO * [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests) * [GitLab: Personal access token](https://docs.gitlab.com/user/profile/personal_access_tokens/) ## GITHUB_CREDENTIALS #### Versionadded Added in version 4.3. List for credentials for GitHub servers. ```python GITHUB_CREDENTIALS = { "api.github.com": { "username": "weblate", "token": "your-api-token", }, } ``` #### NOTE It is possible to use both fine-grained personal access tokens and classic personal access tokens. The fine-grained tokens are limited to a single organization, so it won’t work if you want Weblate to fork a repository outside the organization (typically to the user namespace). To clone, push and create pull requests, the read and write access to Contents and Pull requests is required. Administration might also be necessary for forking a repository if you intend to use forking and the original repository is not public. #### HINT Use `api.github.com` as an API host for [https://github.com/](https://github.com/). The configuration dictionary consists of credentials defined for each API host. The layout is same for almost all version control integrations and is described at [Configuring version control credentials](https://docs.weblate.org/en/latest/admin/config.md#settings-credentials). #### SEE ALSO * [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests) * [Creating a GitHub personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) ## GITHUB_LEGACY_APP_WEBHOOK_SECRET #### Versionadded Added in version 2026.8. Webhook secret for a legacy GitHub App which delivers events to the generic GitHub webhook URL, `/hooks/github/`. App webhook deliveries to the generic URL are rejected when this setting is empty or their `X-Hub-Signature-256` does not match. Ordinary repository webhooks are unaffected. GitHub Apps registered through Weblate use their per-App webhook URLs and do not use this setting. ```python GITHUB_LEGACY_APP_WEBHOOK_SECRET = "your-webhook-secret" ``` #### SEE ALSO * [GitHub notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-notifications) * [App webhook URL](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-webhook) ## BITBUCKETSERVER_CREDENTIALS #### Versionadded Added in version 4.16. List for credentials for Bitbucket Data Center. ```python BITBUCKETSERVER_CREDENTIALS = { "git.self-hosted.com": { "username": "weblate", "token": "http-access-token", }, } ``` The configuration dictionary consists of credentials defined for each API host. The layout is same for almost all version control integrations and is described at [Configuring version control credentials](https://docs.weblate.org/en/latest/admin/config.md#settings-credentials). #### SEE ALSO * [Bitbucket Data Center pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-data-center-pull-requests) * [Bitbucket: HTTP access token](https://confluence.atlassian.com/bitbucketserver/http-access-tokens-939515499.html) ## BITBUCKETCLOUD_CREDENTIALS #### Versionadded Added in version 5.8. List for credentials for Bitbucket Cloud servers. ```python BITBUCKETCLOUD_CREDENTIALS = { "bitbucket.org": { "username": "your-email", "workspace": "your-workspace-slug", "token": "your-api-token", }, } ``` The configuration dictionary consists of credentials defined for each API host. The API host might be different from what you use in the web browser, for example GitHub API is accessed as `api.github.com`. The following configuration is available for each host: `username` : API user. `workspace` : The user workspace slug. `token` : The API token with pullrequest:write permission. Additional settings not described here can be found at [Configuring version control credentials](https://docs.weblate.org/en/latest/admin/config.md#settings-credentials). #### SEE ALSO * [Bitbucket Cloud pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-cloud-pull-requests) * [Create an API token](https://support.atlassian.com/bitbucket-cloud/docs/create-an-api-token/) * [API token permissions](https://support.atlassian.com/bitbucket-cloud/docs/api-token-permissions/) ## AZURE_DEVOPS_CREDENTIALS #### Versionadded Added in version 5.2. List for credentials for Azure DevOps servers. ```python AZURE_DEVOPS_CREDENTIALS = { "dev.azure.com": { "username": "project-name", "token": "your-api-token", "organization": "organization-name", }, } ``` The configuration dictionary consists of credentials defined for each API host. The API host might be different from what you use in the web browser, for example GitHub API is accessed as `api.github.com`. The following configuration is available for each host: `username` : The name of the Azure DevOps project. This is not the repository name. `organization` : The name of the organization of the project. `workItemIds` : An optional list of work items IDs from your organization. When provided new pull requests will have these attached. `token` : API token for the API user, required. Additional settings not described here can be found at [Configuring version control credentials](https://docs.weblate.org/en/latest/admin/config.md#settings-credentials). #### SEE ALSO * [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests) * [Azure DevOps: Personal access token](https://learn.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=Windows) ## GOOGLE_ANALYTICS_ID Google Analytics ID to turn on monitoring of Weblate using Google Universal Analytics. #### NOTE Google Analytics 4 integration is currently not available for Weblate, please see [https://github.com/WeblateOrg/weblate/issues/14015](https://github.com/WeblateOrg/weblate/issues/14015). ## HIDE_REPO_CREDENTIALS Hide repository credentials from the web interface. In case you have repository URL with user and password, Weblate will hide it when related info is shown to users. For example instead of `https://user:password@git.example.com/repo.git` it will show just `https://git.example.com/repo.git`. It tries to clean up VCS error messages too in a similar manner. #### NOTE On by default. ## VERSION_DISPLAY #### Versionadded Added in version 5.17. Controls how prominently Weblate exposes its own version. Supported values are: `show` : Show the version in shared UI such as the footer and expose it in [`GET /api/metrics/`](https://docs.weblate.org/en/latest/api.md#get--api-metrics-). `soft` : Hide the version from prominent shared UI, while keeping it discoverable on the About page and in [`GET /api/metrics/`](https://docs.weblate.org/en/latest/api.md#get--api-metrics-). `hide` : Hide the version from shared UI and [`GET /api/metrics/`](https://docs.weblate.org/en/latest/api.md#get--api-metrics-). This also makes anonymous documentation links point to the latest documentation instead of the version matching the installed release. Hiding the version is a recommended security practice in some corporations, but it does not prevent an attacker from inferring the version by probing behavior. #### NOTE The default is `show`. ## HIDE_VERSION #### Versionadded Added in version 4.3.1. #### Deprecated Deprecated since version 5.17. Compatibility alias for [`VERSION_DISPLAY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VERSION_DISPLAY). Set this to `True` to get the same behavior as `VERSION_DISPLAY = "hide"`. ## INTERNAL_BOT_EMAIL_TEMPLATE #### Versionadded Added in version 2026.7.1. Template used to generate e-mail addresses for internal Weblate bot accounts. Defaults to `"noreply-{scope}-{name}@weblate.org"`. It can contain `{scope}`, `{name}`, `{username}`, `{site_title}`, and `{site_domain}`. Use `{scope}` and `{name}` when generating the e-mail local part. The `{username}` value contains the internal `scope:name` username. Existing internal bot accounts are updated when [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate) is run. Project API token accounts are not affected. ## IP_BEHIND_REVERSE_PROXY Indicates whether Weblate is running behind a reverse proxy. If set to `True`, Weblate gets IP address from a header defined by [`IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_HEADER). #### WARNING The reverse proxy which connects to Weblate must overwrite the configured header or append a verified peer address at the position selected by [`IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_OFFSET). Weblate does not verify which peer supplied the header, so trusting a client-controlled value allows IP address spoofing. Ensure that untrusted clients cannot reach Weblate without passing through the trusted proxy. #### NOTE This is not on by default. #### SEE ALSO * [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy) * [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) * [`IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_HEADER) * [`IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_OFFSET) ## IP_PROXY_HEADER Indicates which header Weblate should obtain the IP address from when [`IP_BEHIND_REVERSE_PROXY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_BEHIND_REVERSE_PROXY) is turned on. Defaults to `HTTP_X_FORWARDED_FOR`. #### SEE ALSO * [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy) * [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) * [`SECURE_PROXY_SSL_HEADER`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECURE_PROXY_SSL_HEADER) * [`IP_BEHIND_REVERSE_PROXY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_BEHIND_REVERSE_PROXY) * [`IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_OFFSET) ## IP_PROXY_OFFSET #### Versionchanged Changed in version 5.0.1: The default changed from 1 to -1. Indicates which part of [`IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_HEADER) is used as client IP address. Depending on your setup, this header might consist of several IP addresses, (for example `X-Forwarded-For: client-ip, proxy-a, proxy-b`) and you can configure which address from the header is used as client IP address here. #### WARNING Setting this affects the security of your installation. Select only an address added or verified by a proxy under your control. Addresses supplied by the client are untrusted. Ensure that the selected offset matches how your proxies construct the header. See <[https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For#security_and_privacy_concerns](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/X-Forwarded-For#security_and_privacy_concerns)> for more details. Defaults to -1. #### SEE ALSO * [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy) * [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) * [`SECURE_PROXY_SSL_HEADER`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECURE_PROXY_SSL_HEADER) * [`IP_BEHIND_REVERSE_PROXY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_BEHIND_REVERSE_PROXY) * [`IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_HEADER) ## LEGAL_DOCUMENT_CSS_CLASS #### Versionadded Added in version 2026.7. CSS class added to the wrappers around legal document templates. Defaults to `"tos"`. Weblate does not attach styling to this class; custom legal styles can use it to target document wrappers. Set this to an empty string to render legal documents without a wrapper class. ```python LEGAL_DOCUMENT_CSS_CLASS = "" ``` #### SEE ALSO * [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) * [Customizing legal documents and styles](https://docs.weblate.org/en/latest/admin/optionals.md#legal-customization) ## LEGAL_HIDDEN_DOCUMENTS #### Versionadded Added in version 2026.7. List of legal document page identifiers to hide from the legal module. The `index` page is always visible. Supported document identifiers are `terms`, `cookies`, `privacy`, and `contracts`. Hidden pages are removed from the legal menu and return a 404 response when requested directly. Hiding `terms` or `privacy` is not recommended when legal document confirmation is enabled. When `terms` or `privacy` is hidden, links exposed through the `terms_url` and `privacy_url` template variables use [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL) and [`PRIVACY_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVACY_URL) as fallbacks when configured. If no fallback URL is configured, the related link is omitted. With legal document confirmation enabled, hiding `terms` and setting [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL) makes the confirmation page link to the external terms document instead of embedding `legal/documents/tos.html`. When a privacy policy link is available, the confirmation covers both documents. In non-Docker deployments, define [`LEGAL_HIDDEN_DOCUMENTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_HIDDEN_DOCUMENTS) and [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL) before `SPECTACULAR_SETTINGS` is created so the API schema terms link uses the same fallback. ```python LEGAL_HIDDEN_DOCUMENTS = ("contracts",) ``` #### SEE ALSO [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) ## LEGAL_TOS_DATE #### Versionadded Added in version 4.15. #### NOTE You need [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) installed to make this work. Date of the legal documents users last agreed to. Whenever the date changes, users are required to agree with the current terms of service and, when a privacy policy link is available, the privacy policy. ```python from datetime import date LEGAL_TOS_DATE = date(2022, 2, 2) ``` ## LEGAL_URL URL where your Weblate instance shows its legal documents. #### HINT Useful if you host your legal documents outside Weblate instead of using the [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) module. When the legal module is enabled, Weblate links to the internal legal pages by default. Example: ```python LEGAL_URL = "https://weblate.org/terms/" ``` #### SEE ALSO [`PRIVACY_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVACY_URL) ## LICENSE_EXTRA Additional licenses to include in the license choices. #### NOTE Each license definition should be a tuple of its short name, a long name, a URL and a boolean, indicating whether it is a libre license. For example: ```python LICENSE_EXTRA = [ ( "AGPL-3.0", "GNU Affero General Public License v3.0", "https://www.gnu.org/licenses/agpl-3.0-standalone.html", True, ), ] ``` ## LICENSE_FILTER #### Versionchanged Changed in version 4.3: Setting this to blank value now disables license alert. Filter list of licenses to show. This also disables the license alert when set to empty. #### NOTE This filter uses the short license names. For example: ```python LICENSE_FILTER = {"AGPL-3.0", "GPL-3.0-or-later"} ``` Following disables the license alert: ```python LICENSE_FILTER = set() ``` #### SEE ALSO [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) ## LICENSE_REQUIRED Defines whether the license attribute in [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) is required. #### NOTE This is off by default. ## LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH Whether the length of a given translation should be limited. The restriction is the length of the source string × 10 characters. #### HINT Set this to `False` to allow longer translations (up to 10,000 characters) irrespective of source string length. #### NOTE Defaults to `True`. ## LOCALIZE_CDN_URL and LOCALIZE_CDN_PATH These settings configure the CDN add-ons, including [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) and [Translation files CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-files). [`LOCALIZE_CDN_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_URL) defines root URL where the localization CDN is available and [`LOCALIZE_CDN_PATH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_PATH) defines path where Weblate should store generated files which will be served at the [`LOCALIZE_CDN_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_URL). The files are served by your web server or CDN, not by Weblate; see [Localization CDN](https://docs.weblate.org/en/latest/admin/optionals.md#cdn-server-security) for secure serving guidance. #### HINT On Hosted Weblate, this uses `https://weblate-cdn.com/`. #### SEE ALSO * [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) * [Translation files CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-files) ## MATOMO_SITE_ID ID of the site in Matomo (formerly Piwik) you want to use for tracking Weblate. #### NOTE This integration does not support the Matomo Tag Manager. #### SEE ALSO [`MATOMO_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-MATOMO_URL) ## MATOMO_URL Full URL (including trailing slash) of a Matomo (formerly Piwik) installation you want to use to track Weblate use. Please check <[https://matomo.org/](https://matomo.org/)> for more details. #### HINT This integration does not support the Matomo Tag Manager. For example: ```python MATOMO_SITE_ID = 1 MATOMO_URL = "https://example.matomo.cloud/" ``` #### SEE ALSO [`MATOMO_SITE_ID`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-MATOMO_SITE_ID) ## NEARBY_MESSAGES Number of nearby strings to show in each direction in the full editor. This is just a default value, users can adjust this in [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile). ## DEFAULT_PAGE_LIMIT #### Versionadded Added in version 4.7. Default number of elements to display when pagination is active. ## PAGURE_CREDENTIALS #### Versionadded Added in version 4.3.2. List for credentials for Pagure servers. ```python PAGURE_CREDENTIALS = { "pagure.io": { "username": "weblate", "token": "your-api-token", }, } ``` The configuration dictionary consists of credentials defined for each API host. The layout is same for almost all version control integrations and is described at [Configuring version control credentials](https://docs.weblate.org/en/latest/admin/config.md#settings-credentials). #### SEE ALSO * [Pagure merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-merge-requests) * [Pagure API](https://pagure.io/api/0/) ## PASSWORD_MINIMAL_STRENGTH #### Versionadded Added in version 5.10.2. Minimal password score as evaluated by the [zxcvbn](https://github.com/dwolfhub/zxcvbn-python) password strength estimator. Defaults to 0, which means strength checking is disabled. #### SEE ALSO * [Password authentication](https://docs.weblate.org/en/latest/admin/auth.md#password-authentication) * [`WEBLATE_MIN_PASSWORD_SCORE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_MIN_PASSWORD_SCORE) ## PASSWORD_RESET_URL #### Versionadded Added in version 5.17. URL for password reset when authentication is handled by an external identity provider, such as LDAP, SAML, or OAuth. When set, Forgot your password? on the sign-in page links to this URL instead of Weblate’s built-in password reset page. ## PRIVACY_URL #### Versionadded Added in version 4.8.1. URL where your Weblate instance shows its privacy policy. #### HINT Useful if you host your privacy policy outside Weblate instead of using the [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) module. When the legal module is enabled, Weblate links to the internal legal pages by default. Example: ```python PRIVACY_URL = "https://weblate.org/terms/" ``` #### SEE ALSO [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL) ## PRIVATE_COMMIT_EMAIL_OPT_IN #### Versionadded Added in version 4.15. Configures whether the private commit e-mail is opt-in or opt-out (by default it is opt-in). #### HINT This setting only applies to users which have not explicitly chosen a commit e-mail. #### SEE ALSO * [Profile](https://docs.weblate.org/en/latest/user/profile.md#profile) * [`PRIVATE_COMMIT_EMAIL_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_TEMPLATE) ## PRIVATE_COMMIT_EMAIL_TEMPLATE #### Versionadded Added in version 4.15. Template to generate a private commit e-mail for a user. Defaults to `"{username}@users.noreply.{site_domain}"`. It can contain `{user_id}`, `{username}`, `{site_title}`, and `{site_domain}`. Set to blank string to disable. #### NOTE Using a different commit e-mail is opt-in for users unless configured by [`PRIVATE_COMMIT_EMAIL_OPT_IN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_OPT_IN). Users can configure their commit e-mail in the [Profile](https://docs.weblate.org/en/latest/user/profile.md#profile). ## PRIVATE_COMMIT_NAME_OPT_IN #### Versionadded Added in version 5.16. Configures whether the private commit name is opt-in or opt-out (by default it is opt-in). #### HINT This setting only applies to users which have not explicitly chosen a commit name. #### SEE ALSO * [Profile](https://docs.weblate.org/en/latest/user/profile.md#profile) * [`PRIVATE_COMMIT_NAME_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_NAME_TEMPLATE) ## PRIVATE_COMMIT_NAME_TEMPLATE #### Versionadded Added in version 5.16. Template to generate a private commit name for a user. Defaults to `"{site_title} user {user_id}"`. It can contain `{user_id}`, `{username}`, `{site_title}`, and `{site_domain}`. Set to blank string to disable. #### NOTE Using a different commit name is opt-in for users unless configured by [`PRIVATE_COMMIT_NAME_OPT_IN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_NAME_OPT_IN). Users can configure their commit name in the [Profile](https://docs.weblate.org/en/latest/user/profile.md#profile). ## PROJECT_BACKUP_KEEP_COUNT #### Versionadded Added in version 4.14. Defines how many backups per project are kept on the server. Defaults to 3. #### SEE ALSO [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) ## PROJECT_BACKUP_KEEP_DAYS #### Versionadded Added in version 4.14. Defines how long the project backups will be kept on the server. Defaults to 30 days. #### SEE ALSO [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) ## PROJECT_BACKUP_UPLOAD_MAX_SIZE #### Versionadded Added in version 5.17.1. Configures the maximum size, in bytes, for uploaded project backup ZIP files. Defaults to 536870912 bytes (512 MiB). In Docker, configure this using the `WEBLATE_PROJECT_BACKUP_UPLOAD_MAX_SIZE` environment variable. Docker setups can also be constrained by [`CLIENT_MAX_BODY_SIZE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CLIENT_MAX_BODY_SIZE); other deployments can be constrained by their reverse proxy request body-size limit. #### SEE ALSO [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) ## PROJECT_BACKUP_IMPORT_MAX_MEMBERS #### Versionadded Added in version 5.17. Defines the maximum number of ZIP entries allowed when importing a project backup. This is a safeguard against malformed or intentionally fragmented archives. Defaults to 100000 entries. In Docker, configure this using the `WEBLATE_PROJECT_BACKUP_IMPORT_MAX_MEMBERS` environment variable. #### SEE ALSO [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) ## PROJECT_BACKUP_IMPORT_MAX_TOTAL_UNCOMPRESSED_SIZE #### Versionadded Added in version 5.17.1. Defines the maximum total uncompressed size, in bytes, for ZIP entries in an imported project backup. Defaults to 536870912 bytes (512 MiB). This limits archives that are small when uploaded but expand to much more data during validation or restore. In Docker, configure this using the `WEBLATE_PROJECT_BACKUP_IMPORT_MAX_TOTAL_UNCOMPRESSED_SIZE` environment variable. #### SEE ALSO [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) ## PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE #### Versionadded Added in version 5.17. Defines the maximum uncompressed size, in bytes, for a single highly compressed ZIP entry in an imported project backup. This limit is only applied to entries that are large enough and compress enough to look suspicious. Large low-compression files are intentionally allowed here and are expected to be constrained by the HTTP upload limit. Defaults to 262144000 bytes (250 MiB). In Docker, configure this using the `WEBLATE_PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE` environment variable. #### SEE ALSO [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) ## PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE #### Versionadded Added in version 5.17. Defines the minimum uncompressed size, in bytes, at which Weblate starts considering the ZIP compression ratio during project backup import. Smaller files are ignored for the compression-ratio-based validation to avoid rejecting reasonably sized files that compress well. Defaults to 1048576 bytes (1 MiB). In Docker, configure this using the `WEBLATE_PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE` environment variable. #### SEE ALSO [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) ## PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_RATIO #### Versionadded Added in version 5.17. Defines the maximum allowed ratio between the uncompressed and compressed size for a large ZIP entry during project backup import. This is used together with [`PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE) and [`PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE) to detect suspiciously compressed entries while still allowing large repository pack files and other low-compression content. Defaults to 250. In Docker, configure this using the `WEBLATE_PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_RATIO` environment variable. #### SEE ALSO [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) ## PROJECT_NAME_RESTRICT_RE #### Versionadded Added in version 4.15. Defines a regular expression to restrict project naming. Any matching names will be rejected. #### SEE ALSO [Project name](https://docs.weblate.org/en/latest/admin/projects.md#project-name) ## PROJECT_WEB_RESTRICT_HOST #### Versionadded Added in version 4.16.2. Reject using certain hosts in project website. Any subdomain is matched, so including `example.com` will block `test.example.com` as well. The list should contain lower case strings only, the parsed domain is lower cased before matching. Default configuration: ```python PROJECT_WEB_RESTRICT_HOST = {"localhost"} ``` #### SEE ALSO * [Project website](https://docs.weblate.org/en/latest/admin/projects.md#project-web) * [`PROJECT_WEB_RESTRICT_NUMERIC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_NUMERIC) * [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE) * [`PROJECT_WEB_RESTRICT_RE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_RE) * [`PROJECT_WEB_RESTRICT_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_ALLOWLIST) ## PROJECT_WEB_RESTRICT_ALLOWLIST #### Versionadded Added in version 5.17. Defines a set of project slugs exempt from [`PROJECT_WEB_RESTRICT_HOST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_HOST), [`PROJECT_WEB_RESTRICT_NUMERIC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_NUMERIC), [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE), and [`PROJECT_WEB_RESTRICT_RE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_RE) when validating the project website. Project slugs are matched case-insensitively. #### CAUTION This exemption weakens outbound URL protections for matching projects, including the private-target restriction enforced by [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE). Use it only for trusted, administrator-managed projects where bypassing these checks is intentional. Default configuration: ```python PROJECT_WEB_RESTRICT_ALLOWLIST = set() ``` #### SEE ALSO * [Project website](https://docs.weblate.org/en/latest/admin/projects.md#project-web) * [`PROJECT_WEB_RESTRICT_HOST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_HOST) * [`PROJECT_WEB_RESTRICT_NUMERIC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_NUMERIC) * [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE) * [`PROJECT_WEB_RESTRICT_RE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_RE) ## PROJECT_WEB_RESTRICT_NUMERIC #### Versionadded Added in version 4.16.2. Reject using numeric IP address in project website. On by default. #### SEE ALSO * [Project website](https://docs.weblate.org/en/latest/admin/projects.md#project-web) * [`PROJECT_WEB_RESTRICT_HOST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_HOST) * [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE) * [`PROJECT_WEB_RESTRICT_RE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_RE) ## PROJECT_WEB_RESTRICT_PRIVATE #### Versionadded Added in version 5.17. Reject using project website and repository browser URLs pointing to internal or non-public addresses. On by default. #### SEE ALSO * [Project website](https://docs.weblate.org/en/latest/admin/projects.md#project-web) * [Repository browser](https://docs.weblate.org/en/latest/admin/projects.md#component-repoweb) * [`PROJECT_WEB_RESTRICT_HOST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_HOST) * [`PROJECT_WEB_RESTRICT_NUMERIC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_NUMERIC) * [`PROJECT_WEB_RESTRICT_RE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_RE) ## PROJECT_WEB_RESTRICT_RE #### Versionadded Added in version 4.15. Defines a regular expression to limit what can be entered as [Project website](https://docs.weblate.org/en/latest/admin/projects.md#project-web). Any matching URLs will be rejected. #### SEE ALSO * [Project website](https://docs.weblate.org/en/latest/admin/projects.md#project-web) * [`PROJECT_WEB_RESTRICT_HOST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_HOST) * [`PROJECT_WEB_RESTRICT_NUMERIC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_NUMERIC) * [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE) ## WEBHOOK_PRIVATE_ALLOWLIST #### Versionadded Added in version 5.17. Defines hostnames or domains exempt from [`WEBHOOK_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_RESTRICT_PRIVATE) for outbound webhook delivery. Entries follow Django host matching semantics, so values such as `hooks.internal.example` or `.internal.example` can be used. Default configuration: ```python WEBHOOK_PRIVATE_ALLOWLIST = [] ``` #### SEE ALSO * [`WEBHOOK_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_RESTRICT_PRIVATE) ## WEBHOOK_RESTRICT_PRIVATE #### Versionadded Added in version 5.17. Reject webhook URLs pointing to internal or non-public addresses unless the target host is included in [`WEBHOOK_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_PRIVATE_ALLOWLIST). On by default. When enabled, hostnames that cannot be resolved during validation are rejected unless they are explicitly included in [`WEBHOOK_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_PRIVATE_ALLOWLIST). #### SEE ALSO * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) * [`WEBHOOK_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_PRIVATE_ALLOWLIST) ## PUBLIC_ENGAGE #### Versionadded Added in version 5.16.2. Allows public engage page even with [`REQUIRE_LOGIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REQUIRE_LOGIN). #### SEE ALSO * [Building the translation community](https://docs.weblate.org/en/latest/devel/share.md#promotion) ## REPORT_EXPIRY Defines how many days generated translation reports are retained. Defaults to 90 days. Changing the value also changes when existing reports become eligible for removal by the daily cleanup task. ## RATELIMIT_NOTIFICATION_LIMITS #### Versionadded Added in version 5.14. Limits how many notifications for a single user will be sent out. The default setting is: ```python # Multi-level rate limiting for email notifications # Each tuple contains (max_emails, time_window_seconds) RATELIMIT_NOTIFICATION_LIMITS = [ # Prevent burst sends - 3 emails per 2 minutes (3, 120), # Equalize to avoid getting blocked for too long - 10 emails per hour (10, 3600), # Daily limit: 50 emails per day (50, 86400), ] ``` ## API_RATELIMIT_ANON #### Versionadded Added in version 2026.10. Default anonymous [API rate limit](https://docs.weblate.org/en/latest/api.md#api-rate). Defaults to `"100/day"`. Rates use a request count and a period of seconds, minutes, hours, or days, for example `"100/hour"`. A zero count rejects every request covered by this throttle; `None` disables this throttle. Anonymous requests without an IP override are also subject to [`API_RATELIMIT_USER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_USER). ## API_RATELIMIT_USER #### Versionadded Added in version 2026.10. Default authenticated [API rate limit](https://docs.weblate.org/en/latest/api.md#api-rate). Defaults to `"5000/hour"`. Uses the same rate syntax as [`API_RATELIMIT_ANON`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_ANON). Authenticated requests are counted per user; anonymous requests are counted per client IP. Set `None` to disable this throttle. ## API_RATELIMIT_USER_OVERRIDES #### Versionadded Added in version 2026.10. Mapping of exact usernames to API rate limits. Defaults to an empty dictionary. Override rates require a positive request count, or `None` for an exemption. These rules take precedence over [`API_RATELIMIT_IP_OVERRIDES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_IP_OVERRIDES). ```python API_RATELIMIT_USER_OVERRIDES = {"automation": "20000/hour"} ``` ## API_RATELIMIT_IP_OVERRIDES #### Versionadded Added in version 2026.10. Mapping of IPv4 or IPv6 addresses and CIDR networks to API rate limits. Defaults to an empty dictionary. The most specific matching network applies to both anonymous and authenticated requests, unless a username override matches. CIDRs must specify network addresses; duplicate normalized networks are rejected. Override rates require a positive request count, or `None` for an exemption. ```python API_RATELIMIT_IP_OVERRIDES = { "192.0.2.42": None, "198.51.100.0/24": "10000/hour", "2001:db8::/48": "10000/hour", } ``` See [API rate limiting](https://docs.weblate.org/en/latest/api.md#api-rate) for counting behavior and trusted proxy requirements. ## RATELIMIT_ATTEMPTS Maximum number of authentication attempts before rate limiting is applied. Defaults to 5. #### SEE ALSO * [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) * [`RATELIMIT_WINDOW`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_WINDOW) * [`RATELIMIT_LOCKOUT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_LOCKOUT) ## RATELIMIT_WINDOW How long authentication is accepted after rate limiting applies. An amount of seconds, defaulting to 300 (5 minutes). #### SEE ALSO * [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) * [`RATELIMIT_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_ATTEMPTS) * [`RATELIMIT_LOCKOUT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_LOCKOUT) ## RATELIMIT_LOCKOUT How long authentication is locked after rate limiting applies. An amount of seconds defaulting to 600 (10 minutes). #### SEE ALSO * [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) * [`RATELIMIT_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_ATTEMPTS) * [`RATELIMIT_WINDOW`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_WINDOW) ## REGISTRATION_ALLOW_BACKENDS #### Versionadded Added in version 4.1. List of authentication backends to allow registration from. This only limits new registrations, users can still authenticate and add authentication using all configured authentication backends. It is recommended to keep [`REGISTRATION_OPEN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_OPEN) on while limiting registration backends, otherwise users will be able to register, but Weblate will not show links to register in the user interface. Example: ```python REGISTRATION_ALLOW_BACKENDS = ["azuread-oauth2", "azuread-tenant-oauth2"] ``` #### HINT The backend names match names used in the URL for authentication. #### SEE ALSO * [`REGISTRATION_OPEN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_OPEN) * [Authentication](https://docs.weblate.org/en/latest/admin/auth.md) ## REGISTRATION_CAPTCHA Whether registration of new accounts is protected by a CAPTCHA. Defaults to enabled. If turned on, a CAPTCHA is added to all pages where a user enters their e-mail address: * New account registration. * Password recovery. * Adding e-mail to an account. * Contact form for users that are not signed in. The protection currently consists of following steps: * Mathematical captcha to be solved by the user. * Proof of work challenge calculated by the browser. The difficulty can be adjusted using [`ALTCHA_COST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALTCHA_COST), [`ALTCHA_MEMORY_COST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALTCHA_MEMORY_COST), and [`ALTCHA_PARALLELISM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALTCHA_PARALLELISM). ## REGISTRATION_EMAIL_MATCH Allows you to filter which e-mail addresses can register. Defaults to `.*`, which allows any e-mail address to be registered. You can use it to restrict registration to a single e-mail domain: ```python REGISTRATION_EMAIL_MATCH = r"^.*@weblate\.org$" ``` ## REGISTRATION_ALLOW_DISPOSABLE_EMAILS #### Versionadded Added in version 5.16.1. Allow registration with disposable e-mail domains. When enabled, the disposable domain blocklist is bypassed. Default is `False`. #### SEE ALSO - [`REGISTRATION_EMAIL_MATCH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_EMAIL_MATCH) - [`WEBLATE_REGISTRATION_ALLOW_DISPOSABLE_EMAILS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_REGISTRATION_ALLOW_DISPOSABLE_EMAILS) ## REGISTRATION_OPEN Whether registration of new accounts is currently permitted. Defaults to enabled. This setting affects built-in authentication by e-mail address or through the Python Social Auth (you can allow certain back-ends using [`REGISTRATION_ALLOW_BACKENDS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_ALLOW_BACKENDS)). #### NOTE If using third-party authentication methods such as [LDAP authentication](https://docs.weblate.org/en/latest/admin/auth.md#ldap-auth), it just hides the registration form, but new users might still be able to sign in and create accounts. #### SEE ALSO * [`REGISTRATION_ALLOW_BACKENDS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_ALLOW_BACKENDS) * [`REGISTRATION_EMAIL_MATCH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_EMAIL_MATCH) * [Authentication](https://docs.weblate.org/en/latest/admin/auth.md) ## REGISTRATION_REBIND #### Versionadded Added in version 4.16. Allow rebinding authentication backends for existing users. Turn this on when migrating between authentication providers. #### NOTE Off by default to not allow adding other authentication backends to an existing account. Rebinding can lead to account compromise when using more third-party authentication backends. ## REPOSITORY_ALERT_THRESHOLD #### Versionadded Added in version 4.0.2. Threshold for triggering an alert for outdated repositories, or ones that contain too many changes. Defaults to 25. #### SEE ALSO [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) ## REQUIRE_LOGIN #### Versionadded Added in version 4.1. This enables [`django.contrib.auth.middleware.LoginRequiredMiddleware`](https://docs.djangoproject.com/en/stable/ref/middleware/#django.contrib.auth.middleware.LoginRequiredMiddleware) and configures REST framework to require authentication for all API endpoints. #### Versionchanged Changed in version 5.15: Weblate now relies on Django built-in middleware. #### NOTE This is implemented in the [Sample configuration](https://docs.weblate.org/en/latest/admin/sample.md#sample-configuration). For Docker, use [`WEBLATE_REQUIRE_LOGIN`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_REQUIRE_LOGIN). ## GOOGLE_CLOUD_ERROR_REPORTING Configuration for [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors) using Google Cloud Error Reporting. Set to `None` to disable the integration, or set to a dictionary of keyword arguments for the Google Cloud Error Reporting client. Weblate automatically supplies `service` as `weblate` and `version` as the current Weblate version or Git revision. Explicit values in the dictionary override these defaults. ## OPENTELEMETRY_ENABLED #### Versionadded Added in version 2026.6. Enable backend tracing using OpenTelemetry. Disabled by default. Traces are exported only when this is enabled and [`OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT) is configured. ## OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT OTLP HTTP traces endpoint for OpenTelemetry, for example `https://collector.example.com/v1/traces`. ## OPENTELEMETRY_EXPORTER_OTLP_HEADERS Additional HTTP headers for the OpenTelemetry OTLP exporter. Defaults to an empty dictionary. ## OPENTELEMETRY_EXTRA_RESOURCE_ATTRIBUTES Additional OpenTelemetry resource attributes. Defaults to an empty dictionary. ## OPENTELEMETRY_SERVICE_NAME OpenTelemetry service name. Defaults to `weblate`. ## OPENTELEMETRY_TRACES_SAMPLE_RATE Configure sampling rate for OpenTelemetry traces. Set to 1 to trace all events, 0 (the default) disables tracing. ## SENTRY_DSN Sentry DSN to use for [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors). #### SEE ALSO [Django integration for Sentry](https://docs.sentry.io/platforms/python/integrations/django/) ## SENTRY_ENVIRONMENT Configures environment for Sentry. Defaults to `devel`. ## SENTRY_MONITOR_BEAT_TASKS #### Versionadded Added in version 5.13. Configure whether to monitor Celery Beat tasks with Sentry. Defaults to `True`. ## SENTRY_PROFILES_SAMPLE_RATE Configure sampling rate for performance monitoring. Set to 1 to profile all traced events (the default), 0 disables profiling. #### SEE ALSO [Sentry Performance Monitoring](https://docs.sentry.io/product/sentry-basics/performance-monitoring/) ## SENTRY_SEND_PII Allow Sentry to collect certain personally identifiable information. Turned off by default. #### Versionchanged Changed in version 5.7: This is turned off by default now, used to be turned on by default. ## SENTRY_TRACES_SAMPLE_RATE Configure sampling rate for profiling monitoring. Set to 1 to trace all events, 0 (the default) disables tracing. #### SEE ALSO [Sentry Profiling](https://docs.sentry.io/product/profiling/) ## SESSION_COOKIE_AGE_2FA #### Versionadded Added in version 5.13.1. Set session expiry while in [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa). This complements [`SESSION_COOKIE_AGE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SESSION_COOKIE_AGE) which is used for unauthenticated users. ## SESSION_COOKIE_AGE_AUTHENTICATED #### Versionadded Added in version 4.3. Set session expiry for authenticated users. This complements [`SESSION_COOKIE_AGE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SESSION_COOKIE_AGE) which is used for unauthenticated users. #### SEE ALSO [`SESSION_COOKIE_AGE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SESSION_COOKIE_AGE) ## SIMPLIFY_LANGUAGES Use simple language codes for default language/country combinations. For example an `fr_FR` translation will use the `fr` language code. This is usually the desired behavior, as it simplifies listing languages for these default combinations. Turn this off if you want to different translations for each variant. ## HIDE_SHARED_GLOSSARY_COMPONENTS #### Versionadded Added in version 5.16. Glossary components are typically shared into other projects to make them available for translation work. When these are visible in the component list of projects that are using them, it can cause confusion or distract translators from the actual components that are meant to be translated. This is turned off by default, making shared glossary components visible. ## SITE_DOMAIN Configures site domain. Necessary to produce correct absolute links in many scopes (for example activation e-mails, notifications or RSS feeds). If Weblate is running on a non-standard port, include it here as well. **Examples:** ```python # Production site with domain name SITE_DOMAIN = "weblate.example.com" # Local development with IP address and port SITE_DOMAIN = "127.0.0.1:8000" ``` #### NOTE This setting should only contain the domain name. For configuring protocol, (turning on and enforcing HTTPS) use [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS) and for changing the URL, use [`URL_PREFIX`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-URL_PREFIX). #### HINT On a Docker container, the site domain is configured through [`WEBLATE_ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ALLOWED_HOSTS). #### SEE ALSO * [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site) * [Allowed hosts setup](https://docs.weblate.org/en/latest/admin/install.md#production-hosts) * [Correctly configure HTTPS](https://docs.weblate.org/en/latest/admin/install.md#production-ssl) * [`WEBLATE_SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SITE_DOMAIN) * [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS) ## SITE_TITLE Site title to be used for the website and sent e-mails. ## SPECIAL_CHARS Additional characters to include in the visual keyboard, [Visual keyboard](https://docs.weblate.org/en/latest/user/translating.md#visual-keyboard). The default value is: ```python SPECIAL_CHARS = ("\t", "\n", "\u00a0", "…") ``` ## SINGLE_PROJECT Redirects users directly to a project or component instead of showing the dashboard. You can either set it to `True` so it only works if there is actually only single project in Weblate. Alternatively, set the project slug, and it will redirect unconditionally to this project. Example: ```python SINGLE_PROJECT = "test" ``` ## SSH_EXTRA_ARGS #### Versionadded Added in version 4.9. Allows adding custom parameters when Weblate is invoking SSH. Useful when connecting to servers using legacy encryption or other non-standard features. For example when SSH connection in Weblate fails with Unable to negotiate with legacyhost: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1, you can turn that on using: ```python SSH_EXTRA_ARGS = "-oKexAlgorithms=+diffie-hellman-group1-sha1" ``` #### HINT The string is evaluated by the shell, so ensure any whitespace and special characters is quoted. #### WARNING This is trusted administrator-controlled configuration. Arbitrary SSH options can alter connection routing and override the address pinning provided by [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE). Administrators are responsible for the security and compatibility impact of all configured arguments. #### SEE ALSO [OpenSSH Legacy Options](https://www.openssh.org/legacy.html) ## STATUS_URL The URL where your Weblate instance reports its status. ## SUPPORT_STATUS_CHECK #### Versionadded Added in version 5.5. Disables semiannual support status check and redirecting superusers upon login to the donation page in case there is no active support subscription. #### HINT Improve your Weblate experience by purchasing a support subscription and boosting Weblate progress instead of turning this off. ## TRANSLATION_UPLOAD_MAX_SIZE #### Versionadded Added in version 5.17.1. Configures the maximum size, in bytes, for uploaded translation files. Defaults to 50 MB. In Docker, configure this using the `WEBLATE_TRANSLATION_UPLOAD_MAX_SIZE` environment variable. ## UNUSED_ALERT_DAYS #### Versionadded Added in version 4.17. Configures when the Component seems unused alert is triggered. Defaults to 365 days, set to 0 to turn it off. ## UPDATE_LANGUAGES #### Versionadded Added in version 4.3.2. Controls whether languages database should be updated when running database migration and is on by default. This setting has no effect on invocation of [`setuplang`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-setuplang). #### WARNING The languages display might become inconsistent with this. Weblate language definitions expand over time and it will not display language code for the defined languages. #### SEE ALSO [Built-in language definitions](https://docs.weblate.org/en/latest/admin/languages.md#included-languages) ## URL_PREFIX This setting allows you to run Weblate under some path (otherwise it relies on being run from the webserver root). #### NOTE To use this setting, you also need to configure your server to strip this prefix. For example with WSGI, this can be achieved by setting `WSGIScriptAlias`. #### HINT The prefix should start with a `/`. Example: ```python URL_PREFIX = "/translations" ``` #### NOTE This setting does not work with Django’s built-in server, you would have to adjust `urls.py` to contain this prefix. ## VCS_ALLOW_HOSTS #### Versionadded Added in version 5.15. A set of hosts to allow when configuring VCS URL. Defaults to an empty set, which does no filtering at all. When [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE) is enabled, matching hosts are also exempt from the private-target restriction. This exemption is also needed for VCS backends which cannot bind the client connection to the address validated by Weblate, such as Mercurial and Subversion. Use [`VCS_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_PRIVATE_ALLOWLIST) instead when hosts should be exempt from the private-target restriction without filtering access to other public hosts. ## VCS_PRIVATE_ALLOWLIST #### Versionadded Added in version 2026.9. Defines hostnames or domains exempt from [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE). Unlike [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS), this setting does not filter access to other hosts. Entries follow Django host matching semantics, so values such as `vcs.internal.example` or `.internal.example` can be used. The exemption is needed for VCS backends which cannot bind the client connection to the address validated by Weblate, such as Mercurial and Subversion. It can also be used to allow private Git repository hosts. When [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS) is non-empty, its host filter still applies and takes precedence over this allowlist. Default configuration: ```python VCS_PRIVATE_ALLOWLIST = [] ``` #### SEE ALSO * [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS) * [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE) ## VCS_ALLOW_SCHEMES #### Versionadded Added in version 5.15. A set of URL schemes to allow when configuring VCS URL. Only `https` and `ssh` are allowed by default. ## VCS_RESTRICT_PRIVATE #### Versionadded Added in version 5.17. Reject VCS repository URLs pointing to internal or non-public addresses unless the target host is included in [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS) or matches [`VCS_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_PRIVATE_ALLOWLIST). On by default. When enabled, hostnames that cannot be resolved during validation are rejected unless they are trusted by [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS) or [`VCS_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_PRIVATE_ALLOWLIST). For Git repositories accessed over HTTPS or SSH, Weblate binds each VCS command to the addresses approved during runtime validation for direct connections. Configured HTTP proxies are trusted infrastructure and resolve repository hostnames instead. Automatic redirect following remains disabled. Permanent same-host HTTP redirects are probed separately through the same outbound route, validated, and stored as the canonical component repository URL. Cross-host redirects have to be configured manually. Mercurial, Subversion, custom VCS backends, and additional URL schemes are rejected unless the target host is trusted by [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS) or [`VCS_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_PRIVATE_ALLOWLIST). Network-level egress filtering which blocks internal, loopback, link-local, reserved, and cloud metadata address ranges is recommended as defense in depth, especially for custom integrations and administrator-installed extensions. ## VCS_API_DELAY #### Versionadded Added in version 4.15.1. Configures minimal delay in seconds between third-party API calls in [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests), [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests), [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests), [Pagure merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-merge-requests), and [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests). This rate-limits API calls from Weblate to these services to avoid overloading them. If you are being limited by secondary rate-limiter at GitHub, increasing this might help. The default value is 10. ## VCS_API_TIMEOUT #### Versionadded Added in version 5.15. Configures timeout in seconds for third-party API calls such as forking or creating merge requests in [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests), [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests), [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests), [Pagure merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-merge-requests), and [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests). The default value is 10. ## VCS_BACKENDS Configuration of available VCS backends. #### NOTE Weblate offers configured backends when their required commands are available. Exact command versions are validated by the deployment and periodic configuration health checks. #### HINT You can limit choices or add custom VCS back-ends by using this. ```python VCS_BACKENDS = ("weblate.vcs.git.GitRepository",) ``` #### SEE ALSO [Version control integration](https://docs.weblate.org/en/latest/vcs.md#vcs) ## VCS_CLONE_DEPTH Configures how deep cloning of repositories Weblate should do. #### NOTE Currently this is only supported in [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git). By default Weblate does shallow clones of the repositories to make cloning faster and save disk space. Depending on your usage (for example when using custom [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons)), you might want to increase the depth or turn off shallow clones completely by setting this to 0. #### HINT In case you get `fatal: protocol error: expected old/new/ref, got 'shallow '` error when pushing from Weblate, turn off shallow clones completely by setting: ```python VCS_CLONE_DEPTH = 0 ``` ## WEBLATE_ADDONS List of add-ons available for use. To use them, they have to be enabled for a given translation component. By default this includes all built-in add-ons, when extending the list you will probably want to keep existing ones enabled, for example: ```python WEBLATE_ADDONS = ( # Built-in add-ons "weblate.addons.gettext.GenerateMoAddon", "weblate.addons.gettext.UpdateLinguasAddon", "weblate.addons.gettext.UpdateConfigureAddon", "weblate.addons.gettext.MsgmergeAddon", "weblate.addons.cleanup.CleanupAddon", "weblate.addons.consistency.LanguageConsistencyAddon", "weblate.addons.discovery.DiscoveryAddon", "weblate.addons.flags.SourceEditAddon", "weblate.addons.flags.TargetEditAddon", "weblate.addons.flags.SameEditAddon", "weblate.addons.flags.BulkEditAddon", "weblate.addons.generate.GenerateFileAddon", "weblate.addons.properties.PropertiesSortAddon", "weblate.addons.git.GitSquashAddon", "weblate.addons.removal.RemoveComments", "weblate.addons.removal.RemoveSuggestions", "weblate.addons.resx.ResxUpdateAddon", "weblate.addons.autotranslate.AutoTranslateAddon", "weblate.addons.cdn.CDNJSAddon", # Add-on you want to include "weblate.addons.example.ExampleAddon", ) ``` #### NOTE Removing the add-on from the list does not uninstall it from the components. Weblate will crash in that case. Please uninstall the add-on from all components prior to removing it from this list. #### SEE ALSO * [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons) * [Custom quality checks, add-ons, automatic suggestions and auto-fixes](https://docs.weblate.org/en/latest/admin/customize.md#custom-modules) * [`DEFAULT_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ADDONS) * [`ADDON_ACTIVITY_LOG_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ADDON_ACTIVITY_LOG_EXPIRY) ## ADDON_ACTIVITY_LOG_EXPIRY #### Versionadded Added in version 5.6. Configures how long activity logs for add-ons are kept. Defaults to 180 days. ## WEBLATE_EXPORTERS #### Versionadded Added in version 4.2. List of available exporters offering translation downloads or glossaries in various file formats. #### SEE ALSO [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) ## WEBLATE_FORMATS List of file formats available for use. #### NOTE The default list already has the common formats. #### SEE ALSO [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) ## WEBLATE_MACHINERY #### Versionadded Added in version 4.13. List of machinery services available for use. #### SEE ALSO * [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md) * [Custom machine translation](https://docs.weblate.org/en/latest/admin/machine.md#custom-machinery) * [Custom quality checks, add-ons, automatic suggestions and auto-fixes](https://docs.weblate.org/en/latest/admin/customize.md#custom-modules) ## WEBLATE_GPG_IDENTITY Identity used by Weblate to sign Git commits, for example: ```python WEBLATE_GPG_IDENTITY = "Weblate " ``` The Weblate GPG keyring is searched for a matching key (`home/.gnupg` under [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR)). If not found, a key is generated, please check [Signing Git commits with GnuPG](https://docs.weblate.org/en/latest/admin/optionals.md#gpg-sign) for more details. #### SEE ALSO [Signing Git commits with GnuPG](https://docs.weblate.org/en/latest/admin/optionals.md#gpg-sign) ## WEBSITE_REQUIRED Defines whether [Project website](https://docs.weblate.org/en/latest/admin/projects.md#project-web) has to be specified when creating a project. On by default, as that suits public server setups. ## WEBSITE_ALERTS_ENABLED #### Versionadded Added in version 5.17. Default: `True` Defines whether Weblate should check project website availability and show alerts for unreachable project websites. When set to `False`, Weblate will skip website availability checks and will not generate project website alerts. This is useful when: - Your websites are behind firewalls that block Weblate’s requests - You want to avoid 403/503-type errors from bot protection - Project website availability is not a concern for your installation #### SEE ALSO [`WEBSITE_REQUIRED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBSITE_REQUIRED) ## Configuring version control credentials #### HINT This section describes VCS credential variables as [`GITHUB_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITHUB_CREDENTIALS), [`GITLAB_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITLAB_CREDENTIALS), [`GITEA_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITEA_CREDENTIALS), [`PAGURE_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PAGURE_CREDENTIALS), [`BITBUCKETSERVER_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BITBUCKETSERVER_CREDENTIALS). The configuration dictionary consists of credentials defined for each API host. The API host might be different from what you use in the web browser, for example GitHub API is accessed as `api.github.com`. The credentials can also be overridden in [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) or [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo) (if push URL is not configured), these take precedence over the ones specified in the configuration file. The following configuration is available for each host: `username` : API user, required. `token` : API token for the API user, required. `scheme` : #### Versionadded Added in version 4.18.
Scheme override. Weblate attempts to parse scheme from the repository URL and falls backs to `https`. If you are running the API server internally, you might want to use `http` instead, but consider security. #### HINT In the Docker container, the credentials can be configured using environment variables, see [Code-hosting sites credentials](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-vcs-config). # admin/continuous.md # Continuous localization There is infrastructure in place so that your translation closely follows development. This way translators can work on translations the entire time, instead of working through huge amount of new text just prior to release. #### SEE ALSO [Integrating with Weblate](https://docs.weblate.org/en/latest/devel/integration.md) describes basic ways to integrate your development with Weblate. [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md) lists provider-specific setup steps for common code-hosting sites. This is the process: 1. Developers make changes and push them to the VCS repository. 2. Optionally the translation files are updated, see [Introducing new strings](https://docs.weblate.org/en/latest/devel/integration.md#translations-update). 3. Weblate pulls changes from the VCS repository, parses translation files and updates its database, see [Updating repositories](https://docs.weblate.org/en/latest/admin/continuous.md#update-vcs). 4. Translators submit translations using the Weblate web interface, or upload offline changes. 5. Once the translators are finished, Weblate commits the changes to the local repository (see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit)). 6. Changes are pushed back to the upstream repository (see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options)). #### HINT Upstream code-hosting site is not necessary, you can use Weblate with [Local files](https://docs.weblate.org/en/latest/vcs.md#vcs-local) where there is only the repository inside Weblate. ## Updating repositories You should set up some way of updating backend repositories from their source. * Use [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks) to integrate with the majority of common code-hosting services, see [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md). You must also [Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks) for this to work. Hook deliveries update components whose repository URL matches the payload; see [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching). * Manually trigger update either in the repository management or using [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) or [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc) * Enable [`AUTO_UPDATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTO_UPDATE) to automatically update all components on your Weblate instance * Execute [`updategit`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-updategit) (with selection of project or `--all` to update all) Whenever Weblate updates the repository, the post-update addons will be triggered, see [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons). ### Matching webhook targets Forge webhooks update components whose [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo) exactly matches a repository URL from the payload (HTTPS or SSH as reported by the forge, plus common variants such as a trailing slash). Generic forge webhook endpoints are compatibility interfaces, and ordinary repository deliveries are not cryptographically authenticated. Legacy GitHub App deliveries containing installation data are an exception: the generic GitHub endpoint verifies their signature using [`GITHUB_LEGACY_APP_WEBHOOK_SECRET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITHUB_LEGACY_APP_WEBHOOK_SECRET). Repository matching does not apply project or component access control because webhooks also need to update private projects and [restricted components](https://docs.weblate.org/en/latest/admin/projects.md#component-restricted). Their JSON responses include diagnostic counts for repository, branch, and enabled-hook matches. Successful responses also include the full project/component slugs and absolute API URLs of updated components. Supplying a matching repository URL can therefore confirm that a repository is registered and reveal these identifiers. Components managed through an authenticated integration are excluded from generic webhook matching and its diagnostic counts. Currently this applies to the GitHub (via Weblate GitHub app) VCS backend. These components receive notifications only through their dedicated tokenized and signed [GitHub App webhook URL](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-webhook). Future authenticated integrations are expected to use the same separation. The returned API URLs do not grant access to the components. The web interface and API continue to enforce normal access control, and webhook responses do not include repository content, translations, or credentials. Where available, prefer an authenticated integration such as [App webhook URL](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-webhook). #### Versionchanged Changed in version 2026.9: Host and path suffix fallback matching was removed. If updates stop, align [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo) with a URL from the forge webhook payload. ### Avoiding merge conflicts The merge conflicts from Weblate arise when same file was changed both in Weblate and outside it. Depending on the situation, there are several approaches that might help here: * [Avoiding merge conflicts by changing translation files in Weblate only](https://docs.weblate.org/en/latest/admin/continuous.md#merge-weblate-only) * [Avoiding merge conflicts by locking Weblate while doing outside changes](https://docs.weblate.org/en/latest/admin/continuous.md#merge-weblate-locking) * [Avoiding merge conflicts by focusing on Git operations](https://docs.weblate.org/en/latest/admin/continuous.md#merge-weblate-git) #### Avoiding merge conflicts by changing translation files in Weblate only Avoiding edits outside Weblate is easy with monolingual files — you can add new strings within Weblate and leave whole editing of the files there. For bilingual files, there is usually some kind of message extraction process to generate translatable files from the source code. In some cases, this can be split into two parts: 1. The extraction generates template (for example gettext POT is generated using **xgettext**). 2. Further process merges it into actual translations (the gettext PO files are updated using **msgmerge**). You can perform the second step within Weblate and it will ensure that all pending changes are included before this operation. #### Avoiding merge conflicts by locking Weblate while doing outside changes Integrating Weblate into your updating process so that it flushes changes before updating the files outside Weblate can be achieved by using [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) to force Weblate to push all pending changes and lock the translation while you are doing changes on your side. The script for doing updates can look like this: ```sh # Lock Weblate translation wlc lock # Push changes from Weblate to upstream repository wlc push # Pull changes from upstream repository to your local copy git pull # Update translation files, this example is for Django ./manage.py makemessages --keep-pot -a git commit -m 'Locale updates' -- locale # Push changes to upstream repository git push # Tell Weblate to pull changes (not needed if Weblate follows your repo # automatically) wlc pull # Unlock translations wlc unlock ``` If you have multiple components sharing the same repository, you need to lock them all separately: ```sh wlc lock foo/bar wlc lock foo/baz wlc lock foo/baj ``` #### NOTE The example uses [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc), which needs configuration (API keys) to be able to control Weblate remotely. You can also achieve this using any HTTP client instead of [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc), for example curl, see [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). ### Repository maintenance The Repository maintenance view shows repository status for a project, component, or translation and lets privileged users run maintenance operations from the user interface. For shared repositories, permissions are checked on the component that owns the repository, even when the operation is started from a linked component. Users with repository permissions only on a linked component can open this view to see which permissions they need on the owner. Restrictions identify the owning component when it is accessible; otherwise, ask your project administrator to coordinate access with the repository owner. See [Access control](https://docs.weblate.org/en/latest/admin/access.md) for permission scope. The same actions can also be triggered using [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) or, for the supported subset, [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc). Availability of individual actions depends on permissions, the configured version control system, whether pushing is configured, and whether the selected object can be locked. Repository actions started from this view are queued for background processing. For a project, Weblate processes the affected repositories sequentially in one task and shows its progress. Repeating the same action opens the existing task; a different action cannot be started for the same repository until that task finishes. The Synchronize and Rescan repository operations are queued for background processing as described above. The separate File management actions are available only for an individual translation. They rewrite that translation file and commit the result during the web request; they are not project-wide or component-wide operations. Operations that read repository content, such as updating, resetting, or rescanning, also reconcile translation files in Weblate. Added or removed translation files are reflected after this processing finishes. Glossary language synchronization and cleanup are described in [Language files and synchronization](https://docs.weblate.org/en/latest/user/glossary.md#glossary-language-sync). | Action | What it does | Typical use | |----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | Commit | Commits pending changes stored in Weblate to the local repository. | Flush pending Weblate changes before doing repository work elsewhere. | | Push | Pushes committed local repository changes to the configured upstream. | Send committed translations upstream when automatic push is disabled or delayed. | | Update | Fetches upstream changes, integrates them using the component’s configured [Merge style](https://docs.weblate.org/en/latest/admin/projects.md#component-merge-style), and reconciles translation files. | Bring Weblate in sync with upstream using the default integration strategy. | | Update with merge | Fetches upstream changes and integrates them with an explicit merge. | Override the default merge style for a single update. | | Update with rebase | Fetches upstream changes and rebases local Weblate commits on top of upstream. | Keep history linear when that matches your workflow. | | Update with merge without fast-forward | Fetches upstream changes and creates an explicit merge commit even when a fast-forward would be possible. | Preserve merge commits for auditing or branch-management reasons. | | Lock / Unlock | Prevents or allows translators to make further changes in Weblate. | Freeze translation changes while doing repository maintenance outside Weblate. | | Reset and discard | Resets Weblate’s local repository to upstream, discards pending Weblate changes, and reconciles translation files. | Use when upstream should overwrite the local Weblate repository state. | | Reset and reapply | Resets Weblate’s local repository to upstream, reconciles translation files, and reapplies pending translations. See [Reset and reapply recovery behavior](https://docs.weblate.org/en/latest/admin/continuous.md#manage-vcs-reset-reapply). | Recover from diverged history while keeping pending Weblate translations. | | Cleanup | Removes untracked files and stale branches from the local repository checkout. | Clean up leftover files or stale repository state in Weblate’s checkout. | | Synchronize | Forces Weblate to write all known translations back to the repository files. | Repair cases where repository files became out of sync with the database state. | | Rescan | Re-reads translation files from the local repository into Weblate and removes translations whose files no longer match the component configuration. | Import file changes after manual repository work or file creation. | | Remove duplicates | Removes repeated strings with the same identifier from one translation file. | Repair duplicate strings reported by Weblate when the file contains repeated units. | | Cleanup unused | Removes strings no longer present in the base file from one translation file. The [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) add-on can perform this automatically. | Run a one-time cleanup without installing the add-on. | | Remove obsolete | Removes obsolete strings from one PO translation file. | Run a one-time PO cleanup without enabling automatic obsolete string removal. | #### Reset and reapply recovery behavior The Reset and reapply operation keeps pending translations from Weblate while resetting the local repository state to match upstream. The operation can restore pending translations only when the target language files still exist after the reset or when Weblate can create them for the component, for example using a valid [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base). If neither of these conditions is met, Weblate keeps the pending changes in its database and reports a recovery error instead of failing later with a generic parse error. #### Avoiding merge conflicts by focusing on Git operations Even when Weblate is the single source of the changes in the translation files, conflicts can appear when using [Squash Git commits](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-git-squash) add-on, [Merge style](https://docs.weblate.org/en/latest/admin/projects.md#component-merge-style) is configured to Rebase, or you are squashing commits outside of Weblate (for example, when merging a pull request). The reason for merge conflicts is different in this case. Weblate can have new local commits after you merge earlier Weblate commits upstream. This typically happens if merging is not automated and changes wait for days or weeks for a human review. Git is then sometimes no longer able to identify upstream changes as matching the Weblate ones and refuses to perform a rebase. Squash merging Weblate changes makes this harder to recover from. A squash merge creates a new commit instead of preserving the individual Weblate commits in the upstream history. Weblate still has the original commits in its local repository, and Git can no longer prove that upstream already contains them. If the conflict was also resolved manually, the file contents can differ from both repositories, so Weblate can keep failing to update even after the pull request was merged upstream. If upstream no longer contains Weblate commits because they were squash merged, updating the repository might not be enough. Use Reset and reapply from Repository maintenance to reset Weblate to upstream while keeping pending translations; see [Reset and reapply recovery behavior](https://docs.weblate.org/en/latest/admin/continuous.md#manage-vcs-reset-reapply). Use Reset and discard only when upstream should fully replace Weblate’s local changes. To approach this, you either need to minimize the amount of pending changes in Weblate when you merge a pull request, or avoid the conflicts completely by not squashing changes. Here are few options how to avoid that: * Do not use [Squash Git commits](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-git-squash) or squash merging for Weblate changes. Squashing is why Git might no longer recognize the changes after merging. * When resolving conflicts outside Weblate, merge the Weblate commits with a regular merge commit and push that result upstream. Do not squash merge the conflict-resolution pull request. * Let Weblate commit pending changes before merging. This will update the pull request with all its changes, and both repositories will be in sync. * Use the review features in Weblate (see [Translation workflows](https://docs.weblate.org/en/latest/workflows.md)) so that you can automatically merge GitHub pull requests after CI passes. * Use locking in Weblate to avoid changes while GitHub pull request is in review. #### SEE ALSO [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc) ### Code-hosting notifications Provider-specific app and webhook instructions for GitHub, GitLab, Bitbucket, Pagure, Azure Repos, Gitea, Forgejo, and Gitee are covered in [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md). #### Provider-specific notifications These legacy anchors are kept for compatibility. Current provider-specific app and webhook setup is documented in [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md). #### SEE ALSO * [GitHub notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-notifications) * [GitLab notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-notifications) * [Bitbucket notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-notifications) * [Pagure notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-notifications) * [Azure Repos notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-repos-notifications) * [Gitea notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-notifications) * [Forgejo notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-forgejo-notifications) * [Gitee notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitee-notifications) ### Automatically updating repositories daily By default, Weblate automatically fetches remote repositories daily to improve performance when merging changes later. Updates are distributed throughout the day. Set [`AUTO_UPDATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTO_UPDATE) to `"full"` to also merge remote changes into the working copy. See [`AUTO_UPDATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTO_UPDATE) for scheduling details and other update modes. ## Pushing changes from Weblate Each translation component can have a push URL set up (see [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push)), and in that case Weblate will be able to push changes to the remote repository. Weblate can also be configured to automatically push changes on every commit, see [Push on commit](https://docs.weblate.org/en/latest/admin/projects.md#component-push-on-commit). For the push options table and provider-specific pull, merge, and review request workflows, see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). #### SEE ALSO See [Accessing repositories](https://docs.weblate.org/en/latest/vcs.md#vcs-repos) for setting up SSH keys, and [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit) for info about when Weblate decides to commit changes. ### Protected branches If you are using Weblate on protected branch, you can configure it to use pull requests and perform actual review on the translations (what might be problematic for languages you do not know). An alternative approach is to waive this limitation for the Weblate push user. For example on GitHub this can be done in the repository configuration: ![image](images/github-protected.png) ## Interacting with others Weblate makes it easy to interact with others using its API. #### SEE ALSO [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) ## Lazy commits The behaviour of Weblate is to group commits from the same author into one commit if possible. This greatly reduces the number of commits, however you might need to explicitly tell it to do the commits in case you want to get the VCS repository in sync, e.g. for merge (this is by default allowed for the Managers group, see [List of privileges](https://docs.weblate.org/en/latest/admin/access.md#privileges)). The changes in this mode are committed once any of the following conditions are fulfilled: * Somebody else changes an already changed string. * A merge from upstream occurs. * An explicit commit is requested. * A file download is requested. * Change is older than period defined as [Age of changes to commit](https://docs.weblate.org/en/latest/admin/projects.md#component-commit-pending-age) on [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component). #### HINT Commits are created for every component. So in case you have many components you will still see lot of commits. You might utilize [Squash Git commits](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-git-squash) add-on in that case. If you want to commit changes more frequently and without checking of age, you can schedule a regular task to perform a commit. This can be done using Periodic Tasks in [The Django admin interface](https://docs.weblate.org/en/latest/admin/admin.md#admin-interface). First create desired Interval (for example 120 seconds). Then add new periodic task and choose `weblate.trans.tasks.commit_pending` as Task with `{"hours": 0}` as Keyword Arguments and desired interval. ## Processing repository with scripts The way to customize how Weblate interacts with the repository is [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons). Consult [Executing scripts from add-on](https://docs.weblate.org/en/latest/admin/addons.md#addon-script) for info on how to execute external scripts through add-ons. ## Keeping translations same across components Once you have multiple translation components, you might want to ensure that the same strings have same translation. This can be achieved at several levels. ### Translation propagation With [Allow translation propagation](https://docs.weblate.org/en/latest/admin/projects.md#component-allow-translation-propagation) enabled (what is the default, see [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component)), all new translations are automatically done in all components with matching strings. Such translations are properly credited to currently translating user in all components. Propagation preconditions: - All components have to reside in a single project (linking component is not enough). - Enable [Allow translation propagation](https://docs.weblate.org/en/latest/admin/projects.md#component-allow-translation-propagation) to automatically reuse translations for matching strings. - The translation propagation requires the key to be match for monolingual translation formats, so keep that in mind when creating translation keys. - The strings are propagated while translating, strings loaded from the repository are not propagated. #### TIP This feature currently has limitations, and we want to make it more universal. Please share your feedback at [https://github.com/WeblateOrg/weblate/issues/3166](https://github.com/WeblateOrg/weblate/issues/3166). ### Consistency check The [Inconsistent](https://docs.weblate.org/en/latest/user/checks.md#check-inconsistent) check fires whenever the strings are different. You can utilize this to review such differences manually and choose the right translation. ### Automatic translation Automatic translation based on different components can be way to synchronize the translations across components. You can either trigger it manually (see [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation)) or make it run automatically on repository update using add-on (see [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate)). # admin/customize.md # Customizing Weblate Extend and customize using Django and Python. Contribute your changes upstream so that everybody can benefit. This reduces your maintenance costs; code in Weblate is taken care of when changing internal interfaces or refactoring the code. #### HINT You can also customize Weblate look in [Appearance customization](https://docs.weblate.org/en/latest/admin/admin.md#manage-appearance). #### WARNING Neither internal interfaces nor templates are considered a stable API. Please review your customizations for every upgrade, the interfaces or their semantics might change without notice. #### SEE ALSO [Contributing to Weblate](https://docs.weblate.org/en/latest/contributing/index.md#contributing) ## Creating a Python module If you are not familiar with Python, you might want to look into [Python For Beginners](https://www.python.org/about/gettingstarted/), explaining the basics and pointing to further tutorials. To write a file with custom Python code (called a module), a place to store it is needed, either in the system path (usually something like `/usr/lib/python3.12/site-packages/`) or in the Weblate directory, which is also added to the interpreter search path. #### HINT When [using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-deploy), you can place Python modules in `/app/data/python/` (see [Docker container volumes](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume)), so they can be loaded by Weblate, for example from a [settings override file](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-settings-override). Better yet, turn your customization into a proper Python package: 1. Create a folder for your package (we will use weblate_customization). 2. Within it, create a `pyproject.toml` file to describe the package: ```toml [build-system] requires = ["uv_build>=0.8.18,<0.9.0"] build-backend = "uv_build" [project] name = "weblate-customization" version = "0.1.0" description = "Add your description here" requires-python = ">=3.13" dependencies = [] ``` 3. Create a folder for the Python module: `src/weblate_customization` 4. Within it, create a `__init__.py` file to ensure Python can import the module. 5. This package can now be installed using **uv pip install -e**. More info to be found in [Editable packages documentation](https://docs.astral.sh/uv/pip/packages/#editable-packages). 6. Once installed, the module can be used in the Weblate configuration (for example `weblate_customization.checks.FooCheck`). Your package structure should look like this: ```text weblate_customization ├── pyproject.toml └── src └── weblate_customization ├── __init__.py ├── addons.py └── checks.py ``` You can find an example of customizing Weblate at <[https://github.com/WeblateOrg/customize-example](https://github.com/WeblateOrg/customize-example)>, it covers all the topics described below. ## Changing the logo 1. Create a simple Django app containing the static files you want to overwrite (see [Creating a Python module](https://docs.weblate.org/en/latest/admin/customize.md#custom-module)). Branding appears in the following files: `icons/weblate.svg` : Logo shown in the navigation bar. `logo-*.png` : Web icons depending on screen resolution and web-browser. `favicon.ico` : Web icon used by legacy browsers. `weblate-*.png` : Avatars for bots or anonymous users. Some web-browsers use these as shortcut icons. `email-logo.png` : Used in notifications e-mails. 2. Add it to [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS): ```python INSTALLED_APPS = ( # Add your customization as first "weblate_customization", # Weblate apps are here… ) ``` 3. Run `weblate collectstatic --noinput`, to collect static files served to clients. #### SEE ALSO * [How to manage static files (e.g. images, JavaScript, CSS)](https://docs.djangoproject.com/en/stable/howto/static-files/) * [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files) ## Custom quality checks, add-ons, automatic suggestions and auto-fixes To install your code for [Custom automatic fixups](https://docs.weblate.org/en/latest/admin/checks.md#custom-autofix), [Writing own checks](https://docs.weblate.org/en/latest/admin/checks.md#own-checks), [Custom machine translation](https://docs.weblate.org/en/latest/admin/machine.md#custom-machinery) or [Writing add-on](https://docs.weblate.org/en/latest/admin/addons.md#own-addon) in Weblate: 1. Place the files into your Python module containing the Weblate customization (see [Creating a Python module](https://docs.weblate.org/en/latest/admin/customize.md#custom-module) or [Customizing code](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-python-override)). 2. Add its fully-qualified path to the Python class in the dedicated settings: * [`WEBLATE_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_ADDONS) * [`CHECK_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CHECK_LIST) * [`WEBLATE_MACHINERY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_MACHINERY) * [`AUTOFIX_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTOFIX_LIST) ```python # Checks CHECK_LIST += ("weblate_customization.checks.FooCheck",) # Autofixes AUTOFIX_LIST += ("weblate_customization.autofix.FooFixer",) # Add-ons WEBLATE_ADDONS += ("weblate_customization.addons.ExamplePreAddon",) # Automatic suggestions WEBLATE_MACHINERY += ("weblate_customization.machinery.SampleTranslation",) ``` #### SEE ALSO * [Custom automatic fixups](https://docs.weblate.org/en/latest/admin/checks.md#custom-autofix) * [Writing own checks](https://docs.weblate.org/en/latest/admin/checks.md#own-checks) * [Writing add-on](https://docs.weblate.org/en/latest/admin/addons.md#own-addon) * [Executing scripts from add-on](https://docs.weblate.org/en/latest/admin/addons.md#addon-script) # admin/deployments.md # Weblate deployments Weblate can be easily installed in your cloud. Please find detailed guide for your platform: * [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md) * [Installing on OpenShift](https://docs.weblate.org/en/latest/admin/install/openshift.md) * [Installing on Kubernetes](https://docs.weblate.org/en/latest/admin/install/kubernetes.md) ## Third-party deployments for Weblate #### NOTE Following deployments are not developed or supported by Weblate team. Parts of the setup might vary from what is described in this documentation. ### Weblate Cloudron Package [Cloudron](https://www.cloudron.io/) is a platform for self-hosting web applications. Weblate installed with Cloudron will be automatically kept up-to-date. The package is maintained by the Cloudron team; see the [Weblate package documentation](https://docs.cloudron.io/packages/weblate/). [![Install Weblate with Cloudron](images/cloudron.png)](https://www.cloudron.io/button.html?app=org.weblate.cloudronapp) ### Weblate in YunoHost The self-hosting project [YunoHost](https://yunohost.org/) provides a package for Weblate. Once you have your YunoHost installation, you may install Weblate as any other application. It will provide you with a fully working stack with backup and restoration, but you may still have to edit your settings file for specific usages. You may use your administration interface, or this button (it will bring you to your server): [![Install Weblate with YunoHost](images/install-with-yunohost.png)](https://apps.yunohost.org/app/weblate) It also is possible to use the command-line interface: ```sh yunohost app install weblate ``` # admin/install.md # Configuration instructions ## Installing Weblate Depending on your setup and experience, choose an appropriate installation method for you: * [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md), recommended for production setups. * Virtualenv installation, recommended for production setups: * [Installing on Debian and Ubuntu](https://docs.weblate.org/en/latest/admin/install/venv-debian.md) * [Installing on SUSE and openSUSE](https://docs.weblate.org/en/latest/admin/install/venv-suse.md) * [Installing on RedHat, Fedora and CentOS](https://docs.weblate.org/en/latest/admin/install/venv-redhat.md) * [Installing on macOS](https://docs.weblate.org/en/latest/admin/install/venv-macos.md) * [Installing from sources](https://docs.weblate.org/en/latest/admin/install/source.md), recommended for development. * [Installing on OpenShift](https://docs.weblate.org/en/latest/admin/install/openshift.md) * [Installing on Kubernetes](https://docs.weblate.org/en/latest/admin/install/kubernetes.md) ## Architecture overview Web server : Handling incoming HTTP requests, [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files). Celery workers : [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) are executed here.
Depending on your workload, you might want to customize the number of workers.
Use dedicated node when scaling Weblate horizontally. Application server : A WSGI or ASGI server serving web pages to users.
Use dedicated node when scaling Weblate horizontally. Database : PostgreSQL database server for storing all the content, see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup).
Use dedicated database node for sites with hundreds of millions of hosted words. Datastore : Key/value datastore such as Valkey or Redis server for cache and tasks queue, see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery).
Use dedicated node when scaling Weblate horizontally. File system : File system storage for storing VCS repositories and uploaded user data. This is shared by all the processes.
Use networked storage when scaling Weblate horizontally. E-mail server : SMTP server for outgoing e-mail, see [Configuring outgoing e-mail](https://docs.weblate.org/en/latest/admin/install.md#out-mail). It can be provided externally. #### HINT [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md) includes PostgreSQL and Valkey, making the installation easier. ## Software requirements ### Operating system Weblate is known to work on Linux, FreeBSD and macOS. Other Unix like systems will most likely work too. Weblate is not supported on Windows. But it may still work and patches are happily accepted. #### SEE ALSO [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture) describes overall Weblate architecture and required services. ### Python dependencies Weblate is written in [Python](https://www.python.org/) and supports Python 3.12 or newer. You can install dependencies using pip or from your distribution packages, full list is available in `requirements.txt`. Most notable dependencies: Django : [https://www.djangoproject.com/](https://www.djangoproject.com/) Celery : [https://docs.celeryq.dev/](https://docs.celeryq.dev/) Translate Toolkit : [https://toolkit.translatehouse.org/](https://toolkit.translatehouse.org/) translation-finder : [https://github.com/WeblateOrg/translation-finder](https://github.com/WeblateOrg/translation-finder) Python Social Auth : [https://python-social-auth.readthedocs.io/](https://python-social-auth.readthedocs.io/) Django REST Framework : [https://www.django-rest-framework.org/](https://www.django-rest-framework.org/) #### Optional dependencies | Optional dependency specifier | Python packages | Weblate feature | |---------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | `amazon` | [boto3](https://pypi.org/project/boto3/)


[django-ses](https://pypi.org/project/django-ses/)

| [Amazon Translate](https://docs.weblate.org/en/latest/admin/machine.md#mt-aws), AWS SES e-mail backend | | `asgi` | [granian](https://pypi.org/project/granian/)

| ASGI server for Weblate | | `gelf` | [logging-gelf](https://pypi.org/project/logging-gelf/)

| [Graylog log management](https://docs.weblate.org/en/latest/admin/install.md#graylog) | | `gerrit` | [git-review](https://pypi.org/project/git-review/)

| [Gerrit review requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gerrit) | | `google` | [google-cloud-storage](https://pypi.org/project/google-cloud-storage/)


[google-cloud-translate](https://pypi.org/project/google-cloud-translate/)

| [Google Cloud Translation Advanced](https://docs.weblate.org/en/latest/admin/machine.md#mt-google-translate-api-v3) with glossary support | | `google-errors` | [google-cloud-error-reporting](https://pypi.org/project/google-cloud-error-reporting/)

| [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors) | | `ldap` | [django-auth-ldap](https://pypi.org/project/django-auth-ldap/)

| [LDAP authentication](https://docs.weblate.org/en/latest/admin/auth.md#ldap-auth) | | `mercurial` | [mercurial](https://pypi.org/project/mercurial/)

| [Mercurial](https://docs.weblate.org/en/latest/vcs.md#vcs-mercurial) | | `postgres` | [psycopg](https://pypi.org/project/psycopg/)

| PostgreSQL, see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) | | `rollbar` | [rollbar](https://pypi.org/project/rollbar/)

| [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors) | | `saml` | [python3-saml](https://pypi.org/project/python3-saml/)


[xmlsec](https://pypi.org/project/xmlsec/)

| [SAML authentication](https://docs.weblate.org/en/latest/admin/auth.md#saml-auth) | | `saml2idp` | [djangosaml2idp2](https://pypi.org/project/djangosaml2idp2/)

| Integrating SAML 2 IDP into Weblate | | `sphinx` | [Sphinx](https://pypi.org/project/Sphinx/)

| Needed for [Update POT file (Sphinx)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-sphinx) | | `wllegal` | [wllegal](https://pypi.org/project/wllegal/)

| Hosted Weblate integration | | `wsgi` | [granian](https://pypi.org/project/granian/)

| WSGI server for Weblate | | `zxcvbn` | [django-zxcvbn-password-validator](https://pypi.org/project/django-zxcvbn-password-validator/)

| [Password authentication](https://docs.weblate.org/en/latest/admin/auth.md#password-authentication) | When installing using pip, you can directly specify desired features when installing: ```sh uv pip install "weblate[Postgres,Amazon,SAML]" ``` Or you can install Weblate with all optional features: ```sh uv pip install "weblate[all]" ``` Or you can install Weblate without any optional features: ```sh uv pip install weblate ``` ### Troubleshooting pip install `ffi_prep_closure(): bad user_data (it seems that the version of the libffi library seen at runtime is different from the 'ffi.h' file seen at compile-time)` : This is caused by incompatibility of binary packages distributed via PyPI with the distribution. To address this, you need to rebuild the package on your system:
```sh uv pip install --force-reinstall --no-binary :all: cffi ``` `error: ‘xmlSecKeyDataFormatEngine’ undeclared (first use in this function); did you mean ‘xmlSecKeyDataFormat’?` : This is a known issue of the xmlsec package, please see [https://github.com/xmlsec/python-xmlsec/issues/314](https://github.com/xmlsec/python-xmlsec/issues/314). `lxml & xmlsec libxml2 library version mismatch` : The `lxml` and `xmlsec` packages have to be built against one `libxml2`. You should build them locally to avoid this issue:
```sh uv pip install --force-reinstall --no-binary xmlsec --no-binary lxml lxml xmlsec ``` ### Other system requirements The following dependencies have to be installed on the system: `Git` : [https://git-scm.com/](https://git-scm.com/) `git-review` (optional for Gerrit support) : [git-review](https://pypi.org/project/git-review/) `git-svn` (optional for Subversion support) : [https://git-scm.com/docs/git-svn](https://git-scm.com/docs/git-svn) `tesseract` (needed only if **tesserocr** binary wheels are not available for your system) : [https://github.com/tesseract-ocr/tesseract](https://github.com/tesseract-ocr/tesseract) ### Build-time dependencies To build some of the [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps) you might need to install their dependencies. This depends on how you install them, so please consult individual packages for documentation. You won’t need those if using prebuilt `Wheels` while installing using `pip` or when you use distribution packages. ## Hardware requirements Weblate should run on any contemporary hardware without problems, the following is the minimal configuration required to run Weblate on a single host (Weblate, database and web server): * 3 GB of RAM * 2 CPU cores * 1 GB of storage space #### NOTE Actual requirements for your installation of Weblate vary heavily based on the size of the translations managed in it. ### Memory usage The more memory the better - it is used for caching on all levels (file system, database and Weblate). For hundreds of translation components, at least 4 GB of RAM is recommended. #### HINT For systems with less memory than recommended, [Single-process Celery setup](https://docs.weblate.org/en/latest/admin/install.md#minimal-celery) is recommended. ### CPU usage Many concurrent users increase the amount of needed CPU cores. ### Storage usage The typical database storage usage is around 300 MB per 1 million hosted words. Storage space needed for cloned repositories varies, but Weblate tries to keep their size minimal by doing shallow clones. ### Storage performance Version control operations perform many filesystem metadata lookups. The `vcs` subdirectory in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) therefore needs low read latency; storage with slow metadata access can make operations such as **git status** take a long time even when its bulk throughput is good. Keep [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) on low-latency local or temporary storage when possible. The deployment checks measure metadata lookup latency for both locations and warn when the median latency exceeds 10 milliseconds. This is an approximate point-in-time measurement affected by filesystem and system load. Rerun **weblate check --deploy** before changing the storage configuration. ### Nodes For small and medium-sized sites (millions of hosted words), all Weblate components (see [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture)) can be run on a single node. When you grow to hundreds of millions of hosted words, it is recommended to have a dedicated node for database (see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup)). ## Verifying release artifacts Release archives can be verified using the signatures, attestations, and SBOMs published with GitHub release assets. See [Verifying release artifacts](https://docs.weblate.org/en/latest/security/release-artifacts.md#verify). ## Filesystem permissions The Weblate process needs to be able to read and write to the directory where it keeps data - [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR). All files within this directory should be owned and writable by the user running all Weblate processes (typically WSGI and Celery, see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server) and [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery)). The default configuration places them in the same tree as the Weblate sources, however you might prefer to move these to a better location such as: `/var/lib/weblate`. Weblate tries to create these directories automatically, but it will fail when it does not have permissions to do so. The configured [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) also has to be writable by the Weblate process and has to allow executing generated helper files. Do not mount [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) with the `noexec` option. You should also take care when running [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage), as they should be ran under the same user as Weblate itself is running, otherwise permissions on some files might be wrong. In the Docker container, all files in the `/app/data` volume have to be owned by the `weblate` user inside the container (UID 1000). #### SEE ALSO [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files) ## Database setup for Weblate It is recommended to run Weblate with a PostgreSQL database server. PostgreSQL 13 and higher is supported. PostgreSQL 15 or newer is recommended. #### SEE ALSO * [Use a powerful database engine](https://docs.weblate.org/en/latest/admin/install.md#production-database) * [Databases](https://docs.djangoproject.com/en/stable/ref/databases/) * [Migrating from other databases to PostgreSQL](https://docs.weblate.org/en/latest/admin/upgrade.md#database-migration) ### Database connections In the default configuration, each Weblate process keeps a persistent connection to the database. Persistent connections improve Weblate responsiveness, but might require more resources for the database server. Please consult [`CONN_MAX_AGE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-CONN_MAX_AGE) and [Persistent connections](https://docs.djangoproject.com/en/stable/ref/databases/#persistent-database-connections) for more info. Weblate needs at least the following number of connections: * $(4 \times \mathit{nCPUs}) + 2$ for Celery processes * $\mathit{nCPUs} + 1$ for WSGI workers This applies to Docker container defaults and example configurations provided in this documentation, but the numbers will change once you customize the amount of WSGI workers or adjust parallelism of Celery. The actual limit for the number of database connections needs to be higher to account for the following situations: * [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage) need their connection as well. * If a process is killed (for example by OOM killer), it might block the existing connection until timeout. #### SEE ALSO [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery), [Sample configuration for NGINX and uWSGI](https://docs.weblate.org/en/latest/admin/install.md#uwsgi), [`WEBLATE_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_WORKERS) ### PostgreSQL PostgreSQL is usually the best choice for Django-based sites. It’s the reference database used for implementing Django database layer. #### NOTE Weblate uses trigram extension which has to be installed separately in some cases. Look for `postgresql-contrib` or a similarly named package. #### SEE ALSO [PostgreSQL notes](https://docs.djangoproject.com/en/stable/ref/databases/#postgresql-notes) #### Creating a database in PostgreSQL It is usually a good idea to run Weblate in a separate database, and separate user account: ```sh # If PostgreSQL was not installed before, set the main password sudo -u postgres psql postgres -c "\password postgres" # Create a database user called "weblate" sudo -u postgres createuser --superuser --pwprompt weblate # Create the database "weblate" owned by "weblate" sudo -u postgres createdb -E UTF8 -O weblate weblate ``` #### HINT If you don’t want to make the Weblate user a superuser in PostgreSQL, you can omit that. In that case you will have to perform some of the migration steps manually as a PostgreSQL superuser in schema Weblate will use: ```postgres CREATE EXTENSION IF NOT EXISTS pg_trgm; CREATE EXTENSION IF NOT EXISTS btree_gin; CREATE EXTENSION IF NOT EXISTS btree_gist; ``` #### Configuring Weblate to use PostgreSQL The `settings.py` snippet for PostgreSQL: ```python DATABASES = { "default": { # Database engine "ENGINE": "django.db.backends.postgresql", # Database name "NAME": "weblate", # Database user "USER": "weblate", # Configures name of the PostgreSQL role to alter during the database migration # "ALTER_ROLE": "weblate", # Database password "PASSWORD": "password", # Set to empty string for localhost "HOST": "database.example.com", # Set to empty string for default "PORT": "", # Persistent connections "CONN_MAX_AGE": None, "CONN_HEALTH_CHECKS": True, } } ``` The database migration performs [ALTER ROLE](https://www.postgresql.org/docs/16/sql-alterrole.html) on the database role used by Weblate. In most cases, the name of the role matches the username. In more complex setups the role name is different from the username, and you will get an error about non-existing role during the database migration (`psycopg2.errors.UndefinedObject: role "weblate@hostname" does not exist`). This is known to happen with Azure Database for PostgreSQL, but it’s not limited to this environment. Please set `ALTER_ROLE` to change the name of the role Weblate should alter during the database migration. #### SEE ALSO [Database connections](https://docs.weblate.org/en/latest/admin/install.md#db-connections) ## Other configurations ### Configuring outgoing e-mail Weblate sends out e-mails on various occasions - for account activation and on various notifications configured by users. For this it needs access to an SMTP server. The mail server setup is configured using these settings: [`EMAIL_HOST`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_HOST), [`EMAIL_HOST_PASSWORD`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_HOST_PASSWORD), [`EMAIL_USE_TLS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_USE_TLS), [`EMAIL_USE_SSL`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_USE_SSL), [`EMAIL_HOST_USER`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_HOST_USER) and [`EMAIL_PORT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_PORT). Their names are quite self-explanatory, but you can find more info in the Django documentation. #### HINT In case you get error about not supported authentication (for example `SMTP AUTH extension not supported by server`), it is most likely caused by using insecure connection and server refuses to authenticate this way. Try enabling [`EMAIL_USE_TLS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_USE_TLS) in such case. #### SEE ALSO * [Not receiving e-mails from Weblate](https://docs.weblate.org/en/latest/contributing/debugging.md#debug-mails) * [Configuring outgoing e-mail in Docker container](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-mail) ### Running behind reverse proxy Several features in Weblate rely on correct HTTP headers being passed to Weblate. When using reverse proxy, please make sure that the needed information is correctly passed. To debug this configuration, you can look at HTTP environment in [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance). Client IP address : This is needed for [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) or [Audit log](https://docs.weblate.org/en/latest/user/profile.md#audit-log).
Weblate parses IP address from the `REMOTE_ADDR`, which is set by the WSGI handler. This might be empty (when using socket for WSGI) or contain a reverse proxy address, so Weblate needs an additional HTTP header with a client IP address.
Enabling [`IP_BEHIND_REVERSE_PROXY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_BEHIND_REVERSE_PROXY) should be sufficient for the most usual setups, but you might need to adjust [`IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_HEADER) and [`IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_OFFSET) as well (use [`WEBLATE_IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_IP_PROXY_HEADER) and [`WEBLATE_IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_IP_PROXY_OFFSET) in the Docker container).
The reverse proxy which connects to Weblate must overwrite the configured header or append a verified peer address at the position selected by [`IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_OFFSET). Do not select a client-supplied address, and do not expose the application server through a path which bypasses the trusted proxy.
When using `X-Forwarded-For` with the Docker container, configure [`WEBLATE_TRUSTED_PROXY_ADDRESSES`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_TRUSTED_PROXY_ADDRESSES) with the reverse proxies allowed to supply client addresses.
#### HINT This configuration cannot be turned on by default, because it would allow IP address spoofing on installations that don’t have a properly configured reverse proxy. Server host name : The [Host](https://www.rfc-editor.org/rfc/rfc7230#section-5.4) header should match to whatever is configured as [`SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SITE_DOMAIN). Additional configuration might be needed in your reverse proxy (for example use `ProxyPreserveHost On` for Apache or `proxy_set_header Host $host;` with nginx).
#### HINT CSRF verification failed errors are often caused by a mismatch between the [Host](https://www.rfc-editor.org/rfc/rfc7230#section-5.4) header and configured [`SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SITE_DOMAIN). Client protocol : Not passing correct protocol may cause Weblate to end up in redirection loop trying to upgrade client to HTTPS. Make sure it is correctly exposed by the reverse proxy as *X-Forwarded-Proto*.
This header then needs to be configured in [`SECURE_PROXY_SSL_HEADER`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECURE_PROXY_SSL_HEADER) (`settings.py`) or [`WEBLATE_SECURE_PROXY_SSL_HEADER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SECURE_PROXY_SSL_HEADER) (Docker environment).
#### IMPORTANT The header value is case-sensitive in the configuration, so `WEBLATE_SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,https` and `WEBLATE_SECURE_PROXY_SSL_HEADER=HTTP_X_FORWARDED_PROTO,HTTPS` are not interchangeable.
#### HINT If you are getting a “Too many redirects” error from the browser, this is most likely caused by mismatch between the actual protocol (HTTPS) and what is observed by Weblate.
#### Versionchanged Changed in version 5.13: The protocol proxy headers are automatically handled by **gunicorn** in the default configuration, but other WSGI servers have more secure configuration and require explicit setting of this.
Since Weblate 5.13 the Docker container is using **granian** and it now requires the explicit configuration of [`WEBLATE_SECURE_PROXY_SSL_HEADER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SECURE_PROXY_SSL_HEADER). #### SEE ALSO * [SSL terminating proxy](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-ssl-proxy) * [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) * [Audit log](https://docs.weblate.org/en/latest/user/profile.md#audit-log) * [Sample configuration for NGINX and Granian](https://docs.weblate.org/en/latest/admin/install.md#nginx-granian) * [Sample configuration for NGINX and Gunicorn](https://docs.weblate.org/en/latest/admin/install.md#nginx-gunicorn) * [Sample configuration for NGINX and uWSGI](https://docs.weblate.org/en/latest/admin/install.md#uwsgi) * [Sample configuration for Apache](https://docs.weblate.org/en/latest/admin/install.md#apache) * [Sample configuration for Apache and Gunicorn](https://docs.weblate.org/en/latest/admin/install.md#apache-gunicorn) * [`IP_BEHIND_REVERSE_PROXY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_BEHIND_REVERSE_PROXY) * [`IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_HEADER) * [`IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_OFFSET) * [`SECURE_PROXY_SSL_HEADER`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECURE_PROXY_SSL_HEADER) * [`WEBLATE_IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_IP_PROXY_HEADER) * [`WEBLATE_TRUSTED_PROXY_ADDRESSES`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_TRUSTED_PROXY_ADDRESSES) * [`WEBLATE_IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_IP_PROXY_OFFSET) ### HTTP proxy Weblate supports per-protocol HTTP proxy configuration for outbound HTTP requests and Git repositories. Define the proxy environment variables in `settings.py`: ```python import os os.environ["http_proxy"] = "http://proxy.example.com:8080" os.environ["https_proxy"] = "http://proxy.example.com:8080" ``` Only `http_proxy` and `https_proxy` are supported. Generic and bypass variables such as `all_proxy` and `no_proxy`, operating-system proxy configuration, and VCS-specific proxy configuration are not supported. #### SEE ALSO [Proxy environment variables](https://everything.curl.dev/usingcurl/proxies/env.html) ## Adjusting configuration #### SEE ALSO [Sample configuration](https://docs.weblate.org/en/latest/admin/sample.md#sample-configuration) Copy `weblate/settings_example.py` to `weblate/settings.py` and adjust it to match your setup. You will probably want to adjust the following options: `ADMINS` > List of site administrators to receive notifications when something goes > wrong, for example notifications on failed merges, or Django errors. > Contact form sends e-mail on these as well unless [`ADMINS_CONTACT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ADMINS_CONTACT) > is configured. > #### SEE ALSO > * [`ADMINS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-ADMINS) > * [`ADMINS_CONTACT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ADMINS_CONTACT) > * [Properly configure admins](https://docs.weblate.org/en/latest/admin/install.md#production-admins) `ALLOWED_HOSTS` > You need to set this to list the hosts your site is supposed to serve. For > example: > ```python > ALLOWED_HOSTS = ["demo.weblate.org"] > ``` > Alternatively you can include wildcard: > ```python > ALLOWED_HOSTS = ["*"] > ``` > #### SEE ALSO > * [`ALLOWED_HOSTS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-ALLOWED_HOSTS) > * [`WEBLATE_ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ALLOWED_HOSTS) > * [Allowed hosts setup](https://docs.weblate.org/en/latest/admin/install.md#production-hosts) `SESSION_ENGINE` > Configure how your sessions will be stored. In case you keep the default > database backend engine, you should schedule: > **weblate clearsessions** to remove stale session data from the > database. > If you are using Valkey or Redis as cache (see [Configure cache](https://docs.weblate.org/en/latest/admin/install.md#production-cache)) it is > recommended to use it for sessions as well: > ```python > SESSION_ENGINE = "django.contrib.sessions.backends.cache" > ``` > #### SEE ALSO > * [Configuring the session engine](https://docs.djangoproject.com/en/stable/topics/http/sessions/#configuring-sessions) > * [`SESSION_ENGINE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SESSION_ENGINE) `DATABASES` > Connectivity to database server, please check Django’s documentation for more > details. > #### SEE ALSO > * [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) > * [`DATABASES`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-DATABASES) > * [Databases](https://docs.djangoproject.com/en/stable/ref/databases/) `DEBUG` > Disable this for any production server. With debug mode enabled, Django will > show backtraces in case of error to users, when you disable it, errors will > be sent per e-mail to `ADMINS` (see above). > Debug mode also slows down Weblate, as Django stores much more info > internally in this case. > #### SEE ALSO > * [`DEBUG`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-DEBUG) > * [Disable debug mode](https://docs.weblate.org/en/latest/admin/install.md#production-debug) `DEFAULT_FROM_EMAIL` > E-mail sender address for outgoing e-mail, for example registration e-mails. > #### SEE ALSO > [`DEFAULT_FROM_EMAIL`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-DEFAULT_FROM_EMAIL) `SECRET_KEY` > Key used by Django to sign some info in cookies, see > [Django secret key](https://docs.weblate.org/en/latest/admin/install.md#production-secret) for more info. > #### SEE ALSO > [`SECRET_KEY`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECRET_KEY) `SERVER_EMAIL` > E-mail used as sender address for sending e-mails to the administrator, for > example notifications on failed merges. > #### SEE ALSO > [`SERVER_EMAIL`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SERVER_EMAIL) ## Filling up the database After your configuration is ready, you can run [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate) to create the database structure. Now you should be able to create translation projects using the admin interface. Once you are done, you should also check the Performance report in the admin interface, which will give you hints of potential non optimal configuration on your site. #### SEE ALSO * [Configuration](https://docs.weblate.org/en/latest/admin/config.md#config) * [List of privileges](https://docs.weblate.org/en/latest/admin/access.md#privileges) ## Production setup For a production setup you should carry out adjustments described in the following sections. The most critical settings will trigger a warning, which is indicated by an exclamation mark in the top bar if signed in as a superuser: ![image](screenshots/admin-wrench.webp) It is also recommended to inspect checks triggered by Django (though you might not need to fix all of them): ```sh weblate check --deploy ``` You can also review the very same checklist at [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance) in the [Management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface). #### SEE ALSO [Deployment checklist](https://docs.djangoproject.com/en/stable/howto/deployment/checklist/) ### Disable debug mode Disable Django’s debug mode ([`DEBUG`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-DEBUG)) by: ```python DEBUG = False ``` With debug mode on, Django stores all executed queries and shows users backtraces of errors, which is not desired in a production setup. #### SEE ALSO [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration) ### Properly configure admins Set the correct admin addresses to the [`ADMINS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ADMINS) setting to define who will receive e-mails in case something goes wrong on the server, for example: ```python ADMINS = ("Your Name ",) ``` #### SEE ALSO [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration) ### Set correct site domain Adjust site name and domain in the admin interface, otherwise links in RSS or registration e-mails will not work. This is configured using [`SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SITE_DOMAIN) which should contain site domain name. #### Versionchanged Changed in version 4.2: Prior to the 4.2 release the Django sites framework was used instead, please see [The “sites” framework](https://docs.djangoproject.com/en/stable/ref/contrib/sites/). #### SEE ALSO * [Allowed hosts setup](https://docs.weblate.org/en/latest/admin/install.md#production-hosts) * [Correctly configure HTTPS](https://docs.weblate.org/en/latest/admin/install.md#production-ssl) * [`SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SITE_DOMAIN) * [`WEBLATE_SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SITE_DOMAIN) * [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS) ### Correctly configure HTTPS It is strongly recommended to run Weblate using the encrypted HTTPS protocol. After enabling it, you should set [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS) in the settings: ```python ENABLE_HTTPS = True ``` #### HINT You might want to set up HSTS as well, see [SSL/HTTPS](https://docs.djangoproject.com/en/stable/topics/security/#security-recommendation-ssl) for more details. #### SEE ALSO * [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS) * [Allowed hosts setup](https://docs.weblate.org/en/latest/admin/install.md#production-hosts) * [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site) ### Set properly SECURE_HSTS_SECONDS If your site is served over SSL, you have to consider setting a value for [`SECURE_HSTS_SECONDS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECURE_HSTS_SECONDS) in the `settings.py` to enable HTTP Strict Transport Security. By default it’s set to 0 as shown below. ```python SECURE_HSTS_SECONDS = 0 ``` If set to a non-zero integer value, the [`django.middleware.security.SecurityMiddleware`](https://docs.djangoproject.com/en/stable/ref/middleware/#django.middleware.security.SecurityMiddleware) sets the [HTTP Strict Transport Security](https://docs.djangoproject.com/en/stable/ref/middleware/#http-strict-transport-security) header on all responses that do not already have it. #### WARNING Setting this incorrectly can irreversibly (for some time) break your site. Read the [HTTP Strict Transport Security](https://docs.djangoproject.com/en/stable/ref/middleware/#http-strict-transport-security) documentation first. ### Use a powerful database engine * Please use PostgreSQL for a production environment, see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) for more info. * Use adjacent location for running the database server, otherwise the networking performance or reliability might ruin your Weblate experience. * Check the database server performance or tweak its configuration, for example using [PGTune](https://pgtune.leopard.in.ua/). * Weblate deployment checks report non-finite PostgreSQL relation statistics. Run `ANALYZE` on the reported relations to rebuild corrupted statistics. #### SEE ALSO * [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) * [Migrating from other databases to PostgreSQL](https://docs.weblate.org/en/latest/admin/upgrade.md#database-migration) * [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration) * [Databases](https://docs.djangoproject.com/en/stable/ref/databases/) ### Configure cache If possible, use Valkey or Redis from Django by adjusting the `CACHES` configuration variable, for example: ```python CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/0", # If redis is running on same host as Weblate, you might # want to use unix sockets instead: # 'LOCATION': 'unix:///var/run/redis/redis.sock?db=0', "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PARSER_CLASS": "redis.connection.HiredisParser", }, } } ``` #### HINT In case you change settings for the cache, you might need to adjust them for Celery as well, see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery). #### SEE ALSO * [Avatar caching](https://docs.weblate.org/en/latest/admin/install.md#production-cache-avatar) * [Django’s cache framework](https://docs.djangoproject.com/en/stable/topics/cache/) ### Avatar caching In addition to caching of Django, Weblate performs caching of avatars. It is recommended to use a separate, file-backed cache for this purpose: ```python CACHES = { "default": { # Default caching backend setup, see above "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "unix:///var/run/redis/redis.sock?db=0", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PARSER_CLASS": "redis.connection.HiredisParser", }, }, "avatar": { "BACKEND": "django.core.cache.backends.filebased.FileBasedCache", "LOCATION": os.path.join(DATA_DIR, "avatar-cache"), "TIMEOUT": 604800, "OPTIONS": { "MAX_ENTRIES": 1000, }, }, } ``` #### SEE ALSO * [`ENABLE_AVATARS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_AVATARS) * [`AVATAR_URL_PREFIX`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AVATAR_URL_PREFIX) * [Avatars](https://docs.weblate.org/en/latest/admin/optionals.md#avatars) * [Configure cache](https://docs.weblate.org/en/latest/admin/install.md#production-cache) * [Django’s cache framework](https://docs.djangoproject.com/en/stable/topics/cache/) ### Configure e-mail sending Weblate needs to send out e-mails on several occasions, and these e-mails should have a correct sender address, please configure [`SERVER_EMAIL`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-SERVER_EMAIL) and [`DEFAULT_FROM_EMAIL`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-DEFAULT_FROM_EMAIL) to match your environment, for example: ```python SERVER_EMAIL = "admin@example.org" DEFAULT_FROM_EMAIL = "weblate@example.org" ``` #### NOTE To disable sending e-mails by Weblate set [`EMAIL_BACKEND`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_BACKEND) to `django.core.mail.backends.dummy.EmailBackend`. This will disable *all* e-mail delivery including registration or password reset e-mails. #### SEE ALSO * [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration) * [Configuring outgoing e-mail](https://docs.weblate.org/en/latest/admin/install.md#out-mail) * [`EMAIL_BACKEND`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_BACKEND) * [`DEFAULT_FROM_EMAIL`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-DEFAULT_FROM_EMAIL) * [`SERVER_EMAIL`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SERVER_EMAIL) ### Allowed hosts setup Django requires [`ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ALLOWED_HOSTS) to hold a list of domain names your site is allowed to serve, leaving it empty will block any requests. In case this is not configured to match your HTTP server, you will get errors like `Invalid HTTP_HOST header: '1.1.1.1'. You may need to add '1.1.1.1' to ALLOWED_HOSTS.` #### HINT On Docker container, this is available as [`WEBLATE_ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ALLOWED_HOSTS). #### SEE ALSO * [`ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ALLOWED_HOSTS) * [`WEBLATE_ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ALLOWED_HOSTS) * [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site) ### Django secret key The [`SECRET_KEY`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-SECRET_KEY) setting is used by Django to sign cookies, and you should really generate your own value rather than using the one from the example setup. You can generate a new key using **weblate-generate-secret-key** shipped with Weblate. #### SEE ALSO [`SECRET_KEY`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-SECRET_KEY) ### Running maintenance tasks For optimal performance, it is good idea to run some maintenance tasks in the background. This is automatically done by [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) and covers following tasks: * Configuration health check (hourly). * Committing pending changes (hourly), see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit) and [`commit_pending`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-commit_pending). * Updating component alerts (daily). * Update remote branches (nightly), see [`AUTO_UPDATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTO_UPDATE). * Translation memory backup to JSON (daily), see [`dump_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-dump_memory). * Fulltext and database maintenance tasks (daily and weekly tasks), see [`cleanuptrans`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-cleanuptrans). ### System locales and encoding The system locales should be configured to UTF-8 capable ones. On most Linux distributions this is the default setting. In case it is not the case on your system, please change locales to UTF-8 variant. For example by editing `/etc/default/locale` and setting there `LANG="C.UTF-8"`. In some cases the individual services have separate configuration for locales. This varies between distribution and web servers, so check documentation of your web server packages for that. Apache on Ubuntu uses `/etc/apache2/envvars`: ```sh export LANG='en_US.UTF-8' export LC_ALL='en_US.UTF-8' ``` Apache on CentOS uses `/etc/sysconfig/httpd` (or `/opt/rh/httpd24/root/etc/sysconfig/httpd`): ```sh LANG='en_US.UTF-8' ``` ### Using custom certificate authority Weblate verifies SSL certificates during HTTP requests. Requests made using HTTPX2 use the system certificate store, so install custom certificate authorities there. Check your distribution documentation for more details. For example, on Debian this can be done by placing the CA certificate into `/usr/local/share/ca-certificates/` and running **update-ca-certificates**. #### HINT The Weblate container does not include it in the search path, you need to specify full path to execute it. For example: ```sh docker compose exec -u root weblate /usr/sbin/update-ca-certificates ``` Once this is done, Weblate HTTPX2 requests and system tools, including Git, will trust the certificate. Some integrations, including OAuth and OpenID Connect authentication, use Requests, which does not use the system certificate store by default. When these integrations communicate with services using the custom certificate authority, configure Requests to use the system CA bundle by adding the following to `settings.py` (the path is Debian-specific): ```python import os os.environ["REQUESTS_CA_BUNDLE"] = "/etc/ssl/certs/ca-certificates.crt" ``` ## Running server #### HINT In case you are not experienced with services described below, you might want to try [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md). You will need several services to run Weblate, the recommended setup consists of: * Database server (see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup)) * Cache server (see [Configure cache](https://docs.weblate.org/en/latest/admin/install.md#production-cache)) * Frontend web server for static files and SSL termination (see [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files)) * WSGI server for dynamic content (see [Sample configuration for NGINX and uWSGI](https://docs.weblate.org/en/latest/admin/install.md#uwsgi)) * Celery for executing background tasks (see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery)) #### NOTE There are some dependencies between the services, for example cache and database should be running when starting up Celery or uwsgi processes. In most cases, you will run all services on single (virtual) server, but in case your installation is heavy loaded, you can split up the services. The only limitation on this is that Celery and Wsgi servers need access to [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR). #### NOTE The WSGI process has to be executed under the same user the Celery process, otherwise files in the [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) will be stored with mixed ownership, leading to runtime issues. See also [Filesystem permissions](https://docs.weblate.org/en/latest/admin/install.md#file-permissions) and [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery). ### Running web server Running Weblate is not different from running any other Django based program. Django is usually executed as WSGI or fcgi (see examples for different webservers below). #### NOTE The sample configuration files shown below are maintained in the Weblate source tree under `weblate/examples/`. They are included in source distributions and in this documentation, but Python wheels only install runtime files. When installing Weblate from PyPI, get the matching source distribution or source checkout before copying these examples. For testing purposes, you can use the built-in web server in Django: ```sh weblate runserver ``` #### WARNING DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests. See also Django documentation on [`runserver`](https://docs.djangoproject.com/en/stable/ref/django-admin/#django-admin-runserver). #### HINT The Django built-in server serves static files only with [`DEBUG`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-DEBUG) enabled as it is intended for development only. For production use, please see WSGI setups: * [Sample configuration for NGINX and Granian](https://docs.weblate.org/en/latest/admin/install.md#nginx-granian) * [Sample configuration for NGINX and Gunicorn](https://docs.weblate.org/en/latest/admin/install.md#nginx-gunicorn) * [Sample configuration for NGINX and uWSGI](https://docs.weblate.org/en/latest/admin/install.md#uwsgi) * [Sample configuration for Apache](https://docs.weblate.org/en/latest/admin/install.md#apache) * [Sample configuration for Apache and Gunicorn](https://docs.weblate.org/en/latest/admin/install.md#apache-gunicorn) * [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files) ### Serving static files #### Versionchanged Changed in version 5.15.2: `/media/` is no longer used for serving screenshots. Django needs to collect its static files in a single directory. To do so, execute `weblate collectstatic --noinput`. This will copy the static files into a directory specified by the [`STATIC_ROOT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STATIC_ROOT) setting (this defaults to a `static` directory inside [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR)). Production installations use content hashes in collected filenames so that updated assets do not reuse stale browser or proxy caches. It is recommended to serve static files directly from your web server, you should use that for the following paths: `/static/` : Serves static files for Weblate and the admin interface (from defined by [`STATIC_ROOT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STATIC_ROOT)). `/favicon.ico` : Should be rewritten to serve `/static/favicon.ico`. #### SEE ALSO * [Sample configuration for NGINX and Granian](https://docs.weblate.org/en/latest/admin/install.md#nginx-granian) * [Sample configuration for NGINX and Gunicorn](https://docs.weblate.org/en/latest/admin/install.md#nginx-gunicorn) * [Sample configuration for NGINX and uWSGI](https://docs.weblate.org/en/latest/admin/install.md#uwsgi) * [Sample configuration for Apache](https://docs.weblate.org/en/latest/admin/install.md#apache) * [Sample configuration for Apache and Gunicorn](https://docs.weblate.org/en/latest/admin/install.md#apache-gunicorn) * [How to deploy Django](https://docs.djangoproject.com/en/stable/howto/deployment/) * [How to deploy static files](https://docs.djangoproject.com/en/stable/howto/static-files/deployment/) ### Content security policy The default Weblate configuration enables `weblate.middleware.SecurityMiddleware` middleware which sets security related HTTP headers like *Content-Security-Policy* or *X-XSS-Protection*. These are by default set up to work with Weblate and its configuration, but this might need customization for your environment. #### SEE ALSO * [`CSP_SCRIPT_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_SCRIPT_SRC) * [`CSP_IMG_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_IMG_SRC) * [`CSP_CONNECT_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_CONNECT_SRC) * [`CSP_STYLE_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_STYLE_SRC) * [`CSP_FONT_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_FONT_SRC) * [`CSP_FORM_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_FORM_SRC) ### Sample configuration for NGINX and Granian The following configuration runs Weblate using Granian with the NGINX webserver: ```nginx # # nginx configuration for Weblate # # You will want to change: # # - server_name # - change /home/weblate/weblate-env to location where Weblate Python environment is placed # - change /home/weblate/data to match your DATA_DIR # - change /home/weblate/data/cache to match your CACHE_DIR # - change python3.12 to match your Python version # - change weblate user to match your Weblate user # server { listen 80; server_name weblate; # Not used root /var/www/html; location ~ ^/favicon.ico$ { # CACHE_DIR/static/favicon.ico alias /home/weblate/data/cache/static/favicon.ico; expires 30d; } location /static/ { # CACHE_DIR/static/ alias /home/weblate/data/cache/static/; expires 30d; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:8888; proxy_read_timeout 3600; } } ``` #### SEE ALSO * [Sample configuration to start Granian](https://docs.weblate.org/en/latest/admin/install.md#running-granian) * [https://github.com/emmett-framework/granian](https://github.com/emmett-framework/granian) * [How to deploy with WSGI](https://docs.djangoproject.com/en/stable/howto/deployment/wsgi/) ### Sample configuration for NGINX and Gunicorn The following configuration runs Weblate using Gunicorn under the NGINX webserver (`weblate/examples/weblate.nginx.gunicorn.conf` in the source tree): ```nginx # # nginx configuration for Weblate # # You will want to change: # # - server_name # - change /home/weblate/weblate-env to location where Weblate Python environment is placed # - change /home/weblate/data to match your DATA_DIR # - change /home/weblate/data/cache to match your CACHE_DIR # - change python3.12 to match your Python version # - change weblate user to match your Weblate user # server { listen 80; server_name weblate; # Not used root /var/www/html; location ~ ^/favicon.ico$ { # CACHE_DIR/static/favicon.ico alias /home/weblate/data/cache/static/favicon.ico; expires 30d; } location /static/ { # CACHE_DIR/static/ alias /home/weblate/data/cache/static/; expires 30d; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://unix:/run/gunicorn.sock; proxy_read_timeout 3600; } } ``` #### SEE ALSO * [Sample configuration to start Gunicorn](https://docs.weblate.org/en/latest/admin/install.md#running-gunicorn) * [How to use Django with Gunicorn](https://docs.djangoproject.com/en/stable/howto/deployment/wsgi/gunicorn/) ### Sample configuration for NGINX and uWSGI To run production webserver, use the WSGI wrapper installed with Weblate (when using a Python environment it is installed as `~/weblate-env/lib/python3.14/site-packages/weblate/wsgi.py`). Don’t forget to set the Python search path to your Python environment as well (for example using `virtualenv = /home/user/weblate-env` in uWSGI). The following configuration runs Weblate as uWSGI under the NGINX webserver. Configuration for NGINX (`weblate/examples/weblate.nginx.conf` in the source tree): ```nginx # # nginx configuration for Weblate # # You will want to change: # # - server_name # - change /home/weblate/weblate-env to location where Weblate Python environment is placed # - change /home/weblate/data to match your DATA_DIR # - change /home/weblate/data/cache to match your CACHE_DIR # - change python3.12 to match your Python version # - change weblate user to match your Weblate user # server { listen 80; server_name weblate; # Not used root /var/www/html; location ~ ^/favicon.ico$ { # CACHE_DIR/static/favicon.ico alias /home/weblate/data/cache/static/favicon.ico; expires 30d; } location /static/ { # CACHE_DIR/static/ alias /home/weblate/data/cache/static/; expires 30d; } location / { include uwsgi_params; # Needed for long running operations in admin interface uwsgi_read_timeout 3600; # Adjust based to uwsgi configuration: uwsgi_pass unix:///run/uwsgi/app/weblate/socket; # uwsgi_pass 127.0.0.1:8080; } } ``` Configuration for uWSGI (`weblate/examples/weblate.uwsgi.ini` in the source tree): ```ini # # uWSGI configuration for Weblate # # You will want to change: # # - change /home/weblate/weblate-env to location where Weblate Python environment is placed # - change /home/weblate/data to match your DATA_DIR # - change python3.12 to match your Python version # - change weblate user to match your Weblate user # [uwsgi] plugins = python3 master = true protocol = uwsgi socket = 127.0.0.1:8080 wsgi-file = /home/weblate/weblate-env/lib/python3.12/site-packages/weblate/wsgi.py # Add path to Weblate checkout if you did not install # Weblate by pip # python-path = /path/to/weblate # Path to the Python environment virtualenv = /home/weblate/weblate-env # Set sys.executable so Python helpers run with the virtual environment's Python py-executable = /home/weblate/weblate-env/bin/python # Needed for OAuth/OpenID buffer-size = 8192 # Reload when consuming too much of memory reload-on-rss = 250 # Increase number of workers for heavily loaded sites workers = 8 # Enable threads for Sentry error submission enable-threads = true # Child processes do not need file descriptors close-on-exec = true # Avoid default 0000 umask umask = 0022 # Run as weblate user uid = weblate gid = weblate # Enable harakiri mode (kill requests after some time) # harakiri = 3600 # harakiri-verbose = true # Enable uWSGI stats server # stats = :1717 # stats-http = true # Do not log some errors caused by client disconnects ignore-sigpipe = true ignore-write-errors = true disable-write-exception = true ``` Set `py-executable` to the absolute path of `bin/python` inside the environment configured by `virtualenv`. Weblate uses Python’s `sys.executable` to launch helper processes, including the SSH connection proxy used for Git repositories. uWSGI can otherwise set this value to its own executable, causing repository operations to fail with an error such as `/usr/bin/uwsgi-core: invalid option -- 'I'`. Setting `virtualenv` alone does not ensure that `sys.executable` points to Python. Restart uWSGI after updating the configuration. #### SEE ALSO [How to use Django with uWSGI](https://docs.djangoproject.com/en/stable/howto/deployment/wsgi/uwsgi/) ### Sample configuration for Apache It is recommended to use prefork MPM when using WSGI with Weblate. The following configuration runs Weblate as WSGI, you need to have enabled `mod_wsgi` (`weblate/examples/apache.conf` in the source tree): ```apache # # VirtualHost for Weblate # # You will want to change: # # - ServerAdmin and ServerName # - change /home/weblate/weblate-env to location where Weblate Python environment is placed # - change /home/weblate/data to match your DATA_DIR # - change /home/weblate/data/cache to match your CACHE_DIR # - change python3.12 to match Python version mod-wsgi is compiled for # - change weblate user to match your Weblate user # ServerAdmin admin@weblate.example.org ServerName weblate.example.org # CACHE_DIR/static/favicon.ico Alias /favicon.ico /home/weblate/data/cache/static/favicon.ico # CACHE_DIR/static/ Alias /static/ /home/weblate/data/cache/static/ Require all granted # Path to your Weblate Python environment WSGIDaemonProcess weblate python-home=/home/weblate/weblate-env user=weblate request-timeout=600 WSGIProcessGroup weblate WSGIApplicationGroup %{GLOBAL} WSGIScriptAlias / /home/weblate/weblate-env/lib/python3.12/site-packages/weblate/wsgi.py process-group=weblate WSGIPassAuthorization On Require all granted ``` #### NOTE Weblate requires Python 3, so please ensure you are running Python 3 variant of the modwsgi. Usually it is available as a separate package, for example `libapache2-mod-wsgi-py3`. Use matching Python version to install Weblate. #### SEE ALSO * [System locales and encoding](https://docs.weblate.org/en/latest/admin/install.md#production-encoding) * [How to use Django with Apache and mod_wsgi](https://docs.djangoproject.com/en/stable/howto/deployment/wsgi/modwsgi/) ### Sample configuration for Apache and Gunicorn The following configuration runs Weblate in Gunicorn and Apache 2.4 (`weblate/examples/apache.gunicorn.conf` in the source tree): ```apache # # VirtualHost for Weblate using gunicorn on localhost:8000 # # You will want to change: # # - ServerAdmin and ServerName # - change /home/weblate/weblate-env to location where Weblate Python environment is placed # - change /home/weblate/data to match your DATA_DIR # - change /home/weblate/data/cache to match your CACHE_DIR # - change weblate user to match your Weblate user # ServerAdmin admin@weblate.example.org ServerName weblate.example.org # CACHE_DIR/static/favicon.ico Alias /favicon.ico /home/weblate/data/cache/static/favicon.ico # CACHE_DIR/static/ Alias /static/ /home/weblate/data/cache/static/ Require all granted SSLEngine on SSLCertificateFile /etc/apache2/ssl/https_cert.cert SSLCertificateKeyFile /etc/apache2/ssl/https_key.pem SSLProxyEngine On ProxyPass /favicon.ico ! ProxyPass /static/ ! ProxyPass / http://localhost:8000/ ProxyPassReverse / http://localhost:8000/ ProxyPreserveHost On ``` #### SEE ALSO * [Sample configuration to start Gunicorn](https://docs.weblate.org/en/latest/admin/install.md#running-gunicorn) * [How to use Django with Gunicorn](https://docs.djangoproject.com/en/stable/howto/deployment/wsgi/gunicorn/) ### Sample configuration to start Granian Weblate has wsgi optional dependency (see [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps)) that will install everything you need to run Granian. When installing Weblate you can specify it as: ```shell uv pip install Weblate[all,wsgi] ``` Once you have Granian installed, you can run it. This is usually done at the system level. The following examples show starting via systemd: ```ini [Unit] Description=granian daemon After=network.target [Service] User=weblate Group=weblate WorkingDirectory=/home/weblate/weblate-env/ Environment="DJANGO_SETTINGS_MODULE=weblate.settings" RuntimeDirectory=granian ExecStart=/home/weblate/weblate-env/bin/granian \ --no-ws \ --workers-max-rss 450 \ --interface wsgi \ --workers 2 \ --blocking-threads 8 \ --backlog 128 \ --backpressure 16 \ --runtime-mode mt \ --port 8888 \ weblate.wsgi:application [Install] WantedBy=multi-user.target ``` Granian uses worker processes for parallel Python execution, blocking threads for concurrent WSGI requests, and runtime threads for network I/O. The sample uses two workers with eight blocking threads each, limits each worker to 16 concurrent connections, and leaves the runtime threads at Granian’s default. Adjust the workers and blocking threads to the available memory, CPU cores, and database connection limit. Keep the backpressure equal to or higher than the number of blocking threads. #### SEE ALSO * [Sample configuration to start Granian with ASGI](https://docs.weblate.org/en/latest/admin/install.md#running-granian-asgi) * [https://github.com/emmett-framework/granian](https://github.com/emmett-framework/granian) * [How to deploy with WSGI](https://docs.djangoproject.com/en/stable/howto/deployment/wsgi/) ### Sample configuration to start Granian with ASGI #### Versionadded Added in version 2026.8. ASGI deployment is available as an opt-in alternative to WSGI. Install the `asgi` optional dependency: ```shell uv pip install Weblate[all,asgi] ``` The following systemd unit runs the Django ASGI application: ```ini [Unit] Description=granian ASGI daemon After=network.target [Service] User=weblate Group=weblate WorkingDirectory=/home/weblate/weblate-env/ Environment="DJANGO_SETTINGS_MODULE=weblate.settings" RuntimeDirectory=granian ExecStart=/home/weblate/weblate-env/bin/granian \ --no-ws \ --workers-max-rss 450 \ --interface asginl \ --workers 2 \ --backlog 128 \ --backpressure 16 \ --runtime-mode mt \ --port 8888 \ weblate.asgi:application [Install] WantedBy=multi-user.target ``` The sample uses Granian’s ASGI interface without lifespan or WebSocket support, because Weblate currently exposes HTTP only. Weblate’s middleware supports both deployment modes and uses thread-sensitive adapters where it still relies on synchronous Django APIs. The health check is asynchronous, but most Weblate views remain synchronous, and CPU-intensive or long-running work should still be handled by [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery). WSGI remains the default deployment mode. Docker images can opt in to ASGI by setting [`WEBLATE_ASGI`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ASGI) to `1`. Adjust the worker count and backpressure to the available memory, CPU cores, and database connection limit. #### SEE ALSO * [Sample configuration to start Granian](https://docs.weblate.org/en/latest/admin/install.md#running-granian) * [https://github.com/emmett-framework/granian](https://github.com/emmett-framework/granian) * [How to deploy with ASGI](https://docs.djangoproject.com/en/stable/howto/deployment/asgi/) ### Sample configuration to start Gunicorn Gunicorn has to be installed separately: ```shell uv pip install gunicorn ``` Once you have Gunicorn installed, you can run it. This is usually done at the system level. The following examples show starting via systemd: ```ini [Unit] Description=gunicorn socket [Socket] ListenStream=/run/gunicorn.sock [Install] WantedBy=sockets.target ``` ```ini [Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target [Service] User=weblate Group=weblate WorkingDirectory=/home/weblate/weblate-env/ Environment="DJANGO_SETTINGS_MODULE=weblate.settings" ExecStart=/home/weblate/weblate-env/bin/gunicorn \ --preload \ --timeout 3600 \ --graceful-timeout 3600 \ --worker-class=gthread \ --workers=2 \ --threads=16 \ --bind unix:/run/gunicorn.sock \ weblate.wsgi:application [Install] WantedBy=multi-user.target ``` #### SEE ALSO [How to use Django with Gunicorn](https://docs.djangoproject.com/en/stable/howto/deployment/wsgi/gunicorn/) ### Running Weblate under path It is recommended to use prefork MPM when using WSGI with Weblate. A sample Apache configuration to serve Weblate under `/weblate`. Again using `mod_wsgi` (`weblate/examples/apache-path.conf` in the source tree): ```apache # # VirtualHost for Weblate, running under /weblate path # # You will want to change: # # - ServerAdmin and ServerName # - change /home/weblate/weblate-env to location where Weblate Python environment is placed # - change /home/weblate/data to match your DATA_DIR # - change /home/weblate/data/cache to match your CACHE_DIR # - change python3.12 to match Python version mod-wsgi is compiled for # - change weblate user to match your Weblate user # ServerAdmin admin@weblate.example.org ServerName weblate.example.org # CACHE_DIR/static/favicon.ico Alias /weblate/favicon.ico /home/weblate/data/cache/static/favicon.ico # CACHE_DIR/static/ Alias /weblate/static/ /home/weblate/data/cache/static/ Require all granted # Path to your Weblate Python environment WSGIDaemonProcess weblate python-home=/home/weblate/weblate-env user=weblate request-timeout=600 WSGIProcessGroup weblate WSGIApplicationGroup %{GLOBAL} WSGIScriptAlias /weblate /home/weblate/weblate-env/lib/python3.12/site-packages/weblate/wsgi.py process-group=weblate WSGIPassAuthorization On Require all granted ``` Additionally, you will have to adjust `weblate/settings.py`: ```python URL_PREFIX = "/weblate" ``` ## Background tasks using Celery Weblate uses Celery to execute regular and background tasks. You are supposed to run a Celery service that will execute these. For example, it is responsible for handling following operations (this list is not complete): * Receiving webhooks from external services (see [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks)). * Running regular maintenance tasks such as backups, cleanups, daily add-ons, or updates (see [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md#backup), [`BACKGROUND_TASKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BACKGROUND_TASKS), [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons)). * Running [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation). * Sending digest notifications. * Offloading expensive operations from the WSGI process. * Committing pending changes (see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit)). A typical setup using Valkey or Redis as a backend looks like this: ```python CELERY_TASK_ALWAYS_EAGER = False CELERY_BROKER_URL = "redis://localhost:6379" CELERY_RESULT_BACKEND = CELERY_BROKER_URL ``` #### SEE ALSO [Redis broker configuration in Celery](https://docs.celeryq.dev/en/stable/getting-started/backends-and-brokers/redis.html#broker-redis-configuration) You should also start the Celery worker to process the tasks and start scheduled tasks. For debugging or development, this can be done directly on the command-line: ```sh celery --app=weblate.utils worker --beat \ --queues=celery,notify,memory,translate,backup \ --prefetch-multiplier=1 ``` Running all queues in one prefork worker shares the initial application memory between its child processes while retaining parallel task execution. Celery determines the concurrency from the number of available CPUs by default; use `--concurrency` to adjust it for your workload and available memory. To reduce startup memory usage, Celery workers do not repeat the Django system checks. The Weblate container runs the more comprehensive **weblate check --deploy** automatically during container startup. For other installation methods, run the command after installation, upgrades, or configuration changes. The checks are also available in the [management interface](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance). #### NOTE The Celery process has to be executed under the same user as the WSGI process, otherwise files in the [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) will be stored with mixed ownership, leading to runtime issues. See also [Filesystem permissions](https://docs.weblate.org/en/latest/admin/install.md#file-permissions) and [Running server](https://docs.weblate.org/en/latest/admin/install.md#server). ### Executing Celery tasks in the WSGI using eager mode #### NOTE This will have severe performance impact on the web interface, and will break features depending on regular trigger (for example committing pending changes, digest notifications, or backups). For development, you might want to use eager configuration, which does process all tasks in place: ```python CELERY_TASK_ALWAYS_EAGER = True CELERY_BROKER_URL = "memory://" CELERY_TASK_EAGER_PROPAGATES = True ``` ### Running Celery as system service Most likely you will want to run Celery as a daemon and that is covered by [Daemonization](https://docs.celeryq.dev/en/stable/userguide/daemonizing.html). For the most common Linux setup using systemd, adapt the example files listed below. These examples are maintained in the Weblate source tree under `weblate/examples/`; Python wheels do not install these deployment samples. Systemd unit to be placed as `/etc/systemd/system/celery-weblate.service`: ```ini [Unit] Description=Celery Service (Weblate) After=network.target [Service] Type=forking User=weblate Group=weblate EnvironmentFile=/etc/default/celery-weblate WorkingDirectory=/home/weblate RuntimeDirectory=celery RuntimeDirectoryPreserve=restart LogsDirectory=celery ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \ -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \ --pidfile=${CELERYD_PID_FILE}' ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \ -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \ --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}' [Install] WantedBy=multi-user.target ``` Environment configuration to be placed as `/etc/default/celery-weblate`: ```sh # Name of nodes to start CELERYD_NODES="combined" # Absolute or relative path to the 'celery' command: CELERY_BIN="/home/weblate/weblate-env/bin/celery" # App instance to use # comment out this line if you don't use an app CELERY_APP="weblate.utils" # Extra command-line arguments to the worker. Celery determines concurrency # from the number of available CPUs by default. You might need to customize it # depending on the available resources and Weblate usage. Increase concurrency # if you get weblate.E019 error, decrease it on a low-resource system. # Command-line values override corresponding Celery settings in settings.py. CELERYD_OPTS="--beat:combined --queues:combined=celery,notify,memory,translate,backup --prefetch-multiplier:combined=1" # Logging configuration # - %n will be replaced with the first part of the nodename. # - %I will be replaced with the current child process index # and is important when using the prefork pool to avoid race conditions. CELERYD_PID_FILE="/run/celery/weblate-%n.pid" CELERYD_LOG_FILE="/var/log/celery/weblate-%n%I.log" CELERYD_LOG_LEVEL="INFO" ``` Additional configuration to rotate Celery logs using **logrotate** to be placed as `/etc/logrotate.d/celery`: ```text /var/log/celery/*.log { weekly missingok rotate 12 compress notifempty } ``` ### Periodic tasks using Celery beat Weblate comes with built-in setup for scheduled tasks. The task schedule is stored in the database and tasks are executed by the Celery beat daemon. #### HINT You can define additional tasks in `settings.py`, for example see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit). ### Monitoring Celery status You can find current length of the Celery task queues in the [Management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface) or you can use [`celery_queues`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-celery_queues) on the command-line. In case the queue will get too long, you will also get configuration error in the admin interface. #### WARNING The Celery errors are by default only logged into Celery log and are not visible to user. In case you want to have overview on such failures, it is recommended to configure [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors). #### SEE ALSO * [Monitoring Weblate](https://docs.weblate.org/en/latest/admin/install.md#monitoring) * [How can I check whether my Weblate is set up properly?](https://docs.weblate.org/en/latest/faq.md#faq-monitoring) * [Configuration and defaults](https://docs.celeryq.dev/en/stable/userguide/configuration.html) * [Workers Guide](https://docs.celeryq.dev/en/stable/userguide/workers.html) * [Daemonization](https://docs.celeryq.dev/en/stable/userguide/daemonizing.html) * [Monitoring and Management Guide](https://docs.celeryq.dev/en/stable/userguide/monitoring.html) * [Background tasks internals](https://docs.weblate.org/en/latest/contributing/internals.md#background-tasks-internals) * [`celery_queues`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-celery_queues) ### Single-process Celery setup In case you have very limited memory, you might want to reduce number of Weblate processes. All Celery tasks can be executed in a single process using: ```sh celery --app=weblate.utils worker --beat --queues=celery,notify,memory,translate,backup --pool=solo ``` An installation using Docker can be configured to use a single-process Celery setup by setting `CELERY_WORKER_MODE=single`. See [`CELERY_WORKER_MODE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_WORKER_MODE). #### WARNING This will have a noticeable performance impact on Weblate. ## Monitoring Weblate Weblate provides the `/healthz/` URL to be used in simple health checks, for example using Kubernetes. The Docker container has built-in health check using this URL. For monitoring metrics of Weblate you can use the [`GET /api/metrics/`](https://docs.weblate.org/en/latest/api.md#get--api-metrics-) API endpoint. Monitoring tools running locally can retrieve the same metrics using the [`metrics`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-metrics) command. #### SEE ALSO * [How can I check whether my Weblate is set up properly?](https://docs.weblate.org/en/latest/faq.md#faq-monitoring) * [Monitoring Celery status](https://docs.weblate.org/en/latest/admin/install.md#monitoring-celery) * [Weblate plugin for Munin](https://github.com/WeblateOrg/munin) ## Collecting error reports and monitoring performance Weblate, as any other software, can fail. In order to collect useful failure states we recommend to use third party services to collect such information. This is especially useful in case of failing Celery tasks, which would otherwise only report error to the logs and you won’t get notified on them. Weblate has support for the following services: ### E-mail The default Weblate configuration instruments Django to send e-mails upon server errors via [`django.utils.log.AdminEmailHandler`](https://docs.djangoproject.com/en/stable/ref/logging/#django.utils.log.AdminEmailHandler). This is the least effort setup, but you should consider other options for privacy reasons, as the error e-mails might include sensitive data. You can read more on that in [Security implications](https://docs.djangoproject.com/en/stable/topics/logging/#logging-security-implications). To disable this behavior, remove `mail_admins` from the [`LOGGING`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-LOGGING) in Weblate settings, or disable [`WEBLATE_ADMIN_NOTIFY_ERROR`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_NOTIFY_ERROR) in the Docker environment. ### Sentry Weblate has built-in support for [Sentry](https://sentry.io/). To use it, it’s enough to set [`SENTRY_DSN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SENTRY_DSN) in the `settings.py`: ```python SENTRY_DSN = "https://id@your.sentry.example.com/" ``` Sentry can be also used to monitor performance of Weblate by collecting traces and profiles for defined percentage of operations. This can be configured using [`SENTRY_TRACES_SAMPLE_RATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SENTRY_TRACES_SAMPLE_RATE) and [`SENTRY_PROFILES_SAMPLE_RATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SENTRY_PROFILES_SAMPLE_RATE). #### SEE ALSO * [Sentry Performance Monitoring](https://docs.sentry.io/product/sentry-basics/performance-monitoring/) * [Sentry Profiling](https://docs.sentry.io/product/profiling/) ### Google Cloud Error Reporting Weblate can report handled server errors to [Google Cloud Error Reporting](https://docs.cloud.google.com/error-reporting/docs/grouping-errors). Install Weblate with the `google-errors` extra and configure [`GOOGLE_CLOUD_ERROR_REPORTING`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GOOGLE_CLOUD_ERROR_REPORTING) in `settings.py`: ```python GOOGLE_CLOUD_ERROR_REPORTING = { "project": "your-google-cloud-project", } ``` Weblate automatically reports errors under the `weblate` service and uses the current Weblate version or Git revision as the reported version. These values can be overridden by setting `service` or `version` in [`GOOGLE_CLOUD_ERROR_REPORTING`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GOOGLE_CLOUD_ERROR_REPORTING). ### OpenTelemetry Weblate can export backend traces using [OpenTelemetry](https://opentelemetry.io/). It uses OTLP over HTTP and can send traces to an OpenTelemetry Collector or a compatible vendor endpoint. ```python OPENTELEMETRY_ENABLED = True OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT = "https://collector.example.com/v1/traces" OPENTELEMETRY_TRACES_SAMPLE_RATE = 0.1 ``` The integration traces Django requests, Celery tasks, Redis, outgoing HTTP requests, database calls, and Weblate-specific spans. Configure it using [`OPENTELEMETRY_ENABLED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_ENABLED), [`OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT), and [`OPENTELEMETRY_TRACES_SAMPLE_RATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_TRACES_SAMPLE_RATE). ### Rollbar Weblate has built-in support for [Rollbar](https://rollbar.com/). To use it, it’s enough to follow instructions for [Rollbar notifier for Python](https://docs.rollbar.com/docs/python/). In short, you need to adjust `settings.py`: ```python # Add rollbar as last middleware: MIDDLEWARE = [ # … other middleware classes … "rollbar.contrib.django.middleware.RollbarNotifierMiddleware", ] # Configure client access ROLLBAR = { "access_token": "POST_SERVER_ITEM_ACCESS_TOKEN", "environment": "development" if DEBUG else "production", "branch": "main", "root": "/absolute/path/to/code/root", } ``` Everything else is integrated automatically, you will now collect both server and client side errors. #### NOTE Error logging also includes exceptions that were gracefully handled, but might indicate a problem - such as failed parsing of an uploaded file. ### Graylog log management #### Versionadded Added in version 5.9. Weblate can be configured to log using the GELF TCP protocol. This was developed for Graylog integration, but can be used with any compliant logging platform. The configuration boilerplate is included in [Sample configuration](https://docs.weblate.org/en/latest/admin/sample.md#sample-configuration), for Docker this can be configured using [`WEBLATE_LOG_GELF_HOST`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_LOG_GELF_HOST). ## Migrating Weblate to another server Migrating Weblate to another server should be pretty easy, however it stores data in few locations which you should migrate carefully. The best approach is to stop Weblate for the migration. ### Migrating database The most straightforward approach is to use database native tools, as they are usually the most effective (e.g. **pg_dump**). Alternatively you can use replication if your database supports it. #### SEE ALSO Migrating between databases described in [Migrating from other databases to PostgreSQL](https://docs.weblate.org/en/latest/admin/upgrade.md#database-migration). ### Migrating VCS repositories The VCS repositories stored under [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) need to be migrated as well. You can simply copy them or use **rsync** to do the migration more effectively. ### Other notes Don’t forget to move other services Weblate might have been using like Valkey, Redis, Cron jobs or custom authentication backends. # admin/install/docker.md # Installing using Docker With dockerized Weblate deployment you can get your personal Weblate instance up and running in seconds. All of Weblate’s dependencies are already included. PostgreSQL is set up as the default database and Valkey as a caching backend. ## Hardware requirements Weblate should run on any contemporary hardware without problems, the following is the minimal configuration required to run Weblate on a single host (Weblate, database and web server): * 3 GB of RAM * 2 CPU cores * 1 GB of storage space #### NOTE Actual requirements for your installation of Weblate vary heavily based on the size of the translations managed in it. ### Memory usage The more memory the better - it is used for caching on all levels (file system, database and Weblate). For hundreds of translation components, at least 4 GB of RAM is recommended. #### HINT For systems with less memory than recommended, [Single-process Celery setup](https://docs.weblate.org/en/latest/admin/install.md#minimal-celery) is recommended. ### CPU usage Many concurrent users increase the amount of needed CPU cores. ### Storage usage The typical database storage usage is around 300 MB per 1 million hosted words. Storage space needed for cloned repositories varies, but Weblate tries to keep their size minimal by doing shallow clones. ### Storage performance Version control operations perform many filesystem metadata lookups. The `vcs` subdirectory in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) therefore needs low read latency; storage with slow metadata access can make operations such as **git status** take a long time even when its bulk throughput is good. Keep [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) on low-latency local or temporary storage when possible. The deployment checks measure metadata lookup latency for both locations and warn when the median latency exceeds 10 milliseconds. This is an approximate point-in-time measurement affected by filesystem and system load. Rerun **weblate check --deploy** before changing the storage configuration. ### Nodes For small and medium-sized sites (millions of hosted words), all Weblate components (see [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture)) can be run on a single node. When you grow to hundreds of millions of hosted words, it is recommended to have a dedicated node for database (see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup)). ## Installation #### HINT The following examples assume you have a working Docker environment, with `docker-compose-plugin` installed. Please check the Docker documentation for instructions. This creates a Weblate deployment server via HTTP, so you should place it behind HTTPS terminating proxy. You can also deploy with a HTTPS proxy, see [Automatic SSL certificates using Let’s Encrypt](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-https-portal). For larger setups, please see [Scaling horizontally](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-scaling). 1. Clone the weblate-docker repo: ```sh git clone https://github.com/WeblateOrg/docker-compose.git weblate-docker cd weblate-docker ``` #### NOTE The Docker Compose files are example deployment configurations. Operators typically customize them for their own deployment and maintain those local changes. Weblate application updates are delivered through Docker image tags; there is no release-bound update path for customized Compose files. 2. Create a `docker-compose.override.yml` file with your settings. See [Docker environment variables](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-environment) for full list of environment variables. ```yaml services: weblate: image: weblate/weblate:latest environment: WEBLATE_EMAIL_HOST: smtp.example.com WEBLATE_EMAIL_HOST_USER: user WEBLATE_EMAIL_HOST_PASSWORD: pass WEBLATE_SERVER_EMAIL: weblate@example.com WEBLATE_DEFAULT_FROM_EMAIL: weblate@example.com WEBLATE_SITE_DOMAIN: weblate.example.com WEBLATE_ADMIN_PASSWORD: password for the admin user WEBLATE_ADMIN_EMAIL: weblate.admin@example.com ports: - 80:8080 ``` #### NOTE If [`WEBLATE_ADMIN_PASSWORD`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_PASSWORD) is not set, the admin user is created with a random password shown on first startup. The provided example makes Weblate listen on port 80, edit the port mapping in the `docker-compose.override.yml` file to change it. 3. Start Weblate containers: ```sh docker compose up ``` Enjoy your Weblate deployment, it’s accessible on port 80 of the `weblate` container. #### SEE ALSO [Invoking management commands](https://docs.weblate.org/en/latest/admin/management.md#invoke-manage) ## Choosing Docker image registry Weblate containers are published to following registries: * Docker Hub, see [https://hub.docker.com/r/weblate/weblate](https://hub.docker.com/r/weblate/weblate) * GitHub Packages registry, see [https://github.com/WeblateOrg/docker/pkgs/container/weblate](https://github.com/WeblateOrg/docker/pkgs/container/weblate) #### NOTE All examples currently fetch images from Docker Hub, please adjust the configuration accordingly to use a different registry. ## Choosing Docker image tag Please choose a tag that matches your environment and expectations: | Tag name | Description | Use case | |----------------------------------|------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------| | `latest` | Weblate stable release, matches latest tagged release | Rolling updates in a production environment | | `` | Weblate stable release | Rolling updates within a calendar year in a production environment | | `.` | Weblate stable release | Rolling updates within a monthly release in a production environment | | `...` | Weblate stable release | Well defined deploy in a production environment | | `edge` | Weblate stable release with development changes in the Docker container (for example updated dependencies) | Rolling updates in a staging environment | | `edge--` | Weblate stable release with development changes in the Docker container (for example updated dependencies) | Well defined deploy in a staging environment | | `bleeding` | Development version Weblate from Git | Rolling updates to test upcoming Weblate features | | `bleeding--` | Development version Weblate from Git | Well defined deploy to test upcoming Weblate features | Every image is tested by our CI before it gets published, so even the bleeding version should be quite safe to use. Full list of published tags can be found at [GitHub Packages](https://github.com/WeblateOrg/docker/pkgs/container/weblate/versions?filters%5Bversion_type%5D=tagged) ## Docker container with HTTPS support Please see [Installation](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-deploy) for generic deployment instructions, this section only mentions differences compared to it. ### SSL terminating proxy SSL can be terminated outside Weblate container. To make this work well together, several headers need to be passed to the container so that it is aware of its actual environment. In more detail, these headers are described in [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy). ```nginx location / { proxy_pass http://127.0.0.1:8080; proxy_read_timeout 3600s; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } ``` ```sh WEBLATE_ENABLE_HTTPS=1 WEBLATE_IP_PROXY_HEADER=HTTP_X_FORWARDED_FOR WEBLATE_TRUSTED_PROXY_ADDRESSES=192.0.2.10 ``` Replace the example trusted proxy address with the address or network of the reverse proxy as seen by the Weblate container. Make sure that untrusted clients cannot reach a published container port by bypassing the reverse proxy. ### Using own SSL certificates In case you have own SSL certificate you want to use, simply place the files into the Weblate data volume (see [Docker container volumes](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume)): * `ssl/fullchain.pem` containing the certificate including any needed CA certificates * `ssl/privkey.pem` containing the private key Both of these files must be owned by the same user as the one starting the docker container and have file mask set to `600` (readable and writable only by the owning user). Additionally, Weblate container will now accept SSL connections on port 4443, you will want to include the port forwarding for HTTPS in docker compose override: ```yaml version: '3' services: weblate: ports: - 80:8080 - 443:4443 ``` If you already host other sites on the same server, it is likely ports `80` and `443` are used by a reverse proxy, such as NGINX. To pass the HTTPS connection from NGINX to the docker container, you can use the following configuration: ```nginx server { listen 443 ssl; listen [::]:443 ssl; server_name ; ssl_certificate /etc/letsencrypt/live//fullchain.pem; ssl_certificate_key /etc/letsencrypt/live//privkey.pem; location / { proxy_set_header HOST $host; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_pass https://127.0.0.1:; } } ``` Replace ``, `` and `` with actual values from your environment. ### Automatic SSL certificates using Let’s Encrypt In case you want to use [Let’s Encrypt](https://letsencrypt.org/) automatically generated SSL certificates on public installation, you need to add a reverse HTTPS proxy an additional Docker container, [https-portal](https://hub.docker.com/r/steveltn/https-portal/) will be used for that. This is made use of in the `docker-compose-https.yml` file. Then create a `docker-compose-https.override.yml` file with your settings: ```yaml version: '3' services: weblate: environment: WEBLATE_EMAIL_HOST: smtp.example.com WEBLATE_EMAIL_HOST_USER: user WEBLATE_EMAIL_HOST_PASSWORD: pass WEBLATE_SITE_DOMAIN: weblate.example.com WEBLATE_ADMIN_PASSWORD: password for admin user https-portal: environment: DOMAINS: 'weblate.example.com -> http://weblate:8080' ``` Whenever invoking **docker compose** you need to pass both files to it, and then do: ```console docker compose -f docker-compose-https.yml -f docker-compose-https.override.yml build docker compose -f docker-compose-https.yml -f docker-compose-https.override.yml up ``` ## Upgrading the Docker container Usually it is good idea to only update the Weblate container and keep the PostgreSQL container at the version you have, as upgrading PostgreSQL is quite painful and in most cases does not bring many benefits. You can do this by sticking with the existing docker-compose and just pull the latest images and then restart: ```sh # Fetch latest versions of the images docker compose pull # Stop and destroy the containers docker compose down # Spawn new containers in the background docker compose up -d # Follow the logs during upgrade docker compose logs -f ``` The Weblate database should be automatically migrated on first startup, and there should be no need for additional manual actions. #### NOTE Direct upgrades are only supported for releases from the current or previous calendar year. If you need to upgrade from an older release, upgrade first to an intermediate version listed in [Version-specific instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#version-specific-instructions). If you use the example Compose files without local changes, you can also review updates in the `docker-compose` repository, though this is not needed for most Weblate upgrades. Customized Compose files need to be maintained as part of your deployment. See [Upgrading PostgreSQL container](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-postgres-upgrade) for upgrading the PostgreSQL server. ### Upgrading PostgreSQL container #### NOTE PostgreSQL 18 changed the default data directory inside the container. A common older setup mounted the database volume at `/var/lib/postgresql/data`, while PostgreSQL 18 now uses `/var/lib/postgresql` by default. If you are upgrading from an older version, either update the mount target in your Docker configuration to the new path, or keep the old mount target and set `PGDATA` accordingly. Leaving the old mount target unchanged without setting `PGDATA` can cause PostgreSQL to write its data outside the persisted volume. See [PGDATA documentation](https://hub.docker.com/_/postgres#pgdata) for more information. PostgreSQL containers do not support automatic upgrading between version, you need to perform the upgrade manually. Following steps show one of the options of upgrading. #### SEE ALSO [https://github.com/docker-library/postgres/issues/37](https://github.com/docker-library/postgres/issues/37) 1. Stop Weblate container: ```shell docker compose stop weblate cache ``` 2. Backup the database: ```shell docker compose exec database pg_dumpall --clean --if-exists --username weblate > backup.sql ``` 3. Stop the database container: ```shell docker compose stop database ``` 4. Remove the PostgreSQL volume: ```shell docker compose rm -v database docker volume remove weblate-docker_postgres-data ``` #### HINT The volume name contains name of the Docker Compose project, which is by default the directory name what is `weblate-docker` in this documentation. 5. Adjust `docker-compose.yml` to use new PostgreSQL version. 6. Start the database container: ```shell docker compose up -d database ``` 7. Restore the database from the backup: ```shell cat backup.sql | docker compose exec -T database psql --username weblate --dbname weblate ``` #### HINT Please check that the database name matches [`POSTGRES_DB`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-POSTGRES_DB). 8. (Optional) Update password for the Weblate user. This might be needed when migrating to PostgreSQL 14 or 15 as way of storing passwords has been changed: ```shell docker compose exec -T database psql --username weblate --dbname weblate -c "ALTER USER weblate WITH PASSWORD 'weblate'" ``` #### HINT Please check that the database name matches [`POSTGRES_DB`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-POSTGRES_DB). 9. Start all remaining containers: ```shell docker compose up -d ``` ## Admin sign in After container setup, you can sign in as admin user with password provided in [`WEBLATE_ADMIN_PASSWORD`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_PASSWORD), or a random password generated on first start if that was not set. To reset admin password, restart the container with [`WEBLATE_ADMIN_PASSWORD`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_PASSWORD) set to new password. #### SEE ALSO * [`WEBLATE_ADMIN_PASSWORD`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_PASSWORD) * [`WEBLATE_ADMIN_NAME`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_NAME) * [`WEBLATE_ADMIN_EMAIL`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_EMAIL) ## Number of processes and memory consumption The number of worker processes for both the web application and Celery is determined automatically based on number of CPUs. This works well for most cloud virtual machines as these typically have few CPUs and good amount of memory. By default, one combined Celery worker handles all task queues using a prefork pool with three times [`WEBLATE_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_WORKERS) processes. Sharing the initial application memory between all Celery workers reduces memory usage while the higher process count increases task throughput. In case you have a lot of CPU cores and hit out of memory issues, try reducing number of workers: ```yaml environment: WEBLATE_WORKERS: 2 ``` You can fine-tune the combined worker: ```yaml environment: CELERY_COMBINED_OPTIONS: --concurrency 12 --prefetch-multiplier 1 ``` Alternatively, use the split mode to run and fine-tune individual worker categories: ```yaml environment: CELERY_WORKER_MODE: split WEB_WORKERS: 4 WEB_BLOCKING_THREADS: 4 CELERY_MAIN_OPTIONS: --concurrency 2 --prefetch-multiplier 1 CELERY_NOTIFY_OPTIONS: --concurrency 1 --prefetch-multiplier 4 CELERY_MEMORY_OPTIONS: --concurrency 1 --prefetch-multiplier 1 CELERY_TRANSLATE_OPTIONS: --concurrency 1 --prefetch-multiplier 1 CELERY_BACKUP_OPTIONS: --concurrency 1 --prefetch-multiplier 1 ``` The prefetch multiplier controls how many tasks each worker execution slot can reserve. The default of one avoids reserving additional long-running or payload-heavy tasks. The notification worker uses four in this example because its short tasks can benefit from buffering. Increase the value only after measuring queue latency and worker memory usage. Memory usage can be further reduced by running Celery in a single process: ```yaml environment: CELERY_WORKER_MODE: single ``` #### SEE ALSO * [`WEBLATE_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_WORKERS) * [`CELERY_WORKER_MODE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_WORKER_MODE) * [`CELERY_COMBINED_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_COMBINED_OPTIONS) * [`CELERY_MAIN_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_MAIN_OPTIONS) * [`CELERY_NOTIFY_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_NOTIFY_OPTIONS) * [`CELERY_MEMORY_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_MEMORY_OPTIONS) * [`CELERY_TRANSLATE_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_TRANSLATE_OPTIONS) * [`CELERY_BACKUP_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_BACKUP_OPTIONS) * [`CELERY_BEAT_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_BEAT_OPTIONS) * [`CELERY_SINGLE_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_SINGLE_OPTIONS) * [`WEBLATE_ASGI`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ASGI) * [`WEB_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEB_WORKERS) * [`WEB_BLOCKING_THREADS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEB_BLOCKING_THREADS) ## Scaling horizontally #### Versionadded Added in version 4.6. You can run multiple Weblate containers to scale the service horizontally. The `/app/data` volume has to be shared by all containers, it is recommended to use cluster filesystem such as GlusterFS for this. The `/app/cache` volume should be separate for each container. Each Weblate container has defined role using [`WEBLATE_SERVICE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SERVICE) environment variable. Please follow carefully the documentation as some of the services should be running just once in the cluster, and the order of the services matters as well. You can find example setup in the `docker-compose` repo as [docker-compose-split.yml](https://github.com/WeblateOrg/docker-compose/blob/main/docker-compose-split.yml). ## Startup configuration warnings The Docker container records actionable configuration warnings from startup in the shared `/app/data` volume. They are shown by **weblate check --deploy** and in the [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance) management interface, in addition to being written to the container log. Each container reports its warnings separately. This keeps warnings from containers with different [`WEBLATE_SERVICE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SERVICE) roles visible in a horizontally scaled deployment. Reports are refreshed while their container is running and are removed during an orderly container shutdown. Reports left by an abrupt shutdown expire after five minutes, and stale report files are cleaned up automatically by later container startups. ## Docker environment variables Many of Weblate’s [Configuration](https://docs.weblate.org/en/latest/admin/config.md#config) can be set in the Docker container using the environment variables described below. If you need to define a setting not exposed through Docker environment variables, see [Configuration beyond environment variables](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-custom-config). ### Passing secrets #### Versionadded Added in version 5.0. Weblate container supports passing secrets as files. To utilize that, append `_FILE` suffix to the environment variable and pass secret file via Docker. Related `docker-compose.yml` might look like: ```yaml services: weblate: environment: POSTGRES_PASSWORD_FILE: /run/secrets/db_password secrets: - db_password database: environment: POSTGRES_PASSWORD_FILE: /run/secrets/db_password secrets: - db_password secrets: db_password: file: db_password.txt ``` #### SEE ALSO [How to use secrets in Docker Compose](https://docs.docker.com/compose/how-tos/use-secrets/) ### Generic settings ### WEBLATE_DEBUG Configures Django debug mode using [`DEBUG`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-DEBUG). **Example:** ```yaml environment: WEBLATE_DEBUG: 1 ``` #### SEE ALSO [Disable debug mode](https://docs.weblate.org/en/latest/admin/install.md#production-debug) ### WEBLATE_LOGLEVEL Configures the logging verbosity. Set this to `DEBUG` to get more detailed logs. Defaults to `INFO` when [`WEBLATE_DEBUG`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_DEBUG) is turned off, `DEBUG` is used when debug mode is turned on. For more silent logging use `ERROR` or `WARNING`. ### WEBLATE_LOGLEVEL_DATABASE Configures the logging of the database queries verbosity. ### WEBLATE_LOG_GELF_HOST #### Versionadded Added in version 5.9. Configures remote logging using GELF TCP connection. Can be used to integrate with Graylog. ### WEBLATE_LOG_GELF_PORT #### Versionadded Added in version 5.9. Use custom port for [`WEBLATE_LOG_GELF_HOST`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_LOG_GELF_HOST), defaults to 12201. ### WEBLATE_SITE_TITLE Changes the site-title shown in the header of all pages. ### WEBLATE_SITE_DOMAIN Configures the site domain. This parameter is required. Include port if using a non-standard one. **Example:** ```yaml environment: WEBLATE_SITE_DOMAIN: example.com:8080 ``` #### SEE ALSO * [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site) * [`SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SITE_DOMAIN) ### WEBLATE_ADMIN_NAME ### WEBLATE_ADMIN_EMAIL Configures the site-admin’s name and e-mail. It is used for both [`ADMINS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ADMINS) setting and creating admin user (see [`WEBLATE_ADMIN_PASSWORD`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_PASSWORD) for more info on that). **Example:** ```yaml environment: WEBLATE_ADMIN_NAME: Weblate admin WEBLATE_ADMIN_EMAIL: noreply@example.com ``` #### SEE ALSO * [Admin sign in](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-admin-login) * [Properly configure admins](https://docs.weblate.org/en/latest/admin/install.md#production-admins) * [`ADMINS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ADMINS) ### WEBLATE_ADMIN_PASSWORD Sets the password for the admin user. * If not set and admin user does not exist, it is created with a random password shown on first container startup. * If not set and admin user exists, no action is performed. * If set the admin user is adjusted on every container startup to match [`WEBLATE_ADMIN_PASSWORD`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_PASSWORD), [`WEBLATE_ADMIN_NAME`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_NAME) and [`WEBLATE_ADMIN_EMAIL`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_EMAIL). #### WARNING It might be a security risk to store password in the configuration file. Consider using this variable only for initial setup (or let Weblate generate random password on initial startup) or for password recovery. #### SEE ALSO * [Admin sign in](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-admin-login) * [Passing secrets](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-secrets) * [`WEBLATE_ADMIN_PASSWORD`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_PASSWORD) * [`WEBLATE_ADMIN_NAME`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_NAME) * [`WEBLATE_ADMIN_EMAIL`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADMIN_EMAIL) ### WEBLATE_ADMIN_NOTIFY_ERROR Whether to send e-mail to admins upon server error. Turned on by default. You might want to use other error collection like Sentry or Rollbar and turn this off. #### SEE ALSO * [Security implications](https://docs.djangoproject.com/en/stable/topics/logging/#logging-security-implications) * [`ROLLBAR_KEY`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-ROLLBAR_KEY) * [`SENTRY_DSN`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-SENTRY_DSN) ### WEBLATE_SERVER_EMAIL The email address that error messages are sent from. #### SEE ALSO * [`SERVER_EMAIL`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SERVER_EMAIL) * [Configure e-mail sending](https://docs.weblate.org/en/latest/admin/install.md#production-email) ### WEBLATE_DEFAULT_FROM_EMAIL Configures the address for outgoing e-mails. #### SEE ALSO * [`DEFAULT_FROM_EMAIL`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-DEFAULT_FROM_EMAIL) * [Configure e-mail sending](https://docs.weblate.org/en/latest/admin/install.md#production-email) ### WEBLATE_ADMINS_CONTACT Configures [`ADMINS_CONTACT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ADMINS_CONTACT). ### WEBLATE_CONTACT_FORM Configures contact form behavior, see [`CONTACT_FORM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CONTACT_FORM). ### WEBLATE_ALLOWED_HOSTS Configures allowed HTTP hostnames using [`ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ALLOWED_HOSTS). Defaults to `*` which allows all hostnames. **Example:** ```yaml environment: WEBLATE_ALLOWED_HOSTS: weblate.example.com,example.com ``` #### SEE ALSO * [`ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ALLOWED_HOSTS) * [Allowed hosts setup](https://docs.weblate.org/en/latest/admin/install.md#production-hosts) * [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site) ### WEBLATE_REGISTRATION_OPEN Configures whether registrations are open by toggling [`REGISTRATION_OPEN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_OPEN). **Example:** ```yaml environment: WEBLATE_REGISTRATION_OPEN: 0 ``` ### WEBLATE_REGISTRATION_CAPTCHA #### Versionadded Added in version 5.10. Configures whether captcha is used for registration and other unauthenticated actions, see [`REGISTRATION_CAPTCHA`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_CAPTCHA). **Example:** ```yaml environment: WEBLATE_REGISTRATION_CAPTCHA: 0 ``` ### WEBLATE_REGISTRATION_ALLOW_BACKENDS Configure which authentication methods can be used to create new account via [`REGISTRATION_ALLOW_BACKENDS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_ALLOW_BACKENDS). > **Example:** > ```yaml > environment: > WEBLATE_REGISTRATION_OPEN: 0 > WEBLATE_REGISTRATION_ALLOW_BACKENDS: azuread-oauth2,azuread-tenant-oauth2 > ``` ### WEBLATE_REGISTRATION_REBIND #### Versionadded Added in version 4.16. Configures [`REGISTRATION_REBIND`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_REBIND). ### WEBLATE_REGISTRATION_ALLOW_DISPOSABLE_EMAILS #### Versionadded Added in version 5.16.1. Configures [`REGISTRATION_ALLOW_DISPOSABLE_EMAILS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_ALLOW_DISPOSABLE_EMAILS). **Example:** ```yaml environment: WEBLATE_REGISTRATION_ALLOW_DISPOSABLE_EMAILS: 1 ``` ### WEBLATE_PROJECT_WEB_RESTRICT_PRIVATE #### Versionadded Added in version 5.17. Configures [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE). Defaults to enabled. ### WEBLATE_PROJECT_WEB_RESTRICT_ALLOWLIST #### Versionadded Added in version 5.17. Configures [`PROJECT_WEB_RESTRICT_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_ALLOWLIST). Expects a comma-separated list of trusted project slugs. ### WEBLATE_WEBHOOK_RESTRICT_PRIVATE #### Versionadded Added in version 5.17. Configures [`WEBHOOK_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_RESTRICT_PRIVATE). Defaults to enabled. ### WEBLATE_WEBHOOK_PRIVATE_ALLOWLIST #### Versionadded Added in version 5.17. Configures [`WEBHOOK_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_PRIVATE_ALLOWLIST). Expects a comma-separated list of trusted hostnames or domains. ### WEBLATE_ALLOWED_ASSET_SIZE #### Versionadded Added in version 2025.7. Configures [`ALLOWED_ASSET_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_SIZE). ### WEBLATE_ASSET_RESTRICT_PRIVATE #### Versionadded Added in version 2025.5. Configures [`ASSET_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_RESTRICT_PRIVATE). Defaults to enabled. ### WEBLATE_ASSET_PRIVATE_ALLOWLIST #### Versionadded Added in version 2025.5. Configures [`ASSET_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_PRIVATE_ALLOWLIST). Expects a comma-separated list of trusted hostnames or domains. ### WEBLATE_TIME_ZONE Configures the used time zone in Weblate, see [`TIME_ZONE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-TIME_ZONE). #### NOTE To change the time zone of the Docker container itself, use the `TZ` environment variable. **Example:** ```yaml environment: WEBLATE_TIME_ZONE: Europe/Prague ``` ### WEBLATE_ENABLE_HTTPS Makes Weblate assume it is operated behind a reverse HTTPS proxy, it makes Weblate use HTTPS in e-mail and API links or set secure flags on cookies. #### HINT Please see [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS) documentation for possible caveats. #### NOTE This does not make the Weblate container accept HTTPS connections, you need to configure that as well, see [Docker container with HTTPS support](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-ssl) for examples. **Example:** ```yaml environment: WEBLATE_ENABLE_HTTPS: 1 ``` #### SEE ALSO * [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS) * [Set correct site domain](https://docs.weblate.org/en/latest/admin/install.md#production-site) * [`WEBLATE_SECURE_PROXY_SSL_HEADER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SECURE_PROXY_SSL_HEADER) ### WEBLATE_NGINX_IPV6 #### Versionadded Added in version 5.17. Controls whether the bundled NGINX listens on IPv6 addresses. Supported values are: * `auto` to enable IPv6 listeners only when IPv6 is available in the container runtime. This is the default. * `on` to always enable IPv6 listeners. * `off` to disable IPv6 listeners. **Example:** ```yaml environment: WEBLATE_NGINX_IPV6: auto ``` ### WEBLATE_IP_PROXY_HEADER Lets Weblate fetch the IP address from any given HTTP header. Use this when using a reverse proxy in front of the Weblate container. Enables [`IP_BEHIND_REVERSE_PROXY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_BEHIND_REVERSE_PROXY) and sets [`IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_HEADER). When set to `HTTP_X_FORWARDED_FOR`, the bundled nginx resolves the client address using [`WEBLATE_TRUSTED_PROXY_ADDRESSES`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_TRUSTED_PROXY_ADDRESSES), uses that address in its logs, and forwards one normalized address to Weblate. #### Versionchanged Changed in version 2026.9: The bundled nginx no longer trusts `X-Forwarded-For` from all network addresses. Trusted proxy addresses have to be configured explicitly. #### NOTE The format must conform to Django’s expectations. Django [transforms](https://docs.djangoproject.com/en/2.2/ref/request-response/#django.http.HttpRequest.META) raw HTTP header names as follows: - converts all characters to uppercase - replaces any hyphens with underscores - prepends `HTTP_` prefix So `X-Forwarded-For` would be mapped to `HTTP_X_FORWARDED_FOR`. **Example:** ```yaml environment: WEBLATE_IP_PROXY_HEADER: HTTP_X_FORWARDED_FOR WEBLATE_TRUSTED_PROXY_ADDRESSES: "192.0.2.10 2001:db8::/64 proxy" ``` ### WEBLATE_TRUSTED_PROXY_ADDRESSES #### Versionadded Added in version 2026.9. Configures the IPv4 or IPv6 addresses, networks, or hostnames of reverse proxies trusted by the bundled nginx to supply `X-Forwarded-For`. Separate multiple values by whitespace. This setting is used only when [`WEBLATE_IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_IP_PROXY_HEADER) is `HTTP_X_FORWARDED_FOR`. If the list is empty, nginx uses the immediate TCP peer in its logs and forwards that address to Weblate. Only list proxies under your control, and do not expose the Weblate container through a path which bypasses them. **Example:** ```yaml environment: WEBLATE_IP_PROXY_HEADER: HTTP_X_FORWARDED_FOR WEBLATE_TRUSTED_PROXY_ADDRESSES: "192.0.2.10 2001:db8::/64 proxy" ``` ### WEBLATE_IP_PROXY_OFFSET #### Versionadded Added in version 5.0.1. Configures [`IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_OFFSET). When [`WEBLATE_IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_IP_PROXY_HEADER) is `HTTP_X_FORWARDED_FOR`, the bundled nginx forwards one normalized address and the container uses an effective offset of `0`. ### WEBLATE_USE_X_FORWARDED_PORT #### Versionadded Added in version 5.0.1. A boolean that specifies whether to use the *X-Forwarded-Port* header in preference to the SERVER_PORT META variable. This should only be enabled if a proxy which sets this header is in use. #### SEE ALSO [`USE_X_FORWARDED_PORT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-USE_X_FORWARDED_PORT) #### NOTE This is a boolean setting (use `"true"` or `"false"`). ### WEBLATE_SECURE_PROXY_SSL_HEADER A tuple representing an HTTP header/value combination that signifies a request is secure. This is needed when Weblate is running behind a reverse proxy doing SSL termination which does not pass standard HTTPS headers. **Example:** ```yaml environment: WEBLATE_SECURE_PROXY_SSL_HEADER: HTTP_X_FORWARDED_PROTO,https ``` #### SEE ALSO * [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy) * [`SECURE_PROXY_SSL_HEADER`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SECURE_PROXY_SSL_HEADER) ### WEBLATE_REQUIRE_LOGIN Enables [`REQUIRE_LOGIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REQUIRE_LOGIN) to enforce authentication on whole Weblate. **Example:** ```yaml environment: WEBLATE_REQUIRE_LOGIN: 1 ``` ### WEBLATE_LEGAL_INTEGRATION Enables the [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) module in Docker deployments. By default, the integration is disabled; leave this variable unset or empty to disable it. Supported values are: * `tos-confirm` to enable the legal module and enforce legal document confirmation during social authentication and for signed-in users. * `wllegal` to enable the same integration and additionally load the hosted legal document templates from `wllegal`. These templates are used by services operated by Weblate s.r.o. and are not intended for general use. To provide your own legal documents in Docker, override the templates in `/app/data/python/customize/templates/legal/documents`, see [Replacing logo and other static files](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-static-override). Recreate the Docker container after changing this environment variable, for example using **docker compose up -d**. Restarting an existing container does not apply changed environment values. **Example:** ```yaml environment: WEBLATE_LEGAL_INTEGRATION: tos-confirm ``` #### SEE ALSO * [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) * [Replacing logo and other static files](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-static-override) ### WEBLATE_LEGAL_DOCUMENT_CSS_CLASS Configures [`LEGAL_DOCUMENT_CSS_CLASS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_DOCUMENT_CSS_CLASS) in Docker deployments with [`WEBLATE_LEGAL_INTEGRATION`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_LEGAL_INTEGRATION) enabled. Set this to the class targeted by your custom legal stylesheet. Set it to an empty string to render legal documents without a wrapper class. **Example:** ```yaml environment: WEBLATE_LEGAL_DOCUMENT_CSS_CLASS: "" ``` ### WEBLATE_LEGAL_HIDDEN_DOCUMENTS Configures [`LEGAL_HIDDEN_DOCUMENTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_HIDDEN_DOCUMENTS) in Docker deployments with [`WEBLATE_LEGAL_INTEGRATION`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_LEGAL_INTEGRATION) enabled. Provide a comma-separated list of legal document page identifiers. External legal documents are used as fallbacks for hidden internal pages. The following configuration links both documents externally and requires one agreement covering the terms of service and privacy policy: **Example:** ```yaml environment: WEBLATE_LEGAL_INTEGRATION: tos-confirm WEBLATE_LEGAL_HIDDEN_DOCUMENTS: terms,privacy WEBLATE_LEGAL_URL: https://example.com/terms/ WEBLATE_PRIVACY_URL: https://example.com/privacy/ ``` ### WEBLATE_PUBLIC_ENGAGE Enables [`PUBLIC_ENGAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PUBLIC_ENGAGE). ### WEBLATE_GOOGLE_ANALYTICS_ID Configures ID for Google Analytics by changing [`GOOGLE_ANALYTICS_ID`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GOOGLE_ANALYTICS_ID). ### WEBLATE_DEFAULT_PULL_MESSAGE Configures the default title and message for pull requests via API by changing [`DEFAULT_PULL_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_PULL_MESSAGE). #### SEE ALSO [DEFAULT_PULL_MESSAGE](https://docs.weblate.org/en/latest/admin/config.md#config-pull-message) ### WEBLATE_SIMPLIFY_LANGUAGES Configures the language simplification policy, see [`SIMPLIFY_LANGUAGES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SIMPLIFY_LANGUAGES). ### WEBLATE_HIDE_SHARED_GLOSSARY_COMPONENTS Hides glossary components when shared to other projects, see [`HIDE_SHARED_GLOSSARY_COMPONENTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-HIDE_SHARED_GLOSSARY_COMPONENTS). ### WEBLATE_DEFAULT_ACCESS_CONTROL Configures the default [Access control](https://docs.weblate.org/en/latest/admin/projects.md#project-access-control) for new projects, see [`DEFAULT_ACCESS_CONTROL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ACCESS_CONTROL). ### WEBLATE_DEFAULT_TRANSLATION_REVIEW #### Versionadded Added in version 5.16. Configures the default value for [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review), turned off by default. ### WEBLATE_DEFAULT_SOURCE_REVIEW #### Versionadded Added in version 5.16. Configures the default value for [Enable source reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-source-review), turned off by default. ### WEBLATE_DEFAULT_RESTRICTED_COMPONENT Configures the default value for [Restricted access](https://docs.weblate.org/en/latest/admin/projects.md#component-restricted) for new components, see [`DEFAULT_RESTRICTED_COMPONENT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_RESTRICTED_COMPONENT). ### WEBLATE_DEFAULT_TRANSLATION_PROPAGATION Configures the default value for [Allow translation propagation](https://docs.weblate.org/en/latest/admin/projects.md#component-allow-translation-propagation) for new components, see [`DEFAULT_TRANSLATION_PROPAGATION`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_TRANSLATION_PROPAGATION). ### WEBLATE_DEFAULT_COMMITER_EMAIL Configures [`DEFAULT_COMMITER_EMAIL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_COMMITER_EMAIL). ### WEBLATE_DEFAULT_COMMITER_NAME Configures [`DEFAULT_COMMITER_NAME`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_COMMITER_NAME). ### WEBLATE_DEFAULT_SHARED_TM Configures [`DEFAULT_SHARED_TM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_SHARED_TM). ### WEBLATE_DEFAULT_AUTOCLEAN_TM Configures [`DEFAULT_AUTOCLEAN_TM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_AUTOCLEAN_TM). ### WEBLATE_COMMIT_PENDING_HOURS Configures the default value for [Age of changes to commit](https://docs.weblate.org/en/latest/admin/projects.md#component-commit-pending-age) for new components, see [`COMMIT_PENDING_HOURS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-COMMIT_PENDING_HOURS). ### WEBLATE_GPG_IDENTITY Configures GPG signing of commits, see [`WEBLATE_GPG_IDENTITY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_GPG_IDENTITY). #### SEE ALSO [Signing Git commits with GnuPG](https://docs.weblate.org/en/latest/admin/optionals.md#gpg-sign) ### WEBLATE_URL_PREFIX Configures URL prefix where Weblate is running, see [`URL_PREFIX`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-URL_PREFIX). ### WEBLATE_STATIC_URL Configures URL prefix for static files served from [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR). ### WEBLATE_SILENCED_SYSTEM_CHECKS Configures checks which you do not want to be displayed, see [`SILENCED_SYSTEM_CHECKS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SILENCED_SYSTEM_CHECKS). ### WEBLATE_CSP_SCRIPT_SRC ### WEBLATE_CSP_IMG_SRC ### WEBLATE_CSP_CONNECT_SRC ### WEBLATE_CSP_STYLE_SRC ### WEBLATE_CSP_FONT_SRC ### WEBLATE_CSP_FORM_SRC Allows to customize *Content-Security-Policy* HTTP header. #### SEE ALSO * [Content security policy](https://docs.weblate.org/en/latest/admin/install.md#csp) * [`CSP_SCRIPT_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_SCRIPT_SRC) * [`CSP_IMG_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_IMG_SRC) * [`CSP_CONNECT_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_CONNECT_SRC) * [`CSP_STYLE_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_STYLE_SRC) * [`CSP_FONT_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_FONT_SRC) * [`CSP_FORM_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_FORM_SRC) ### WEBLATE_LICENSE_FILTER Configures [`LICENSE_FILTER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LICENSE_FILTER). ### WEBLATE_LICENSE_REQUIRED Configures [`LICENSE_REQUIRED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LICENSE_REQUIRED). ### WEBLATE_WEBSITE_REQUIRED Configures [`WEBSITE_REQUIRED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBSITE_REQUIRED). ### WEBLATE_VERSION_DISPLAY Configures [`VERSION_DISPLAY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VERSION_DISPLAY). ### WEBLATE_HIDE_VERSION Configures [`HIDE_VERSION`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-HIDE_VERSION). ### WEBLATE_BASIC_LANGUAGES Configures [`BASIC_LANGUAGES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BASIC_LANGUAGES). ### WEBLATE_DEFAULT_AUTO_WATCH Configures [`DEFAULT_AUTO_WATCH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_AUTO_WATCH). ### WEBLATE_RATELIMIT_ATTEMPTS ### WEBLATE_RATELIMIT_LOCKOUT ### WEBLATE_RATELIMIT_WINDOW #### Versionadded Added in version 4.6. Configures rate limiter. #### HINT You can set configuration for any rate limiter scopes. To do that add `WEBLATE_` prefix to any of setting described in [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit). #### SEE ALSO * [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) * [`RATELIMIT_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_ATTEMPTS) * [`RATELIMIT_WINDOW`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_WINDOW) * [`RATELIMIT_LOCKOUT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_LOCKOUT) ### WEBLATE_API_RATELIMIT_ANON ### WEBLATE_API_RATELIMIT_USER #### Versionadded Added in version 4.11. Configures [`API_RATELIMIT_ANON`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_ANON) and [`API_RATELIMIT_USER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_USER). Defaults to `100/day` for anonymous and `5000/hour` for authenticated users. #### SEE ALSO [API rate limiting](https://docs.weblate.org/en/latest/api.md#api-rate) ### WEBLATE_API_RATELIMIT_USER_OVERRIDES ### WEBLATE_API_RATELIMIT_IP_OVERRIDES #### Versionadded Added in version 2026.10. JSON mappings configuring [`API_RATELIMIT_USER_OVERRIDES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_USER_OVERRIDES) and [`API_RATELIMIT_IP_OVERRIDES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_IP_OVERRIDES). Both default to empty objects. Use JSON `null` to exempt a user, IP address, or network from API throttling. For example, in `compose.override.yaml`: ```yaml services: weblate: environment: WEBLATE_API_RATELIMIT_USER_OVERRIDES: '{"automation":"20000/hour"}' WEBLATE_API_RATELIMIT_IP_OVERRIDES: '{"192.0.2.42":null,"198.51.100.0/24":"10000/hour"}' ``` Username rules take precedence over IP rules. See [API rate limiting](https://docs.weblate.org/en/latest/api.md#api-rate) for counting behavior and proxy configuration requirements. ### WEBLATE_ENABLE_HOOKS #### Versionadded Added in version 4.13. Configures [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS). ### WEBLATE_ENABLE_AVATARS #### Versionadded Added in version 4.6.1. Configures [`ENABLE_AVATARS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_AVATARS). ### WEBLATE_AVATAR_URL_PREFIX #### Versionadded Added in version 4.15. Configures [`AVATAR_URL_PREFIX`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AVATAR_URL_PREFIX). ### WEBLATE_LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH #### Versionadded Added in version 4.9. Configures [`LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH). ### WEBLATE_SSH_EXTRA_ARGS #### Versionadded Added in version 4.9. Configures [`SSH_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SSH_EXTRA_ARGS). ### WEBLATE_BORG_EXTRA_ARGS #### Versionadded Added in version 4.9. Configures [`BORG_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BORG_EXTRA_ARGS) as a comma separated list of args. **Example:** ```yaml environment: WEBLATE_BORG_EXTRA_ARGS: --exclude,vcs/ ``` ### WEBLATE_ENABLE_SHARING #### Versionadded Added in version 4.14.1. Configures [`ENABLE_SHARING`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_SHARING). ### WEBLATE_SUPPORT_STATUS_CHECK #### Versionadded Added in version 5.5. Configures [`SUPPORT_STATUS_CHECK`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SUPPORT_STATUS_CHECK). ### WEBLATE_EXTRA_HTML_HEAD #### Versionadded Added in version 4.15. Configures [`EXTRA_HTML_HEAD`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-EXTRA_HTML_HEAD). ### WEBLATE_INTERNAL_BOT_EMAIL_TEMPLATE #### Versionadded Added in version 2026.7.1. Configures [`INTERNAL_BOT_EMAIL_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-INTERNAL_BOT_EMAIL_TEMPLATE). ### WEBLATE_PRIVATE_COMMIT_EMAIL_TEMPLATE #### Versionadded Added in version 4.15. Configures [`PRIVATE_COMMIT_EMAIL_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_TEMPLATE). ### WEBLATE_PRIVATE_COMMIT_EMAIL_OPT_IN #### Versionadded Added in version 4.15. Configures [`PRIVATE_COMMIT_EMAIL_OPT_IN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_OPT_IN). ### WEBLATE_PRIVATE_COMMIT_NAME_TEMPLATE #### Versionadded Added in version 5.16. Configures [`PRIVATE_COMMIT_NAME_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_NAME_TEMPLATE). ### WEBLATE_PRIVATE_COMMIT_NAME_OPT_IN #### Versionadded Added in version 5.16. Configures [`PRIVATE_COMMIT_NAME_OPT_IN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_NAME_OPT_IN). ### WEBLATE_UNUSED_ALERT_DAYS #### Versionadded Added in version 4.17. Configures [`UNUSED_ALERT_DAYS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-UNUSED_ALERT_DAYS). ### WEBLATE_REPORT_EXPIRY #### Versionadded Added in version 2026.8. Configures [`REPORT_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REPORT_EXPIRY). ### WEBLATE_UPDATE_LANGUAGES #### Versionadded Added in version 4.3.2. Configures [`UPDATE_LANGUAGES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-UPDATE_LANGUAGES). ### WEBLATE_VCS_ALLOW_HOSTS #### Versionadded Added in version 5.15. Configures [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS). ### WEBLATE_VCS_PRIVATE_ALLOWLIST #### Versionadded Added in version 2026.9. Configures [`VCS_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_PRIVATE_ALLOWLIST). ### WEBLATE_VCS_ALLOW_SCHEMES #### Versionadded Added in version 5.15. Configures [`VCS_ALLOW_SCHEMES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_SCHEMES). ### WEBLATE_VCS_RESTRICT_PRIVATE #### Versionadded Added in version 5.17. Configures [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE). ### WEBLATE_VCS_CLONE_DEPTH #### Versionadded Added in version 5.4. Configures [`VCS_CLONE_DEPTH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_CLONE_DEPTH). ### WEBLATE_VCS_API_DELAY #### Versionadded Added in version 5.4. Configures [`VCS_API_DELAY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_API_DELAY). ### WEBLATE_VCS_API_TIMEOUT #### Versionadded Added in version 5.15. Configures [`VCS_API_TIMEOUT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_API_TIMEOUT). ### WEBLATE_CORS_ALLOWED_ORIGINS #### Versionadded Added in version 4.16. Allow CORS requests to API from given origins. **Example:** ```yaml environment: WEBLATE_CORS_ALLOWED_ORIGINS: https://example.com,https://weblate.org ``` ### WEBLATE_CORS_ALLOW_ALL_ORIGINS #### Versionadded Added in version 5.6.1: Allows CORS requests to API from all origins. ### WEBLATE_WEBSITE_ALERTS_ENABLED #### Versionadded Added in version 5.17. Configures [`WEBSITE_ALERTS_ENABLED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBSITE_ALERTS_ENABLED). ### CLIENT_MAX_BODY_SIZE #### Versionadded Added in version 4.16.3. Configures maximal body size accepted by the built-in web server. ```yaml environment: CLIENT_MAX_BODY_SIZE: 200m ``` #### HINT This variable intentionally lacks `WEBLATE_` prefix as it is shared with third-party container used in [Automatic SSL certificates using Let’s Encrypt](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-https-portal). ### WEBLATE_TRANSLATION_UPLOAD_MAX_SIZE Configures [`TRANSLATION_UPLOAD_MAX_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-TRANSLATION_UPLOAD_MAX_SIZE). The value is in bytes. ### WEBLATE_COMPONENT_ZIP_UPLOAD_MAX_SIZE Configures [`COMPONENT_ZIP_UPLOAD_MAX_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-COMPONENT_ZIP_UPLOAD_MAX_SIZE). The value is in bytes. ### WEBLATE_PROJECT_BACKUP_UPLOAD_MAX_SIZE Configures [`PROJECT_BACKUP_UPLOAD_MAX_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_UPLOAD_MAX_SIZE). The value is in bytes. Make sure [`CLIENT_MAX_BODY_SIZE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CLIENT_MAX_BODY_SIZE) is also large enough for uploaded backup files. ### WEBLATE_PROJECT_BACKUP_IMPORT_MAX_MEMBERS #### Versionadded Added in version 2026.5. Configures [`PROJECT_BACKUP_IMPORT_MAX_MEMBERS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_MEMBERS). ### WEBLATE_PROJECT_BACKUP_IMPORT_MAX_TOTAL_UNCOMPRESSED_SIZE #### Versionadded Added in version 2026.5. Configures [`PROJECT_BACKUP_IMPORT_MAX_TOTAL_UNCOMPRESSED_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_TOTAL_UNCOMPRESSED_SIZE). The value is in bytes. ### WEBLATE_PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE #### Versionadded Added in version 2026.5. Configures [`PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE). The value is in bytes. ### WEBLATE_PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE #### Versionadded Added in version 2026.5. Configures [`PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE). The value is in bytes. ### WEBLATE_PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_RATIO #### Versionadded Added in version 2026.5. Configures [`PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_RATIO`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_RATIO). ### Code-hosting sites credentials In the Docker container, the code-hosting credentials can be configured either in separate variables or using a Python dictionary to set them at once. The following examples are for [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests), but apply to all [Version control integration](https://docs.weblate.org/en/latest/vcs.md#vcs) with appropriately changed variable names. #### IMPORTANT All environment variable names must include the `WEBLATE_` prefix. For example, to configure GitHub credentials, use `WEBLATE_GITHUB_USERNAME`, not `GITHUB_USERNAME`. This applies whether you’re configuring for pull requests or any other VCS integration. An example configuration for GitHub pull requests might look like: ```shell WEBLATE_GITHUB_USERNAME=api-user WEBLATE_GITHUB_TOKEN=api-token WEBLATE_GITHUB_HOST=api.github.com ``` Will be used as: ```python GITHUB_CREDENTIALS = { "api.github.com": { "username": "api-user", "token": "api-token", } } ``` Alternatively the Python dictionary can be provided as a string: ```shell WEBLATE_GITHUB_CREDENTIALS='{ "api.github.com": { "username": "api-user", "token": "api-token", } }' ``` Or the path to a file containing the Python dictionary: ```shell echo '{ "api.github.com": { "username": "api-user", "token": "api-token", } }' > /path/to/github-credentials WEBLATE_GITHUB_CREDENTIALS_FILE='/path/to/github-credentials' ``` ### WEBLATE_GITHUB_USERNAME ### WEBLATE_GITHUB_TOKEN ### WEBLATE_GITHUB_HOST ### WEBLATE_GITHUB_CREDENTIALS Configures [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests) by changing [`GITHUB_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITHUB_CREDENTIALS). #### SEE ALSO [Configuring code-hosting credentials in Docker](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-vcs-config) ### WEBLATE_GITHUB_LEGACY_APP_WEBHOOK_SECRET #### Versionadded Added in version 2026.8. Configures [`GITHUB_LEGACY_APP_WEBHOOK_SECRET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITHUB_LEGACY_APP_WEBHOOK_SECRET). The `_FILE` variant can be used to load the secret from a file. GitHub Apps registered through the in-app manifest flow are stored in the database and do not need environment variables. See [GitHub notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-notifications). ### WEBLATE_GITLAB_USERNAME ### WEBLATE_GITLAB_TOKEN ### WEBLATE_GITLAB_HOST ### WEBLATE_GITLAB_CREDENTIALS Configures [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests) by changing [`GITLAB_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITLAB_CREDENTIALS). #### SEE ALSO [Configuring code-hosting credentials in Docker](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-vcs-config) ### WEBLATE_GITEA_USERNAME ### WEBLATE_GITEA_TOKEN ### WEBLATE_GITEA_HOST ### WEBLATE_GITEA_CREDENTIALS Configures [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests) by changing [`GITEA_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITEA_CREDENTIALS). #### SEE ALSO [Configuring code-hosting credentials in Docker](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-vcs-config) ### WEBLATE_PAGURE_USERNAME ### WEBLATE_PAGURE_TOKEN ### WEBLATE_PAGURE_HOST ### WEBLATE_PAGURE_CREDENTIALS Configures [Pagure merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-merge-requests) by changing [`PAGURE_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PAGURE_CREDENTIALS). #### SEE ALSO [Configuring code-hosting credentials in Docker](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-vcs-config) ### WEBLATE_BITBUCKETSERVER_USERNAME ### WEBLATE_BITBUCKETSERVER_TOKEN ### WEBLATE_BITBUCKETSERVER_HOST ### WEBLATE_BITBUCKETSERVER_CREDENTIALS Configures [Bitbucket Data Center pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-data-center-pull-requests) by changing [`BITBUCKETSERVER_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BITBUCKETSERVER_CREDENTIALS). ### WEBLATE_BITBUCKETCLOUD_USERNAME ### WEBLATE_BITBUCKETCLOUD_WORKSPACE ### WEBLATE_BITBUCKETCLOUD_TOKEN ### WEBLATE_BITBUCKETCLOUD_HOST ### WEBLATE_BITBUCKETCLOUD_CREDENTIALS Configures [Bitbucket Cloud pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-cloud-pull-requests) by changing [`BITBUCKETCLOUD_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BITBUCKETCLOUD_CREDENTIALS). #### SEE ALSO [Configuring code-hosting credentials in Docker](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-vcs-config) ### WEBLATE_AZURE_DEVOPS_USERNAME ### WEBLATE_AZURE_DEVOPS_ORGANIZATION ### WEBLATE_AZURE_DEVOPS_TOKEN ### WEBLATE_AZURE_DEVOPS_HOST ### WEBLATE_AZURE_DEVOPS_CREDENTIALS Configures [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests) by changing [`AZURE_DEVOPS_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AZURE_DEVOPS_CREDENTIALS). #### SEE ALSO [Configuring code-hosting credentials in Docker](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-vcs-config) ### Automatic suggestion settings #### Versionchanged Changed in version 4.13: Automatic suggestion services are now configured in the user interface, see [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup). The existing environment variables are imported during the migration to Weblate 4.13, but changing them will not have any further effect. ### Authentication settings #### HINT The e-mail based authentication is turned on unless disabled by [`WEBLATE_NO_EMAIL_AUTH`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_NO_EMAIL_AUTH). #### LDAP ### WEBLATE_AUTH_LDAP_SERVER_URI ### WEBLATE_AUTH_LDAP_USER_DN_TEMPLATE ### WEBLATE_AUTH_LDAP_USER_ATTR_MAP ### WEBLATE_AUTH_LDAP_BIND_DN ### WEBLATE_AUTH_LDAP_BIND_PASSWORD ### WEBLATE_AUTH_LDAP_CONNECTION_OPTION_REFERRALS ### WEBLATE_AUTH_LDAP_USER_SEARCH ### WEBLATE_AUTH_LDAP_USER_SEARCH_FILTER ### WEBLATE_AUTH_LDAP_USER_SEARCH_UNION ### WEBLATE_AUTH_LDAP_USER_SEARCH_UNION_DELIMITER LDAP authentication configuration. **Example for direct bind:** ```yaml environment: WEBLATE_AUTH_LDAP_SERVER_URI: ldap://ldap.example.org WEBLATE_AUTH_LDAP_USER_DN_TEMPLATE: uid=%(user)s,ou=People,dc=example,dc=net # map weblate 'full_name' to ldap 'name' and weblate 'email' attribute to 'mail' ldap attribute. # another example that can be used with OpenLDAP: 'full_name:cn,email:mail' WEBLATE_AUTH_LDAP_USER_ATTR_MAP: full_name:name,email:mail ``` **Example for search and bind:** ```yaml environment: WEBLATE_AUTH_LDAP_SERVER_URI: ldap://ldap.example.org WEBLATE_AUTH_LDAP_BIND_DN: CN=ldap,CN=Users,DC=example,DC=com WEBLATE_AUTH_LDAP_BIND_PASSWORD: password WEBLATE_AUTH_LDAP_USER_ATTR_MAP: full_name:name,email:mail WEBLATE_AUTH_LDAP_USER_SEARCH: CN=Users,DC=example,DC=com ``` **Example for union search and bind:** ```yaml environment: WEBLATE_AUTH_LDAP_SERVER_URI: ldap://ldap.example.org WEBLATE_AUTH_LDAP_BIND_DN: CN=ldap,CN=Users,DC=example,DC=com WEBLATE_AUTH_LDAP_BIND_PASSWORD: password WEBLATE_AUTH_LDAP_USER_ATTR_MAP: full_name:name,email:mail WEBLATE_AUTH_LDAP_USER_SEARCH_UNION: ou=users,dc=example,dc=com|ou=otherusers,dc=example,dc=com ``` **Example with search and bind against Active Directory:** ```yaml environment: WEBLATE_AUTH_LDAP_BIND_DN: CN=ldap,CN=Users,DC=example,DC=com WEBLATE_AUTH_LDAP_BIND_PASSWORD: password WEBLATE_AUTH_LDAP_SERVER_URI: ldap://ldap.example.org WEBLATE_AUTH_LDAP_CONNECTION_OPTION_REFERRALS: 0 WEBLATE_AUTH_LDAP_USER_ATTR_MAP: full_name:name,email:mail WEBLATE_AUTH_LDAP_USER_SEARCH: CN=Users,DC=example,DC=com WEBLATE_AUTH_LDAP_USER_SEARCH_FILTER: (sAMAccountName=%(user)s) ``` #### SEE ALSO * [Passing secrets](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-secrets) * [LDAP authentication](https://docs.weblate.org/en/latest/admin/auth.md#ldap-auth) #### GitHub ### WEBLATE_SOCIAL_AUTH_GITHUB_KEY ### WEBLATE_SOCIAL_AUTH_GITHUB_SECRET ### WEBLATE_SOCIAL_AUTH_GITHUB_ORG_KEY ### WEBLATE_SOCIAL_AUTH_GITHUB_ORG_SECRET ### WEBLATE_SOCIAL_AUTH_GITHUB_ORG_NAME ### WEBLATE_SOCIAL_AUTH_GITHUB_TEAM_KEY ### WEBLATE_SOCIAL_AUTH_GITHUB_TEAM_SECRET ### WEBLATE_SOCIAL_AUTH_GITHUB_TEAM_ID Enables [GitHub authentication](https://docs.weblate.org/en/latest/admin/auth.md#github-auth). #### GitHub Enterprise Edition ### WEBLATE_SOCIAL_AUTH_GITHUB_ENTERPRISE_KEY ### WEBLATE_SOCIAL_AUTH_GITHUB_ENTERPRISE_SECRET ### WEBLATE_SOCIAL_AUTH_GITHUB_ENTERPRISE_URL ### WEBLATE_SOCIAL_AUTH_GITHUB_ENTERPRISE_API_URL ### WEBLATE_SOCIAL_AUTH_GITHUB_ENTERPRISE_SCOPE Enables [GitHub EE authentication](https://docs.weblate.org/en/latest/admin/auth.md#github-ee-auth). #### Bitbucket ### WEBLATE_SOCIAL_AUTH_BITBUCKET_OAUTH2_KEY ### WEBLATE_SOCIAL_AUTH_BITBUCKET_OAUTH2_SECRET Enables [Bitbucket authentication](https://docs.weblate.org/en/latest/admin/auth.md#bitbucket-auth). #### Facebook ### WEBLATE_SOCIAL_AUTH_FACEBOOK_KEY ### WEBLATE_SOCIAL_AUTH_FACEBOOK_SECRET Enables [Facebook OAuth 2](https://docs.weblate.org/en/latest/admin/auth.md#facebook-auth). #### Google ### WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_KEY ### WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET ### WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS ### WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_EMAILS Enables [Google OAuth 2](https://docs.weblate.org/en/latest/admin/auth.md#google-auth). #### GitLab ### WEBLATE_SOCIAL_AUTH_GITLAB_KEY ### WEBLATE_SOCIAL_AUTH_GITLAB_SECRET ### WEBLATE_SOCIAL_AUTH_GITLAB_API_URL Enables [GitLab OAuth 2](https://docs.weblate.org/en/latest/admin/auth.md#gitlab-auth). #### Gitea ### WEBLATE_SOCIAL_AUTH_GITEA_API_URL ### WEBLATE_SOCIAL_AUTH_GITEA_KEY ### WEBLATE_SOCIAL_AUTH_GITEA_SECRET Enables Gitea authentication. #### Microsoft Entra ID ### WEBLATE_SOCIAL_AUTH_AZUREAD_OAUTH2_KEY ### WEBLATE_SOCIAL_AUTH_AZUREAD_OAUTH2_SECRET Enables Microsoft Entra ID authentication, see [Microsoft Entra ID](https://docs.weblate.org/en/latest/admin/auth.md#entra-auth). #### Microsoft Entra ID with Tenant support ### WEBLATE_SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_KEY ### WEBLATE_SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_SECRET ### WEBLATE_SOCIAL_AUTH_AZUREAD_TENANT_OAUTH2_TENANT_ID Enables Microsoft Entra ID authentication with Tenant support, see [Microsoft Entra ID](https://docs.weblate.org/en/latest/admin/auth.md#entra-auth). #### Keycloak ### WEBLATE_SOCIAL_AUTH_KEYCLOAK_KEY ### WEBLATE_SOCIAL_AUTH_KEYCLOAK_SECRET ### WEBLATE_SOCIAL_AUTH_KEYCLOAK_PUBLIC_KEY ### WEBLATE_SOCIAL_AUTH_KEYCLOAK_ALGORITHM ### WEBLATE_SOCIAL_AUTH_KEYCLOAK_AUTHORIZATION_URL ### WEBLATE_SOCIAL_AUTH_KEYCLOAK_ACCESS_TOKEN_URL ### WEBLATE_SOCIAL_AUTH_KEYCLOAK_TITLE ### WEBLATE_SOCIAL_AUTH_KEYCLOAK_IMAGE Enables Keycloak authentication, see [Keycloak - Open Source Red Hat SSO](https://python-social-auth.readthedocs.io/en/latest/backends/keycloak.html). ### WEBLATE_SOCIAL_AUTH_KEYCLOAK_ID_KEY #### Versionadded Added in version 5.17. Configures which claim is used as the unique user identifier from Keycloak. Defaults to `email`. #### HINT When Keycloak is configured to abstract third-party IDP, you will need to configure [`WEBLATE_CSP_FORM_SRC`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_CSP_FORM_SRC) for the third-party IDP domain. ```yaml environment: WEBLATE_CSP_FORM_SRC: login.microsoftonline.com ``` #### Linux vendors You can enable authentication using Linux vendors authentication services by setting following variables to any value. ### WEBLATE_SOCIAL_AUTH_FEDORA ### WEBLATE_SOCIAL_AUTH_OPENSUSE ### WEBLATE_SOCIAL_AUTH_OPENINFRA ### WEBLATE_SOCIAL_AUTH_UBUNTU #### Slack ### WEBLATE_SOCIAL_AUTH_SLACK_KEY ### WEBLATE_SOCIAL_AUTH_SLACK_SECRET Enables Slack authentication, see [Slack](https://docs.weblate.org/en/latest/admin/auth.md#slack-auth). #### OpenID Connect #### Versionadded Added in version 4.13-1. ### WEBLATE_SOCIAL_AUTH_OIDC_OIDC_ENDPOINT ### WEBLATE_SOCIAL_AUTH_OIDC_KEY ### WEBLATE_SOCIAL_AUTH_OIDC_SECRET ### WEBLATE_SOCIAL_AUTH_OIDC_USERNAME_KEY ### WEBLATE_SOCIAL_AUTH_OIDC_TITLE ### WEBLATE_SOCIAL_AUTH_OIDC_IMAGE Configures generic OpenID Connect integration. #### SEE ALSO [OIDC (OpenID Connect)](https://python-social-auth.readthedocs.io/en/latest/backends/oidc.html) #### Fedora OpenID Connect #### Versionadded Added in version 5.15. ### WEBLATE_SOCIAL_AUTH_FEDORA_OIDC_KEY ### WEBLATE_SOCIAL_AUTH_FEDORA_OIDC_SECRET Configures Fedora OpenID Connect integration. #### SEE ALSO [Fedora](https://python-social-auth.readthedocs.io/en/latest/backends/fedora.html) #### SAML Self-signed SAML keys are automatically generated on first container startup. In case you want to use own keys, place the certificate and private key in `/app/data/ssl/saml.crt` and `/app/data/ssl/saml.key`. ### WEBLATE_SAML_IDP_ENTITY_ID ### WEBLATE_SAML_IDP_URL ### WEBLATE_SAML_IDP_X509CERT ### WEBLATE_SAML_IDP_IMAGE ### WEBLATE_SAML_IDP_TITLE SAML Identity Provider settings, see [SAML authentication](https://docs.weblate.org/en/latest/admin/auth.md#saml-auth). ### WEBLATE_SAML_SECURITY_CONFIG #### Versionadded Added in version 2026.6. SAML security configuration as a JSON object, passed to `SOCIAL_AUTH_SAML_SECURITY_CONFIG`. For example, to disable the `requestedAuthnContext` (needed for some identity providers such as Microsoft Entra ID with multi-factor authentication): ```yaml environment: WEBLATE_SAML_SECURITY_CONFIG: '{"requestedAuthnContext": false}' ``` #### SEE ALSO [python3-saml security settings](https://github.com/SAML-Toolkits/python3-saml#settings) ### WEBLATE_SAML_ID_ATTR_FULL_NAME ### WEBLATE_SAML_ID_ATTR_FIRST_NAME ### WEBLATE_SAML_ID_ATTR_LAST_NAME ### WEBLATE_SAML_ID_ATTR_USERNAME ### WEBLATE_SAML_ID_ATTR_EMAIL ### WEBLATE_SAML_ID_ATTR_USER_PERMANENT_ID #### Versionadded Added in version 4.18. SAML attributes mapping. #### Other authentication settings ### WEBLATE_NO_EMAIL_AUTH Disables e-mail authentication when set to any value. See [Turning off password authentication](https://docs.weblate.org/en/latest/admin/auth.md#disable-email-auth). ### WEBLATE_MIN_PASSWORD_SCORE Minimal password score as evaluated by the [zxcvbn](https://github.com/dwolfhub/zxcvbn-python) password strength estimator. Defaults to 3, set to 0 to disable strength checking. #### SEE ALSO * [Password authentication](https://docs.weblate.org/en/latest/admin/auth.md#password-authentication) * [`PASSWORD_MINIMAL_STRENGTH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PASSWORD_MINIMAL_STRENGTH) ### PostgreSQL database setup The database is created by `docker-compose.yml`, so these settings affect both Weblate and PostgreSQL containers. #### SEE ALSO [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) ### POSTGRES_PASSWORD PostgreSQL password. #### SEE ALSO [Passing secrets](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-secrets) ### POSTGRES_USER PostgreSQL username. ### POSTGRES_DB PostgreSQL database name. ### POSTGRES_HOST PostgreSQL server hostname or IP address. Defaults to `database`. ### POSTGRES_PORT PostgreSQL server port. Defaults to none (uses the default value). ### POSTGRES_SSL_MODE Configure how PostgreSQL handles SSL in connection to the server, for possible choices see [SSL Mode Descriptions](https://www.postgresql.org/docs/11/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS). ### POSTGRES_ALTER_ROLE Configures name of the PostgreSQL role to alter during the database migration, see [Configuring Weblate to use PostgreSQL](https://docs.weblate.org/en/latest/admin/install.md#config-postgresql). Defaults to [`POSTGRES_USER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-POSTGRES_USER). ### POSTGRES_CONN_MAX_AGE #### Versionadded Added in version 4.8.1. The lifetime of a database connection, as an integer of seconds. Use 0 to close database connections at the end of each request. #### Versionchanged Changed in version 5.1: The default behavior is to have unlimited persistent database connections. Enabling connection persistence will typically, cause more open connection to the database. Please adjust your database configuration prior enabling. Example configuration: ```yaml environment: POSTGRES_CONN_MAX_AGE: 3600 ``` #### SEE ALSO * [`CONN_MAX_AGE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-CONN_MAX_AGE) * [Persistent connections](https://docs.djangoproject.com/en/stable/ref/databases/#persistent-database-connections) ### POSTGRES_DISABLE_SERVER_SIDE_CURSORS #### Versionadded Added in version 4.9.1. Disable server side cursors in the database. This is necessary in some **pgbouncer** setups. Example configuration: ```yaml environment: POSTGRES_DISABLE_SERVER_SIDE_CURSORS: 1 ``` #### SEE ALSO * [`DISABLE_SERVER_SIDE_CURSORS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-DATABASE-DISABLE_SERVER_SIDE_CURSORS) * [Transaction pooling and server-side cursors](https://docs.djangoproject.com/en/stable/ref/databases/#transaction-pooling-server-side-cursors) ### WEBLATE_DATABASES #### Versionadded Added in version 5.1. Set to false to disable environment based configuration of the database connection. Use [Overriding settings from the data volume](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-settings-override) to configure the database connection manually. ### Database backup settings #### SEE ALSO [Dumped data for backups](https://docs.weblate.org/en/latest/admin/backup.md#backup-dumps) ### WEBLATE_DATABASE_BACKUP Configures the daily database dump using [`DATABASE_BACKUP`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATABASE_BACKUP). Defaults to `plain`. ### Datastore server setup Using Valkey or Redis is required by the Weblate container and you have to provide a connection parameters when running Weblate in Docker. #### SEE ALSO [Configure cache](https://docs.weblate.org/en/latest/admin/install.md#production-cache) ### REDIS_HOST The datastore server hostname or IP address. Defaults to `cache`. ### REDIS_PORT The datastore server port. Defaults to `6379`. ### REDIS_DB The datastore database number, defaults to `1`. ### REDIS_USER #### Versionadded Added in version 5.13: The datastore database user, not used by default. ### REDIS_PASSWORD The datastore server password, not used by default. #### SEE ALSO [Passing secrets](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-secrets) ### REDIS_TLS Enables using SSL for the datastore connection. ### REDIS_VERIFY_SSL Can be used to disable SSL certificate verification for the datastore connection. ### Email server setup To make outgoing e-mail work, you need to provide a mail server. Example TLS configuration: ```yaml environment: WEBLATE_EMAIL_HOST: smtp.example.com WEBLATE_EMAIL_HOST_USER: user WEBLATE_EMAIL_HOST_PASSWORD: pass ``` Example SSL configuration: ```yaml environment: WEBLATE_EMAIL_HOST: smtp.example.com WEBLATE_EMAIL_PORT: 465 WEBLATE_EMAIL_HOST_USER: user WEBLATE_EMAIL_HOST_PASSWORD: pass WEBLATE_EMAIL_USE_TLS: 0 WEBLATE_EMAIL_USE_SSL: 1 ``` #### SEE ALSO [Configuring outgoing e-mail](https://docs.weblate.org/en/latest/admin/install.md#out-mail) ### WEBLATE_EMAIL_HOST Mail server hostname or IP address. #### SEE ALSO * [`WEBLATE_EMAIL_PORT`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_PORT) * [`WEBLATE_EMAIL_USE_SSL`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_USE_SSL) * [`WEBLATE_EMAIL_USE_TLS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_USE_TLS) * [`EMAIL_HOST`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_HOST) ### WEBLATE_EMAIL_PORT Mail server port, defaults to 25. #### SEE ALSO [`EMAIL_PORT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_PORT) ### WEBLATE_EMAIL_HOST_USER E-mail authentication user. #### SEE ALSO [`EMAIL_HOST_USER`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_HOST_USER) ### WEBLATE_EMAIL_HOST_PASSWORD E-mail authentication password. #### SEE ALSO * [Passing secrets](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-secrets) * [`EMAIL_HOST_PASSWORD`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_HOST_PASSWORD) ### WEBLATE_EMAIL_USE_SSL Whether to use an implicit TLS (secure) connection when talking to the SMTP server. In most e-mail documentation, this type of TLS connection is referred to as SSL. It is generally used on port 465. If you are experiencing problems, see the explicit TLS setting [`WEBLATE_EMAIL_USE_TLS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_USE_TLS). #### Versionchanged Changed in version 4.11: The SSL/TLS support is automatically enabled based on the [`WEBLATE_EMAIL_PORT`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_PORT). #### SEE ALSO * [`WEBLATE_EMAIL_PORT`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_PORT) * [`WEBLATE_EMAIL_USE_TLS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_USE_TLS) * [`EMAIL_USE_SSL`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_USE_SSL) ### WEBLATE_EMAIL_USE_TLS Whether to use a TLS (secure) connection when talking to the SMTP server. This is used for explicit TLS connections, generally on port 587 or 25. If you are experiencing connections that hang, see the implicit TLS setting [`WEBLATE_EMAIL_USE_SSL`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_USE_SSL). #### Versionchanged Changed in version 4.11: The SSL/TLS support is automatically enabled based on the [`WEBLATE_EMAIL_PORT`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_PORT). #### SEE ALSO * [`WEBLATE_EMAIL_PORT`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_PORT) * [`WEBLATE_EMAIL_USE_SSL`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_USE_SSL) * [`EMAIL_USE_TLS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_USE_TLS) ### WEBLATE_EMAIL_BACKEND Configures Django back-end to use for sending e-mails. Set to `django_ses.SESBackend` to use AWS SES. #### SEE ALSO * [Configure e-mail sending](https://docs.weblate.org/en/latest/admin/install.md#production-email) * [`EMAIL_BACKEND`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-EMAIL_BACKEND) ### WEBLATE_AWS_SES_REGION_NAME AWS region for SES (e.g. `us-east-1`). Sets `AWS_SES_REGION_NAME` and derives [`WEBLATE_AWS_SES_REGION_ENDPOINT`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_AWS_SES_REGION_ENDPOINT) automatically unless that variable is set explicitly. If not set, the region must be available through the standard boto3 credential chain (e.g. `AWS_DEFAULT_REGION` or an AWS profile). ### WEBLATE_AWS_SES_REGION_ENDPOINT SES endpoint hostname. When set, it is passed to django-ses directly regardless of [`WEBLATE_AWS_SES_REGION_NAME`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_AWS_SES_REGION_NAME). When not set but [`WEBLATE_AWS_SES_REGION_NAME`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_AWS_SES_REGION_NAME) is provided, defaults to `email..amazonaws.com`. Override when using a VPC or custom endpoint. ### WEBLATE_USE_SES_V2 Set to `true` to use the SES v2 API (`SendEmail`) instead of the legacy `SendRawEmail` call. Boolean setting (use `"true"` or `"false"`). ### WEBLATE_AUTO_UPDATE Configures if and how Weblate should update repositories. The default, `"false"`, fetches remote changes daily without merging them into the working copy; it does not disable daily updates. Set to `"true"` to also merge remote changes into the working copy. #### SEE ALSO [`AUTO_UPDATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTO_UPDATE) for details on how updates are scheduled throughout the day. #### NOTE This is a Boolean setting (use `"true"` or `"false"`). ### Site integration ### WEBLATE_GET_HELP_URL Configures [`GET_HELP_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GET_HELP_URL). ### WEBLATE_STATUS_URL Configures [`STATUS_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-STATUS_URL). ### WEBLATE_LEGAL_URL Configures [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL). ### WEBLATE_PRIVACY_URL Configures [`PRIVACY_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVACY_URL). ### WEBLATE_PASSWORD_RESET_URL Configures [`PASSWORD_RESET_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PASSWORD_RESET_URL). ### Collecting error reports and monitoring performance It is recommended to collect errors from the installation systematically, see [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors). To enable support for Rollbar, set the following: ### ROLLBAR_KEY Your Rollbar post server access token. ### ROLLBAR_ENVIRONMENT Your Rollbar environment, defaults to `production`. To enable support for Sentry, set following: ### SENTRY_DSN Your Sentry DSN, see [`SENTRY_DSN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SENTRY_DSN). ### SENTRY_ENVIRONMENT Your Sentry Environment (optional), defaults to [`WEBLATE_SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SITE_DOMAIN). ### SENTRY_MONITOR_BEAT_TASKS Whether to monitor Celery Beat tasks with Sentry, defaults to `True`. ### SENTRY_TRACES_SAMPLE_RATE Configures [`SENTRY_TRACES_SAMPLE_RATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SENTRY_TRACES_SAMPLE_RATE). **Example:** ```yaml environment: SENTRY_TRACES_SAMPLE_RATE: 0.5 ``` ### SENTRY_PROFILES_SAMPLE_RATE Configures [`SENTRY_PROFILES_SAMPLE_RATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SENTRY_PROFILES_SAMPLE_RATE). **Example:** ```yaml environment: SENTRY_PROFILES_SAMPLE_RATE: 0.5 ``` ### SENTRY_SEND_PII Configures [`SENTRY_SEND_PII`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SENTRY_SEND_PII). To enable support for Google Cloud Error Reporting, set following: ### GOOGLE_CLOUD_ERROR_REPORTING_ENABLED Enables [`GOOGLE_CLOUD_ERROR_REPORTING`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GOOGLE_CLOUD_ERROR_REPORTING), defaults to `False`. ### GOOGLE_CLOUD_ERROR_REPORTING_PROJECT Google Cloud project to report errors to. If omitted, the Google client uses application default credentials to detect the project. ### GOOGLE_CLOUD_ERROR_REPORTING_SERVICE Service name to use in Google Cloud Error Reporting, defaults to `weblate`. To enable support for OpenTelemetry tracing, set following: ### OPENTELEMETRY_ENABLED Enables [`OPENTELEMETRY_ENABLED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_ENABLED), defaults to `False`. ### OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT Configures [`OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT). **Example:** ```yaml environment: OPENTELEMETRY_ENABLED: true OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT: https://collector.example.com/v1/traces OPENTELEMETRY_TRACES_SAMPLE_RATE: 0.1 ``` ### OPENTELEMETRY_EXPORTER_OTLP_HEADERS Configures [`OPENTELEMETRY_EXPORTER_OTLP_HEADERS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_EXPORTER_OTLP_HEADERS) as a comma-separated `name:value` mapping. ### OPENTELEMETRY_EXTRA_RESOURCE_ATTRIBUTES Configures [`OPENTELEMETRY_EXTRA_RESOURCE_ATTRIBUTES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_EXTRA_RESOURCE_ATTRIBUTES) as a comma-separated `name:value` mapping. ### OPENTELEMETRY_SERVICE_NAME Configures [`OPENTELEMETRY_SERVICE_NAME`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_SERVICE_NAME). ### OPENTELEMETRY_TRACES_SAMPLE_RATE Configures [`OPENTELEMETRY_TRACES_SAMPLE_RATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-OPENTELEMETRY_TRACES_SAMPLE_RATE). ### Localization CDN ### WEBLATE_LOCALIZE_CDN_URL ### WEBLATE_LOCALIZE_CDN_PATH #### Versionadded Added in version 4.2.1. Configuration for CDN add-ons, including [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) and [Translation files CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-files). The [`WEBLATE_LOCALIZE_CDN_PATH`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_LOCALIZE_CDN_PATH) is path within the container. It should be stored on the persistent volume and not in the transient storage. One of possibilities is storing that inside the Weblate data dir: ```yaml environment: WEBLATE_LOCALIZE_CDN_URL: https://cdn.example.com/ WEBLATE_LOCALIZE_CDN_PATH: /app/data/l10n-cdn ``` #### NOTE You are responsible for setting up serving of the files generated by Weblate, it only stores the files in configured location. See [Localization CDN](https://docs.weblate.org/en/latest/admin/optionals.md#cdn-server-security) for secure serving guidance. #### SEE ALSO * [Translating HTML and JavaScript using Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#weblate-cdn) * [`LOCALIZE_CDN_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_URL) * [`LOCALIZE_CDN_PATH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_PATH) ### Changing enabled apps, checks, formats, add-ons, machinery, or autofixes The built-in configuration of enabled checks, file formats, add-ons, machinery, or autofixes can be adjusted by the following variables: ### WEBLATE_ADD_APPS ### WEBLATE_REMOVE_APPS ### WEBLATE_ADD_CHECK ### WEBLATE_REMOVE_CHECK ### WEBLATE_ADD_AUTOFIX ### WEBLATE_REMOVE_AUTOFIX ### WEBLATE_ADD_FORMATS ### WEBLATE_REMOVE_FORMATS ### WEBLATE_ADD_ADDONS ### WEBLATE_REMOVE_ADDONS ### WEBLATE_ADD_MACHINERY #### Versionadded Added in version 5.6.1. ### WEBLATE_REMOVE_MACHINERY #### Versionadded Added in version 5.6.1. **Example:** ```yaml environment: WEBLATE_REMOVE_AUTOFIX: weblate.trans.autofixes.whitespace.SameBookendingWhitespace WEBLATE_REMOVE_FORMATS: weblate.formats.ttkit.PoFormat WEBLATE_ADD_ADDONS: customize.addons.MyAddon,customize.addons.OtherAddon ``` #### SEE ALSO * [`CHECK_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CHECK_LIST) * [`AUTOFIX_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTOFIX_LIST) * [`WEBLATE_FORMATS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_FORMATS) * [`WEBLATE_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_ADDONS) * [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS) * [`WEBLATE_MACHINERY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_MACHINERY) ### Container settings ### WEBLATE_WORKERS #### Versionadded Added in version 4.6.1. Base number of worker processes running in the container. When not set it is determined automatically on container startup based on number of CPU cores available. It is used to determine [`CELERY_MAIN_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_MAIN_OPTIONS), [`CELERY_COMBINED_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_COMBINED_OPTIONS), [`CELERY_NOTIFY_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_NOTIFY_OPTIONS), [`CELERY_MEMORY_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_MEMORY_OPTIONS), [`CELERY_TRANSLATE_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_TRANSLATE_OPTIONS), [`CELERY_BACKUP_OPTIONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_BACKUP_OPTIONS), [`WEB_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEB_WORKERS), and [`WEB_BLOCKING_THREADS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEB_BLOCKING_THREADS). You can use these settings to fine-tune. ### CELERY_WORKER_MODE #### Versionadded Added in version 2026.9.1. Selects how Celery workers are run in the container. Supported modes are: `combined` : Runs one prefork worker for all queues. This is the default and reduces memory usage by sharing the application startup memory. Its concurrency defaults to three times [`WEBLATE_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_WORKERS), and its prefetch multiplier defaults to one. `split` : Runs a separate prefork worker for each queue. This matches the behavior of container versions before 2026.9.1 and allows each queue to be tuned independently. `single` : Runs all queues in one process using the solo pool. This minimizes memory usage, but noticeably reduces task throughput. Explicit [`WEBLATE_SERVICE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SERVICE) selection takes precedence over this setting in horizontally scaled deployments. ### CELERY_COMBINED_OPTIONS #### Versionadded Added in version 2026.9.1. Configures the worker used by `CELERY_WORKER_MODE=combined`. By default, its concurrency is three times [`WEBLATE_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_WORKERS). The worker uses a prefetch multiplier of one unless overridden here. ```yaml environment: CELERY_COMBINED_OPTIONS: --concurrency 12 --prefetch-multiplier 1 ``` #### SEE ALSO * [Celery worker options](https://docs.celeryq.dev/en/stable/reference/celery.bin.worker.html) * [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) ### CELERY_MAIN_OPTIONS ### CELERY_NOTIFY_OPTIONS ### CELERY_MEMORY_OPTIONS ### CELERY_TRANSLATE_OPTIONS ### CELERY_BACKUP_OPTIONS These variables allow you to adjust Celery worker options in `CELERY_WORKER_MODE=split`. It can be useful to adjust concurrency (`--concurrency 16`), prefetching (`--prefetch-multiplier 4`), or use different pool implementation (`--pool=gevent`). Command-line options take precedence over corresponding Celery settings, allowing each worker category to use a different prefetch multiplier. When any of these variables is set in `combined` or `single` mode, the container logs a startup warning that it is ignored. By default, the number of concurrent workers is based on [`WEBLATE_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_WORKERS). **Example:** ```yaml environment: CELERY_MAIN_OPTIONS: --concurrency 16 --prefetch-multiplier 1 ``` #### SEE ALSO * [Celery worker options](https://docs.celeryq.dev/en/stable/reference/celery.bin.worker.html) * [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) ### CELERY_BEAT_OPTIONS Configures the Celery beat scheduler in all worker modes. ### CELERY_SINGLE_OPTIONS Configures the worker used by `CELERY_WORKER_MODE=single`. #### SEE ALSO * [Celery worker options](https://docs.celeryq.dev/en/stable/reference/celery.bin.worker.html) * [Single-process Celery setup](https://docs.weblate.org/en/latest/admin/install.md#minimal-celery) ### CELERY_SINGLE_PROCESS #### Versionadded Added in version 5.7.1. #### Deprecated Deprecated since version 2026.9.1. Compatibility alias for `CELERY_WORKER_MODE=single`. When set to `1` without [`CELERY_WORKER_MODE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_WORKER_MODE), the container starts in `single` mode and logs a warning asking you to update the setting. If both variables are set, [`CELERY_WORKER_MODE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_WORKER_MODE) takes precedence. #### SEE ALSO [Single-process Celery setup](https://docs.weblate.org/en/latest/admin/install.md#minimal-celery) ### WEBLATE_ASGI #### Versionadded Added in version 2026.8. Set to `1` to run the web application using ASGI instead of WSGI. This is an opt-in setting intended for testing the transition to ASGI. WSGI remains the default for now, but a future release will run ASGI only and remove this setting. ```yaml environment: WEBLATE_ASGI: 1 ``` #### SEE ALSO [Sample configuration to start Granian with ASGI](https://docs.weblate.org/en/latest/admin/install.md#running-granian-asgi) ### WEB_WORKERS > Configure how many web application workers should be executed. > It defaults to half of [`WEBLATE_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_WORKERS), but is always at least 2. > **Example:** > ```yaml > environment: > WEB_WORKERS: 4 > ``` #### Versionchanged Changed in version 5.13: [`WEB_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEB_WORKERS) configures how many worker processes will be used by **granian**. ### WEB_BLOCKING_THREADS Configure how many blocking WSGI threads each **granian** worker can use. It defaults to twice [`WEBLATE_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_WORKERS) and is ignored when [`WEBLATE_ASGI`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ASGI) is enabled. The maximum number of simultaneous WSGI requests is approximately [`WEB_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEB_WORKERS) multiplied by [`WEB_BLOCKING_THREADS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEB_BLOCKING_THREADS). Each thread can hold its own database connection, so keep the resulting total within the database connection limit. **Example:** ```yaml environment: WEB_WORKERS: 2 WEB_BLOCKING_THREADS: 8 ``` ### WEBLATE_SERVICE Defines which services should be executed inside the container. Use this for [Scaling horizontally](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-scaling). Following services are defined: `celery-beat` : Celery task scheduler, only one instance should be running. This container is also responsible for the database structure migrations and it should be started prior others. `celery-backup` : Celery worker for backups, only one instance should be running. `celery-combined` : Combined Celery worker for all task queues. `celery-celery` : Generic Celery worker. `celery-memory` : Translation memory Celery worker. `celery-notify` : Notifications Celery worker. `celery-single` : Single-process Celery worker for all task queues. `celery-translate` : Automatic translation Celery worker. `web` : Web server. #### SEE ALSO [Background tasks internals](https://docs.weblate.org/en/latest/contributing/internals.md#background-tasks-internals) ### WEBLATE_ANUBIS_URL #### Versionadded Added in version 5.11.4. URL of [Anubis](https://anubis.techaro.lol/) server to handle subrequest authentication. This can be useful to filter incoming HTTP requests using proof-of-work to stop AI crawlers. You need to configure [Anubis for Subrequest Authentication](https://anubis.techaro.lol/docs/admin/configuration/subrequest-auth) to make it work. #### SEE ALSO * [Anubis Docker container integration](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-anubis) * [Anubis](https://anubis.techaro.lol/) ## Docker container volumes There are two volumes (`data` and `cache`) exported by the Weblate container. #### NOTE The other service containers (such as PostgreSQL or Valkey) have their data volumes as well and are required to maintain Weblate persistence. The PostgreSQL container stores the database in the `/var/lib/postgresql` volume and Valkey in the `/data` volume. Valkey container does not save the data by default and needs additional configuration to enable persistence. Base your configuration on Weblate-provided examples or consult their documentation for more information. The `data` volume is mounted as `/app/data` and is used to store Weblate persistent data such as cloned repositories or to customize Weblate installation. [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) describes in more detail what is stored here. The `data` volume is also place to store Weblate customization such as [Overriding settings from the data volume](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-settings-override), [Replacing logo and other static files](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-static-override) or [Customizing code](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-python-override). The placement of the Docker volume on host system depends on your Docker configuration, but usually it is stored in `/var/lib/docker/volumes/weblate-docker_weblate-data/_data/` (the path consist of name of your docker-compose directory, container, and volume names). The `cache` volume is mounted as `/app/cache` and is used to store static files and [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR). Its content is recreated on container startup and the volume can be mounted using ephemeral filesystem such as tmpfs, but the mount has to allow execution because Weblate stores generated helper files there. When mounting `/app/cache` explicitly as `tmpfs` in Docker Compose, enable execution: ```yaml tmpfs: - /app/cache:exec ``` When also setting ownership options, keep the `exec` option: ```yaml tmpfs: - /app/cache:exec,uid=1000,gid=1000 ``` When creating the volumes manually, the directories should be owned by UID 1000 as that is user used inside the container. Weblate container can also be executed with a read-only root file system. In this case, two additional `tmpfs` volumes should be mounted: `/tmp` and `/run`. #### SEE ALSO * [Docker volumes documentation](https://docs.docker.com/engine/storage/volumes/) * [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) * [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) ### Read-only root filesystem #### Versionadded Added in version 4.18. When running the container with a read-only root filesystem, two additional tmpfs volumes are required - `/tmp` and `/run`. ## Configuration beyond environment variables [Docker environment variables](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-environment) are intended to expose most [configuration settings](https://docs.weblate.org/en/latest/admin/config.md#config) of relevance for Weblate installations. If you find a setting that is not exposed as an environment variable, and you believe that it should be, feel free to [ask for it to be exposed in a future version of Weblate](https://docs.weblate.org/en/latest/contributing/issues.md#report-issue). If you need to modify a setting that is not exposed as a Docker environment variable, you can still do so, either [from the data volume](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-settings-override) or [extending the Docker image](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-custom-settings). #### SEE ALSO [Customizing Weblate](https://docs.weblate.org/en/latest/admin/customize.md) ### Overriding settings from the data volume You can create a file at `/app/data/settings-override.py`, i.e. at the root of the [data volume](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume), to extend or override settings defined through environment variables. ### Overriding settings by extending the Docker image To override settings at the Docker image level instead of from the data volume: 1. [Create a custom Python package](https://docs.weblate.org/en/latest/admin/customize.md#custom-module). 2. Add a module to your package that imports all settings from `weblate.settings_docker`. For example, within the example package structure defined at [Creating a Python module](https://docs.weblate.org/en/latest/admin/customize.md#custom-module), you could create a file at `weblate_customization/weblate_customization/settings.py` with the following initial code: ```python from weblate.settings_docker import * ``` 3. Create a custom `Dockerfile` that inherits from the official Weblate Docker image, and then installs your package and points the `DJANGO_SETTINGS_MODULE` environment variable to your settings module: ```docker FROM weblate/weblate USER root COPY weblate_customization /usr/src/weblate_customization RUN source /app/venv/bin/activate && uv pip install --no-cache-dir /usr/src/weblate_customization ENV DJANGO_SETTINGS_MODULE=weblate_customization.settings USER 1000 ``` 4. Instead of using the official Weblate Docker image, build a custom image from this `Dockerfile` file. There is [no clean way](https://github.com/docker/compose/issues/7231) to do this with `docker-compose.override.yml`. You *could* add `build: .` to the `weblate` node in that file, but then your custom image will be tagged as `weblate/weblate` in your system, which could be problematic. So, instead of using the `docker-compose.yml` straight from the [official repository](https://github.com/WeblateOrg/docker-compose), unmodified, and extending it through `docker-compose.override.yml`, you may want to make a copy of the official `docker-compose.yml` file, and edit your copy to replace `image: weblate/weblate` with `build: .`. See the [Compose file build reference](https://docs.docker.com/reference/compose-file/build/) for details on building images from source when using `docker-compose`. 5. Extend your custom settings module to define or redefine settings. You can define settings before or after the import statement above to determine which settings take precedence. Settings defined before the import statement can be overridden by environment variables and setting overrides defined in the data volume. Setting defined after the import statement cannot be overridden. You can also go further. For example, you can reproduce some of the things that `weblate.docker_settings` [does](https://github.com/WeblateOrg/weblate/blob/main/weblate/settings_docker.py), such as exposing settings as environment variables, or allow overriding settings from Python files in the data volume. ### Replacing logo and other static files The static files coming with Weblate can be overridden by placing into `/app/data/python/customize/static` (see [Docker container volumes](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume)). For example creating `/app/data/python/customize/static/favicon.ico` will replace the favicon. #### HINT The files are copied to the corresponding location upon container startup, so a restart of Weblate is needed after changing the content of the volume. This approach can be also used to override Weblate templates. For example, custom [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) documents and styles can be provided as described in [Customizing legal documents and styles](https://docs.weblate.org/en/latest/admin/optionals.md#legal-customization). Alternatively you can also include own module (see [Customizing Weblate](https://docs.weblate.org/en/latest/admin/customize.md)) and add it as separate volume to the Docker container, for example: ```yaml weblate: volumes: - weblate-data:/app/data - ./weblate_customization/weblate_customization:/app/data/python/weblate_customization environment: WEBLATE_ADD_APPS: weblate_customization ``` ### Customizing code #### NOTE The internal Weblate API may vary significantly between releases and is not meant to be stable. Please review your custom code interacting with Weblate internals on each upgrade. You can place additional Python code into `/app/data/python/customize` (see [Docker container volumes](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-volume)). It is already installed as a Django application inside Weblate (this is used for customizing templates and static files as described above). This can be used to place any code (for example [Writing own checks](https://docs.weblate.org/en/latest/admin/checks.md#own-checks)) or to add custom maintenance tasks to the Celery task scheduler. ```python """Custom scheduled task.""" from __future__ import annotations # ruff: ignore[suspicious-subprocess-import] import subprocess from typing import TYPE_CHECKING from celery.schedules import crontab from weblate.utils.celery import app if TYPE_CHECKING: from celery import Celery @app.task def custom_task() -> None: """Execute custom task code.""" # ruff: ignore[start-process-with-partial-path] subprocess.run(["sleep", "1"], check=True) @app.on_after_finalize.connect def setup_periodic_tasks(sender: Celery, **kwargs: object) -> None: """Configure when periodic task is triggered.""" sender.add_periodic_task( crontab(hour=1, minute=0), custom_task.s(), name="custom-task" ) ``` ## Integrating third-party containers The Weblate Docker setup can be extended with additional containers to provide complementary services such as machine translation, spell checking, or other tools that enhance the translation workflow. These services can be integrated into your Docker Compose configuration and work alongside Weblate. When adding third-party containers, consider the following: * **Network connectivity**: Ensure containers can communicate with each other by placing them on the same Docker network * **Data persistence**: Use volumes for services that need to persist data * **Security**: Configure appropriate access controls and avoid exposing unnecessary ports ### LibreTranslate Docker container integration [LibreTranslate](https://libretranslate.com/) is a free and open-source machine translation service that can be self-hosted. Integrating it with Weblate provides offline machine translation capabilities without relying on external services. You can incorporate the LibreTranslate service into your Weblate deployment by including it in a `docker-compose.override.yml` file. Since it runs within the Docker network, it’s only accessible to Weblate and not exposed to the public internet. Basic setup using `docker-compose.override.yml`: ```yaml services: libretranslate: image: libretranslate/libretranslate:latest command: --disable-web-ui restart: unless-stopped environment: LT_UPDATE_MODELS: true volumes: - libretranslate_models:/home/libretranslate/.local:rw healthcheck: test: ['CMD-SHELL', './venv/bin/python scripts/healthcheck.py'] interval: 10s timeout: 4s retries: 4 start_period: 5s volumes: libretranslate_models: ``` For GPU-accelerated translation (if you have NVIDIA GPU available): ```yaml services: libretranslate: image: libretranslate/libretranslate:latest-cuda command: --disable-web-ui restart: unless-stopped environment: LT_UPDATE_MODELS: true PUID: root volumes: - libretranslate_models:/home/libretranslate/.local:rw healthcheck: test: ['CMD-SHELL', './venv/bin/python scripts/healthcheck.py'] interval: 10s timeout: 4s retries: 4 start_period: 5s deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] volumes: libretranslate_models: ``` After starting the services with `docker compose down && docker compose up -d`, configure LibreTranslate in Weblate: 1. Access the Weblate admin interface 2. Navigate to Machine translation → Automatic suggestions 3. Add a new LibreTranslate service with: * **Service:** LibreTranslate * **API URL:** `http://libretranslate:5000` * **API key:** Leave empty LibreTranslate is now configured and available for machine translation in Weblate. #### NOTE * The LibreTranslate service runs without the web UI (`--disable-web-ui`) and is only accessible via the API within the Docker network. * Models are automatically updated when the container starts. (`LT_UPDATE_MODELS: true`) * Data is persisted using Docker volumes for optimal performance and data safety. * Health checks ensure that the Docker engine properly observes the state of the service. * For GPU acceleration, use the CUDA image variant and ensure your system has NVIDIA Docker support. This container runs as a privileged user to be able to use the GPU. * No external ports are exposed, making the setup secure by default. #### SEE ALSO * [LibreTranslate](https://docs.weblate.org/en/latest/admin/machine.md#mt-libretranslate) * [LibreTranslate Docker documentation](https://docs.libretranslate.com/guides/installation/#with-docker) * [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup) ### Anubis Docker container integration [Anubis](https://anubis.techaro.lol/) is a web AI firewall utility to block AI scrapers and other disruptive traffic on the server. It is typically needed for publicly open Weblate installations to avoid excessive load caused by scraping. Anubis can be deployed using Docker Compose: ```yaml anubis: image: ghcr.io/techarohq/anubis:latest environment: BIND: ":8923" DIFFICULTY: "4" METRICS_BIND: ":9090" SERVE_ROBOTS_TXT: "false" OG_PASSTHROUGH: "false" # The single space in TARGET enables subrequest authentication TARGET: " " # The redirect domain has to match WEBLATE_SITE_DOMAIN REDIRECT_DOMAINS: weblate.example.com # Generate a random private key using: openssl rand -hex 32 ED25519_PRIVATE_KEY_HEX: "..." # Customize your Anubis policy POLICY_FNAME: /data/botPolicies.yaml healthcheck: test: ["CMD", "anubis", "--healthcheck"] interval: 5s timeout: 30s retries: 5 start_period: 500ms volumes: - anubis-data:/data volumes: anubis-data: ``` #### NOTE The `anubis-data` volume in the above configuration is expected to contain `botPolicies.yaml` with a bot policy configured to your needs. At minimum, you need to adjust status codes as described in [https://anubis.techaro.lol/docs/admin/configuration/subrequest-auth](https://anubis.techaro.lol/docs/admin/configuration/subrequest-auth). It is also recommended to configure persistent storage backend as described in [https://anubis.techaro.lol/docs/admin/policies/#storage-backends](https://anubis.techaro.lol/docs/admin/policies/#storage-backends). You can then turn on the Anubis usage in Weblate using: ```yaml environment: WEBLATE_ANUBIS_URL: http://anubis:8923 ``` #### SEE ALSO [`WEBLATE_ANUBIS_URL`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ANUBIS_URL) ## Configuring PostgreSQL server The PostgreSQL container uses default PostgreSQL configuration and it won’t effectively utilize your CPU cores or memory. It is recommended to customize the configuration to improve the performance. The configuration can be adjusted as described in Database Configuration at [https://hub.docker.com/_/postgres](https://hub.docker.com/_/postgres). The configuration matching your environment can be generated using [https://pgtune.leopard.in.ua/](https://pgtune.leopard.in.ua/). ## Container internals The container is using **supervisor** to start individual services. In case of [Scaling horizontally](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-scaling), it only starts single service in a container. To check the services status use: ```sh docker compose exec --user weblate weblate supervisorctl status ``` The Celery services depend on [`CELERY_WORKER_MODE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_WORKER_MODE). The default `combined` mode runs `celery-combined`, while `single` mode runs `celery-single`. You can stop all task processing in the default mode using: ```sh docker compose exec --user weblate weblate supervisorctl stop celery-combined ``` The `split` mode runs an individual service for each Celery queue (see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) for details). In this mode, you can stop processing some tasks by stopping the appropriate worker: ```sh docker compose exec --user weblate weblate supervisorctl stop celery-translate ``` # admin/install/kubernetes.md # Installing on Kubernetes #### NOTE This guide is looking for contributors experienced with Kubernetes to cover the setup in more details. With the Kubernetes Helm chart you can get your personal Weblate instance up and running in seconds. All of Weblate’s dependencies are already included. PostgreSQL is set up as the default database and persistent volume claims are used. You can find the chart at <[https://github.com/WeblateOrg/helm/](https://github.com/WeblateOrg/helm/)> and it can be displayed at <[https://artifacthub.io/packages/helm/weblate/weblate](https://artifacthub.io/packages/helm/weblate/weblate)>. ## Installation ```shell helm repo add weblate https://helm.weblate.org helm install my-release weblate/weblate ``` ## Configuration For further configuration options, see [Docker environment variables](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-environment) for full list of environment variables. # admin/install/openshift.md # Installing on OpenShift With the OpenShift Weblate template you can get your personal Weblate instance up and running in seconds. All of Weblate’s dependencies are already included. PostgreSQL is set up as the default database and persistent volume claims are used. You can find the template at <[https://github.com/WeblateOrg/openshift/](https://github.com/WeblateOrg/openshift/)>. ## Installation The following examples assume you have a working OpenShift v3.x environment, with `oc` client tool installed. Please check the OpenShift documentation for instructions. The `template.yml` is suited for running all components in OpenShift. There is also `template-external-postgresql.yml` which does not start a PostgreSQL server and allows you to configure external PostgreSQL server. ### Web Console Copy the raw content from [template.yml](https://github.com/WeblateOrg/openshift/blob/main/template.yml) and import them into your project, then use the Create button in the OpenShift web console to create your application. The web console will prompt you for the values for all of the parameters used by the template. ### CLI To upload the Weblate template to your current project’s template library, pass the `template.yml` file with the following command: ```bash $ oc create -f https://raw.githubusercontent.com/WeblateOrg/openshift/main/template.yml \ -n ``` The template is now available for selection using the web console or the CLI. #### Parameters The parameters that you can override are listed in the parameters section of the template. You can list them with the CLI by using the following command and specifying the file to be used: ```bash $ oc process --parameters -f https://raw.githubusercontent.com/WeblateOrg/openshift/main/template.yml # If the template is already uploaded $ oc process --parameters -n weblate ``` #### Provisioning You can also use the CLI to process templates and use the configuration that is generated to create objects immediately. ```bash $ oc process -f https://raw.githubusercontent.com/WeblateOrg/openshift/main/template.yml \ -p APPLICATION_NAME=weblate \ -p WEBLATE_VERSION=4.3.1-1 \ -p WEBLATE_SITE_DOMAIN=weblate.app-openshift.example.com \ -p POSTGRESQL_IMAGE=docker-registry.default.svc:5000/openshift/postgresql:9.6 \ -p REDIS_IMAGE=docker-registry.default.svc:5000/openshift/redis:3.2 \ | oc create -f ``` The Weblate instance should be available after successful migration and deployment at the specified `WEBLATE_SITE_DOMAIN` parameter. After container setup, you can sign in as admin user with password provided in `WEBLATE_ADMIN_PASSWORD`, or a random password generated on first start if that was not set. To reset admin password, restart the container with `WEBLATE_ADMIN_PASSWORD` set to new password in the respective `Secret`. #### Eliminate ```bash $ oc delete all -l app= $ oc delete configmap -l app= $ oc delete secret -l app= # ATTENTION! The following command is only optional and will permanently delete all of your data. $ oc delete pvc -l app= $ oc delete all -l app=weblate \ && oc delete secret -l app=weblate \ && oc delete configmap -l app=weblate \ && oc delete pvc -l app=weblate ``` ## Configuration By processing the template a respective `ConfigMap` will be created and which can be used to customize the Weblate image. The `ConfigMap` is directly mounted as environment variables and triggers a new deployment every time it is changed. For further configuration options, see [Docker environment variables](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-environment) for full list of environment variables. # admin/install/source.md # Installing from sources 1. Please follow the installation instructions for your system first up to installing Weblate: * [Installing on Debian and Ubuntu](https://docs.weblate.org/en/latest/admin/install/venv-debian.md) * [Installing on SUSE and openSUSE](https://docs.weblate.org/en/latest/admin/install/venv-suse.md) * [Installing on RedHat, Fedora and CentOS](https://docs.weblate.org/en/latest/admin/install/venv-redhat.md) 2. Grab the latest Weblate sources using Git (or download a tarball and unpack that): ```sh git clone https://github.com/WeblateOrg/weblate.git weblate-src ``` Alternatively you can use released archives. You can download them from our website <[https://weblate.org/](https://weblate.org/)>. Those downloads are cryptographically signed, please see [Verifying release artifacts](https://docs.weblate.org/en/latest/security/release-artifacts.md#verify). 3. Install current Weblate code into the Python environment: ```sh . ~/weblate-env/bin/activate uv pip install -e 'weblate-src[all]' ``` If you intend to run the testsuite from the source checkout, install the development dependencies as described in [Local testing of Weblate](https://docs.weblate.org/en/latest/contributing/tests.md#local-tests). 4. Copy `weblate/settings_example.py` to `weblate/settings.py`. 5. Adjust the values in the new `settings.py` file to your liking. You will need to provide at least the database credentials and Django secret key, but you will want more changes for production setup, see [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration). 6. Create the database used by Weblate, see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup). 7. Build Django tables, static files and initial data (see [Filling up the database](https://docs.weblate.org/en/latest/admin/install.md#tables-setup) and [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files)): ```sh weblate migrate weblate collectstatic ``` #### NOTE This step should be repeated whenever you update the repository. ## Packaging Weblate for distributions The dependency versions in `pyproject.toml` describe the runtime environment tested by the Weblate project. They are intentionally strict for installs from PyPI and for the Weblate release process, because Weblate cannot validate every dependency-version combination covered by wider version ranges. Distribution packages can replace those Python packages with versions from the distribution package set. When doing so, run Weblate’s test suite against the packaged dependency set and treat passing tests as the compatibility signal for the distribution package. Keep Weblate’s tightly coupled companion packages in sync with the Weblate release: * [weblate-fonts](https://pypi.org/project/weblate-fonts/) * [weblate_schemas](https://pypi.org/project/weblate_schemas/) * [weblate-language-data](https://pypi.org/project/weblate-language-data/) * [translation-finder](https://pypi.org/project/translation-finder/) * [translate-toolkit](https://pypi.org/project/translate-toolkit/) Mismatched versions of these packages are more likely to break at runtime or during tests than other Python dependency substitutions. #### SEE ALSO See [Local testing of Weblate](https://docs.weblate.org/en/latest/contributing/tests.md#local-tests) for test setup and [Release cycle](https://docs.weblate.org/en/latest/security/releases.md#release-cycle) for Weblate’s release cadence. # admin/install/steps/adjust-config.md Adjust the values in the new `settings.py` file to your liking. You will need to provide at least the database credentials and Django secret key, but you will want more changes for production setup, see [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration). # admin/install/steps/hw.md # Hardware requirements Weblate should run on any contemporary hardware without problems, the following is the minimal configuration required to run Weblate on a single host (Weblate, database and web server): * 3 GB of RAM * 2 CPU cores * 1 GB of storage space #### NOTE Actual requirements for your installation of Weblate vary heavily based on the size of the translations managed in it. ## Memory usage The more memory the better - it is used for caching on all levels (file system, database and Weblate). For hundreds of translation components, at least 4 GB of RAM is recommended. #### HINT For systems with less memory than recommended, [Single-process Celery setup](https://docs.weblate.org/en/latest/admin/install.md#minimal-celery) is recommended. ## CPU usage Many concurrent users increase the amount of needed CPU cores. ## Storage usage The typical database storage usage is around 300 MB per 1 million hosted words. Storage space needed for cloned repositories varies, but Weblate tries to keep their size minimal by doing shallow clones. ## Storage performance Version control operations perform many filesystem metadata lookups. The `vcs` subdirectory in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) therefore needs low read latency; storage with slow metadata access can make operations such as **git status** take a long time even when its bulk throughput is good. Keep [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) on low-latency local or temporary storage when possible. The deployment checks measure metadata lookup latency for both locations and warn when the median latency exceeds 10 milliseconds. This is an approximate point-in-time measurement affected by filesystem and system load. Rerun **weblate check --deploy** before changing the storage configuration. ## Nodes For small and medium-sized sites (millions of hosted words), all Weblate components (see [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture)) can be run on a single node. When you grow to hundreds of millions of hosted words, it is recommended to have a dedicated node for database (see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup)). # admin/install/steps/install-after.md # After installation Congratulations, your Weblate server is now running and you can start using it. * You can now access Weblate on `http://localhost:8000/`. * Sign in with admin credentials obtained during installation or register with new users. * You can now run Weblate commands using **weblate** command when Weblate Python environment is active, see [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage). * You can stop the test server with `Ctrl`+`C`. * Review potential issues with your installation either on `/manage/performance/` URL (see [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance)) or using **weblate check --deploy**, see [Production setup](https://docs.weblate.org/en/latest/admin/install.md#production). ## Adding translation 1. Open the admin interface (`http://localhost:8000/create/project/`) and create the project you want to translate. See [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) for more details. All you need to specify here is the project name and its website. 2. Create a component which is the real object for translation - it points to the VCS repository, and selects which files to translate. See [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for more details. The important fields here are: [Component name](https://docs.weblate.org/en/latest/admin/projects.md#component-name), [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), and [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) for finding translatable files. Weblate supports a wide range of formats including [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext), [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource), [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md#apple), [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop), [Stringsdict format](https://docs.weblate.org/en/latest/formats/stringsdict.md#stringsdict) or [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent), see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) for more details. 3. Once the above is completed (it can be lengthy process depending on the size of your VCS repository, and number of messages to translate), you can start translating. # admin/install/steps/install-configure.md # Configuring Weblate #### NOTE The following assumes the Python environment used by Weblate is activated (by executing `. ~/weblate-env/bin/activate`). If not, specify the full path to the **weblate** command as `~/weblate-env/bin/weblate`. 1. Copy the file `~/weblate-env/lib/python3.9/site-packages/weblate/settings_example.py` to `~/weblate-env/lib/python3.9/site-packages/weblate/settings.py`. 2. Adjust the values in the new `settings.py` file to your liking. You will need to provide at least the database credentials and Django secret key, but you will want more changes for production setup, see [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration). 3. Create the database and its structure for Weblate (the example settings use PostgreSQL, check [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) for a production-ready setup): ```sh weblate migrate ``` #### SEE ALSO [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate) 4. Create an administrator user account `admin`, generate its password, and copy it to the clipboard; remember to save it for later use: ```sh weblate createadmin ``` #### HINT If you previously missed/lost the admin password, you can generate a new one with the following command: ```sh weblate createadmin --update ``` #### SEE ALSO [`createadmin`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-createadmin) 5. Collect the static files for your web server (see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server) and [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files)): ```sh weblate collectstatic ``` 6. Start the Celery workers. This is not necessary for development purposes, but strongly recommended otherwise. [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) has more info: ```sh celery --app=weblate.utils worker --beat \ --queues=celery,notify,memory,translate,backup \ --prefetch-multiplier=1 ``` 7. Start the development server ([Running server](https://docs.weblate.org/en/latest/admin/install.md#server) details a production setup): ```sh weblate runserver ``` # admin/install/steps/install-python.md # Python modules #### HINT We’re installing Weblate in a separate Python environment. 1. Create the Python environment for Weblate: ```sh uv venv ~/weblate-env ``` 2. Activate the Python environment for Weblate: ```sh . ~/weblate-env/bin/activate ``` 3. Install Weblate including all optional dependencies: ```sh # Install Weblate with all optional dependencies uv pip install "weblate[all]" ``` Please check [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps) for fine-tuning of optional dependencies. #### SEE ALSO * [Using Python environments](https://docs.astral.sh/uv/pip/environments/) * [Troubleshooting pip install](https://docs.weblate.org/en/latest/admin/install.md#troubleshoot-pip-install) # admin/install/steps/install-system-devel.md # Installation ## System requirements Install the dependencies needed to build the Python modules (see [Software requirements](https://docs.weblate.org/en/latest/admin/install.md#requirements)): # admin/install/steps/install-system-optional.md Install wanted optional dependencies depending on features you intend to use (see [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps)): # admin/install/steps/install-system-server.md Optionally install software for running production server, see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server), [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup), [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery). Depending on size of your installation you might want to run these components on dedicated servers. The local installation instructions: # admin/install/steps/install-uv.md # uv package manager #### HINT We’re using uv package manager to install Weblate. ```sh curl -LsSf https://astral.sh/uv/install.sh | sh ``` #### SEE ALSO [Installing uv](https://docs.astral.sh/uv/getting-started/installation/) # admin/install/venv-debian.md # Installing on Debian and Ubuntu ## Hardware requirements Weblate should run on any contemporary hardware without problems, the following is the minimal configuration required to run Weblate on a single host (Weblate, database and web server): * 3 GB of RAM * 2 CPU cores * 1 GB of storage space #### NOTE Actual requirements for your installation of Weblate vary heavily based on the size of the translations managed in it. ### Memory usage The more memory the better - it is used for caching on all levels (file system, database and Weblate). For hundreds of translation components, at least 4 GB of RAM is recommended. #### HINT For systems with less memory than recommended, [Single-process Celery setup](https://docs.weblate.org/en/latest/admin/install.md#minimal-celery) is recommended. ### CPU usage Many concurrent users increase the amount of needed CPU cores. ### Storage usage The typical database storage usage is around 300 MB per 1 million hosted words. Storage space needed for cloned repositories varies, but Weblate tries to keep their size minimal by doing shallow clones. ### Storage performance Version control operations perform many filesystem metadata lookups. The `vcs` subdirectory in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) therefore needs low read latency; storage with slow metadata access can make operations such as **git status** take a long time even when its bulk throughput is good. Keep [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) on low-latency local or temporary storage when possible. The deployment checks measure metadata lookup latency for both locations and warn when the median latency exceeds 10 milliseconds. This is an approximate point-in-time measurement affected by filesystem and system load. Rerun **weblate check --deploy** before changing the storage configuration. ### Nodes For small and medium-sized sites (millions of hosted words), all Weblate components (see [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture)) can be run on a single node. When you grow to hundreds of millions of hosted words, it is recommended to have a dedicated node for database (see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup)). ## Installation ### System requirements Install the dependencies needed to build the Python modules (see [Software requirements](https://docs.weblate.org/en/latest/admin/install.md#requirements)): ```sh apt install -y \ libxml2-dev libxslt-dev libfreetype6-dev libjpeg-dev libz-dev libyaml-dev \ libffi-dev \ libacl1-dev liblz4-dev libzstd-dev libxxhash-dev libssl-dev libpq-dev libjpeg-dev build-essential \ python3-gdbm python3-dev git ``` Install wanted optional dependencies depending on features you intend to use (see [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps)): ```sh apt install -y \ libldap2-dev libldap-common libsasl2-dev \ libxmlsec1-dev ``` Optionally install software for running production server, see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server), [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup), [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery). Depending on size of your installation you might want to run these components on dedicated servers. The local installation instructions: ```sh # Web server option 1: NGINX and uWSGI apt install -y nginx uwsgi uwsgi-plugin-python3 # Web server option 2: Apache with ``mod_wsgi`` apt install -y apache2 libapache2-mod-wsgi-py3 # Caching backend: Valkey apt install -y valkey-server # Database server: PostgreSQL apt install -y postgresql postgresql-contrib # SMTP server apt install -y exim4 # Gettext tools for gettext POT/PO update add-ons apt install -y gettext ``` ### uv package manager #### HINT We’re using uv package manager to install Weblate. ```sh curl -LsSf https://astral.sh/uv/install.sh | sh ``` #### SEE ALSO [Installing uv](https://docs.astral.sh/uv/getting-started/installation/) ### Python modules #### HINT We’re installing Weblate in a separate Python environment. 1. Create the Python environment for Weblate: ```sh uv venv ~/weblate-env ``` 2. Activate the Python environment for Weblate: ```sh . ~/weblate-env/bin/activate ``` 3. Install Weblate including all optional dependencies: ```sh # Install Weblate with all optional dependencies uv pip install "weblate[all]" ``` Please check [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps) for fine-tuning of optional dependencies. #### SEE ALSO * [Using Python environments](https://docs.astral.sh/uv/pip/environments/) * [Troubleshooting pip install](https://docs.weblate.org/en/latest/admin/install.md#troubleshoot-pip-install) ### Configuring Weblate #### NOTE The following assumes the Python environment used by Weblate is activated (by executing `. ~/weblate-env/bin/activate`). If not, specify the full path to the **weblate** command as `~/weblate-env/bin/weblate`. 1. Copy the file `~/weblate-env/lib/python3.9/site-packages/weblate/settings_example.py` to `~/weblate-env/lib/python3.9/site-packages/weblate/settings.py`. 2. Adjust the values in the new `settings.py` file to your liking. You will need to provide at least the database credentials and Django secret key, but you will want more changes for production setup, see [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration). 3. Create the database and its structure for Weblate (the example settings use PostgreSQL, check [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) for a production-ready setup): ```sh weblate migrate ``` #### SEE ALSO [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate) 4. Create an administrator user account `admin`, generate its password, and copy it to the clipboard; remember to save it for later use: ```sh weblate createadmin ``` #### HINT If you previously missed/lost the admin password, you can generate a new one with the following command: ```sh weblate createadmin --update ``` #### SEE ALSO [`createadmin`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-createadmin) 5. Collect the static files for your web server (see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server) and [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files)): ```sh weblate collectstatic ``` 6. Start the Celery workers. This is not necessary for development purposes, but strongly recommended otherwise. [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) has more info: ```sh celery --app=weblate.utils worker --beat \ --queues=celery,notify,memory,translate,backup \ --prefetch-multiplier=1 ``` 7. Start the development server ([Running server](https://docs.weblate.org/en/latest/admin/install.md#server) details a production setup): ```sh weblate runserver ``` ## After installation Congratulations, your Weblate server is now running and you can start using it. * You can now access Weblate on `http://localhost:8000/`. * Sign in with admin credentials obtained during installation or register with new users. * You can now run Weblate commands using **weblate** command when Weblate Python environment is active, see [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage). * You can stop the test server with `Ctrl`+`C`. * Review potential issues with your installation either on `/manage/performance/` URL (see [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance)) or using **weblate check --deploy**, see [Production setup](https://docs.weblate.org/en/latest/admin/install.md#production). ### Adding translation 1. Open the admin interface (`http://localhost:8000/create/project/`) and create the project you want to translate. See [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) for more details. All you need to specify here is the project name and its website. 2. Create a component which is the real object for translation - it points to the VCS repository, and selects which files to translate. See [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for more details. The important fields here are: [Component name](https://docs.weblate.org/en/latest/admin/projects.md#component-name), [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), and [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) for finding translatable files. Weblate supports a wide range of formats including [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext), [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource), [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md#apple), [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop), [Stringsdict format](https://docs.weblate.org/en/latest/formats/stringsdict.md#stringsdict) or [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent), see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) for more details. 3. Once the above is completed (it can be lengthy process depending on the size of your VCS repository, and number of messages to translate), you can start translating. # admin/install/venv-macos.md # Installing on macOS ## Hardware requirements Weblate should run on any contemporary hardware without problems, the following is the minimal configuration required to run Weblate on a single host (Weblate, database and web server): * 3 GB of RAM * 2 CPU cores * 1 GB of storage space #### NOTE Actual requirements for your installation of Weblate vary heavily based on the size of the translations managed in it. ### Memory usage The more memory the better - it is used for caching on all levels (file system, database and Weblate). For hundreds of translation components, at least 4 GB of RAM is recommended. #### HINT For systems with less memory than recommended, [Single-process Celery setup](https://docs.weblate.org/en/latest/admin/install.md#minimal-celery) is recommended. ### CPU usage Many concurrent users increase the amount of needed CPU cores. ### Storage usage The typical database storage usage is around 300 MB per 1 million hosted words. Storage space needed for cloned repositories varies, but Weblate tries to keep their size minimal by doing shallow clones. ### Storage performance Version control operations perform many filesystem metadata lookups. The `vcs` subdirectory in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) therefore needs low read latency; storage with slow metadata access can make operations such as **git status** take a long time even when its bulk throughput is good. Keep [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) on low-latency local or temporary storage when possible. The deployment checks measure metadata lookup latency for both locations and warn when the median latency exceeds 10 milliseconds. This is an approximate point-in-time measurement affected by filesystem and system load. Rerun **weblate check --deploy** before changing the storage configuration. ### Nodes For small and medium-sized sites (millions of hosted words), all Weblate components (see [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture)) can be run on a single node. When you grow to hundreds of millions of hosted words, it is recommended to have a dedicated node for database (see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup)). ## Installation ### System requirements Install the dependencies needed to build the Python modules (see [Software requirements](https://docs.weblate.org/en/latest/admin/install.md#requirements)): ```sh brew install python libyaml pkgconf zstd lz4 xxhash libxmlsec1 uv ``` Optionally install software for running production server, see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server), [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup), [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery). Depending on size of your installation you might want to run these components on dedicated servers. The local installation instructions: ```sh # Web server option 1: NGINX and uWSGI brew install nginx uwsgi # Web server option 2: Apache with ``mod_wsgi`` brew install httpd # Caching backend: Valkey brew install valkey # Database server: PostgreSQL brew install postgresql # Gettext tools for gettext POT/PO update add-ons brew install gettext ``` ### Python modules #### HINT We’re installing Weblate in a separate Python environment. 1. Create the Python environment for Weblate: ```sh uv venv ~/weblate-env ``` 2. Activate the Python environment for Weblate: ```sh . ~/weblate-env/bin/activate ``` 3. Install Weblate including all optional dependencies: ```sh # Install Weblate with all optional dependencies uv pip install "weblate[all]" ``` Please check [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps) for fine-tuning of optional dependencies. #### SEE ALSO * [Using Python environments](https://docs.astral.sh/uv/pip/environments/) * [Troubleshooting pip install](https://docs.weblate.org/en/latest/admin/install.md#troubleshoot-pip-install) ### Configuring Weblate #### NOTE The following assumes the Python environment used by Weblate is activated (by executing `. ~/weblate-env/bin/activate`). If not, specify the full path to the **weblate** command as `~/weblate-env/bin/weblate`. 1. Copy the file `~/weblate-env/lib/python3.9/site-packages/weblate/settings_example.py` to `~/weblate-env/lib/python3.9/site-packages/weblate/settings.py`. 2. Adjust the values in the new `settings.py` file to your liking. You will need to provide at least the database credentials and Django secret key, but you will want more changes for production setup, see [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration). 3. Create the database and its structure for Weblate (the example settings use PostgreSQL, check [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) for a production-ready setup): ```sh weblate migrate ``` #### SEE ALSO [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate) 4. Create an administrator user account `admin`, generate its password, and copy it to the clipboard; remember to save it for later use: ```sh weblate createadmin ``` #### HINT If you previously missed/lost the admin password, you can generate a new one with the following command: ```sh weblate createadmin --update ``` #### SEE ALSO [`createadmin`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-createadmin) 5. Collect the static files for your web server (see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server) and [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files)): ```sh weblate collectstatic ``` 6. Start the Celery workers. This is not necessary for development purposes, but strongly recommended otherwise. [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) has more info: ```sh celery --app=weblate.utils worker --beat \ --queues=celery,notify,memory,translate,backup \ --prefetch-multiplier=1 ``` 7. Start the development server ([Running server](https://docs.weblate.org/en/latest/admin/install.md#server) details a production setup): ```sh weblate runserver ``` ## After installation Congratulations, your Weblate server is now running and you can start using it. * You can now access Weblate on `http://localhost:8000/`. * Sign in with admin credentials obtained during installation or register with new users. * You can now run Weblate commands using **weblate** command when Weblate Python environment is active, see [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage). * You can stop the test server with `Ctrl`+`C`. * Review potential issues with your installation either on `/manage/performance/` URL (see [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance)) or using **weblate check --deploy**, see [Production setup](https://docs.weblate.org/en/latest/admin/install.md#production). ### Adding translation 1. Open the admin interface (`http://localhost:8000/create/project/`) and create the project you want to translate. See [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) for more details. All you need to specify here is the project name and its website. 2. Create a component which is the real object for translation - it points to the VCS repository, and selects which files to translate. See [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for more details. The important fields here are: [Component name](https://docs.weblate.org/en/latest/admin/projects.md#component-name), [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), and [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) for finding translatable files. Weblate supports a wide range of formats including [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext), [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource), [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md#apple), [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop), [Stringsdict format](https://docs.weblate.org/en/latest/formats/stringsdict.md#stringsdict) or [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent), see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) for more details. 3. Once the above is completed (it can be lengthy process depending on the size of your VCS repository, and number of messages to translate), you can start translating. # admin/install/venv-redhat.md # Installing on RedHat, Fedora and CentOS ## Hardware requirements Weblate should run on any contemporary hardware without problems, the following is the minimal configuration required to run Weblate on a single host (Weblate, database and web server): * 3 GB of RAM * 2 CPU cores * 1 GB of storage space #### NOTE Actual requirements for your installation of Weblate vary heavily based on the size of the translations managed in it. ### Memory usage The more memory the better - it is used for caching on all levels (file system, database and Weblate). For hundreds of translation components, at least 4 GB of RAM is recommended. #### HINT For systems with less memory than recommended, [Single-process Celery setup](https://docs.weblate.org/en/latest/admin/install.md#minimal-celery) is recommended. ### CPU usage Many concurrent users increase the amount of needed CPU cores. ### Storage usage The typical database storage usage is around 300 MB per 1 million hosted words. Storage space needed for cloned repositories varies, but Weblate tries to keep their size minimal by doing shallow clones. ### Storage performance Version control operations perform many filesystem metadata lookups. The `vcs` subdirectory in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) therefore needs low read latency; storage with slow metadata access can make operations such as **git status** take a long time even when its bulk throughput is good. Keep [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) on low-latency local or temporary storage when possible. The deployment checks measure metadata lookup latency for both locations and warn when the median latency exceeds 10 milliseconds. This is an approximate point-in-time measurement affected by filesystem and system load. Rerun **weblate check --deploy** before changing the storage configuration. ### Nodes For small and medium-sized sites (millions of hosted words), all Weblate components (see [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture)) can be run on a single node. When you grow to hundreds of millions of hosted words, it is recommended to have a dedicated node for database (see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup)). ## Installation ### System requirements Install the dependencies needed to build the Python modules (see [Software requirements](https://docs.weblate.org/en/latest/admin/install.md#requirements)): ```sh dnf install \ libxslt-devel libxml2-devel freetype-devel libjpeg-devel zlib-devel \ libyaml-devel libffi-devel libacl-devel lz4-devel libzstd-devel xxhash-devel \ libtool-ltdl-devel python3-devel git ``` Install wanted optional dependencies depending on features you intend to use (see [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps)): ```sh dnf install openldap-devel cyrus-sasl-devel dnf install xmlsec1-devel ``` Optionally install software for running production server, see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server), [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup), [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery). Depending on size of your installation you might want to run these components on dedicated servers. The local installation instructions: ```sh # Web server option 1: NGINX and uWSGI dnf install nginx uwsgi uwsgi-plugin-python3 # Web server option 2: Apache with ``mod_wsgi`` dnf install httpd python3-mod_wsgi # Caching backend: Valkey dnf install valkey # Database server: PostgreSQL dnf install postgresql postgresql-contrib # SMTP server dnf install postfix # Gettext tools for gettext POT/PO update add-ons dnf install gettext ``` ### uv package manager #### HINT We’re using uv package manager to install Weblate. ```sh curl -LsSf https://astral.sh/uv/install.sh | sh ``` #### SEE ALSO [Installing uv](https://docs.astral.sh/uv/getting-started/installation/) ### Python modules #### HINT We’re installing Weblate in a separate Python environment. 1. Create the Python environment for Weblate: ```sh uv venv ~/weblate-env ``` 2. Activate the Python environment for Weblate: ```sh . ~/weblate-env/bin/activate ``` 3. Install Weblate including all optional dependencies: ```sh # Install Weblate with all optional dependencies uv pip install "weblate[all]" ``` Please check [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps) for fine-tuning of optional dependencies. #### SEE ALSO * [Using Python environments](https://docs.astral.sh/uv/pip/environments/) * [Troubleshooting pip install](https://docs.weblate.org/en/latest/admin/install.md#troubleshoot-pip-install) ### Configuring Weblate #### NOTE The following assumes the Python environment used by Weblate is activated (by executing `. ~/weblate-env/bin/activate`). If not, specify the full path to the **weblate** command as `~/weblate-env/bin/weblate`. 1. Copy the file `~/weblate-env/lib/python3.9/site-packages/weblate/settings_example.py` to `~/weblate-env/lib/python3.9/site-packages/weblate/settings.py`. 2. Adjust the values in the new `settings.py` file to your liking. You will need to provide at least the database credentials and Django secret key, but you will want more changes for production setup, see [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration). 3. Create the database and its structure for Weblate (the example settings use PostgreSQL, check [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) for a production-ready setup): ```sh weblate migrate ``` #### SEE ALSO [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate) 4. Create an administrator user account `admin`, generate its password, and copy it to the clipboard; remember to save it for later use: ```sh weblate createadmin ``` #### HINT If you previously missed/lost the admin password, you can generate a new one with the following command: ```sh weblate createadmin --update ``` #### SEE ALSO [`createadmin`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-createadmin) 5. Collect the static files for your web server (see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server) and [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files)): ```sh weblate collectstatic ``` 6. Start the Celery workers. This is not necessary for development purposes, but strongly recommended otherwise. [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) has more info: ```sh celery --app=weblate.utils worker --beat \ --queues=celery,notify,memory,translate,backup \ --prefetch-multiplier=1 ``` 7. Start the development server ([Running server](https://docs.weblate.org/en/latest/admin/install.md#server) details a production setup): ```sh weblate runserver ``` ## After installation Congratulations, your Weblate server is now running and you can start using it. * You can now access Weblate on `http://localhost:8000/`. * Sign in with admin credentials obtained during installation or register with new users. * You can now run Weblate commands using **weblate** command when Weblate Python environment is active, see [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage). * You can stop the test server with `Ctrl`+`C`. * Review potential issues with your installation either on `/manage/performance/` URL (see [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance)) or using **weblate check --deploy**, see [Production setup](https://docs.weblate.org/en/latest/admin/install.md#production). ### Adding translation 1. Open the admin interface (`http://localhost:8000/create/project/`) and create the project you want to translate. See [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) for more details. All you need to specify here is the project name and its website. 2. Create a component which is the real object for translation - it points to the VCS repository, and selects which files to translate. See [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for more details. The important fields here are: [Component name](https://docs.weblate.org/en/latest/admin/projects.md#component-name), [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), and [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) for finding translatable files. Weblate supports a wide range of formats including [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext), [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource), [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md#apple), [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop), [Stringsdict format](https://docs.weblate.org/en/latest/formats/stringsdict.md#stringsdict) or [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent), see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) for more details. 3. Once the above is completed (it can be lengthy process depending on the size of your VCS repository, and number of messages to translate), you can start translating. # admin/install/venv-suse.md # Installing on SUSE and openSUSE ## Hardware requirements Weblate should run on any contemporary hardware without problems, the following is the minimal configuration required to run Weblate on a single host (Weblate, database and web server): * 3 GB of RAM * 2 CPU cores * 1 GB of storage space #### NOTE Actual requirements for your installation of Weblate vary heavily based on the size of the translations managed in it. ### Memory usage The more memory the better - it is used for caching on all levels (file system, database and Weblate). For hundreds of translation components, at least 4 GB of RAM is recommended. #### HINT For systems with less memory than recommended, [Single-process Celery setup](https://docs.weblate.org/en/latest/admin/install.md#minimal-celery) is recommended. ### CPU usage Many concurrent users increase the amount of needed CPU cores. ### Storage usage The typical database storage usage is around 300 MB per 1 million hosted words. Storage space needed for cloned repositories varies, but Weblate tries to keep their size minimal by doing shallow clones. ### Storage performance Version control operations perform many filesystem metadata lookups. The `vcs` subdirectory in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) therefore needs low read latency; storage with slow metadata access can make operations such as **git status** take a long time even when its bulk throughput is good. Keep [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) on low-latency local or temporary storage when possible. The deployment checks measure metadata lookup latency for both locations and warn when the median latency exceeds 10 milliseconds. This is an approximate point-in-time measurement affected by filesystem and system load. Rerun **weblate check --deploy** before changing the storage configuration. ### Nodes For small and medium-sized sites (millions of hosted words), all Weblate components (see [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture)) can be run on a single node. When you grow to hundreds of millions of hosted words, it is recommended to have a dedicated node for database (see [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup)). ## Installation ### System requirements Install the dependencies needed to build the Python modules (see [Software requirements](https://docs.weblate.org/en/latest/admin/install.md#requirements)): ```sh zypper install \ libxslt-devel libxml2-devel freetype-devel libjpeg-devel zlib-devel \ libyaml-devel libffi-devel libacl-devel liblz4-devel libzstd-devel libxxhash-devel \ python3-devel git ``` Install wanted optional dependencies depending on features you intend to use (see [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps)): ```sh zypper install libldap2-devel libsasl2-devel zypper install libxmlsec1-devel ``` Optionally install software for running production server, see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server), [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup), [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery). Depending on size of your installation you might want to run these components on dedicated servers. The local installation instructions: ```sh # Web server option 1: NGINX and uWSGI zypper install nginx uwsgi uwsgi-plugin-python3 # Web server option 2: Apache with ``mod_wsgi`` zypper install apache2 apache2-mod_wsgi # Caching backend: Valkey zypper install valkey-server # Database server: PostgreSQL zypper install postgresql postgresql-contrib # SMTP server zypper install postfix # Gettext tools for gettext POT/PO update add-ons zypper install gettext ``` ### uv package manager #### HINT We’re using uv package manager to install Weblate. ```sh curl -LsSf https://astral.sh/uv/install.sh | sh ``` #### SEE ALSO [Installing uv](https://docs.astral.sh/uv/getting-started/installation/) ### Python modules #### HINT We’re installing Weblate in a separate Python environment. 1. Create the Python environment for Weblate: ```sh uv venv ~/weblate-env ``` 2. Activate the Python environment for Weblate: ```sh . ~/weblate-env/bin/activate ``` 3. Install Weblate including all optional dependencies: ```sh # Install Weblate with all optional dependencies uv pip install "weblate[all]" ``` Please check [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps) for fine-tuning of optional dependencies. #### SEE ALSO * [Using Python environments](https://docs.astral.sh/uv/pip/environments/) * [Troubleshooting pip install](https://docs.weblate.org/en/latest/admin/install.md#troubleshoot-pip-install) ### Configuring Weblate #### NOTE The following assumes the Python environment used by Weblate is activated (by executing `. ~/weblate-env/bin/activate`). If not, specify the full path to the **weblate** command as `~/weblate-env/bin/weblate`. 1. Copy the file `~/weblate-env/lib/python3.9/site-packages/weblate/settings_example.py` to `~/weblate-env/lib/python3.9/site-packages/weblate/settings.py`. 2. Adjust the values in the new `settings.py` file to your liking. You will need to provide at least the database credentials and Django secret key, but you will want more changes for production setup, see [Adjusting configuration](https://docs.weblate.org/en/latest/admin/install.md#configuration). 3. Create the database and its structure for Weblate (the example settings use PostgreSQL, check [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) for a production-ready setup): ```sh weblate migrate ``` #### SEE ALSO [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate) 4. Create an administrator user account `admin`, generate its password, and copy it to the clipboard; remember to save it for later use: ```sh weblate createadmin ``` #### HINT If you previously missed/lost the admin password, you can generate a new one with the following command: ```sh weblate createadmin --update ``` #### SEE ALSO [`createadmin`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-createadmin) 5. Collect the static files for your web server (see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server) and [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files)): ```sh weblate collectstatic ``` 6. Start the Celery workers. This is not necessary for development purposes, but strongly recommended otherwise. [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) has more info: ```sh celery --app=weblate.utils worker --beat \ --queues=celery,notify,memory,translate,backup \ --prefetch-multiplier=1 ``` 7. Start the development server ([Running server](https://docs.weblate.org/en/latest/admin/install.md#server) details a production setup): ```sh weblate runserver ``` ## After installation Congratulations, your Weblate server is now running and you can start using it. * You can now access Weblate on `http://localhost:8000/`. * Sign in with admin credentials obtained during installation or register with new users. * You can now run Weblate commands using **weblate** command when Weblate Python environment is active, see [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage). * You can stop the test server with `Ctrl`+`C`. * Review potential issues with your installation either on `/manage/performance/` URL (see [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance)) or using **weblate check --deploy**, see [Production setup](https://docs.weblate.org/en/latest/admin/install.md#production). ### Adding translation 1. Open the admin interface (`http://localhost:8000/create/project/`) and create the project you want to translate. See [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) for more details. All you need to specify here is the project name and its website. 2. Create a component which is the real object for translation - it points to the VCS repository, and selects which files to translate. See [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for more details. The important fields here are: [Component name](https://docs.weblate.org/en/latest/admin/projects.md#component-name), [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), and [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) for finding translatable files. Weblate supports a wide range of formats including [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext), [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource), [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md#apple), [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop), [Stringsdict format](https://docs.weblate.org/en/latest/formats/stringsdict.md#stringsdict) or [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent), see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) for more details. 3. Once the above is completed (it can be lengthy process depending on the size of your VCS repository, and number of messages to translate), you can start translating. # admin/languages.md # Language definitions To present different translations properly, info about language name, text direction, plural definitions and language code are needed. ## Built-in language definitions Definitions for about 800 languages are included in Weblate and the list is extended in every release. Whenever Weblate is upgraded (more specifically whenever [`migrate`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-migrate) is executed, see [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions)) the database of languages is updated to include all language definitions shipped in Weblate. This feature can be disabled using [`UPDATE_LANGUAGES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-UPDATE_LANGUAGES). You can also enforce updating the database to match Weblate built-in data using [`setuplang`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-setuplang). #### SEE ALSO * [Extending built-in language definitions](https://docs.weblate.org/en/latest/contributing/modules.md#extending-languages) * [Current language definitions](https://github.com/WeblateOrg/language-data/blob/main/languages.csv) ## Parsing language codes While parsing translations, Weblate attempts to map language code (usually the ISO 639-1 one) from the [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) to any existing language object. You can further adjust this mapping at project level by [Language aliases](https://docs.weblate.org/en/latest/admin/projects.md#project-language-aliases). If no exact match can be found, an attempt will be made to best fit it into an existing language. Following steps are tried: * Case insensitive lookups. * Normalizing underscores and dashes. * Looking up built-in language aliases. * Looking up by language name. * Ignoring the default country code for a given language—choosing `cs` instead of `cs_CZ`. Should that also fail, a new language definition will be created using the defaults (left to right text direction, one plural). The automatically created language with code `xx_XX` will be named as xx_XX (generated). You might want to change this in the admin interface later, (see [Changing language definitions](https://docs.weblate.org/en/latest/admin/languages.md#changing-languages)) and report it to the issue tracker (see [Contributing to Weblate](https://docs.weblate.org/en/latest/contributing/index.md#contributing)), so that the proper definition can be added to the upcoming Weblate release. #### HINT In case you see something unwanted as a language, you might want to adjust [Language filter](https://docs.weblate.org/en/latest/admin/projects.md#component-language-regex) to ignore such file when parsing translations. #### SEE ALSO * [Language code](https://docs.weblate.org/en/latest/admin/languages.md#language-code) * [Adding new translations](https://docs.weblate.org/en/latest/devel/translations.md#adding-translation) ## Changing language definitions You can change language definitions in the languages interface (`/languages/` URL). While editing, ensure all fields are correct (especially plurals and text direction), otherwise translators will be unable to properly edit those translations. #### HINT Please consider contributing your changes back, see [Extending built-in language definitions](https://docs.weblate.org/en/latest/contributing/modules.md#extending-languages). ## Ambiguous language codes and macrolanguages In many cases it is not a good idea to use macrolanguage code for a translation. The typical problematic case might be Kurdish language, which might be written in Arabic or Latin script, depending on actual variant. To get correct behavior in Weblate, it is recommended to use individual language codes only and avoid macrolanguages. #### SEE ALSO [Macrolanguages at Wikipedia](https://en.wikipedia.org/wiki/ISO_639_macrolanguage) ## Language definitions Each language consists of following fields: ### Language code Code identifying the language. Weblate prefers two letter codes as defined by [ISO 639-1](https://en.wikipedia.org/wiki/ISO_639-1), but uses [ISO 639-2](https://en.wikipedia.org/wiki/ISO_639-2) or [ISO 639-3](https://en.wikipedia.org/wiki/ISO_639-3) codes for languages that do not have two letter code. It can also support extended codes as defined by [BCP 47](https://www.rfc-editor.org/info/bcp47). #### SEE ALSO * [Parsing language codes](https://docs.weblate.org/en/latest/admin/languages.md#language-parsing-codes) * [Adding new translations](https://docs.weblate.org/en/latest/devel/translations.md#adding-translation) ### Language name Visible name of the language. The language names included in Weblate are also being localized depending on user interface language. ### Text direction Determines whether language is written right to left or left to right. This property is autodetected correctly for most of the languages. ### Number of speakers Number of worldwide speakers of this language. ## Plural definitions Weblate comes with a built-in set of plural definitions. These are based on file-format specifications, CLDR, and other sources. #### WARNING Doing changes to the built-in plural definitions will most likely won’t have desired effect, as these rules need to match underlying implementation. Changing plural number or formula will affect only displaying of the strings, but not parsing and storing strings to the files. Should you think Weblate behaves incorrectly, please file an issue in our issue tracker. ### Plural number Number of plurals used in the language. ### Plural formula Gettext compatible plural formula used to determine which plural form is used for given count. The formula uses the same expression syntax as the `plural=` part of the Gettext `Plural-Forms` header. The `nplurals` value sets how many plural forms the language has, and the formula returns the zero-based index of the plural form to use for a count `n`. Weblate validates the formula using the Gettext parser provided by Python. The accepted syntax is a C-like integer expression with `n` as the only variable. It can use decimal numbers, parentheses, arithmetic operators (`+`, `-`, `*`, `/`, `%`), comparison and equality operators, logical operators (`&&`, `||`, `!`), and the ternary operator (`condition ? value1 : value2`). The result must be between `0` and `nplurals - 1`. For example, English uses: ```text nplurals=2; plural=n != 1; ``` #### SEE ALSO * [Plurals](https://docs.weblate.org/en/latest/user/translating.md#plurals) * [GNU gettext manual for plural forms](https://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms) * [GNU gettext plural formula parser](https://cgit.git.savannah.gnu.org/cgit/gettext.git/tree/gettext-runtime/intl/plural.y) * [Language Plural Rules by the Unicode Consortium](https://www.unicode.org/cldr/charts/43/supplemental/language_plural_rules.html) # admin/licensing.md # Licensing translations You can specify which license translations are contributed under. This is especially important to do if translations are open to the public, to stipulate what they can be used for. You should specify [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) license info. You should avoid requiring a contributor license agreement, though it is possible. ## License info Upon specifying license info (license name and URL), this info is shown in the translation info section of the respective [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component). Usually this is best place to post licensing info if no explicit consent is required. If your project or translation is not libre you most probably need prior consent. ## Contributor license agreement If you specify a [Contributor license agreement](https://docs.weblate.org/en/latest/admin/projects.md#component-agreement), only users who have agreed to it will be able to contribute. This is a clearly visible step when accessing the translation: ![image](screenshots/contributor-agreement.webp) ## User licenses Any user can review all translation licenses of all public projects on the instance from their profile: ![image](screenshots/profile-licenses.webp) # admin/machine.md # Automatic suggestions #### Versionchanged Changed in version 4.13: Prior to Weblate 4.13, the services were configured in the [Configuration](https://docs.weblate.org/en/latest/admin/config.md#config). The support for several machine translation and translation memory services is built-in. Each service can be turned on by the administrator for whole site (under Automatic suggestions in [Management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface)) or at the project settings: ![image](screenshots/project-machinery.webp) #### NOTE They come subject to their terms of use, so ensure you are allowed to use them how you want. Third-party services can receive source strings, translations, and related context from Weblate. The services translate from the source language as configured at [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component), see [Source language](https://docs.weblate.org/en/latest/admin/projects.md#component-source-language). Per-project automatic suggestion can also be configured via the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). #### SEE ALSO [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) ## Priority of machine translation and translation memory services [Weblate Translation Memory](https://docs.weblate.org/en/latest/admin/machine.md#mt-weblate-translation-memory) matches with 100% score take priority over machine translation services. If 100% match in translation memory is found, no machine translation is performed. If several 100% matches occur, the first one returned by the database is used. Each machine translation service has a predefined maximum score it can produce. The use of installed translation services is ordered according to their maximum score. For each string with translation score lower than the service’s maximum, the service is asked to produce a translation. Translations with a score exceeding the current one are accepted. ## Source strings for the machine translation #### Versionadded Added in version 5.11. The origin of source strings for all third-party services can be configured. This can be used to tweak the service to get the best results. Following choices are available: Automatic selection : Chooses the best source language automatically.
This is the default behavior. Component source language : Uses the component source language.
This was the behavior before the 5.11 release. Secondary language defined in project or component : Use project [Secondary language](https://docs.weblate.org/en/latest/admin/projects.md#project-secondary-language) or component [Secondary language](https://docs.weblate.org/en/latest/admin/projects.md#component-secondary-language).
Falls back to the automatic selection of the source language if the secondary language not configured. ## LLM translation context LLM-based automatic suggestion services receive additional context about each translated string, when available. This includes the string context or monolingual key, additional explanation, configured secondary-language translation, plural information, failing quality checks, and placeholder contents. Matching glossary entries are passed with their explanations and selected flags, so duplicate glossary terms can be disambiguated. You can add target-language-specific instructions in Language-specific instructions using a JSON object mapping language codes to text. Language codes have to exist in Weblate and are matched exactly; whitespace is not ignored. Each instruction can contain up to 1000 characters. Weblate first looks for the exact target language code and then falls back to the base language code. The added metadata is used only to guide the generated suggestion; the returned translation still has to preserve the source placeholders and markup. Weblate also sends a short previous chat exchange to LLM services to demonstrate the expected JSON response format. The exchange uses bundled translated examples when available for the source and target language pair, or language-neutral formatting examples otherwise. Existing translations for the same target language can be appended as additional examples. ## Alibaba #### Versionadded Added in version 5.3. * **Service ID:** `alibaba` * **Maximum score:** 80 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | Access key ID | | | `secret` | Access key secret | | | `region` | Region ID | | Alibaba Translate is a neural machine translation service for translating text and it supports up to 214 language pairs. #### SEE ALSO [Alibaba Translate Documentation](https://www.alibabacloud.com/help/en/machine-translation) ## Anthropic #### Versionadded Added in version 5.16. * **Service ID:** `anthropic` * **Maximum score:** 90 * **Advanced features:** * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * [LLM translation context](https://docs.weblate.org/en/latest/admin/machine.md#llm-translation-context) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |-------------------------|--------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `base_url` | Anthropic API URL | Base URL of the Anthropic API. Leave empty to use the default URL. | | `model` | Anthropic model | Available choices:

`claude-haiku-4-5` – Claude Haiku 4.5

`claude-sonnet-5` – Claude Sonnet 5

`claude-opus-5` – Claude Opus 5

`claude-fable-5-1` – Claude Fable 5.1

`claude-opus-4-8` – Claude Opus 4.8

`claude-fable-5` – Claude Fable 5

`custom` – Custom model | | `persona` | Translator persona | Describe the persona of translator to improve the accuracy of the translation. For example: “You are a squirrel breeder.” | | `style` | Translator style | Describe the style of translation. For example: “Use informal language.” | | `language_instructions` | Language-specific instructions | JSON object mapping existing target language codes to extra instructions, up to 1000 characters each. | | `key` | API key | | | `custom_model` | Custom model name | Only needed when model is set to ‘Custom model’ | | `max_tokens` | Max tokens | Maximum number of tokens to generate in the response. | Performs translation using [Anthropic’s Claude](https://www.anthropic.com/) models. The Anthropic API provides access to the Claude family of models, which are known for their strong reasoning and language capabilities. You need an API key from Anthropic to use this service. The model choices favor current generally available Claude models. Previously offered models remain selectable while Anthropic continues to support them. Use persona and style fields to further fine-tune translations. These will be used in a prompt for Claude and allow you to change the style of the translations. The service automatically uses [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary), see [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). #### SEE ALSO * [Anthropic API documentation](https://docs.anthropic.com/en/api/getting-started) * [Anthropic Console](https://platform.claude.com/) ## Apertium APy * **Service ID:** `apertium-apy` * **Maximum score:** 88 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `url` | API URL | | A libre software machine translation platform providing translations to a limited set of languages. The recommended way to use Apertium is to run your own Apertium-APy server. #### SEE ALSO * [Apertium website](https://www.apertium.org/) * [Apertium APy documentation](https://wiki.apertium.org/wiki/Apertium-apy) ## Amazon Translate * **Service ID:** `aws` * **Maximum score:** 88 * **Advanced features:** * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | Access key ID | | | `secret` | API secret key | | | `region` | Region name | | | `formality` | Formality | Available choices:

*empty value* – Default

`FORMAL` – Formal

`INFORMAL` – Informal | | `brevity` | Brevity | Prefer shorter translations when supported.

Available choices:

*empty value* – Default

`ON` – Enabled | | `profanity` | Profanity | Mask profane words in translated text.

Available choices:

*empty value* – Default

`MASK` – Mask profanity | Amazon Translate is a neural machine translation service for translating text to and from English across a breadth of supported languages. The service requires the TranslateFullAccess Managed Policy. The service automatically uses [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary), see [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). #### SEE ALSO * [Amazon Translate Documentation](https://docs.aws.amazon.com/translate/) * [AWS TranslateFullAccess Policy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/TranslateFullAccess.html) ## Azure OpenAI #### Versionadded Added in version 5.8. * **Service ID:** `azure-openai` * **Maximum score:** 90 * **Advanced features:** * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * [LLM translation context](https://docs.weblate.org/en/latest/admin/machine.md#llm-translation-context) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |-------------------------|--------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `base_url` | API URL | | | `model` | LLM model | | | `persona` | Translator persona | Describe the persona of translator to improve the accuracy of the translation. For example: “You are a squirrel breeder.” | | `style` | Translator style | Describe the style of translation. For example: “Use informal language.” | | `language_instructions` | Language-specific instructions | JSON object mapping existing target language codes to extra instructions, up to 1000 characters each. | | `key` | API key | | | `azure_endpoint` | Azure OpenAI endpoint URL | Endpoint URL of the instance, e.g: [https://my-instance.openai.azure.com](https://my-instance.openai.azure.com). | | `deployment` | Azure OpenAI deployment | The model’s unique deployment name. | Performs translation using [OpenAI](https://openai.com/) hosted on Azure. #### SEE ALSO [OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-openai) ## Baidu * **Service ID:** `baidu` * **Maximum score:** 90 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | Client ID | | | `secret` | Client secret | | Machine translation service provided by Baidu. This service uses an API and you need to obtain an ID and API key from Baidu to use it. #### SEE ALSO [Baidu Translate API](https://fanyi-api.baidu.com/product/11) ## CyrTranslit #### Versionadded Added in version 5.7. * **Service ID:** `cyrtranslit` * **Maximum score:** 100 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| Machine translation service using the Cyrtranslit library. This service converts text between Cyrillic and Latin scripts for languages that have both scripts. #### SEE ALSO [Cyrtranslit repository](https://github.com/opendatakosovo/cyrillic-transliteration) ## DeepL * **Service ID:** `deepl` * **Maximum score:** 91 * **Advanced features:** * [Placeables in automatic suggestion](https://docs.weblate.org/en/latest/user/checks.md#placeables-mt) * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `url` | API URL | | | `key` | API key | | | `formality` | Formality | Uses the specified formality if language is not specified as (in)formal | | `context` | Translation context | Describe the context of the translation to improve the accuracy of the translation. | | `next_gen` | Use next-gen model | Prefer next-gen LLM over classic machine translation model. | DeepL is a paid service providing good machine translation for a few languages. You need to purchase DeepL API subscription. API URL to use with the DeepL service. Configure the base endpoint without an API version; Weblate selects the appropriate DeepL API version for each request. For a legacy subscription requiring API v1, configure `https://api.deepl.com/v1/` instead. #### Versionchanged Changed in version 2026.9.1: Support for explicitly configured DeepL API v1 endpoints has been restored. `https://api.deepl.com/` (default in Weblate) : Is meant for API usage on the paid plan, and the subscription is usage-based. `https://api-free.deepl.com/` : Is meant for API usage on the free plan, and the subscription is usage-based. Weblate supports DeepL formality, it will choose matching one based on the language (for example, there is `de@formal` and `de@informal`). The translation context can optionally be specified to improve translations quality. Read more on that in [DeepL translation context documentation](https://developers.deepl.com/docs/learning-how-tos/examples-and-guides/how-to-use-context-parameter). The service automatically uses [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary), see [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). Glossary integration is not available with API v1. #### SEE ALSO * [DeepL translator](https://www.deepl.com/translator) * [DeepL pricing](https://www.deepl.com/pro) * [DeepL API documentation](https://developers.deepl.com/docs/getting-started/quickstart) ## Glosbe * **Service ID:** `glosbe` * **Maximum score:** 90 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| Free dictionary and translation memory for almost every living language. The API is gratis to use, but usage of the translations is subject to the license of the used data source. There is a limit of calls that may be done from one IP in a set period of time, to prevent abuse. #### SEE ALSO [Glosbe website](https://glosbe.com/) ## Google Cloud Translation Basic * **Service ID:** `google-translate` * **Maximum score:** 90 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | API key | | Machine translation service provided by the Google Cloud services. This service uses the Google Translation API v2, and you need to obtain an API key and turn on billing in the Google API console. #### SEE ALSO [Google translate documentation](https://docs.cloud.google.com/translate/docs) ## Google Cloud Translation Advanced * **Service ID:** `google-translate-api-v3` * **Maximum score:** 90 * **Advanced features:** * [Placeables in automatic suggestion](https://docs.weblate.org/en/latest/user/checks.md#placeables-mt) * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|---------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `credentials` | Google Translate service account info | Enter a JSON key for the service account. | | `project` | Google Translate project | Enter the numeric or alphanumeric ID of your Google Cloud project. | | `location` | Google Translate location | Choose a Google Cloud Translation region that is used for the Google Cloud project or is closest to you. | | `bucket_name` | Google Storage Bucket name | Enter the name of the Google Cloud Storage bucket that is used to store the Glossary files. | Machine translation service provided by the Google Cloud services. This service uses the Google Translation API v3 and you need credentials in JSON format to access it. In order to use this service, you first need to go through the following steps: 1. [Select or create a Cloud Platform project.](https://console.cloud.google.com/project) 2. [Enable billing for your project.](https://docs.cloud.google.com/billing/docs/how-to/modify-project#enable_billing_for_a_project) 3. [Enable the Cloud Translation.](https://docs.cloud.google.com/translate/docs) 4. [Setup Authentication.](https://googleapis.dev/python/google-api-core/latest/auth.html) Optionally, you can configure the service to use [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) by setting up a Bucket: 1. [Create a Google Cloud bucket.](https://docs.cloud.google.com/storage/docs/creating-buckets) 2. [Set bucket location to “us-central1”.](https://docs.cloud.google.com/translate/docs/migrate-to-v3#resources_projects_and_locations) 3. [Grant ‘Storage Admin’ permission to the Service Account.](https://docs.cloud.google.com/translate/docs/access-control) #### SEE ALSO * [Google translate documentation](https://docs.cloud.google.com/translate/docs) * [Authenticate to Cloud services using client libraries](https://docs.cloud.google.com/docs/authentication/client-libraries) * [Creating Google Translate project](https://docs.cloud.google.com/appengine/docs/standard/nodejs/building-app/creating-project) * [Google Cloud App Engine locations](https://docs.cloud.google.com/appengine/docs/standard/locations) ## IBM Watson Language Translator #### Versionremoved Removed in version 5.13.1: This service was withdrawn by vendor as of 10 December 2024. ## LibreTranslate #### Versionadded Added in version 4.7.1. * **Service ID:** `libretranslate` * **Maximum score:** 89 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `url` | API URL | | | `key` | API key | | LibreTranslate is a free and open-source service for machine translations. The public instance requires an API key, but LibreTranslate can be self-hosted and there are several mirrors available to use the API for free. `https://libretranslate.com/` (official public instance) : Requires an API key to use outside of the website. #### SEE ALSO * [LibreTranslate website](https://libretranslate.com/) * [LibreTranslate repository](https://github.com/LibreTranslate/LibreTranslate) * [LibreTranslate Docker container integration](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-libretranslate) ## LTEngine #### Versionadded Added in version 5.17.1. * **Service ID:** `ltengine` * **Maximum score:** 89 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `url` | API URL | | | `key` | API key | | LTEngine provides a local LibreTranslate-compatible API backed by large language models. For many Weblate installations, native LLM services such as [Ollama](https://docs.weblate.org/en/latest/admin/machine.md#mt-ollama) can be a better fit because Weblate can send translation context directly to the model. Use LTEngine when you specifically want its local translation engine or future LTEngine translation improvements. ## Azure AI Translator * **Service ID:** `microsoft-translator` * **Maximum score:** 90 * **Advanced features:** * [Placeables in automatic suggestion](https://docs.weblate.org/en/latest/user/checks.md#placeables-mt) * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | API key | | | `base_url` | Application base URL | Available choices:

`api.cognitive.microsofttranslator.com` – Global (non-regional)

`api-apc.cognitive.microsofttranslator.com` – Asia Pacific

`api-eur.cognitive.microsofttranslator.com` – Europe

`api-nam.cognitive.microsofttranslator.com` – North America

`api.translator.azure.cn` – China

`api.cognitive.microsofttranslator.us` – Azure US Government cloud | | `endpoint_url` | Authentication service URL | Regional or multi-service can be specified using region field below.

Available choices:

`api.cognitive.microsoft.com` – Global

`api.cognitive.azure.cn` – China

`api.cognitive.microsoft.us` – Azure US Government cloud | | `region` | Authentication service region | | | `category` | Category | Specify a customized system category ID to use it instead of general one. | Machine translation service provided by Microsoft in Azure portal as one of Cognitive Services. Weblate implements Translator API V3. The service automatically uses [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) via [dynamic dictionary](https://learn.microsoft.com/en-us/azure/ai-services/translator/dynamic-dictionary), see [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). ### Translator Text API V2 The key you use with Translator API V2 can be used with API 3. ### Translator Text API V3 You need to register at Azure portal and use the key you obtain there. With new Azure keys, you also need to set `region` to locale of your service. You can also specify a custom category to use [custom translator](https://learn.microsoft.com/en-gb/azure/ai-services/Translator/custom-translator/concepts/customization). #### HINT For Azure China, please use your endpoint from the Azure Portal. #### SEE ALSO * [Cognitive Services - Text Translation API](https://azure.microsoft.com/en-us/products/ai-services/ai-translator) * [Microsoft Azure Portal](https://portal.azure.com/) * [Base URLs](https://learn.microsoft.com/en-us/azure/ai-services/translator/text-translation/reference/v3/reference#base-urls) * [“Authenticating with a Multi-service resource”](https://learn.microsoft.com/en-us/azure/ai-services/translator/text-translation/reference/authentication#authenticating-with-a-multi-service-resource) * [“Authenticating with an access token” section](https://learn.microsoft.com/en-us/azure/ai-services/translator/text-translation/reference/authentication#authenticating-with-an-access-token) ## Mistral #### Versionadded Added in version 2026.7. * **Service ID:** `mistral` * **Maximum score:** 90 * **Advanced features:** * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * [LLM translation context](https://docs.weblate.org/en/latest/admin/machine.md#llm-translation-context) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |-------------------------|--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `base_url` | Mistral API base URL | Base URL of the Mistral API, if it differs from the Mistral default URL | | `model` | Mistral model | Available choices:

`auto` – Automatic selection

`mistral-small-latest` – Mistral Small 4

`ministral-14b-latest` – Ministral 3 14B

`ministral-8b-latest` – Ministral 3 8B

`ministral-3b-latest` – Ministral 3 3B

`mistral-large-latest` – Mistral Large 3

`mistral-medium-latest` – Mistral Medium 3.5

`custom` – Custom model | | `persona` | Translator persona | Describe the persona of translator to improve the accuracy of the translation. For example: “You are a squirrel breeder.” | | `style` | Translator style | Describe the style of translation. For example: “Use informal language.” | | `language_instructions` | Language-specific instructions | JSON object mapping existing target language codes to extra instructions, up to 1000 characters each. | | `key` | API key | | | `custom_model` | Custom model name | Only needed when model is set to ‘Custom model’ | Automatic and predefined model selection queries the service model-listing endpoint. Automatic selection prefers general-purpose models that balance translation quality, response time, and price, trying other available models in the displayed order. Choose Custom model when using a compatible gateway that does not provide model discovery; Weblate sends the configured model identifier directly to the chat endpoint. ## ModernMT #### Versionadded Added in version 4.2. * **Service ID:** `modernmt` * **Maximum score:** 90 * **Advanced features:** * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `url` | API URL | | | `key` | API key | | | `context_vector` | Context vector | Comma-separated list of memory IDs:weight. e.g: 1234:0.123,4567:0.456 | The service automatically uses [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary), see [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). #### SEE ALSO [ModernMT API](https://www.modernmt.com/api/#translation) ## MyMemory * **Service ID:** `mymemory` * **Maximum score:** 100 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `email` | Contact e-mail | | | `username` | Username | | | `key` | API key | | Huge translation memory with machine translation. Free, anonymous usage is currently limited to 100 requests/day, or to 1000 requests/day when you provide a contact e-mail address in `email`. You can also ask them for more. #### SEE ALSO [MyMemory website](https://mymemory.translated.net/) ## Netease Sight * **Service ID:** `netease-sight` * **Maximum score:** 90 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | Client ID | | | `secret` | Client secret | | Machine translation service provided by NetEase. This service uses an API, and you need to obtain key and secret from NetEase. #### SEE ALSO [NetEase Sight Translation Platform](https://sight.youdao.com/) ## Ollama #### Versionadded Added in version 5.15. * **Service ID:** `ollama` * **Maximum score:** 90 * **Advanced features:** * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * [LLM translation context](https://docs.weblate.org/en/latest/admin/machine.md#llm-translation-context) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |-------------------------|--------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `base_url` | API URL | Base URL of the Ollama API, localhost and port 11434 by default. | | `model` | Ollama model | Name of the model described in Ollama catalogue. | | `persona` | Translator persona | Describe the persona of translator to improve the accuracy of the translation. For example: “You are a squirrel breeder.” | | `style` | Translator style | Describe the style of translation. For example: “Use informal language.” | | `language_instructions` | Language-specific instructions | JSON object mapping existing target language codes to extra instructions, up to 1000 characters each. | Performs translation using [Ollama](https://ollama.com/) models. The Ollama API allows for the use of open source models for translations either locally installed or remotely accessed via the [Ollama](https://ollama.com/) service. Note that before configuring your models, you should have [Ollama installed](https://ollama.com/download) and downloaded the models you wish to use. Use persona and style fields to further fine-tune translations. These will be used in a prompt for Ollama and allow you to change the style of the translations. The service automatically uses [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary), see [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). #### SEE ALSO * [Ollama models](https://ollama.com/search) ## OpenAI #### Versionadded Added in version 5.3. * **Service ID:** `openai` * **Maximum score:** 90 * **Advanced features:** * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) * [LLM translation context](https://docs.weblate.org/en/latest/admin/machine.md#llm-translation-context) * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |-------------------------|--------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `base_url` | OpenAI API base URL | Base URL of the OpenAI API, if it differs from the OpenAI default URL | | `model` | OpenAI model | Available choices:

`auto` – Automatic selection

`gpt-5.6-luna` – GPT-5.6 Luna

`gpt-5.4-mini` – GPT-5.4 mini

`gpt-5-mini` – GPT-5 mini

`gpt-5.4-nano` – GPT-5.4 nano

`gpt-5-nano` – GPT-5 nano

`gpt-5.6-terra` – GPT-5.6 Terra

`gpt-5.4` – GPT-5.4

`gpt-5` – GPT-5

`gpt-5.6` – GPT-5.6 Sol

`gpt-5.5` – GPT-5.5

`gpt-4.1-mini` – GPT-4.1 mini

`gpt-4o-mini` – GPT-4o mini

`gpt-4.1-nano` – GPT-4.1 nano

`gpt-4.1` – GPT-4.1

`gpt-4o` – GPT-4o

`gpt-4-turbo` – GPT-4 Turbo

`gpt-4` – GPT-4

`gpt-3.5-turbo` – GPT-3.5 Turbo

`custom` – Custom model | | `persona` | Translator persona | Describe the persona of translator to improve the accuracy of the translation. For example: “You are a squirrel breeder.” | | `style` | Translator style | Describe the style of translation. For example: “Use informal language.” | | `language_instructions` | Language-specific instructions | JSON object mapping existing target language codes to extra instructions, up to 1000 characters each. | | `key` | API key | | | `custom_model` | Custom model name | Only needed when model is set to ‘Custom model’ | Performs translation using [OpenAI](https://openai.com/). The OpenAI API is powered by a diverse set of models with different capabilities and price points. Automatic selection chooses the best model available, but you might want to choose a specific model that matches your needs. Automatic and predefined model selection queries the service model-listing endpoint. Automatic selection prefers current general-purpose models that balance translation quality, response time, and price, using older GPT models only as compatibility fallbacks. Choose Custom model when using an OpenAI-compatible gateway that does not provide model discovery; Weblate sends the configured model identifier directly to the chat completions endpoint. Use persona and style fields to further fine-tune translations. These will be used in a prompt for OpenAI and allow you to change the style of the translations. The service automatically uses [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary), see [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). #### Versionchanged Changed in version 5.7: Support for custom model and base URL was added. #### SEE ALSO * [OpenAI models](https://platform.openai.com/docs/models) * [OpenAI API keys](https://platform.openai.com/api-keys) ## SAP Translation Hub * **Service ID:** `sap-translation-hub` * **Maximum score:** 100 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `url` | API URL | | | `key` | API key | | | `username` | SAP username | | | `password` | SAP password | | | `enable_mt` | Enable machine translation | | | `domain` | Translation domain | The ID of a translation domain, for example, BC. If you do not specify a domain, the method searches for translations in all available domains. | Machine translation service provided by SAP. You need to have a SAP account (and the SAP Translation Hub enabled in the SAP Cloud Platform) to use this service. You can also configure whether to also use machine translation services, in addition to the term database. #### NOTE To access the Sandbox API, you need to set `url` and `key`. To access the productive API, you need to set `url`, `username` and `password`. #### SEE ALSO * [What is SAP Translation Hub](https://help.sap.com/docs/translation-hub/sap-translation-hub/what-is-sap-translation-hub) * [SAP Translation Hub API](https://api.sap.com/api/translationhub/overview) ## Systran * **Service ID:** `systran` * **Maximum score:** 90 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | API key | | Machine translation service provided by Systran. This service uses an API, and you need to obtain API key at <[https://translate.systran.net/en/account](https://translate.systran.net/en/account)>. ## tmserver * **Service ID:** `tmserver` * **Maximum score:** 100 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `url` | API URL | | You can run your own translation memory server by using a tmserver protocol. * The original **tmserver** was bundled with the translate-toolkit. * amaGama server is an enhanced version of tmserver. #### NOTE There currently does not seem to be a maintained server for this. ## Weblate * **Service ID:** `weblate` * **Maximum score:** 100 * **Configuration:** This service has no configuration. Weblate machine translation service can provide translations based on the exact matches of a string in the currently existing strings in a Translated, Approved, or Read-only [states](https://docs.weblate.org/en/latest/workflows.md#states) inside Weblate. ## Weblate Translation Memory * **Service ID:** `weblate-translation-memory` * **Maximum score:** 100 * **Configuration:** This service has no configuration. Use [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) as a machine translation service. Any string that has been translated before (or uploaded to the translation memory) can be translated in this way. This suggestion source works with fuzzy matching. #### NOTE Recreating [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) reduces capabilities of this TM source. ## Yandex * **Service ID:** `yandex` * **Maximum score:** 90 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | API key | | Machine translation service provided by Yandex. This service uses a Translation API, and you need to obtain an API key from Yandex. #### SEE ALSO * [Yandex Translate API](https://yandex.com/dev/translate/) ## Yandex v2 #### Versionadded Added in version 5.1. * **Service ID:** `yandex-v2` * **Maximum score:** 90 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | API key | | Machine translation service provided by Yandex. This service uses a Translation API, and you need to obtain an API key from Yandex Cloud. #### SEE ALSO * [Yandex Translate API v2](https://aistudio.yandex.ru/docs/en/translate/api-ref/authentication.html) ## Youdao Zhiyun * **Service ID:** `youdao-zhiyun` * **Maximum score:** 90 * **Configuration:** | `source_language` | Source language selection | Available choices:

`auto` – Automatic selection

`source` – Component source language

`secondary` – Secondary language defined in project or component | |---------------------|-----------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `key` | Client ID | | | `secret` | Client secret | | Machine translation service provided by Youdao. This service uses an API, and you need to obtain an ID and an API key from Youdao. #### SEE ALSO [Youdao Zhiyun Natural Language Translation Service](https://ai.youdao.com/product-fanyi-text.s) ## Custom machine translation You can also implement your own machine translation services using a few lines of Python code. Place the code in a module Weblate can import (see [Creating a Python module](https://docs.weblate.org/en/latest/admin/customize.md#custom-module) or [Customizing code](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-python-override)) and add fully qualified class name to [`WEBLATE_MACHINERY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_MACHINERY). ```python """ Machine translation example. This example uses fictional http://example.com/ service to translate the strings. """ from __future__ import annotations from typing import TYPE_CHECKING from weblate.machinery.base import MACHINERY_DEFAULT_THRESHOLD, MachineTranslation if TYPE_CHECKING: from weblate.auth.models import User from weblate.machinery.base import DownloadTranslations from weblate.trans.models import Unit class SampleTranslation(MachineTranslation): """Sample machine translation interface.""" name = "Sample" def download_languages(self) -> list[str]: """Return list of languages your machine translation supports.""" response = self.request("get", "http://example.com/languages") return response.json()["languages"] def download_translations( self, source_language: str, target_language: str, text: str, unit: Unit | None, user: User | None, threshold: int = MACHINERY_DEFAULT_THRESHOLD, ) -> DownloadTranslations: """Return tuple with translations.""" response = self.request( "get", "http://example.com/translate", params={ "source_language": source_language, "target_language": target_language, "text": text, }, ) for translation in response.json()["translations"]: yield { "text": translation, "quality": 100, "service": self.name, "source": text, } ``` #### SEE ALSO * [Custom quality checks, add-ons, automatic suggestions and auto-fixes](https://docs.weblate.org/en/latest/admin/customize.md#custom-modules) * [Creating a Python module](https://docs.weblate.org/en/latest/admin/customize.md#custom-module) * [Customizing code](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-python-override) # admin/management.md # Management commands #### NOTE Running management commands under a different user than the one running your webserver can result in files getting wrong permissions, please check [Filesystem permissions](https://docs.weblate.org/en/latest/admin/install.md#file-permissions) for more details. You will find basic management commands (available as `./manage.py` in the Django sources, or as an extended set in a script called **weblate** installable atop Weblate). ## Invoking management commands As mentioned before, invocation depends on how you installed Weblate. If using a Python environment for Weblate, you can either specify the full path to **weblate**, or activate the Python environment prior to invoking it: ```sh # Direct invocation ~/weblate-env/bin/weblate # Activating Python environment adds it to search path . ~/weblate-env/bin/activate weblate ``` If you are using source code directly (either from a tarball or Git checkout), the management script is `./manage.py` available in the Weblate sources. To run it: ```sh python ./manage.py list_versions ``` If you’ve installed Weblate using the pip installer, or by using the `./setup.py` script, the **weblate** is installed to your path (or Python environment path), from where you can use it to control Weblate: ```sh weblate list_versions ``` For the Docker image, the script is installed like above, and you can run it using **docker exec**: ```sh docker exec --user weblate weblate list_versions ``` For **docker-compose-plugin** the process is similar, you just have to use **docker compose exec**: ```sh docker compose exec --user weblate weblate weblate list_versions ``` In case you need to pass it a file, you can temporary add a volume: ```sh docker compose exec --user weblate /tmp:/tmp weblate weblate importusers /tmp/users.json ``` #### SEE ALSO * [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md) * [Installing on Debian and Ubuntu](https://docs.weblate.org/en/latest/admin/install/venv-debian.md) * [Installing on SUSE and openSUSE](https://docs.weblate.org/en/latest/admin/install/venv-suse.md) * [Installing on RedHat, Fedora and CentOS](https://docs.weblate.org/en/latest/admin/install/venv-redhat.md) * [Installing from sources](https://docs.weblate.org/en/latest/admin/install/source.md) ## add_suggestions ### weblate add_suggestions Imports a translation from the file to use as a suggestion for the given translation. It skips duplicated translations; only different ones are added. ### --author USER@EXAMPLE.COM E-mail of author for the suggestions. This user has to exist prior to importing (you can create one in the admin interface if needed). Example: ```sh weblate --author michal@cihar.com add_suggestions weblate application cs /tmp/suggestions-cs.po ``` ## analyze_translator_work ### weblate analyze_translator_work Analyzes change history to estimate realistic translator throughput per day. The command includes only active human users and unit-backed manual translation changes, and applies daily minimum and maximum thresholds to skip obvious outliers, bots, bulk imports, uploads, and other events that would pollute the result. ### --days DAYS Number of recent days to analyze when `--since` is not specified. ### --since YYYY-MM-DD Start date for the analysis. ### --until YYYY-MM-DD End date for the analysis. ### --project PROJECT Limit the analysis to a project slug. ### --component PROJECT/COMPONENT Limit the analysis to a component. ### --language LANGUAGE Limit the analysis to a language code. ### --min-changes COUNT Minimum translated strings per user day to include. ### --max-changes COUNT Maximum translated strings per user day to include. ### --max-words COUNT Maximum translated source words per user day to include. Example: ```sh weblate analyze_translator_work --project weblate --since 2026-01-01 ``` ## auto_translate ### weblate auto_translate #### Versionchanged Changed in version 4.6: Added parameter for translation mode. Performs automatic translation based on other component translations. ### --source PROJECT/COMPONENT Specifies the component to use as source available for translation. If not specified all components in the project are used. ### --user USERNAME Specify username listed as author of the translations. “Anonymous user” is used if not specified. ### --overwrite Whether to overwrite existing translations. ### --inconsistent Whether to overwrite existing translations that are inconsistent (see [Inconsistent](https://docs.weblate.org/en/latest/user/checks.md#check-inconsistent)). ### --add Automatically add language if a given translation does not exist. ### --mt MT Use machine translation instead of other components as machine translations. ### --threshold THRESHOLD Similarity threshold for machine translation, defaults to 80. ### --mode MODE Specify translation mode, default is `translate` but `fuzzy` or `suggest` can be used. Example: ```sh weblate auto_translate --user nijel --inconsistent --source weblate/application weblate website cs ``` #### SEE ALSO [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation) ## backup ### weblate backup Runs configured backups synchronously, without using Celery. It first updates the settings and database backup dumps in [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR), then runs the selected Borg backup service or services. ### --list Lists configured backup service IDs. ### --service ID Runs one backup service by ID. ### --all Runs all enabled backup services. Use Django’s standard `--verbosity 2` option to show backup service output. Failed backup service output is shown even without increased verbosity. Examples: ```sh weblate backup --list weblate backup --service 1 --verbosity 2 weblate backup --all ``` For Docker Compose deployments, you can stop the regular Weblate container and run the command in a one-off container using **docker compose run**. The database and configured backup storage still need to be available. ```sh docker compose stop weblate docker compose run --rm --user weblate weblate weblate backup --list docker compose run --rm --user weblate weblate weblate backup --service 1 --verbosity 2 ``` #### SEE ALSO [Automated backup using BorgBackup](https://docs.weblate.org/en/latest/admin/backup.md#automated-backup) ## benchmark ### weblate benchmark Imports given content into Weblate, useful for benchmarking. ```sh # Run benchmark with a profiling python -m cProfile -o benchmark.prof ./manage.py benchmark --project benchmark --filemask '*.tbx' --format tbx --zipfile /tmp/MicrosoftTermCollection2.zip # Convert to SVG for visualization uvx gprof2dot -f pstats benchmark.prof | dot -Tsvg -o benchmark.svg # Display SVG firefox ./benchmark.svg ``` ```sh # Run benchmark under memray uvx memray run ./manage.py benchmark --project benchmark --filemask '*.tbx' --format tbx --zipfile /tmp/MicrosoftTermCollection2.zip # Render the profile uvx memray flamegraph ./memray-manage.py.2554179.bin # Display it fixefox memray-flamegraph-manage.py.2554179.html ``` ## billing_demo ### weblate billing_demo #### Versionadded Added in version 5.15. Creates a demo billing project. Can be executed multiple times to add additional invoices and billing events. This can be useful when developing Weblate. Needs [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing) installed. #### SEE ALSO * [`import_demo`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_demo) * [Bootstrapping your devel instance](https://docs.weblate.org/en/latest/contributing/start.md#devel-demo) ## celery_queues ### weblate celery_queues Displays length of Celery task queues. #### SEE ALSO [Background tasks internals](https://docs.weblate.org/en/latest/contributing/internals.md#background-tasks-internals) ## checkgit ### weblate checkgit Prints current state of the back-end Git repository. You can either define which project or component to update (for example `weblate/application`), or use `--all` to update all existing components. ## commitgit ### weblate commitgit Commits any possible pending changes to the back-end Git repository. You can either define which project or component to update (for example `weblate/application`), or use `--all` to update all existing components, or use `--file-format` to filter based on the file format. ## commit_pending ### weblate commit_pending Commits pending changes older than a given age. You can either define which project or component to update (for example `weblate/application`), or use `--all` to update all existing components. ### --age HOURS Age in hours for committing. If not specified the value configured in [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) is used. #### NOTE This is automatically performed in the background by Weblate, so there no real need to invoke this manually, besides forcing an earlier commit than specified by [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component). #### SEE ALSO * [Running maintenance tasks](https://docs.weblate.org/en/latest/admin/install.md#production-cron) * [`COMMIT_PENDING_HOURS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-COMMIT_PENDING_HOURS) ## cleanuptrans ### weblate cleanuptrans Cleans up orphaned checks and translation suggestions. There is normally no need to run this manually, as the cleanups happen automatically in the background. #### SEE ALSO [Running maintenance tasks](https://docs.weblate.org/en/latest/admin/install.md#production-cron) ## cleanup_memory ### weblate cleanup_memory #### Versionadded Added in version 5.13. Removes all obsolete entries with pending status from the translation memory. ## cleanup_ssh_keys ### weblate cleanup_ssh_keys #### Versionadded Added in version 4.9.1. Performs cleanup of stored SSH host keys: * Removes deprecated RSA keys for GitHub which might cause issues connecting to GitHub. * Removes duplicate entries in host keys. #### SEE ALSO [SSH repositories](https://docs.weblate.org/en/latest/vcs.md#ssh-repos) ## createadmin ### weblate createadmin Creates an `admin` account with a random password, unless it is specified. ### --password PASSWORD Provides a password on the command-line, to not generate a random one. ### --no-password Do not set password, this can be useful with –update. ### --username USERNAME Use the given name instead of `admin`. ### --email USER@EXAMPLE.COM Specify the admin e-mail address. ### --name Specify the admin name (visible). ### --update Update the existing user (you can use this to change passwords). ## dump_memory ### weblate dump_memory Export a JSON file containing Weblate Translation Memory content. #### SEE ALSO * [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) * [Weblate Translation Memory Schema](https://docs.weblate.org/en/latest/contributing/schemas.md#schema-memory) ## dumpuserdata ### weblate dumpuserdata Dumps userdata to a file for later use by [`importuserdata`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-importuserdata). #### HINT This comes in handy when migrating or merging Weblate instances. ## import_demo ### weblate import_demo #### Versionadded Added in version 4.1. Creates a demo project with components based on <[https://github.com/WeblateOrg/demo](https://github.com/WeblateOrg/demo)>. Make sure the celery tasks are running before running this command. This can be useful when developing Weblate. ### --delete Removes existing demo project. #### SEE ALSO * [`billing_demo`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-billing_demo) * [Bootstrapping your devel instance](https://docs.weblate.org/en/latest/contributing/start.md#devel-demo) ## import_json ### weblate import_json Batch import of components based on JSON data. The imported JSON file structure pretty much corresponds to the component object (see [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-)). You have to include the `name` and `filemask` fields. ### --project PROJECT Specifies where the components will be imported from. ### --main-component COMPONENT Use the given VCS repository from this component for all of them. ### --ignore Skip (already) imported components. ### --update Update (already) imported components. Example of JSON file: ```json [ { "slug": "po", "name": "Gettext PO", "file_format": "po", "filemask": "po/*.po", "new_lang": "none" }, { "name": "Android", "filemask": "android/values-*/strings.xml", "template": "android/values/strings.xml", "repo": "weblate://test/test", "file_format": "aresource" } ] ``` #### SEE ALSO [`import_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_memory) ## import_memory ### weblate import_memory Imports a file into the Weblate translation memory. Supported file formats are TMX, JSON, XLIFF, PO, CSV. Specifying a source and a target languages might be necessary for formats other than JSON and TMX. ### --language-map LANGMAP Allows mapping languages in the TMX to the Weblate translation memory. The language codes are mapped after normalization usually done by Weblate. `--language-map en_US:en` will for example import all `en_US` strings as `en` ones. This can be useful in case your TMX file locales happen not to match what you use in Weblate. ### --source-language SOURCE_LANG Specifies the source language for imported translations. Typically needed for formats where the languages cannot be determined from the file itself. ### --target-language TARGET_LANG Specifies the target language for imported translations. Typically needed for formats where the languages cannot be determined from the file itself. #### SEE ALSO * [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) * [Weblate Translation Memory Schema](https://docs.weblate.org/en/latest/contributing/schemas.md#schema-memory) ## import_project ### weblate import_project Batch imports components into project based on the file mask. It is based on the [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) add-on, so you might want to use that instead. names an existing project, into which the components are to be imported. The defines the Git repository URL to use, and signifies the Git branch. To import additional translation components from an existing Weblate component, use a weblate:/// URL for the . The defines file discovery for the repository. It can be either be made simple using wildcards, or it can use the full power of regular expressions. The simple matching uses `**` for component name and `*` for language, for example: `**/*.po` The regular expression has to contain groups named component and language, for example: `(?P[^/]*)/(?P[^-/]*)\.po`. The import matches existing components based on files and adds the ones that do not exist. It does not change already existing ones. ### --name-template TEMPLATE Customize the name of a component using Django template syntax. For example: `Documentation: {{ component }}` ### --base-file-template TEMPLATE Customize the base file for monolingual translations. For example: `{{ component }}/res/values/string.xml` ### --new-base-template TEMPLATE Customize the base file for addition of new translations. For example: `{{ component }}/ts/en.ts` ### --file-format FORMAT You can also specify the file format to use (see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats)), the default is auto-detection. ### --language-regex REGEX You can specify language filtering (see [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component)) with this parameter. It has to be a valid regular expression. ### --main-component You can specify which component will be chosen as the main one—the one actually containing the VCS repository. ### --license NAME Specify the overall, project or component translation license. ### --license-url URL Specify the URL where the translation license is to be found. ### --vcs NAME In case you need to specify which version control system to use, you can do it here. The default version control is Git. To give you some examples, let’s try importing two projects. First The Debian Handbook translations, where each language has separate a folder with the translations of each chapter: ```sh weblate import_project \ debian-handbook \ https://salsa.debian.org/hertzog/debian-handbook.git \ bullseye/main \ '*/**.po' ``` Then the Tanaguru tool, where the file format needs be specified, along with the base file template, and how all components and translations are located in single folder: ```sh weblate import_project \ --file-format=properties \ --base-file-template=web-app/tgol-web-app/src/main/resources/i18n/%s-I18N.properties \ tanaguru \ https://github.com/Tanaguru/Tanaguru \ master \ web-app/tgol-web-app/src/main/resources/i18n/**-I18N_*.properties ``` More complex example of parsing of filenames to get the correct component and language out of a filename like `src/security/Numerous_security_holes_in_0.10.1.de.po`: ```sh weblate import_project \ tails \ git://git.tails.boum.org/tails master \ 'wiki/src/security/(?P.*)\.(?P[^.]*)\.po$' ``` Filtering only translations in a chosen language: ```sh ./manage import_project \ --language-regex '^(cs|sk)$' \ weblate \ https://github.com/WeblateOrg/weblate.git \ 'weblate/locale/*/LC_MESSAGES/**.po' ``` Importing Sphinx documentation split to multiple files: ```console $ weblate import_project --name-template 'Documentation: %s' \ --file-format po \ project https://github.com/project/docs.git master \ 'docs/locale/*/LC_MESSAGES/**.po' ``` Importing Sphinx documentation split to multiple files and directories: ```console $ weblate import_project --name-template 'Directory 1: %s' \ --file-format po \ project https://github.com/project/docs.git master \ 'docs/locale/*/LC_MESSAGES/dir1/**.po' $ weblate import_project --name-template 'Directory 2: %s' \ --file-format po \ project https://github.com/project/docs.git master \ 'docs/locale/*/LC_MESSAGES/dir2/**.po' ``` #### SEE ALSO More detailed examples can be found in the [Starting with internationalization](https://docs.weblate.org/en/latest/devel/starting.md#starting) chapter, alternatively you might want to use [`import_json`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_json). ## import_projectbackup ### weblate import_projectbackup #### Versionadded Added in version 5.10. Imports [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup). #### HINT Usually it is more comfortable to import project when [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects). ## importuserdata ### weblate importuserdata Imports user data from a file created by [`dumpuserdata`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-dumpuserdata). ## importusers ### weblate importusers --check Imports users from JSON dump of the Django auth_users database. ### --check With this option it will just check whether a given file can be imported and report possible conflicts arising from usernames or e-mails. You can dump users from the existing Django site using: ```sh ./manage.py dumpdata auth.User > users.json ``` #### HINT Use [`dumpuserdata`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-dumpuserdata) for dumping data from other Weblate server as that includes user settings as well. #### SEE ALSO [Migrating from Pootle](https://docs.weblate.org/en/latest/admin/upgrade.md#pootle-migration) ## install_addon ### weblate install_addon --addon ADDON Installs an add-on to a set of components. ### --addon ADDON Name of the add-on to install. For example `weblate.gettext.customize`. ### --configuration CONFIG JSON encoded configuration of an add-on. ### --update Update the existing add-on configuration. You can either define which project or component to install the add-on in (for example `weblate/application`), or use `--all` to include all existing components. To install [Generate MO files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-mo) for all components: ```shell weblate install_addon --addon weblate.gettext.mo --configuration '{"fuzzy": true}' --update --all ``` #### SEE ALSO [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md) ## install_machinery #### Versionadded Added in version 4.18. ### weblate install_machinery --service SERVICE Installs a site-wide automatic suggestion service. ### --service SERVICE Name of the service to install. For example `deepl`. ### --configuration CONFIG JSON encoded configuration of a service. ### --update Update the existing service configuration. To install [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl): ```shell weblate install_machinery --service deepl --configuration '{"key": "x", "url": "https://api.deepl.com/"}' --update ``` #### SEE ALSO [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md) ## list_addons ### weblate list_addons Lists add-ons in reStructuredText as a template for [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md). ### --sections {events,addons,parameters} Filter the generated output to just the add-on event sections, the built-in add-on sections, or the shared add-on parameter sections. If omitted, all generated sections are shown. #### SEE ALSO [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) ## list_permissions ### weblate list_permissions Lists permissions in reStructuredText as a template for [Access control](https://docs.weblate.org/en/latest/admin/access.md). #### SEE ALSO [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) ## list_checks ### weblate list_checks Lists quality checks in reStructuredText as a template for [Checks and fixups](https://docs.weblate.org/en/latest/admin/checks.md) and [Checks and fixups](https://docs.weblate.org/en/latest/user/checks.md). ### --sections {checks,flags} Filter the generated output to just the quality check sections or the shared check flag sections. If omitted, all generated sections are shown. #### NOTE Using `--output` requires selecting exactly one value in `--sections` so each generated snippet is written to its own file. This matches the [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) workflow and the `make -C docs update-docs` targets. #### SEE ALSO [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) ## list_languages ### weblate list_languages Lists supported languages in MediaWiki markup - language codes, English names and localized names. This is used to generate <[https://www.l10n.cz/wiki/Slovn%C3%ADky/Slovn%C3%ADk_s_n%C3%A1zvy_jazyk%C5%AF/](https://www.l10n.cz/wiki/Slovn%C3%ADky/Slovn%C3%ADk_s_n%C3%A1zvy_jazyk%C5%AF/)>. ## list_machinery ### weblate list_machinery Lists automatic suggestions services in reStructuredText as a template for [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md). #### SEE ALSO [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) ## list_translators ### weblate list_translators Lists translators by contributed language for the given project: ```text [French] Jean Dupont [English] John Doe ``` ### --language-code List names by language code instead of language name. You can either define which project or component to use (for example `weblate/application`), or use `--all` to list translators from all existing components. ## list_versions ### weblate list_versions Lists all Weblate dependencies and their versions. ## list_file_format_params ### weblate list_file_format_params Lists File format parameters. ## list_change_events ### weblate list_change_events Lists all possible change event types. ## list_format_features ### weblate list_format_features Generates RST documentation snippets describing the supported features for every file format. The command generates one file for every format, that can be found in the specified output directory. ### --output PATH Directory where the format feature snippets will be written. #### NOTE The generated documentation files are meant to be included in documentation sources such as [Localization file formats](https://docs.weblate.org/en/latest/formats.md). See also `weblate/formats/management/commands/list_format_features.py` for customization and merging logic. ## loadpo ### weblate loadpo Reloads translations from disk (for example in case you have done some updates in the VCS repository). ### --force Force update, even if the files should be up-to-date. ### --lang LANGUAGE Limit processing to a single language. You can either define which project or component to update (for example `weblate/application`), or use `--all` to update all existing components. #### NOTE You seldom need to invoke this, Weblate will automatically load changed files for every VCS update. This is needed in case you manually changed an underlying Weblate VCS repository or in some special cases following an upgrade. ## lock_translation ### weblate lock_translation Prevents further translation of a component. #### HINT Useful in case you want to do some maintenance on the underlying repository. You can either define which project or component to update (for example `weblate/application`), or use `--all` to update all existing components. #### SEE ALSO [`unlock_translation`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-unlock_translation) ## metrics ### weblate metrics Outputs the server metrics exposed by [`GET /api/metrics/`](https://docs.weblate.org/en/latest/api.md#get--api-metrics-). ### --format FORMAT Selects the output format. Supported formats are `json`, `csv`, and `openmetrics`. The default is `json`. ## migrate ### weblate migrate Migrates database to current Weblate schema. The command line options are described at Django [`migrate`](https://docs.djangoproject.com/en/stable/ref/django-admin/#django-admin-migrate). #### HINT In case you want to run an installation non interactively, you can use `weblate migrate --noinput`, and then create an admin user using [`createadmin`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-createadmin) command. #### SEE ALSO * [`migrate`](https://docs.djangoproject.com/en/stable/ref/django-admin/#django-admin-migrate) * [Filling up the database](https://docs.weblate.org/en/latest/admin/install.md#tables-setup) ## move_language ### weblate move_language source target Allows you to merge language content. This is useful when updating to a new version which contains aliases for previously unknown languages that have been created with the `(generated)` suffix. It moves all content from the source language to the target one. Example: ```sh weblate move_language cze cs ``` After moving the content, you should check whether there is anything left (this is subject to race conditions when somebody updates the repository meanwhile) and remove the `(generated)` language. ## pushgit ### weblate pushgit Pushes committed changes to the upstream VCS repository. ### --force-commit Force commits any pending changes, prior to pushing. You can either define which project or component to update (for example `weblate/application`), or use `--all` to update all existing components. #### NOTE Weblate pushes changes automatically if [Push on commit](https://docs.weblate.org/en/latest/admin/projects.md#component-push-on-commit) in [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) is turned on, which is the default. ## unlock_translation ### weblate unlock_translation Unlocks a given component, making it available for translation. #### HINT Useful in case you want to do some maintenance on the underlying repository. You can either define which project or component to update (for example `weblate/application`), or use `--all` to update all existing components. #### SEE ALSO [`lock_translation`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-lock_translation) ## setupgroups ### weblate setupgroups Configures default groups and optionally assigns all users to that default group. ### --no-privs-update Turns off automatic updating of existing groups (only adds new ones). ### --no-projects-update Prevents automatic updates of groups for existing projects. This allows adding newly added groups to existing projects, see [Project access control](https://docs.weblate.org/en/latest/admin/access.md#acl). #### SEE ALSO [List of privileges](https://docs.weblate.org/en/latest/admin/access.md#privileges) ## setuplang ### weblate setuplang Updates list of defined languages in Weblate. ### --no-update Turns off automatic updates of existing languages (only adds new ones). ## updatechecks ### weblate updatechecks Updates all checks for all strings. #### HINT Useful for upgrades which do major changes to checks. You can either define which project or component to update (for example `weblate/application`), or use `--all` to update all existing components. #### NOTE Checks are recalculated regularly by Weblate in the background, the frequency can be configured via [`BACKGROUND_TASKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BACKGROUND_TASKS). ## updategit ### weblate updategit Fetches remote VCS repositories and updates the internal cache. You can either define which project or component to update (for example `weblate/application`), or use `--all` to update all existing components. #### NOTE Usually it is better to configure hooks in the repository to trigger [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks), instead of regular triggering the updates by [`updategit`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-updategit). # admin/memory.md # Translation Memory Weblate comes with a built-in translation memory consisting of: * Manually imported translation memory (see [User interface](https://docs.weblate.org/en/latest/admin/memory.md#memory-user)). * Automatically stored translations performed in Weblate (depending on [Translation-memory scopes](https://docs.weblate.org/en/latest/admin/memory.md#memory-scopes)). * Automatically imported past translations. Content in the translation memory can be applied to strings in several ways: * User can accept suggestions from the [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) tab while editing the string. * The selected strings can be processed using [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation) from the Operations menu. * [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) add-on can automatically apply changes to new and existing strings. For installation tips, see [Weblate Translation Memory](https://docs.weblate.org/en/latest/admin/machine.md#mt-weblate-translation-memory), which is turned on by default. ## Translation-memory scopes The translation-memory scopes ensure privacy for different projects and users. Sharing of translations is also available. #### NOTE When upgrading from older Weblate releases, existing translation-memory entries are converted to scopes by a periodic Celery background task. Until this backfill finishes, existing entries can be temporarily unavailable in suggestions and memory management views. Keep Celery running after the upgrade so the periodic task can start or resume the migration. Site administrators can monitor the backfill and duplicate-entry consolidation in Administration > Performance report. ### Imported translation memory Importing arbitrary translation memory data using the [`import_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_memory) command makes memory content available to all users and projects. ### Per-user translation memory Stores all user translations automatically in the personal translation memory of each respective user. The default value for new users is automatically adjusted based on the [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/memory.md#autoclean-tm) configuration. If automatic cleanup is enabled, this is disabled by default to prevent reintroducing inconsistent translations. ### Per-project translation memory All translations within a project are automatically stored in a project translation memory only available for this project. Entries attributed to an existing restricted component are only available to users who can access that component. This also applies when project memory is downloaded or accessed using the REST API. Legacy entries which can not be attributed to a current component use the project access rules. This can happen when the component path has changed or the component has been removed. ### Workspace translation memory Projects in the same workspace can share translation memory without enabling the global shared translation memory. Workspace translation memory has to be enabled both in the workspace settings and in the individual project workflow settings. Entries attributed to an existing restricted component are only available to users who can access that component, even when they can access another project in the workspace. Unattributed legacy entries use the workspace access rules. #### SEE ALSO * [Use workspace translation memory](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-use-workspace-tm) * [Contribute to workspace translation memory](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-contribute-workspace-tm) * [Use workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-workspace-tm) * [Contribute to workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-workspace-tm) ### Shared translation memory All translations within projects with shared translation memory turned on are stored in a shared translation memory available to all projects. Turning off contribution to shared translation memory stops previously contributed automatic entries from being used as shared suggestions. Restricted components do not contribute new entries to shared translation memory. On Hosted Weblate, a project with restricted components can not enable shared translation memory, and a component can not be restricted while its project uses shared translation memory. Unattributed legacy entries which are already in shared translation memory use the shared translation memory access rules. Please consider carefully whether to turn this feature on for shared Weblate installations, as it can have severe implications: * The translations can be used by anybody else. * This might lead to disclosing secret information. * Make sure the translations you share have good quality. #### SEE ALSO * [Contribute to shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-shared-tm) * [Use shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-shared-tm) ## Translation memory status #### Versionadded Added in version 5.13. Translation memory entries can have two different statuses: **active** and **pending**. Pending entries are included in suggestions, but with a quality penalty applied. Depending on the configured score threshold, the penalty can exclude even exact matches from suggestions and automatic translation. Entries imported from translation memory files are stored as active. If [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/memory.md#autoclean-tm) is enabled, matching pending entries are removed when a translation becomes active. ## Autoclean translation memory #### Versionadded Added in version 5.13. When enabled for a project, Weblate replaces older automatically created translation memory entries when a translation becomes active: * With [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) enabled, cleanup happens when the translation is approved. * Without review, cleanup happens as soon as the translation reaches the translated state. For the same source string, component, context, and source/target language pair, Weblate removes matching non-file entries from translation memory, including entries with a different target text. This applies across personal, project, and shared translation memory scopes. The current translation is then stored again as an active entry in the scopes that are enabled for that change. Entries imported from external translation memory files are not cleaned up automatically. Entries with a different context are kept. In the Docker container this can be configured using [`WEBLATE_DEFAULT_AUTOCLEAN_TM`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_DEFAULT_AUTOCLEAN_TM). #### NOTE Enabling automatic cleanup also changes the default for new user profiles to not contribute to personal translation memory. This prevents reintroducing inconsistent translations that were supposed to be cleaned up. #### SEE ALSO [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-autoclean-tm) ## Managing the Translation Memory ### User interface Translation memory can be managed from several places in the Weblate UI: * Open the user menu and choose Translation memory to manage your personal translation memory. * Open a project and choose Translation memory from the project menu to manage translation memory for that project. * Open a workspace and choose Operations ↓ Translation memory to manage automatically created translation memory for that workspace. Editing the workspace is required. * Open Administration and choose Translation memory to manage uploaded translation memory for the whole Weblate instance. The translation memory page shows entry counts for the selected scope. Depending on the scope, it also lists entries by origin, component, or language pair. The listed entries can be downloaded as JSON or TMX. Users with the required permissions can delete entries, and the project view can rebuild translation memory for the whole project or for individual components from the current translations. Removing a component preserves its automatically created translation memory by default. Because the component access rule no longer exists after removal, the retained entries use the access rules of their remaining translation-memory scope. To remove those entries together with a component, select Delete translation memory created from this component in the removal form. Category removal offers the equivalent option for every component in the category and its nested categories. This removes attributed entries and legacy entries matching the current component path. It does not infer paths used before a component or category rename or move. Such unmatched entries can be deleted by origin in the project or workspace translation memory management, or using the REST API. The REST API accepts the `delete_memory` boolean in the request body or query string for component and category removal. Personal and uploaded entries are preserved. The project view also shows whether shared translation memory and autoclean translation memory are enabled for the project, with a link to the project workflow settings when the user can edit the project. The workspace view can rebuild all currently contributing projects or an individual contributing component. It manages workspace-scoped automatic entries only. Translation-memory files cannot be uploaded into a workspace scope. Translation memory files can be imported on the same page. Uploaded files are processed during the request, stored as active, and added to the selected scope: * Personal uploads are available in your personal translation memory. * Project uploads are available in the selected project’s translation memory. * Administration uploads are available as uploaded shared entries for the whole Weblate instance. #### HINT Translation memories in various formats can be imported into Weblate. The TMX format is provided for interoperability with other tools. All supported formats are TMX, JSON, XLIFF, PO, and CSV. Source and target languages must be selected when uploading XLIFF, PO, or CSV files if the language information is not provided by the file itself. #### SEE ALSO [Weblate Translation Memory Schema](https://docs.weblate.org/en/latest/contributing/schemas.md#schema-memory) ![image](screenshots/memory.webp) You can search translation memory while editing strings from the [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) tab. ### Admin interface Administrative users have additional translation memory management controls. In Administration > Translation memory, the page lists uploaded shared entries, shared entries, and total entries for the Weblate instance. Depending on permissions, it can import uploaded shared memory, delete uploaded entries, and download uploaded, shared, or all entries as JSON or TMX. #### Versionadded Added in version 4.12. The project translation memory view also allows rebuilding parts of or the entire project translation memory. Automatically generated entries for the selected component or project are deleted, and the memory is populated again from the current translations in the background. Entries imported from files are preserved. ### Management interface Several management commands can manipulate translation memory content. These operate on the translation memory as a whole, unfiltered by scopes (unless requested by parameters): [`dump_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-dump_memory) : Exports the memory into JSON [`import_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_memory) : Imports TMX or JSON files into the translation memory [`cleanup_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-cleanup_memory) : Removes all entries with pending status from the translation memory #### Versionadded Added in version 4.14. The Weblate API covers the translation memory. This allows automated manipulation for different purposes, or based on events in the translation cycle. # admin/optionals.md # Optional Weblate modules Several optional modules are available for your setup. ## Git exporter Provides you read-only access to the underlying Git repository using HTTP(S). ### Installation 1. Add `weblate.gitexport` to installed apps in `settings.py`: ```python INSTALLED_APPS += ("weblate.gitexport",) ``` 2. Export existing repositories by migrating your database after installation: ```sh weblate migrate ``` #### HINT Git exporter is turned on in our official Docker image. To turn it off, use: ```sh WEBLATE_REMOVE_APPS=weblate.gitexport ``` ### Usage The module automatically hooks into Weblate and sets the exported repository URL in the [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component). The repositories are accessible under the `/git/` part of the Weblate URL, for example `https://example.org/git/weblate/main/`. Repositories for publicly available projects can be cloned without authentication: ```sh git clone 'https://example.org/git/weblate/main/' ``` Access to browse the repositories with restricted access (with Private [access control](https://docs.weblate.org/en/latest/admin/access.md#acl) or when [`REQUIRE_LOGIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REQUIRE_LOGIN) is enabled) requires an API token which can be obtained in your [user profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile): ```sh git clone 'https://user:KEY@example.org/git/weblate/main/' ``` #### NOTE Weblate serves the Git repository itself, but it does not serve Git LFS objects. See [Git LFS](https://docs.weblate.org/en/latest/vcs.md#git-lfs) for supported behavior. Clone repositories using Git LFS from the upstream repository and add Weblate as another remote. If you only need Git-tracked files, you can clone from Weblate with `GIT_LFS_SKIP_SMUDGE=1` to skip downloading Git LFS objects. #### HINT By default members of Users group and anonymous user have access to the repositories for public projects via Access repository and Power user roles. ## Billing This is used on [Hosted Weblate](https://weblate.org/hosting/) to define billing plans, track invoices and usage limits. ### Installation 1. Add `weblate.billing` to installed apps in `settings.py`: ```python INSTALLED_APPS += ("weblate.billing",) ``` 1. Run the database migration to optionally install additional database structures for the module: ```sh weblate migrate ``` ### Billing plan creation and assignment You first need to create a billing plan to activate billing. Navigate to the Administration section (represented by the wrench icon) and open the Tools screen. From there, proceed to the Django admin interface. In the Django admin interface, locate the BILLING section and add a billing plan. For instance, you can add a Free plan with no cost. If you wish to assign a billing plan to an existing project, this can also be done within the Django admin interface using the Customer billings option. Lastly, the Django admin interface provides an Invoice option for logging your customer payments. ### Usage After installation you can control billing in the admin interface. Users with billing enabled will get new Billing tab in their [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile). The billing module additionally allows users to create new projects and components without being superusers (see [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects)). This is possible when following conditions are met: * The billing is in its configured limits (any overusage results in blocking of project/component creation) and paid (if its price is non zero) * The user has Add projects to workspace permission for the workspace covered by the billing plan. Upon project creation user is able to choose which workspace should contain the project. Projects created in a workspace with billing count against the billing plan assigned to that workspace. Users with the Edit workspace settings permission can view and pay the billing plan; billing notification e-mails are sent to these users. See [Billing](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-billing) for details. ## Legal module This is used on [Hosted Weblate](https://weblate.org/hosting/) to provide required legal documents. It comes provided with blank documents, and you are expected to fill out the following templates in the documents: `legal/documents/tos.html` : Terms of service document `legal/documents/privacy.html` : Privacy policy document `legal/documents/summary.html` : Short overview of the terms of service and privacy policy `legal/documents/contracts.html` : Subcontractor information The legal module embeds these templates inside Weblate. Its confirmation page uses `legal/documents/tos.html` and, when a privacy policy link is available, requires one agreement covering both the terms of service and the privacy policy. This is separate from [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL) and [`PRIVACY_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVACY_URL), which are meant for linking to externally hosted legal documents from the footer when the legal module is not enabled or as fallbacks for hidden internal pages. When the legal module is enabled, Weblate links to the internal legal pages by default. On changing the terms of service or privacy policy, adjust [`LEGAL_TOS_DATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_TOS_DATE) when users should be forced to agree with the updated documents. #### NOTE Legal documents for the Hosted Weblate service operated by Weblate s.r.o. are available in this Git repository: <[https://github.com/WeblateOrg/wllegal/tree/main/wllegal/templates/legal/documents](https://github.com/WeblateOrg/wllegal/tree/main/wllegal/templates/legal/documents)>. The bundled terms of service and related legal documents are specific to services operated by Weblate s.r.o. They can serve as an implementation example, but should not be used as a basis for legal documents of other services. ### Installation 1. Add `weblate.legal` to installed apps in `settings.py`: ```python INSTALLED_APPS += ("weblate.legal",) # Optional: # Social auth pipeline to confirm TOS upon registration/subsequent sign in SOCIAL_AUTH_PIPELINE += ("weblate.legal.pipeline.tos_confirm",) # Middleware to enforce TOS confirmation of signed in users MIDDLEWARE += [ "weblate.legal.middleware.RequireTOSMiddleware", ] ``` 1. Run the database migration to optionally install additional database structures for the module: ```sh weblate migrate ``` 1. Provide legal document templates matching your service, as described in [Customizing legal documents and styles](https://docs.weblate.org/en/latest/admin/optionals.md#legal-customization). #### HINT In Docker deployments, enable the legal module using [`WEBLATE_LEGAL_INTEGRATION`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_LEGAL_INTEGRATION) instead of editing `settings.py`. Use `tos-confirm` to enable the legal module and legal document confirmation enforcement, or `wllegal` to additionally load the hosted legal document templates used by services operated by Weblate s.r.o. These templates are not intended for general use. To provide your own templates in Docker, place them in `/app/data/python/customize/templates/legal/documents`, see [Replacing logo and other static files](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-static-override). Recreate the Docker container after changing environment variables, for example using **docker compose up -d**. Restarting an existing container does not apply changed environment values. ### Usage After installation and customization, the legal documents are shown in the Weblate UI. The legal document templates are regular Django templates. Text is translated only when you use Django translation tags such as `{% translate %}` or `{% blocktranslate %}`; plain HTML text is shown as written. Legal pages and the sign-in and registration overview provide `terms_url` and `privacy_url` variables for linking to the terms of service and privacy policy documents. #### Customizing legal documents and styles Provide your own legal documents by overriding these templates in a [Creating a Python module](https://docs.weblate.org/en/latest/admin/customize.md#custom-module): * `templates/legal/documents/tos.html` * `templates/legal/documents/privacy.html` * `templates/legal/documents/summary.html` * `templates/legal/documents/contracts.html` * `templates/legal/styles.html` * `static/weblate_customization/legal.css` Place the customization app before `weblate.legal` and any other app providing legal template overrides in [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS) so that Django selects its templates. Only templates you provide are overridden; the remaining legal templates continue to use the defaults from later apps. The `legal/styles.html` template is included in the HTML head of every legal page. Use it to load a stylesheet from your customization app: ```django {% load static %} ``` Run `weblate collectstatic --noinput` after adding or changing the static file. In Docker deployments, place document templates in `/app/data/python/customize/templates/legal/documents`, `styles.html` in `/app/data/python/customize/templates/legal/styles.html`, and the stylesheet in `/app/data/python/customize/static/legal.css`. The stylesheet template then uses `{% static 'legal.css' %}`. Restart the container to apply the changes, see [Replacing logo and other static files](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-static-override). By default, legal document wrappers use the `tos` CSS class. Weblate does not attach any styling to this class; target it from your custom stylesheet, or set [`LEGAL_DOCUMENT_CSS_CLASS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_DOCUMENT_CSS_CLASS) to another class matching your document markup. Set the setting to an empty string if no wrapper class is needed. Use [`LEGAL_HIDDEN_DOCUMENTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_HIDDEN_DOCUMENTS) to hide optional legal pages such as subcontractors from the legal menu. Hidden pages return a 404 response when requested directly. If `terms` or `privacy` is hidden, links using `terms_url` or `privacy_url` fall back to [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL) or [`PRIVACY_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVACY_URL) when configured, otherwise the link is omitted. To use externally hosted legal documents with legal confirmation, configure [`LEGAL_HIDDEN_DOCUMENTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_HIDDEN_DOCUMENTS) to hide `terms` and `privacy` and set [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL) and [`PRIVACY_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVACY_URL). The confirmation page then links to those external documents and requires one agreement covering both without needing a `legal/documents/tos.html` template override. If no privacy policy link is available, the confirmation covers only the terms of service. ## Avatars Avatars are downloaded and cached server-side to reduce information leaks to the sites serving them by default. The built-in support for fetching avatars from e-mails addresses configured for it can be turned off using [`ENABLE_AVATARS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_AVATARS). Weblate currently supports: * [Gravatar](https://gravatar.com/) * [Libravatar](https://www.libravatar.org/) #### SEE ALSO * [Avatar caching](https://docs.weblate.org/en/latest/admin/install.md#production-cache-avatar) * [`AVATAR_URL_PREFIX`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AVATAR_URL_PREFIX) * [`ENABLE_AVATARS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_AVATARS) ## Localization CDN The [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) and [Translation files CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-files) add-ons write files to [`LOCALIZE_CDN_PATH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_PATH); Weblate does not serve them. Configure the web server or CDN serving [`LOCALIZE_CDN_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_URL) as a public, read-only static file host. Treat every published CDN file as public. The add-on specific UUID in the URL is not an access-control mechanism. Do not enable CDN add-ons for components that contain private strings, unreleased product text, customer data, internal URLs, API examples, repository paths, translator comments, or file-format metadata that should not be exposed. The [Translation files CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-files) add-on publishes raw translation files in formats supported by Weblate. Some formats can be interpreted by browsers or other clients as HTML, SVG, XML, JavaScript, YAML, or application-specific configuration. Serve the CDN from a dedicated domain that is separate from Weblate and from the application consuming the translations. Do not share authentication cookies with the CDN domain. Recommended server configuration: * Serve only the directory configured by [`LOCALIZE_CDN_PATH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_PATH); do not expose Weblate repositories, backups, media, configuration, or the whole data directory. * Disable directory listing. * Use HTTPS and make the CDN host read-only from the web server. * Send *X-Content-Type-Options* with `nosniff`. * Configure conservative MIME types. Serve unknown translation formats as *text/plain* or *application/octet-stream*; only serve `weblate.js` as JavaScript. * For raw translation formats that are not intended to be rendered in a browser, consider adding *Content-Disposition* with `attachment`. * Configure `Access-Control-Allow-Origin` only for sites that need browser access to the files. * Set cache lifetimes that match your update expectations, and purge CDN caches when stale translations must disappear quickly. The following nginx snippet serves only the configured CDN directory and applies conservative defaults for raw translation files: ```nginx # # nginx configuration for the Weblate localization CDN # # You will want to change: # # - server_name to match the host configured in LOCALIZE_CDN_URL # - root to match LOCALIZE_CDN_PATH # - Access-Control-Allow-Origin to the sites that need browser access # - TLS configuration if HTTPS is not terminated before nginx # server { listen 80; server_name cdn.example.com; # LOCALIZE_CDN_PATH root /home/weblate/data/l10n-cdn; autoindex off; disable_symlinks on; location = / { return 404; } # The JavaScript localization add-on publishes this loader. location ~ "^/[0-9a-f]{32}/weblate\.js$" { try_files $uri =404; types { application/javascript js; } default_type application/javascript; add_header X-Content-Type-Options nosniff always; # add_header Access-Control-Allow-Origin "https://www.example.com" always; expires 1h; } # Other CDN files are translation files. Serve them conservatively so raw # formats are not interpreted as active browser content. location / { try_files $uri =404; types { } default_type text/plain; add_header X-Content-Type-Options nosniff always; add_header Content-Disposition "attachment" always; # add_header Access-Control-Allow-Origin "https://www.example.com" always; expires 1h; } } ``` #### SEE ALSO * [Translating HTML and JavaScript using Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#weblate-cdn) * [`LOCALIZE_CDN_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_URL) * [`LOCALIZE_CDN_PATH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_PATH) ## Signing Git commits with GnuPG All commits can be signed by the GnuPG key of the Weblate instance. * Turn on [`WEBLATE_GPG_IDENTITY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_GPG_IDENTITY). (Weblate will generate a GnuPG key when needed and will use it to sign all translation commits.) This feature needs GnuPG 2.1 or newer installed. You can find the key in the [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) and the public key is shown on the “About” page: ![image](screenshots/about-gpg.webp) * Alternatively you can also import existing keys into Weblate, just set `HOME=$DATA_DIR/home` when invoking gpg. #### HINT The key material is cached by Weblate for a long period. In case you let Weblate generate a key with [`WEBLATE_GPG_IDENTITY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_GPG_IDENTITY) and then import key with the same identity to use an existing key, purging redis cache is recommended to see the effect of such change. #### NOTE When sharing [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) between multiple hosts, please follow instructions at [https://wiki.gnupg.org/NFS](https://wiki.gnupg.org/NFS) to make GnuPG signing work reliably. #### SEE ALSO [`WEBLATE_GPG_IDENTITY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_GPG_IDENTITY) ## Rate limiting #### Versionchanged Changed in version 4.6: The rate limiting no longer applies to signed in superusers. Several operations in Weblate are rate limited. Rate limits are evaluated independently for each scope. At most [`RATELIMIT_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_ATTEMPTS) attempts are allowed within [`RATELIMIT_WINDOW`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_WINDOW) seconds in one scope. That scope is then blocked for [`RATELIMIT_LOCKOUT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_LOCKOUT); Weblate does not turn this into a sitewide temporary IP ban. Exceeding one scope, such as `TRANSLATE` or `SEARCH`, does not by itself block unrelated scopes such as `LOGIN` or `SECOND_FACTOR`. There are also settings specific to scopes, for example `RATELIMIT_CONTACT_ATTEMPTS` or `RATELIMIT_TRANSLATE_ATTEMPTS`. The table below is a full list of available scopes. The following operations are subject to rate limiting: | Name | Scope | Allowed attempts | Ratelimit window | Lockout period | |----------------------------------------------|-----------------|--------------------|--------------------|------------------| | Registration | `REGISTRATION` | 5 | 300 | 600 | | Sending message to admins | `MESSAGE` | 2 | 300 | 600 | | Password authentication on sign-in | `LOGIN` | 5 | 300 | 600 | | Second-factor authentication | `SECOND_FACTOR` | 5 | 300 | 600 | | Sitewide search | `SEARCH` | 6 | 60 | 60 | | Translating | `TRANSLATE` | 30 | 60 | 600 | | Adding to glossary | `GLOSSARY` | 30 | 60 | 600 | | Starting translation into a new
language | `LANGUAGE` | 2 | 300 | 600 | | Creating new project | `PROJECT` | 5 | 600 | 600 | | Connecting a GitHub account | `GITHUB_SETUP` | 100 | 3600 | 600 | Within each scope, the rate limiting is based on sessions when user is signed in and on IP address if not. For signed-in users, Weblate records the first rejected request during each active scope lockout in the [Audit log](https://docs.weblate.org/en/latest/user/profile.md#audit-log), including the scope and request path. Repeated rejections during the same lockout do not create additional audit-log entries. If a user fails to sign in [`AUTH_LOCK_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTH_LOCK_ATTEMPTS) times, password authentication will be turned off on the account until having gone through the process of having its password reset. The settings can be also applied in the Docker container by adding `WEBLATE_` prefix to the setting name, for example [`RATELIMIT_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_ATTEMPTS) becomes [`WEBLATE_RATELIMIT_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_RATELIMIT_ATTEMPTS). The API has separate rate limiting settings, see [API rate limiting](https://docs.weblate.org/en/latest/api.md#api-rate). #### SEE ALSO * [Rate limiting](https://docs.weblate.org/en/latest/user/translating.md#user-rate) * [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy) * [API rate limiting](https://docs.weblate.org/en/latest/api.md#api-rate) # admin/projects.md # Translation projects ## Translation organization Weblate organizes translatable VCS content of project/components into a tree-like structure. You can additionally organize components within a project using categories. * The bottom level object is [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project), which should hold all translations belonging together (for example translation of an application in several versions and/or accompanying documentation). * The middle level is optionally created by [Category](https://docs.weblate.org/en/latest/admin/projects.md#category). The categories can be nested to achieve more complex structure. * On the level above, [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component), which is actually the component to translate, you define the VCS repository to use, and the mask of files to translate. * Above [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) there are individual translations, handled automatically by Weblate as translation files (which match [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) defined in [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component)) appear in the VCS repository. Weblate supports a wide range of translation formats (both bilingual and monolingual ones) supported by Translate Toolkit, see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats). #### NOTE You can share cloned VCS repositories using [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls). Using this feature is highly recommended when you have many components sharing the same VCS. It improves performance and decreases required disk space. ## Adding translation projects and components Based on your permissions, new translation projects and components can be created. It is always permitted for users with the Add new projects permission, and if your instance uses billing (e.g. like [https://hosted.weblate.org/](https://hosted.weblate.org/) see [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing)), you can also create those based on your plans allowance from the user account that manages billing. Projects can also be created in a workspace by users who have the Add projects to workspace permission in that workspace. Creating a project without selecting a workspace requires the site-wide Add new projects permission. See [Project creation and moves](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-project-creation) for details. #### HINT To grant every user permission to create new projects create new [Automatic team assignments](https://docs.weblate.org/en/latest/admin/access.md#autoteam) for the Project creators team. You can view your current billing plan on a separate page: ![image](screenshots/user-billing.webp) The project creation can be initiated from there, or using the menu in the navigation bar, filling in basic info about the translation project to complete addition of it: ![image](screenshots/user-add-project.webp) After creating the project, you are taken directly to the project page: ![image](screenshots/user-add-project-done.webp) Creating a new translation component can be initiated via a single click there. The process of creating a component is multi-staged and automatically detects most translation parameters. There are several approaches to creating component: From version control : Creates component from remote version control repository. From existing component : Creates additional component to existing one by choosing different files. Additional branch : Creates additional component to existing one, just for different branch. Upload translations files : Upload translation files to Weblate in case you do not have version control or do not want to integrate it with Weblate. You can later update the content using the web interface or [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). Translate document : Upload single document or translation file and translate that. Start from scratch : Create blank translation project and add strings manually. Once you have existing translation components, you can also easily add new ones for additional files or branches using same repository. First you need to fill in name and repository location: ![image](screenshots/user-add-component-init.webp) On the next page, you are presented with a list of discovered translatable resources: ![image](screenshots/user-add-component-discovery.webp) As a last step, you review the translation component info and fill in optional details: ![image](screenshots/user-add-component.webp) #### SEE ALSO * [The Django admin interface](https://docs.weblate.org/en/latest/admin/admin.md#admin-interface) * [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) ## Project configuration Create a translation project and then add a new component for translation in it. The project is like a shelf, in which real translations are stacked. All components in the same project share suggestions and their dictionary; the translations are also automatically propagated through all components in a single project (unless turned off in the component configuration), see [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#memory). #### SEE ALSO [Integrating with Weblate](https://docs.weblate.org/en/latest/devel/integration.md) These basic attributes set up and inform translators of a project: ### Project name Verbose project name, used to display the project name. #### SEE ALSO [`PROJECT_NAME_RESTRICT_RE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_NAME_RESTRICT_RE) ### URL slug Project name suitable for URLs. ### Project website URL where translators can find more info about the project. This is a required parameter unless turned off by [`WEBSITE_REQUIRED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBSITE_REQUIRED). #### SEE ALSO * [`PROJECT_WEB_RESTRICT_HOST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_HOST) * [`PROJECT_WEB_RESTRICT_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_ALLOWLIST) * [`PROJECT_WEB_RESTRICT_NUMERIC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_NUMERIC) * [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE) * [`PROJECT_WEB_RESTRICT_RE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_RE) ### Translation instructions Text describing localization process in the project, and any other information useful for translators. Markdown can be used for text formatting or inserting links. Good translation instructions explain how contributors should submit translations, what review they should expect, how they can report problems with source strings, and where translations can be tested or when they are released. ### Translation license Default translation license for components in this project. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Translation license](https://docs.weblate.org/en/latest/admin/projects.md#component-license) ### Contributor license agreement Default contributor license agreement for components in this project. Markdown can be used for text formatting or inserting links. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Contributor license agreement](https://docs.weblate.org/en/latest/admin/projects.md#component-agreement) ### Use shared translation memory Whether to use shared translation memory, see [Shared translation memory](https://docs.weblate.org/en/latest/admin/memory.md#shared-tm) for more details. The default value can be changed by [`DEFAULT_SHARED_TM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_SHARED_TM). ### Contribute to shared translation memory Whether to contribute to shared translation memory, see [Shared translation memory](https://docs.weblate.org/en/latest/admin/memory.md#shared-tm) for more details. This also affects whether the project can be used as source for [Automatic translation](https://docs.weblate.org/en/latest/admin/continuous.md#automatic-translation). The default value can be changed by [`DEFAULT_SHARED_TM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_SHARED_TM). #### NOTE This option is unavailable on Hosted Weblate, it is toggled together with [Use shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-shared-tm). ### Use workspace translation memory Whether to use translation memory shared by projects in the same workspace, see [Translation-memory scopes](https://docs.weblate.org/en/latest/admin/memory.md#memory-scopes) for more details. The workspace has to allow workspace translation memory as well. ### Contribute to workspace translation memory Whether to contribute translations to the translation memory shared by projects in the same workspace. The workspace has to allow contribution as well. #### NOTE This option is unavailable on Hosted Weblate, it is toggled together with [Use workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-workspace-tm). ### Autoclean translation memory #### Versionadded Added in version 5.13. Whether to replace older automatically created translation memory entries when a translation becomes active. Matching is based on the same source string, component, context, and source/target language pair. Uploaded translation memory files are not affected. #### SEE ALSO * [Translation memory status](https://docs.weblate.org/en/latest/admin/memory.md#memory-status) * [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/memory.md#autoclean-tm) ### Access control Configure per project access control, see [Project access control](https://docs.weblate.org/en/latest/admin/access.md#acl) for more details. The default value can be changed by [`DEFAULT_ACCESS_CONTROL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ACCESS_CONTROL). ### Public sharing Allow anonymous access to the project’s engage pages and rendered status widgets. This setting applies to Private and Custom projects; Public and Protected projects are always publicly shareable. Public sharing exposes project and component names, including restricted components, together with translation statistics, languages, and progress. It does not grant access to project pages, translations, repositories, or the API. Changing this setting requires the Manage project access permission. The status widget configuration page continues to use normal project access control. When [`REQUIRE_LOGIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REQUIRE_LOGIN) is enabled, [`PUBLIC_ENGAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PUBLIC_ENGAGE) must also be enabled for anonymous access to engage pages. ### Enforced two-factor authentication #### Versionadded Added in version 5.7. Enforce [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa) for all contributors. Users won’t be allowed to perform any operations within the project without having it configured. ### Enable reviews Enable review workflow for translations, see [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews). #### SEE ALSO * [`DEFAULT_TRANSLATION_REVIEW`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_TRANSLATION_REVIEW) * [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) ### Enable source reviews Enable review workflow for source strings, see [Source strings reviews](https://docs.weblate.org/en/latest/workflows.md#source-reviews). #### SEE ALSO * [`DEFAULT_SOURCE_REVIEW`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_SOURCE_REVIEW) * [Receiving source string feedback](https://docs.weblate.org/en/latest/devel/review.md#report-source) * [Comments](https://docs.weblate.org/en/latest/user/translating.md#user-comments) ### Translation quality filter #### Versionadded Added in version 5.13. The commit policy determines which translations are included when committing changes to the version control system. This setting is available at the project level and supports the following options: * **Commit all translations regardless of quality**: All translations will be committed, including those marked as needing editing or not reviewed. * **Skip translations marked as needing editing**: Only translations that don’t have the “needs editing”, “needs rewriting” or “needs checking” state will be committed. * **Only include approved translations**: Only translations that have been approved by a reviewer will be committed. This option requires [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) to be enabled. The approved-only policy applies only to translations with reviews enabled. Languages with reviews disabled through [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) commit all translations, including those marked as needing editing. Source strings follow the same rule using [Enable source reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-source-review). Components linked to a repository in another project follow their own project’s commit policy. If the editor shows “Only approved translations are written to the translation file.” or “Approval is required before this translation can be written to the translation file.”, the quality filter prevents writing the translation to the file until it is approved. This notice does not confirm that your current edit was saved; resolve any validation errors before leaving the editor. The project policy description qualifies this as “For languages with reviews enabled, only approved translations are written to the translation file.” Having permission to approve translations does not automatically approve your edits. For a language that does not use reviews, open its page in the project and choose Settings. Enable Customize translation workflow for this language in this project, then turn Enable reviews off. This requires permission to edit project settings. See [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization). With the approved-only policy, this makes all translation states eligible for writing to files for that language, including those needing editing. If reviews are needed, users with both review and bulk-edit permissions can use [Bulk edit](https://docs.weblate.org/en/latest/user/translating.md#bulk-edit) to approve existing translations they have reviewed. Eligibility for writing to a translation file does not mean the change is immediately committed or pushed; see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit) and [Push on commit](https://docs.weblate.org/en/latest/admin/projects.md#component-push-on-commit). ### Enable hooks Whether unauthenticated [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks) are to be used for this repository. #### SEE ALSO * [Intermediate language file](https://docs.weblate.org/en/latest/admin/projects.md#component-intermediate) * [Quality gateway for the source strings](https://docs.weblate.org/en/latest/workflows.md#source-quality-gateway) * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) * [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) ### Language aliases Define language codes mapping when importing translations into Weblate. Use this when language codes are inconsistent in your repositories and you want to get a consistent view in Weblate or in case you want to use non-standard naming of your translation files. The typical use case might be mapping American English to English: `en_US:en` Multiple mappings to be separated by comma: `en_GB:en,en_US:en` Using non standard code: `ia_FOO:ia` #### HINT The language codes are mapped when matching the translation files and the matches are case sensitive, so ensure you use the source language codes in same form as used in the filenames. #### SEE ALSO * [Adding new translations](https://docs.weblate.org/en/latest/devel/translations.md#adding-translation) * [Language code](https://docs.weblate.org/en/latest/admin/languages.md#language-code) * [Parsing language codes](https://docs.weblate.org/en/latest/admin/languages.md#language-parsing-codes) ### Adding new translation Default behavior for requests to create new translations in components in this project. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Adding new translation](https://docs.weblate.org/en/latest/admin/projects.md#component-new-lang) * [Limiting translation languages](https://docs.weblate.org/en/latest/workflows.md#workflow-language-restrictions) ### Language code style Default language code style for translations created by Weblate in components in this project. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Language code style](https://docs.weblate.org/en/latest/admin/projects.md#component-language-code-style) ### Secondary language #### Versionadded Added in version 5.11. Additional language to show together with the source language while translating. Optionally, it can be also used as a source for the machine translation. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Secondary languages](https://docs.weblate.org/en/latest/user/profile.md#secondary-languages) * [Source strings for the machine translation](https://docs.weblate.org/en/latest/admin/machine.md#mt-sources) ### Translation flags #### Versionadded Added in version 5.11. Customization of quality checks and other Weblate behavior, see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks). Workspace, project, component, and translation flags are merged. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) ### Commit, add, delete, merge, add-on, and merge request messages Default commit and merge request message templates for components in this project. The default values can be changed by [`DEFAULT_ADD_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ADD_MESSAGE), [`DEFAULT_ADDON_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ADDON_MESSAGE), [`DEFAULT_COMMIT_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_COMMIT_MESSAGE), [`DEFAULT_DELETE_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_DELETE_MESSAGE), [`DEFAULT_MERGE_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_MERGE_MESSAGE), [`DEFAULT_PULL_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_PULL_MESSAGE). The built-in defaults follow Conventional Commits and include Weblate links where available. Use Restore site default next to a message editor to restore the current installation default for that message; for inherited values, this also disables inheritance for that message. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup) ## Component configuration A component is a grouping of something for translation. You enter a VCS repository location and file mask for which files you want translated, and Weblate automatically fetches from this VCS, and finds all matching translatable files. #### SEE ALSO [Integrating with Weblate](https://docs.weblate.org/en/latest/devel/integration.md) You can find some examples of typical configurations in the [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats). #### NOTE It is recommended to keep translation components to a reasonable size - split the translation by anything that makes sense in your case (individual apps or add-ons, book chapters or websites). Weblate easily handles translations with 10000s of strings, but it is harder to split work and coordinate among translators with such large translation components. Should the language definition for a translation be missing, an empty definition is created and named as “cs_CZ (generated)”. You should adjust the definition and report this back to the Weblate authors, so that the missing languages can be included in next release. The component contains all important parameters for working with the VCS, and for getting translations out of it: ### Component name Verbose component name, used to display the component name. ### Component slug Component name suitable for URLs. ### Component project [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) where the component belongs. ### Version control system VCS to use, see [Version control integration](https://docs.weblate.org/en/latest/vcs.md#vcs) for details. #### SEE ALSO [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options) ### Version control parameters Parameters tuning how Weblate interacts with the repository, for example whether to force push or to open pull requests. Only parameters applicable to the selected [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) are shown, see also [Version control parameters](https://docs.weblate.org/en/latest/vcs.md#vcs-params). #### NOTE The settings form silently drops parameters which do not apply to the selected version control system, but the REST API rejects them. When changing [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) over the API, clear or replace `vcs_params` in the same request. The same applies to [File format parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format-params) and [File format](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format). ### Source code repository VCS repository used to pull changes. #### SEE ALSO See [Accessing repositories](https://docs.weblate.org/en/latest/vcs.md#vcs-repos) for more details on specifying URLs. #### HINT This can either be a real VCS URL or `weblate://project/component` indicating that the repository should be shared with another component. See [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls) for more details. ### Repository push URL Repository URL used for pushing. The behavior of this depends on [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs), and this is in more detail covered in [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). For linked repositories, this is not used and setting from linked component applies. #### SEE ALSO See [Accessing repositories](https://docs.weblate.org/en/latest/vcs.md#vcs-repos) for more details on how to specify a repository URL and [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options) for more details on pushing changes from Weblate. ### Repository browser URL of repository browser used to display source files (location of used messages). When empty, no such links will be generated. You can use [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup). For example on GitHub, use something like: `https://github.com/WeblateOrg/hello/blob/{{branch}}/{{filename}}#L{{line}}` In case your paths are relative to different folder (path contains `..`), you might want to strip leading directory by `parentdir` filter (see [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup)): `https://github.com/WeblateOrg/hello/blob/{{branch}}/{{filename|parentdir}}#L{{line}}` #### SEE ALSO * [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE) ### Exported repository URL URL where changes made by Weblate are exported. This is important when [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md#continuous-translation) is not used, or when there is a need to manually merge changes. You can use [Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter) to automate this for Git repositories. ### Repository branch Which branch to checkout from the VCS, and where to look for translations. For linked repositories using [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls), this setting is controlled by the linked component that owns the repository. Linked child components use the value from that component. ### Push branch Branch for pushing changes, leave empty to use [Repository branch](https://docs.weblate.org/en/latest/admin/projects.md#component-branch). For linked repositories using [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls), this setting is controlled by the linked component that owns the repository. Linked child components use the value from that component. #### NOTE This setting is ignored for Mercurial and Subversion. For Gerrit, this selects the target branch for the review request. Leave it empty to review against [Repository branch](https://docs.weblate.org/en/latest/admin/projects.md#component-branch). Use the short branch name, not `refs/heads/` or `refs/for/`. Gerrit push options can be appended after `%` in either setting, for example `main%topic=l10n`; Gerrit interprets them as the configured Weblate Gerrit account. #### SEE ALSO [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options) ### File mask Mask of files to translate, including path. It should include one “\*” replacing language code (see [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) for info on how this is processed). In case your repository contains more than one translation file (e.g. more gettext domains), you need to create a component for each of them. For example `po/*.po` or `locale/*/LC_MESSAGES/django.po`. In case your filename contains special characters such as `[`, `]`, these need to be escaped as `[[]` or `[]]`. #### SEE ALSO * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) * [What does mean “There are more files for the single language (en)”?](https://docs.weblate.org/en/latest/faq.md#faq-duplicate-files) ### Screenshot file mask This feature allows the discovery and updating of screenshots through screenshot file masks, using paths from the VCS repository. This operates at the component level and necessitates the use of an asterisk “\*” to replace the screenshot file name. Allowed formats are WebP, JPEG, PNG, APNG and GIF. Note: 1. The file mask and screenshot file mask are not related. Configure them separately. 2. It is a manual job to link a discovered screenshot in a component to a specific translation key. For example: Let’s assume your VCS repository has a structure like this: ```text component_A └── docs ├── image1.png └── image2.jpg ``` For component_A, you want to allow discovery and updates of PNG screenshots. You’d set the screenshot file mask for component_A as `component_A/docs/*.png`. This means any PNG images under docs in component_A can be discovered and updated. So, if you want to update `image1.png`, the new screenshot you provide should be named `image1.png`, matching the existing `filename`, and stored under `component_A/docs/`. For Android projects using Fastlane metadata, a source-language screenshot mask can point to the metadata screenshot folder, for example `fastlane/metadata/android/en-US/images/phoneScreenshots/*.png`. Weblate will discover matching screenshots on repository update. The discovered screenshots still need to be associated with source strings in the screenshot management interface; use OCR or source string search there to assign them in bulk. ### Monolingual base language file Base file containing string definitions for [Project and component creation](https://docs.weblate.org/en/latest/admin/admin.md#monolingual). #### SEE ALSO * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) * [What does mean “There are more files for the single language (en)”?](https://docs.weblate.org/en/latest/faq.md#faq-duplicate-files) ### Edit base file Whether to allow editing strings in the [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template). #### SEE ALSO * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) * [Project and component creation](https://docs.weblate.org/en/latest/admin/admin.md#monolingual) * [What does mean “There are more files for the single language (en)”?](https://docs.weblate.org/en/latest/faq.md#faq-duplicate-files) * [Manage strings](https://docs.weblate.org/en/latest/admin/projects.md#component-manage-units) ### Intermediate language file Intermediate language file for [Project and component creation](https://docs.weblate.org/en/latest/admin/admin.md#monolingual). In most cases this is a translation file provided by developers and is used when creating actual source strings. When set, the source strings are based on this file, but all other languages are based on [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template). In case the string is not translated into the source language, translating to other languages is prohibited. This provides [Quality gateway for the source strings](https://docs.weblate.org/en/latest/workflows.md#source-quality-gateway). The intermediate file can match an existing language file. While it is configured as intermediate, Weblate does not list it as a regular language in the component language list. Clearing this setting makes the file appear as a regular language again on the next component scan. Target strings can become read-only while the intermediate file is configured. This happens for strings where the matching source string in the [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template) is not translated yet. #### SEE ALSO * [Quality gateway for the source strings](https://docs.weblate.org/en/latest/workflows.md#source-quality-gateway) * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) * [What does mean “There are more files for the single language (en)”?](https://docs.weblate.org/en/latest/faq.md#faq-duplicate-files) ### Template for new translations Base file used to generate new translations. * Keep this field empty for most of the monoligual formats. Those are typically able to start from an empty file. * Choose `.pot` file with GNU gettext PO files. * Choose blank file without translations, if you have one. * Choose [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template) for monolingual formats that need a full set of keys present. * Choose [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template) for document translations. * Choose any translation file for others. * Template file can be the same as the base file in most cases. #### HINT In many monolingual formats Weblate starts with empty file by default. Use this in case you want to have all strings present with empty value when creating new translation. #### SEE ALSO * [Adding new translations](https://docs.weblate.org/en/latest/devel/translations.md#adding-translation) * [Adding new translation](https://docs.weblate.org/en/latest/admin/projects.md#component-new-lang) * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) * [What does mean “There are more files for the single language (en)”?](https://docs.weblate.org/en/latest/faq.md#faq-duplicate-files) ### File format Translation file format, see also [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats). ### File format parameters Parameters used to configure how translation files are processed, see also [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). ### Source string bug reporting address Email address used for reporting upstream bugs. This address will also receive notification about any source string comments made in Weblate. With the [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) format, this address is also saved by Weblate in the *Report-Msgid-Bugs-To* header of the file. ### Do not show glossary matches Hides the glossary panel and its matches in the translation editor for this component. When enabled, glossary suggestions for this component are not computed, and the Glossary panel (including its “Add term to glossary” action) is hidden in the editor. #### NOTE Glossary self-references are always excluded from matches even when this option is disabled. #### SEE ALSO * [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) * [Use as a glossary](https://docs.weblate.org/en/latest/admin/projects.md#component-is-glossary) ### Contribute to project translation memory Controls whether translations from this component are added to the project translation memory. #### SEE ALSO [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md) ### Allow translation propagation You can turn off propagation of translations to this component from other components within same project. This really depends on what you are translating, sometimes it’s desirable to have make use of a translation more than once. It’s usually a good idea to turn this off for monolingual translations, unless you are using the same IDs across the whole project. The default value can be changed by [`DEFAULT_TRANSLATION_PROPAGATION`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_TRANSLATION_PROPAGATION). #### SEE ALSO [Keeping translations same across components](https://docs.weblate.org/en/latest/admin/continuous.md#translation-consistency) ### Enable suggestions Whether translation suggestions are accepted for this component. #### SEE ALSO [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) ### Suggestion voting Turns on vote casting for suggestions, see [Suggestion voting](https://docs.weblate.org/en/latest/admin/translating.md#voting). #### SEE ALSO [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) ### Automatically accept suggestions Automatically accept voted suggestions, see [Suggestion voting](https://docs.weblate.org/en/latest/admin/translating.md#voting). #### SEE ALSO [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) ### Translation flags Customization of quality checks and other Weblate behavior, see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks). Workspace, project, component, and translation flags are merged. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) ### Enforced checks List of checks which can not be dismissed. #### SEE ALSO [Enforcing checks](https://docs.weblate.org/en/latest/admin/checks.md#enforcing-checks) ### Translation license License of the translation (does not need to be the same as the source code license). #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) ### Contributor license agreement Contributor license agreement which needs to be approved before a user can translate this component. Markdown can be used for text formatting or inserting links. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) ### Adding new translation How to handle requests for creation of new languages. Available options: Contact maintainers : User can select desired language and the project maintainers will receive a notification about this. It is up to them to add (or not) the language to the repository. Point to translation instructions URL : User is presented a link to page which describes process of starting new translations. Use this in case more formal process is desired (for example forming a team of people before starting actual translation). Create new language file : User can select language and Weblate automatically creates the file for it and translation can begin. Create existing project languages; contact maintainers for new languages : Users can create translations for languages already used as target languages in another non-glossary component in the project. Other languages are requested from maintainers, who approve them by creating the first target translation. See [Limiting translation languages](https://docs.weblate.org/en/latest/workflows.md#workflow-language-restrictions) for eligibility and API behavior. Disable adding new translations : There will be no option for user to start new translation. #### HINT The project admins can add new translations even if it is disabled here when it is possible (either [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base) or the file format supports starting from an empty file). #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Adding new translations](https://docs.weblate.org/en/latest/devel/translations.md#adding-translation) * [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base) * [Limiting translation languages](https://docs.weblate.org/en/latest/workflows.md#workflow-language-restrictions) ### Manage strings #### Versionadded Added in version 4.5. Configures whether users in Weblate will be allowed to add new strings and remove existing ones. Adjust this to match your localization workflow - how the new strings are supposed to be introduced. For bilingual formats, the strings are typically extracted from the source code (for example by using **xgettext**) and adding new strings in Weblate should be disabled (they would be discarded next time you update the translation files). In Weblate you can manage strings for every translation and it does not enforce the strings in all translations to be consistent. For monolingual formats, the strings are managed only on source language and are automatically added or removed in the translations. The strings appear in the translation files once they are translated. #### HINT You might want to turn on [Edit base file](https://docs.weblate.org/en/latest/admin/projects.md#component-edit-template) together with Manage strings for monolingual formats. #### SEE ALSO * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) * [Adding new strings](https://docs.weblate.org/en/latest/devel/integration.md#adding-new-strings) * [`POST /api/translations/(string:project)/(string:component)/(string:language)/units/`](https://docs.weblate.org/en/latest/api.md#post--api-translations-(string-project)-(string-component)-(string-language)-units-) ### Language code style Customize language code used to generate the filename for translations created by Weblate. #### NOTE Weblate recognizes any of the language codes when parsing translation files, following settings only influences how new files are created. Default based on the file format : Dependent on file format, for most of them POSIX is used. POSIX style using underscore as a separator : Typically used by gettext and related tools, produces language codes like `pt_BR`. POSIX style using underscore as a separator, lower cased : Typically used by gettext and related tools, produces language codes like `pt_BR`. POSIX style using underscore as a separator, including country code : POSIX style language code including the country code even when not necessary (for example `cs_CZ`). POSIX style using underscore as a separator, including country code, lower cased : POSIX style language code including the country code even when not necessary (lowercase) (for example `cs_cz`). BCP style using hyphen as a separator : Typically used on web platforms, produces language codes like `pt-BR`. BCP style using hyphen as a separator, including country code : BCP style language code including the country code even when not necessary (for example `cs-CZ`). BCP style using hyphen as a separator, legacy language codes : Uses legacy codes for Chinese and BCP style notation. BCP style using hyphen as a separator, lower cased : BCP style notation, all in lower case (for example `cs-cz`). Apple App Store metadata style : Style suitable for uploading metadata to Apple App Store. Google Play metadata style : Style suitable for uploading metadata to Google Play Store. Android style : Only used in Android apps, produces language codes like `pt-rBR`. Linux style : Locales as used by Linux, uses legacy codes for Chinese and POSIX style notation. Linux style, lower cased : Locales as used by Linux, uses legacy codes for Chinese and POSIX style notation. Lower cased. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Adding new translations](https://docs.weblate.org/en/latest/devel/translations.md#adding-translation) * [Language code](https://docs.weblate.org/en/latest/admin/languages.md#language-code) * [Parsing language codes](https://docs.weblate.org/en/latest/admin/languages.md#language-parsing-codes) * [Language aliases](https://docs.weblate.org/en/latest/admin/projects.md#project-language-aliases) ### Merge style You can configure how updates from the upstream repository are handled. The actual implementation depends on VCS, see [Version control integration](https://docs.weblate.org/en/latest/vcs.md). Rebase : Rebases Weblate commits on top of upstream repository on update. This provides clean history without extra merge commits.
Rebasing can cause you trouble in case of complicated merges, so carefully consider whether or not you want to enable them.
You might need to turn on [force pushing](https://docs.weblate.org/en/latest/vcs.md#vcs-git-force-push) in [Version control parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs-params), especially when pushing to a different branch. Merge : Upstream repository changes are merged into Weblate one. This setting utilizes fast-forward when possible. This is the safest way, but might produce a lot of merge commits. Merge without fast-forward : Upstream repository changes are merged into Weblate one with doing a merge commit every time (even when fast-forward would be possible). Every Weblate change will appear as a merge commit in Weblate repository. The default value can be changed by [`DEFAULT_MERGE_STYLE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_MERGE_STYLE). ### Commit, add, delete, merge, add-on, and merge request messages Message used when committing a translation, see [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup). The default value can be changed by [`DEFAULT_ADD_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ADD_MESSAGE), [`DEFAULT_ADDON_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ADDON_MESSAGE), [`DEFAULT_COMMIT_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_COMMIT_MESSAGE), [`DEFAULT_DELETE_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_DELETE_MESSAGE), [`DEFAULT_MERGE_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_MERGE_MESSAGE), [`DEFAULT_PULL_MESSAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_PULL_MESSAGE). The built-in defaults follow Conventional Commits and include Weblate links where available. Use Restore site default next to a message editor to restore the current installation default for that message; for inherited values, this also disables inheritance for that message. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) ### Push on commit Whether committed changes should be automatically pushed to the upstream repository. When enabled, the push is initiated once Weblate commits changes to its underlying repository (see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit)). To actually enable pushing Repository push URL has to be configured as well. For linked repositories using [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls), this setting is controlled by the linked component that owns the repository. Linked child components use the value from that component. ### Age of changes to commit Sets how old (in hours) changes have to be before they are committed by background task or the [`commit_pending`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-commit_pending) management command. All changes in a component are committed once there is at least one change older than this period. For linked repositories using [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls), this setting is controlled by the linked component that owns the repository. Linked child components use the value from that component. The default value can be changed by [`COMMIT_PENDING_HOURS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-COMMIT_PENDING_HOURS). #### HINT There are other situations where pending changes might be committed, see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit). ### Lock on error Locks the component (and linked components, see [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls)) upon the first failed push or merge into its upstream repository, or pull from it. This avoids adding another conflicts, which would have to be resolved manually. The component will be automatically unlocked once there are no repository errors left. For linked repositories using [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls), this setting is controlled by the linked component that owns the repository. Linked child components use the value from that component. ### Source language Language used for source strings. Change this if you are translating from something else than English. #### HINT In case you are translating bilingual files from English, but want to be able to do fixes in the English translation as well, choose English (Developer) as a source language to avoid conflict between the name of the source language and the existing translation. For monolingual translations, you can use intermediate translation in this case, see [Intermediate language file](https://docs.weblate.org/en/latest/admin/projects.md#component-intermediate). ### Language filter Regular expression used to filter the translation when scanning for file mask. It can be used to limit the list of languages managed by Weblate. The filter also applies when creating a new translation file. In this case, it checks the language code generated according to [Language code style](https://docs.weblate.org/en/latest/admin/projects.md#component-language-code-style). #### NOTE You need to list language codes as they appear in the filename. Some examples of filtering: | Filter description | Regular expression | |------------------------------|----------------------| | Selected languages only | `^(cs|de|es)$` | | Exclude languages | `^(?!(it|fr)$).+$` | | Filter two letter codes only | `^..$` | | Exclude non language files | `^(?!(blank)$).+$` | | Include all files (default) | `^[^.]+$` | #### SEE ALSO [Limiting translation languages](https://docs.weblate.org/en/latest/workflows.md#workflow-language-restrictions) ### Key filter #### Versionadded Added in version 5.8. A regular expression that is used to filter units by their keys. It displays only those units whose keys match the regular expression that was set as the value of this field. Some examples of filtering: | Filter description | Regular expression | |------------------------------|--------------------------| | Selected keys only | `^(one|two|other)$` | | Exclude app store changelogs | `^(?!changelogs/.*$).+$` | | Filter prefixed strings | `^translatable` | #### NOTE This filter is only available for components with monolingual file formats. ### Variants regular expression Regular expression used to determine the variants of a string, see [String variants](https://docs.weblate.org/en/latest/devel/translations.md#variants). #### NOTE Most of the fields can be edited by project owners or administrators, in the Weblate interface. #### SEE ALSO * [Does Weblate support other VCSes than Git and Mercurial?](https://docs.weblate.org/en/latest/faq.md#faq-vcs) * [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) ### Secondary language #### Versionadded Added in version 5.11. Additional language to show together with the source language while translating. Optionally, it can be also used as a source for the machine translation. #### NOTE This setting can be inherited from the project. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Secondary languages](https://docs.weblate.org/en/latest/user/profile.md#secondary-languages) * [Source strings for the machine translation](https://docs.weblate.org/en/latest/admin/machine.md#mt-sources) ### Priority Components with higher priority are offered first to translators. #### Versionchanged Changed in version 4.15: This now also affects ordering of matched glossary terms. ### Restricted access #### NOTE On Hosted Weblate, this requires a billing plan which permits private projects. By default the component is visible to anybody who has access to the project, even if the person can not perform any changes in the component. This makes it easier to keep translation consistency within the project. Restricting access at a component, or component-list level takes over access permission to a component, regardless of project-level permissions. You will have to grant access to it explicitly. This can be done through granting access to a new user group and putting users in it, or using the default custom or private access control groups. The default value can be changed in [`DEFAULT_RESTRICTED_COMPONENT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_RESTRICTED_COMPONENT). #### HINT This applies to project admins as well — please ensure you will not lose access to the component after toggling the status. Restricted components do not contribute new entries to [Shared translation memory](https://docs.weblate.org/en/latest/admin/memory.md#shared-tm). Project and workspace translation memory entries attributed to an existing restricted component follow the component restriction. Unattributed legacy entries follow the access rules of their translation memory scope. On Hosted Weblate, shared translation memory and restricted components can not be enabled in the same project. ### Share in projects You can choose additional projects where the component will be visible. Useful for shared libraries which you use in several projects. #### NOTE Sharing a component doesn’t change its access control. It only makes it visible when browsing other projects. Users still need access to the actual component to browse or translate it. ### Use as a glossary #### Versionadded Added in version 4.5. Allows using this component as a glossary. Use when you want to manage terminology separately from normal translations. Glossaries are best for: - Ensuring consistent use of terms (e.g., UI labels, product names). - Sharing preferred translations across multiple components or projects. - Supporting translators with definitions and context. #### NOTE Glossaries are not for regular translations—they are for managing terms only. Weblate automatically adds missing glossary languages for languages used in the project. See [Language files and synchronization](https://docs.weblate.org/en/latest/user/glossary.md#glossary-language-sync) for details. You can configure how it will be listed using [Glossary color](https://docs.weblate.org/en/latest/admin/projects.md#component-glossary-color). The glossary will be accessible in all projects defined by [Share in projects](https://docs.weblate.org/en/latest/admin/projects.md#component-links). It is recommended to enable [Manage strings](https://docs.weblate.org/en/latest/admin/projects.md#component-manage-units) on glossaries in order to allow adding new words to them. #### SEE ALSO [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) ### Glossary color Color used when displaying terms from this glossary. Useful to distinguish glossaries when using more of them. #### SEE ALSO [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) ## Category Categories are there to give structure to components within a project. You can nest them to achieve a more complex structure. ### Category settings Categories can override the same inherited settings as projects and components, including translation license, contributor agreement, adding new translations, secondary language, translation flags, and commit messages. Nested categories inherit from their parent category by default. Top-level categories inherit from the project. Components in a category inherit from that category by default. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Translation license](https://docs.weblate.org/en/latest/admin/projects.md#project-license) * [Translation license](https://docs.weblate.org/en/latest/admin/projects.md#component-license) ## Template markup Weblate uses simple markup language in several places where text rendering is needed. It is based on [The Django template language](https://docs.djangoproject.com/en/stable/ref/templates/language/), so it can be quite powerful. Currently it is used in: * Commit message formatting, see [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) * Several add-ons : * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) * [Statistics generator](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-generate-generate) * [Executing scripts from add-on](https://docs.weblate.org/en/latest/admin/addons.md#addon-script) The following variables are available in the component templates: `{{ language_code }}` : Language code `{{ language_name }}` : Language name `{{ component_name }}` : Component name `{{ component_slug }}` : Component slug `{{ project_name }}` : Project name `{{ project_slug }}` : Project slug `{{ url }}` : Translation URL `{{ filename }}` : Translation filename `{{ stats }}` : Translation stats, this has further attributes, examples below. `{{ stats.all }}` : Total strings count `{{ stats.fuzzy }}` : Count of strings needing review `{{ stats.fuzzy_percent }}` : Percent of strings needing review `{{ stats.translated }}` : Translated strings count `{{ stats.translated_percent }}` : Translated strings percent `{{ stats.allchecks }}` : Number of strings with failing checks `{{ stats.allchecks_percent }}` : Percent of strings with failing checks `{{ author }}` : Author of current commit, available only in the commit scope. `{{ addon_name }}` : Name of currently executed add-on, available only in the add-on commit message. The [Statistics generator](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-generate-generate) additionally supports a collection of languages and their statistics in component mode. Use the `json` or `python` filter to serialize template values into JSON or Python literals, including the necessary quoting and escaping. The following variables are available in the repository browser or editor templates: `{{branch}}` : current branch `{{line}}` : line in file `{{filename}}` : filename, you can also strip leading parts using the `parentdir` filter, for example `{{filename|parentdir}}` #### HINT In some places additional variables can be available, see [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery). You can combine them with filters: ```django {{ component|title }} ``` You can use conditions: ```django {% if stats.translated_percent > 80 %}Well translated!{% endif %} ``` There is additional tag available for replacing characters: ```django {% replace component "-" " " %} ``` You can combine it with filters: ```django {% replace component|capfirst "-" " " %} ``` There are also additional filter to manipulate with filenames: ```django Directory of a file: {{ filename|dirname }} File without extension: {{ filename|stripext }} File in parent dir: {{ filename|parentdir }} It can be used multiple times: {{ filename|parentdir|parentdir }} ``` …and other Django template features. ## Importing speed Fetching VCS repository and importing translations to Weblate can be a lengthy process, depending on size of your translations. Here are some tips: ### Optimize configuration The default configuration is useful for testing and debugging Weblate, while for a production setup, you should do some adjustments. Many of them have quite a big impact on performance. Please check [Production setup](https://docs.weblate.org/en/latest/admin/install.md#production) for more details, especially: * Configure Celery for executing background tasks (see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery)) * [Configure cache](https://docs.weblate.org/en/latest/admin/install.md#production-cache) * [Use a powerful database engine](https://docs.weblate.org/en/latest/admin/install.md#production-database) * [Disable debug mode](https://docs.weblate.org/en/latest/admin/install.md#production-debug) ### Check resource limits If you are importing huge translations or repositories, you might be hit by resource limitations of your server. * Check the amount of free memory, having translation files cached by the operating system will greatly improve performance. * Disk operations might be bottleneck if there is a lot of strings to process—the disk is pushed by both Weblate and the database. * Additional CPU cores might help improve performance of background tasks (see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery)). ### Disable unneeded checks Some quality checks can be quite expensive, and if not needed, can save you some time during import if omitted. See [`CHECK_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CHECK_LIST) for info on configuration. ## Automatic creation of components In case your project has dozen of translation files (e.g. for different gettext domains, or parts of Android apps), you might want to import them automatically. This can either be achieved from the command-line by using [`import_project`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_project) or [`import_json`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_json), or by installing the [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) add-on. To use the add-on, you first need to create a component for one translation file (choose the one that is the least likely to be renamed or removed in future), and install the add-on on this component. For the management commands, you need to create a project which will contain all components and then run [`import_project`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_project) or [`import_json`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_json). #### SEE ALSO * [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage) * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) # admin/sample.md # Sample configuration The following example is shipped as `weblate/settings_example.py` with Weblate: ```python # Copyright © Michal Čihař # # SPDX-License-Identifier: GPL-3.0-or-later # mypy: disable-error-code="var-annotated" from __future__ import annotations import os import platform from logging.handlers import SysLogHandler from weblate.api.spectacular import ( get_drf_settings, get_drf_standardized_errors_settings, get_spectacular_settings, ) # Title of site to use SITE_TITLE = "Weblate" # Site domain SITE_DOMAIN = "" # Whether site uses https ENABLE_HTTPS = False # Site URL SITE_URL = f"{'https' if ENABLE_HTTPS else 'http'}://{SITE_DOMAIN}" # # Django settings for Weblate project. # DEBUG = True ADMINS: tuple[str, ...] = ( # "Your Name ", ) MANAGERS = ADMINS DATABASES: dict[str, dict[str, str | int | dict | None]] = { "default": { "ENGINE": "django.db.backends.postgresql", # Database name. "NAME": "weblate", # Database user. "USER": "weblate", # Name of role to alter to set parameters in PostgreSQL, # use in case role name is different than the user used for authentication. # "ALTER_ROLE": "weblate", # Database password. "PASSWORD": "", # Set to empty string for localhost. "HOST": "127.0.0.1", # Set to empty string for default. "PORT": "", # Customizations for databases. "OPTIONS": {}, # Persistent connections "CONN_MAX_AGE": None, "CONN_HEALTH_CHECKS": True, # Disable server-side cursors, might be needed with pgbouncer "DISABLE_SERVER_SIDE_CURSORS": False, } } # Data directory, you can use following for the development purposes: # os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "data") DATA_DIR = "/home/weblate/data" CACHE_DIR = f"{DATA_DIR}/cache" # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name # although not all choices may be available on all operating systems. # In a Windows environment this must be set to your system time zone. TIME_ZONE = "UTC" # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html LANGUAGE_CODE = "en-us" LANGUAGES = ( ("ar", "العربية"), ("az", "Azərbaycan"), ("ba", "башҡорт теле"), # codespell:ignore ("be", "Беларуская"), ("be-latn", "Biełaruskaja"), ("bg", "Български"), ("br", "Brezhoneg"), ("ca", "Català"), ("cs", "Čeština"), ("cy", "Cymraeg"), ("da", "Dansk"), ("de", "Deutsch"), ("en", "English"), ("el", "Ελληνικά"), ("en-gb", "English (United Kingdom)"), ("es", "Español"), ("fi", "Suomi"), ("fr", "Français"), ("ga", "Gaeilge"), ("gl", "Galego"), ("he", "עברית"), ("hu", "Magyar"), ("hr", "Hrvatski"), ("id", "Indonesia"), ("is", "Íslenska"), ("it", "Italiano"), ("ja", "日本語"), ("kab", "Taqbaylit"), ("kk", "Қазақ тілі"), ("ko", "한국어"), ("lo", "ລາວ"), ("nb", "Norsk bokmål"), ("nl", "Nederlands"), ("pl", "Polski"), ("pt", "Português"), ("pt-br", "Português brasileiro"), ("ro", "Română"), ("ru", "Русский"), ("sk", "Slovenčina"), ("sl", "Slovenščina"), ("sq", "Shqip"), ("sr", "Српски"), ("sr-latn", "Srpski"), ("sv", "Svenska"), ("ta", "தமிழ்"), ("th", "ไทย"), ("tr", "Türkçe"), ("uk", "Українська"), ("vi", "Tiếng việt"), ("zh-hans", "简体中文"), ("zh-hant", "正體中文"), ) SITE_ID = 1 # If you set this to False, Django will make some optimizations so as not # to load the internationalization machinery. USE_I18N = True # If you set this to False, Django will not use timezone-aware datetimes. USE_TZ = True # Type of automatic primary key, introduced in Django 3.2 DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # URL prefix to use, please see documentation for more details URL_PREFIX = "" # Absolute filesystem path to the directory that will hold user-uploaded files. MEDIA_ROOT = os.path.join(DATA_DIR, "media") # Absolute path to the directory static files should be collected to. # Don't put anything in this directory yourself; store your static files # in apps' "static/" subdirectories and in STATICFILES_DIRS. STATIC_ROOT = os.path.join(CACHE_DIR, "static") # URL prefix for static files. STATIC_URL = f"{URL_PREFIX}/static/" # Additional locations of static files STATICFILES_DIRS = ( # Put strings here, like "/home/html/static" or "C:/www/django/static". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. ) # List of finder classes that know how to find static files in # various locations. STATICFILES_FINDERS = ( "django.contrib.staticfiles.finders.FileSystemFinder", "django.contrib.staticfiles.finders.AppDirectoriesFinder", ) STORAGES = { "default": {"BACKEND": "django.core.files.storage.FileSystemStorage"}, "staticfiles": { "BACKEND": ( "django.contrib.staticfiles.storage.StaticFilesStorage" if DEBUG else "weblate.utils.static.WeblateManifestStaticFilesStorage" ) }, } # Make this unique, and don't share it with anybody. # You can generate it using weblate-generate-secret-key SECRET_KEY = "" TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "OPTIONS": { "context_processors": [ "django.contrib.auth.context_processors.auth", "django.template.context_processors.debug", "django.template.context_processors.i18n", "django.template.context_processors.request", "django.template.context_processors.csrf", "django.contrib.messages.context_processors.messages", "weblate.trans.context_processors.weblate_context", ], }, "APP_DIRS": True, } ] # GitHub username and token for sending pull requests. # Please see the documentation for more details. GITHUB_CREDENTIALS = {} # Webhook secret for a legacy GitHub App delivering to /hooks/github/. GITHUB_LEGACY_APP_WEBHOOK_SECRET = "" # Azure DevOps username and token for sending pull requests. # Please see the documentation for more details. AZURE_DEVOPS_CREDENTIALS = {} # GitLab username and token for sending merge requests. # Please see the documentation for more details. GITLAB_CREDENTIALS = {} # Bitbucket username and token for sending merge requests. # Please see the documentation for more details. BITBUCKETSERVER_CREDENTIALS = {} # Bitbucket username, app-password and workspace for sending merge requests. # Please see the documentation for more details. BITBUCKETCLOUD_CREDENTIALS = {} # Authentication configuration AUTHENTICATION_BACKENDS: tuple[str, ...] = ( "social_core.backends.email.EmailAuth", # "social_core.backends.google.GoogleOAuth2", # "social_core.backends.github.GithubOAuth2", # "social_core.backends.github_enterprise.GithubEnterpriseOAuth2", # "social_core.backends.bitbucket.BitbucketOAuth2", # "social_core.backends.suse.OpenSUSEOpenId", # "social_core.backends.ubuntu.UbuntuOpenId", # "social_core.backends.fedora.FedoraOpenId", # "social_core.backends.facebook.FacebookOAuth2", "weblate.accounts.auth.WeblateUserBackend", ) # Custom user model AUTH_USER_MODEL = "weblate_auth.User" # WebAuthn OTP_WEBAUTHN_RP_NAME = SITE_TITLE OTP_WEBAUTHN_RP_ID = SITE_DOMAIN.split(":", 1)[0] OTP_WEBAUTHN_ALLOWED_ORIGINS = [SITE_URL] OTP_WEBAUTHN_ALLOW_PASSWORDLESS_LOGIN = False OTP_WEBAUTHN_HELPER_CLASS = "weblate.accounts.utils.WeblateWebAuthnHelper" # Social auth backends setup SOCIAL_AUTH_GITHUB_KEY = "" SOCIAL_AUTH_GITHUB_SECRET = "" SOCIAL_AUTH_GITHUB_SCOPE = ["user:email"] SOCIAL_AUTH_GITHUB_ORG_KEY = "" SOCIAL_AUTH_GITHUB_ORG_SECRET = "" SOCIAL_AUTH_GITHUB_ORG_NAME = "" SOCIAL_AUTH_GITHUB_TEAM_KEY = "" SOCIAL_AUTH_GITHUB_TEAM_SECRET = "" SOCIAL_AUTH_GITHUB_TEAM_ID = "" SOCIAL_AUTH_GITHUB_ENTERPRISE_KEY = "" SOCIAL_AUTH_GITHUB_ENTERPRISE_SECRET = "" SOCIAL_AUTH_GITHUB_ENTERPRISE_URL = "" SOCIAL_AUTH_GITHUB_ENTERPRISE_API_URL = "" SOCIAL_AUTH_GITHUB_ENTERPRISE_SCOPE = "" SOCIAL_AUTH_BITBUCKET_OAUTH2_KEY = "" SOCIAL_AUTH_BITBUCKET_OAUTH2_SECRET = "" SOCIAL_AUTH_BITBUCKET_OAUTH2_VERIFIED_EMAILS_ONLY = True SOCIAL_AUTH_FACEBOOK_KEY = "" SOCIAL_AUTH_FACEBOOK_SECRET = "" SOCIAL_AUTH_FACEBOOK_SCOPE = ["email", "public_profile"] SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = {"fields": "id,name,email"} SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "" SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "" # Social auth settings SOCIAL_AUTH_PIPELINE = ( "social_core.pipeline.social_auth.social_details", "social_core.pipeline.social_auth.social_uid", "social_core.pipeline.social_auth.auth_allowed", "social_core.pipeline.social_auth.social_user", "weblate.accounts.pipeline.store_params", "weblate.accounts.pipeline.verify_open", "social_core.pipeline.user.get_username", "weblate.accounts.pipeline.require_email", "social_core.pipeline.mail.mail_validation", "weblate.accounts.pipeline.revoke_mail_code", "weblate.accounts.pipeline.ensure_valid", "weblate.accounts.pipeline.remove_account", "social_core.pipeline.social_auth.associate_by_email", "weblate.accounts.pipeline.reauthenticate", "weblate.accounts.pipeline.verify_username", "social_core.pipeline.user.create_user", "social_core.pipeline.social_auth.associate_user", "weblate.accounts.pipeline.handle_invite", "social_core.pipeline.social_auth.load_extra_data", "weblate.accounts.pipeline.second_factor", "weblate.accounts.pipeline.user_full_name", "weblate.accounts.pipeline.store_email", "weblate.accounts.pipeline.notify_connect", "weblate.accounts.pipeline.password_reset", ) SOCIAL_AUTH_DISCONNECT_PIPELINE = ( "social_core.pipeline.disconnect.allowed_to_disconnect", "social_core.pipeline.disconnect.get_entries", "social_core.pipeline.disconnect.revoke_tokens", "weblate.accounts.pipeline.cycle_session", "weblate.accounts.pipeline.adjust_primary_mail", "weblate.accounts.pipeline.notify_disconnect", "social_core.pipeline.disconnect.disconnect", ) # Custom authentication strategy SOCIAL_AUTH_STRATEGY = "weblate.accounts.strategy.WeblateStrategy" # Raise exceptions so that we can handle them later SOCIAL_AUTH_RAISE_EXCEPTIONS = True SOCIAL_AUTH_EMAIL_VALIDATION_FUNCTION = "weblate.accounts.pipeline.send_validation" SOCIAL_AUTH_EMAIL_VALIDATION_URL = f"{URL_PREFIX}/accounts/email-sent/" SOCIAL_AUTH_LOGIN_ERROR_URL = f"{URL_PREFIX}/accounts/login/" SOCIAL_AUTH_EMAIL_FORM_URL = f"{URL_PREFIX}/accounts/email/" SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = f"{URL_PREFIX}/accounts/profile/#account" SOCIAL_AUTH_PROTECTED_USER_FIELDS = ("email",) SOCIAL_AUTH_SLUGIFY_USERNAMES = True SOCIAL_AUTH_SLUGIFY_FUNCTION = "weblate.accounts.pipeline.slugify_username" # Value higher than 0 enables validation using zxcvbn PASSWORD_MINIMAL_STRENGTH = 0 # Password validation configuration AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator" }, { "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", "OPTIONS": {"min_length": 10}, }, {"NAME": "weblate.accounts.password_validation.MaximalLengthValidator"}, {"NAME": "weblate.accounts.password_validation.PastPasswordsValidator"}, ] # Optional password strength validation by django-zxcvbn-password-validator if PASSWORD_MINIMAL_STRENGTH > 0: AUTH_PASSWORD_VALIDATORS.append( {"NAME": "django_zxcvbn_password_validator.ZxcvbnPasswordValidator"} ) else: AUTH_PASSWORD_VALIDATORS.extend( [ {"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator"}, { "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator" }, {"NAME": "weblate.accounts.password_validation.CharsPasswordValidator"}, ] ) # Password hashing (prefer Argon) PASSWORD_HASHERS = [ "django.contrib.auth.hashers.Argon2PasswordHasher", "django.contrib.auth.hashers.PBKDF2PasswordHasher", "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", "django.contrib.auth.hashers.BCryptSHA256PasswordHasher", ] # Allow new user registrations REGISTRATION_OPEN = True # Allow registration with disposable e-mail domains REGISTRATION_ALLOW_DISPOSABLE_EMAILS = False # Project website restriction allowlist # PROJECT_WEB_RESTRICT_ALLOWLIST = {"trusted-project"} # Restrict private webhook targets # WEBHOOK_RESTRICT_PRIVATE = True # Restrict private asset targets # ASSET_RESTRICT_PRIVATE = True # Restrict private VCS repository targets # VCS_RESTRICT_PRIVATE = True # Private VCS repository target allowlist # VCS_PRIVATE_ALLOWLIST = [".internal.example", "vcs.internal.example"] # Private webhook target allowlist # WEBHOOK_PRIVATE_ALLOWLIST = [".internal.example", "hooks.internal.example"] # Private asset target allowlist # ASSET_PRIVATE_ALLOWLIST = [".internal.example", "assets.internal.example"] # Shortcut for login required setting REQUIRE_LOGIN = False # Middleware MIDDLEWARE = [ "weblate.middleware.RedirectMiddleware", "weblate.middleware.ProxyMiddleware", "corsheaders.middleware.CorsMiddleware", "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "weblate.accounts.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "social_django.middleware.SocialAuthExceptionMiddleware", "weblate.api.middleware.ThrottlingMiddleware", "weblate.middleware.SecurityMiddleware", "weblate.wladmin.middleware.ManageMiddleware", ] if REQUIRE_LOGIN: # Use Django 5.1's LoginRequiredMiddleware to enforce authentication # All public views are marked with @login_not_required decorator MIDDLEWARE.insert( MIDDLEWARE.index("weblate.api.middleware.ThrottlingMiddleware"), "django.contrib.auth.middleware.LoginRequiredMiddleware", ) ROOT_URLCONF = "weblate.urls" # Django and Weblate apps INSTALLED_APPS = [ # Weblate apps on top to override Django locales and templates "weblate.addons", "weblate.api", "weblate.auth", "weblate.checks", "weblate_fonts", "weblate.formats", "weblate.glossary", "weblate.machinery", "weblate.workspaces", "weblate.trans", "weblate.lang", "weblate_language_data", "weblate.memory", "weblate.screenshots", "weblate.fonts", "weblate.accounts", "weblate.configuration", "weblate.utils", "weblate.vcs", "weblate.wladmin", "weblate.metrics", "weblate", # Optional: Git exporter "weblate.gitexport", # Standard Django modules "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.admin", "django.contrib.postgres", "django.contrib.sitemaps", "django.contrib.humanize", # Third party Django modules "social_django", "crispy_forms", "crispy_bootstrap5", "rest_framework", "rest_framework.authtoken", "django_filters", "django_celery_beat", "corsheaders", "django_otp", "django_otp.plugins.otp_static", "django_otp.plugins.otp_totp", "django_otp_webauthn", "drf_spectacular", "drf_spectacular_sidecar", "drf_standardized_errors", ] # django_zxcvbn_password_validator integration if PASSWORD_MINIMAL_STRENGTH > 0: INSTALLED_APPS.append("django_zxcvbn_password_validator") # Custom exception reporter to include some details DEFAULT_EXCEPTION_REPORTER_FILTER = "weblate.trans.debug.WeblateExceptionReporterFilter" # Default logging of Weblate messages # - to syslog in production (if available) # - otherwise to console # - you can also choose "logfile" to log into separate file # after configuring it below # Detect if we can connect to syslog HAVE_SYSLOG = False if platform.system() != "Windows": try: handler = SysLogHandler(address="/dev/log", facility=SysLogHandler.LOG_LOCAL2) # Since Python 3.7 connect failures are silently discarded, so # the exception is almost never raised here. Instead we look whether the socket # to syslog is open after init. HAVE_SYSLOG = handler.socket.fileno() != -1 # type: ignore[attr-defined] handler.close() except OSError: HAVE_SYSLOG = False DEFAULT_LOG = ["console" if DEBUG or not HAVE_SYSLOG else "syslog"] DEFAULT_LOGLEVEL = "DEBUG" if DEBUG else "INFO" # GELF TCP integration (Graylog) WEBLATE_LOG_GELF_HOST = None if WEBLATE_LOG_GELF_HOST: DEFAULT_LOG.append("gelf") # A sample logging configuration. The only tangible logging # performed by this configuration is to send an email to # the site admins on every HTTP 500 error when DEBUG=False. # See http://docs.djangoproject.com/en/stable/topics/logging for # more details on how to customize your logging configuration. LOGGING: dict = { "version": 1, "disable_existing_loggers": True, "filters": {"require_debug_false": {"()": "django.utils.log.RequireDebugFalse"}}, "formatters": { "simple": {"format": "[%(asctime)s: %(levelname)s/%(process)s] %(message)s"}, "logfile": {"format": "%(asctime)s %(levelname)s %(message)s"}, "django.server": { "()": "django.utils.log.ServerFormatter", "format": "[%(server_time)s] %(message)s", }, }, "handlers": { "mail_admins": { "level": "ERROR", "filters": ["require_debug_false"], "class": "django.utils.log.AdminEmailHandler", "include_html": True, }, "console": { "level": "DEBUG", "class": "logging.StreamHandler", "formatter": "simple", }, "django.server": { "level": "INFO", "class": "logging.StreamHandler", "formatter": "django.server", }, # Logging to a file # "logfile": { # "level":"DEBUG", # "class":"logging.handlers.RotatingFileHandler", # "filename": "/var/log/weblate/weblate.log", # "maxBytes": 100000, # "backupCount": 3, # "formatter": "logfile", # }, }, "loggers": { "django.request": { "handlers": ["mail_admins", *DEFAULT_LOG], "level": "ERROR", "propagate": False, }, "django.server": { "handlers": ["django.server"], "level": "INFO", "propagate": False, }, # Logging database queries "django.db.backends": { "handlers": [*DEFAULT_LOG], # Toggle to DEBUG to log all database queries "level": "CRITICAL", "propagate": False, }, "weblate": { "handlers": [*DEFAULT_LOG], "level": DEFAULT_LOGLEVEL, "propagate": False, }, # Logging VCS operations "weblate.vcs": { "handlers": [*DEFAULT_LOG], "level": DEFAULT_LOGLEVEL, "propagate": False, }, # Python Social Auth "social": { "handlers": [*DEFAULT_LOG], "level": DEFAULT_LOGLEVEL, "propagate": False, }, # Django Authentication Using LDAP "django_auth_ldap": { "handlers": [*DEFAULT_LOG], "level": DEFAULT_LOGLEVEL, "propagate": False, }, # SAML IdP "djangosaml2idp": { "handlers": [*DEFAULT_LOG], "level": DEFAULT_LOGLEVEL, "propagate": False, }, # Fedora messaging "fedora_messaging": { "handlers": [*DEFAULT_LOG], "level": DEFAULT_LOGLEVEL, "propagate": False, }, }, } # Configure syslog setup if it's present if HAVE_SYSLOG: LOGGING["formatters"]["syslog"] = { "format": "weblate[%(process)d]: %(levelname)s %(message)s", } LOGGING["handlers"]["syslog"] = { "level": "DEBUG", "class": "logging.handlers.SysLogHandler", "formatter": "syslog", "address": "/dev/log", "facility": SysLogHandler.LOG_LOCAL2, } # Configure GELF integration if present if WEBLATE_LOG_GELF_HOST: LOGGING["formatters"]["gelf"] = { "()": "logging_gelf.formatters.GELFFormatter", "null_character": True, } LOGGING["handlers"]["gelf"] = { "level": "DEBUG", "class": "logging_gelf.handlers.GELFTCPSocketHandler", "formatter": "gelf", "host": WEBLATE_LOG_GELF_HOST, "port": 12201, } # Use HTTPS when creating redirect URLs for social authentication, see # documentation for more details: # https://python-social-auth-docs.readthedocs.io/en/latest/configuration/settings.html#processing-redirects-and-urlopen SOCIAL_AUTH_REDIRECT_IS_HTTPS = ENABLE_HTTPS # Make CSRF cookie HttpOnly, see documentation for more details: # https://docs.djangoproject.com/en/1.11/ref/settings/#csrf-cookie-httponly CSRF_COOKIE_HTTPONLY = True CSRF_COOKIE_SECURE = ENABLE_HTTPS # Store CSRF token in session CSRF_USE_SESSIONS = True # Customize CSRF failure view CSRF_FAILURE_VIEW = "weblate.trans.views.error.csrf_failure" SESSION_COOKIE_SECURE = ENABLE_HTTPS SESSION_COOKIE_HTTPONLY = True # SSL redirect SECURE_SSL_REDIRECT = ENABLE_HTTPS SECURE_SSL_HOST = SITE_DOMAIN # Sent referrer only for same origin links SECURE_REFERRER_POLICY = "same-origin" # SSL redirect URL exemption list SECURE_REDIRECT_EXEMPT = (r"healthz/$",) # Allowing HTTP access to health check # Session cookie age (in seconds) SESSION_COOKIE_AGE = 1000 SESSION_COOKIE_AGE_AUTHENTICATED = 1209600 SESSION_COOKIE_SAMESITE = "Lax" # Increase allowed upload size DATA_UPLOAD_MAX_MEMORY_SIZE = 50000000 # Maximum allowed uploaded translation file size TRANSLATION_UPLOAD_MAX_SIZE = 50000000 # Maximum allowed uploaded component ZIP file size COMPONENT_ZIP_UPLOAD_MAX_SIZE = 50000000 # Maximum allowed uploaded project backup ZIP file size PROJECT_BACKUP_UPLOAD_MAX_SIZE = 512 * 1024 * 1024 # Allow more fields for case with a lot of subscriptions in profile DATA_UPLOAD_MAX_NUMBER_FIELDS = 2000 # Apply session cookie settings to language cookie as well with exception # of SameSite as we want language to be honored in CSRF error messages. LANGUAGE_COOKIE_SECURE = SESSION_COOKIE_SECURE LANGUAGE_COOKIE_HTTPONLY = SESSION_COOKIE_HTTPONLY LANGUAGE_COOKIE_AGE = SESSION_COOKIE_AGE_AUTHENTICATED * 10 LANGUAGE_COOKIE_SAMESITE = "None" # Some security headers SECURE_BROWSER_XSS_FILTER = True X_FRAME_OPTIONS = "DENY" SECURE_CONTENT_TYPE_NOSNIFF = True # Optionally enable HSTS SECURE_HSTS_SECONDS = 31536000 if ENABLE_HTTPS else 0 SECURE_HSTS_PRELOAD = ENABLE_HTTPS SECURE_HSTS_INCLUDE_SUBDOMAINS = ENABLE_HTTPS # HTTPS detection behind reverse proxy SECURE_PROXY_SSL_HEADER = None # URL of login LOGIN_URL = f"{URL_PREFIX}/accounts/login/" # URL of logout LOGOUT_URL = f"{URL_PREFIX}/accounts/logout/" # Default location for login LOGIN_REDIRECT_URL = f"{URL_PREFIX}/" # Anonymous user name ANONYMOUS_USER_NAME = "anonymous" # Reverse proxy settings IP_PROXY_HEADER = "HTTP_X_FORWARDED_FOR" IP_BEHIND_REVERSE_PROXY = False IP_PROXY_OFFSET = -1 # Sending HTML in mails EMAIL_SEND_HTML = True # Subject of emails includes site title EMAIL_SUBJECT_PREFIX = f"[{SITE_TITLE}] " # Enable remote hooks ENABLE_HOOKS = True # By default the length of a given translation is limited to the length of # the source string * 10 characters. Set this option to False to allow longer # translations (up to 10.000 characters) LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH = True # Use simple language codes for default language/country combinations SIMPLIFY_LANGUAGES = True # Render forms using bootstrap CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5" CRISPY_TEMPLATE_PACK = "bootstrap5" # List of quality checks # CHECK_LIST = ( # "weblate.checks.same.SameCheck", # "weblate.checks.chars.AcceleratorKeyCheck", # "weblate.checks.chars.BeginNewlineCheck", # "weblate.checks.chars.EndNewlineCheck", # "weblate.checks.chars.BeginSpaceCheck", # "weblate.checks.chars.EndSpaceCheck", # "weblate.checks.chars.DoubleSpaceCheck", # "weblate.checks.chars.EndStopCheck", # "weblate.checks.chars.EndColonCheck", # "weblate.checks.chars.EndQuestionCheck", # "weblate.checks.chars.EndExclamationCheck", # "weblate.checks.chars.EndInterrobangCheck", # "weblate.checks.chars.EndEllipsisCheck", # "weblate.checks.chars.EndSemicolonCheck", # "weblate.checks.chars.MaxLengthCheck", # "weblate.checks.chars.MultipleCapitalCheck", # "weblate.checks.chars.KashidaCheck", # "weblate.checks.chars.PunctuationSpacingCheck", # "weblate.checks.chars.KabyleCharactersCheck", # "weblate.checks.format.PythonFormatCheck", # "weblate.checks.format.PythonBraceFormatCheck", # "weblate.checks.format.PHPFormatCheck", # "weblate.checks.format.CFormatCheck", # "weblate.checks.format.PerlFormatCheck", # "weblate.checks.format.PerlBraceFormatCheck", # "weblate.checks.format.JavaScriptFormatCheck", # "weblate.checks.format.LuaFormatCheck", # "weblate.checks.format.ObjectPascalFormatCheck", # "weblate.checks.format.SchemeFormatCheck", # "weblate.checks.format.CSharpFormatCheck", # "weblate.checks.format.LaravelFormatCheck", # "weblate.checks.format.JavaFormatCheck", # "weblate.checks.format.JavaMessageFormatCheck", # "weblate.checks.format.PercentPlaceholdersCheck", # "weblate.checks.format.VueFormattingCheck", # "weblate.checks.format.I18NextInterpolationCheck", # "weblate.checks.format.ESTemplateLiteralsCheck", # "weblate.checks.format.AutomatticComponentsCheck", # "weblate.checks.angularjs.AngularJSInterpolationCheck", # "weblate.checks.icu.ICUMessageFormatCheck", # "weblate.checks.icu.ICUSourceCheck", # "weblate.checks.qt.QtFormatCheck", # "weblate.checks.qt.QtPluralCheck", # "weblate.checks.ruby.RubyFormatCheck", # "weblate.checks.consistency.PluralsCheck", # "weblate.checks.consistency.SamePluralsCheck", # "weblate.checks.consistency.ConsistencyCheck", # "weblate.checks.consistency.ReusedCheck", # "weblate.checks.consistency.TranslatedCheck", # "weblate.checks.chars.EscapedNewlineCountingCheck", # "weblate.checks.chars.NewLineCountCheck", # "weblate.checks.markup.BBCodeCheck", # "weblate.checks.chars.ZeroWidthSpaceCheck", # "weblate.checks.render.MaxSizeCheck", # "weblate.checks.markup.XMLValidityCheck", # "weblate.checks.markup.XMLTagsCheck", # "weblate.checks.markup.XMLCharsAroundTagsCheck", # "weblate.checks.markup.MarkdownRefLinkCheck", # "weblate.checks.markup.MarkdownLinkCheck", # "weblate.checks.markup.MarkdownSyntaxCheck", # "weblate.checks.markup.URLCheck", # "weblate.checks.markup.SafeHTMLCheck", # "weblate.checks.markup.RSTReferencesCheck", # "weblate.checks.markup.RSTSyntaxCheck", # "weblate.checks.placeholders.PlaceholderCheck", # "weblate.checks.mdx.SafeMDXCheck", # "weblate.checks.placeholders.RegexCheck", # "weblate.checks.duplicate.DuplicateCheck", # "weblate.checks.source.OptionalPluralCheck", # "weblate.checks.source.EllipsisCheck", # "weblate.checks.source.MultipleFailingCheck", # "weblate.checks.source.LongUntranslatedCheck", # "weblate.checks.format.MultipleUnnamedFormatsCheck", # "weblate.checks.glossary.GlossaryCheck", # "weblate.checks.glossary.ProhibitedInitialCharacterCheck", # "weblate.checks.fluent.syntax.FluentSourceSyntaxCheck", # "weblate.checks.fluent.syntax.FluentTargetSyntaxCheck", # "weblate.checks.fluent.parts.FluentPartsCheck", # "weblate.checks.fluent.references.FluentReferencesCheck", # "weblate.checks.fluent.inner_html.FluentSourceInnerHTMLCheck", # "weblate.checks.fluent.inner_html.FluentTargetInnerHTMLCheck", # ) # List of automatic fixups # AUTOFIX_LIST = ( # "weblate.trans.autofixes.whitespace.SameBookendingWhitespace", # "weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis", # "weblate.trans.autofixes.chars.RemoveZeroSpace", # "weblate.trans.autofixes.chars.RemoveControlChars", # "weblate.trans.autofixes.chars.DevanagariDanda", # "weblate.trans.autofixes.chars.PunctuationSpacing", # "weblate.trans.autofixes.html.BleachHTML", # ) # List of enabled addons # WEBLATE_ADDONS = ( # "weblate.addons.gettext.GenerateMoAddon", # "weblate.addons.gettext.UpdateLinguasAddon", # "weblate.addons.gettext.UpdateConfigureAddon", # "weblate.addons.gettext.MsgmergeAddon", # "weblate.addons.gettext.XgettextAddon", # "weblate.addons.gettext.MesonAddon", # "weblate.addons.gettext.DjangoAddon", # "weblate.addons.gettext.SphinxAddon", # "weblate.addons.cleanup.CleanupAddon", # "weblate.addons.cleanup.RemoveBlankAddon", # "weblate.addons.cleanup.ResetAddon", # "weblate.addons.consistency.LanguageConsistencyAddon", # "weblate.addons.discovery.DiscoveryAddon", # "weblate.addons.autotranslate.AutoTranslateAddon", # "weblate.addons.flags.SourceEditAddon", # "weblate.addons.flags.TargetEditAddon", # "weblate.addons.flags.SameEditAddon", # "weblate.addons.flags.BulkEditAddon", # "weblate.addons.flags.TargetRepoUpdateAddon", # "weblate.addons.generate.GenerateFileAddon", # "weblate.addons.generate.PseudolocaleAddon", # "weblate.addons.generate.PrefillAddon", # "weblate.addons.generate.FillReadOnlyAddon", # "weblate.addons.properties.PropertiesSortAddon", # "weblate.addons.git.GitSquashAddon", # "weblate.addons.removal.RemoveComments", # "weblate.addons.removal.RemoveSuggestions", # "weblate.addons.resx.ResxUpdateAddon", # "weblate.addons.cdn.CDNJSAddon", # "weblate.addons.cdn.CDNFilesAddon", # "weblate.addons.webhooks.WebhookAddon", # "weblate.addons.webhooks.SlackWebhookAddon", # "weblate.addons.fedora_messaging.FedoraMessagingAddon", # ) # E-mail address that error messages come from. SERVER_EMAIL = "noreply@example.com" # Default email address to use for various automated correspondence from # the site managers. Used for registration emails. DEFAULT_FROM_EMAIL = "noreply@example.com" # List of URLs your site is supposed to serve ALLOWED_HOSTS = ["*"] # Configuration for caching CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", # If redis is running on same host as Weblate, you might # want to use unix sockets instead: # "LOCATION": "unix:///var/run/redis/redis.sock?db=1", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", # If you set password here, adjust CELERY_BROKER_URL as well "PASSWORD": None, "CONNECTION_POOL_KWARGS": {}, }, "KEY_PREFIX": "weblate", "TIMEOUT": 3600, }, "avatar": { "BACKEND": "django.core.cache.backends.filebased.FileBasedCache", "LOCATION": os.path.join(CACHE_DIR, "avatar"), "TIMEOUT": 86400, "OPTIONS": {"MAX_ENTRIES": 1000}, }, } # Store sessions in cache SESSION_ENGINE = "django.contrib.sessions.backends.cache" # Store messages in session MESSAGE_STORAGE = "django.contrib.messages.storage.session.SessionStorage" # REST framework settings for API API_RATELIMIT_ANON = "100/day" API_RATELIMIT_USER = "5000/hour" API_RATELIMIT_USER_OVERRIDES: dict[str, str | None] = {} API_RATELIMIT_IP_OVERRIDES: dict[str, str | None] = {} # API_RATELIMIT_USER_OVERRIDES = {"automation": "20000/hour"} # API_RATELIMIT_IP_OVERRIDES = {"192.0.2.42": None, "198.51.100.0/24": "10000/hour"} REST_FRAMEWORK = get_drf_settings(require_login=REQUIRE_LOGIN) DRF_STANDARDIZED_ERRORS = get_drf_standardized_errors_settings() SPECTACULAR_SETTINGS = get_spectacular_settings( INSTALLED_APPS, SITE_URL, SITE_TITLE, static_url=STATIC_URL, legal_hidden_documents=globals().get("LEGAL_HIDDEN_DOCUMENTS", ()), legal_url=globals().get("LEGAL_URL"), ) # Fonts CDN URL FONTS_CDN_URL = None # Note: When REQUIRE_LOGIN is enabled, Django's LoginRequiredMiddleware is used. # Public views are marked with @login_not_required decorator in the code. # The LOGIN_REQUIRED_URLS and LOGIN_REQUIRED_URLS_EXCEPTIONS settings are no longer used. # Silence some of the Django system checks SILENCED_SYSTEM_CHECKS = [ # We have modified django.contrib.auth.middleware.AuthenticationMiddleware # as weblate.accounts.middleware.AuthenticationMiddleware "admin.E408", # Using custom authentication middleware with LoginRequiredMiddleware "auth.E013", # pytest overrides string_if_invalid with a non-string value "templates.E002", # Silence drf_spectacular until these are addressed "drf_spectacular.W001", "drf_spectacular.W002", ] # Celery worker configuration for testing # CELERY_TASK_ALWAYS_EAGER = True # CELERY_BROKER_URL = "memory://" # CELERY_TASK_EAGER_PROPAGATES = True # Celery worker configuration for production CELERY_TASK_ALWAYS_EAGER = False CELERY_BROKER_URL = "redis://localhost:6379" CELERY_RESULT_BACKEND: str | None = CELERY_BROKER_URL CELERY_BROKER_CONNECTION_RETRY_ON_STARTUP = True CELERY_BROKER_CONNECTION_RETRY = True # Celery settings, it is not recommended to change these CELERY_WORKER_MAX_MEMORY_PER_CHILD = 450000 CELERY_WORKER_PREFETCH_MULTIPLIER = 1 CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler" CELERY_TASK_ROUTES = { "weblate.trans.tasks.auto_translate*": {"queue": "translate"}, "weblate.accounts.tasks.notify_*": {"queue": "notify"}, "weblate.accounts.tasks.send_mails": {"queue": "notify"}, "weblate.addons.tasks.addon_change": {"queue": "notify"}, "weblate.utils.tasks.settings_backup": {"queue": "backup"}, "weblate.utils.tasks.database_backup": {"queue": "backup"}, "weblate.wladmin.tasks.backup": {"queue": "backup"}, "weblate.wladmin.tasks.backup_service": {"queue": "backup"}, "weblate.memory.tasks.*": {"queue": "memory"}, } # CORS allowed origins CORS_ALLOWED_ORIGINS = [] CORS_URLS_REGEX = rf"^{URL_PREFIX}/api/.*$" # Enable plain database backups DATABASE_BACKUP = "plain" # Enable auto updating AUTO_UPDATE = False # PGP commits signing WEBLATE_GPG_IDENTITY = None # Website availability checks # Set to False to disable broken website alerts WEBSITE_ALERTS_ENABLED = True # Third party services integration MATOMO_SITE_ID = None MATOMO_URL = None GOOGLE_ANALYTICS_ID = None SENTRY_DSN = None SENTRY_ENVIRONMENT = SITE_DOMAIN GOOGLE_CLOUD_ERROR_REPORTING = None OPENTELEMETRY_ENABLED = False OPENTELEMETRY_SERVICE_NAME = "weblate" OPENTELEMETRY_EXPORTER_OTLP_ENDPOINT = None OPENTELEMETRY_EXPORTER_OTLP_HEADERS = {} OPENTELEMETRY_TRACES_SAMPLE_RATE = 0 OPENTELEMETRY_EXTRA_RESOURCE_ATTRIBUTES = {} PASSWORD_RESET_URL = None ``` # admin/support.md # Getting support for Weblate *Weblate* is copylefted libre software with community support. Hosting subscribers receive priority support at no extra charge. Prepaid help packages are available for everyone, including self-hosting users. Find info about current support offerings at [https://weblate.org/support](https://weblate.org/support). ## Integrating support Purchased support packages can optionally be integrated into your Weblate [subscription management](https://weblate.org/user/) interface, from where you will find a link to it. Basic instance details about your installation are also reported back to Weblate this way. ![image](screenshots/support.webp) ## Info sent to the Weblate * Your Weblate instance URL * Its site title * The version you are running * Tallies of projects, components, languages, source strings, and users * The public SSH key of your instance * Monthly activity summaries from the instance statistics for the last 24 completed months, used to monitor subscription activity and rank servers in Discover Weblate. Months without stored metrics are reported as zero. Monthly activity uses the same cached summaries as the instance statistics page at `/stats/`. These are trend indicators grouped by metric collection month. Each daily metric counts the preceding day’s changes, so the September summary covers changes from August 31 through September 29. This keeps completed monthly summaries independent of the collection job on the first day of the following month. Use [Translation progress reporting](https://docs.weblate.org/en/latest/devel/reporting.md) for reports over exact date ranges. Additionally, if you turn on [Discover Weblate](https://docs.weblate.org/en/latest/admin/support.md#discover-weblate): * List of public and protected projects (name, URL, and website). #### HINT Check what *Discover* shows publicly in the [Discover Weblate](https://docs.weblate.org/en/latest/admin/support.md#discover-weblate) description. No other data is submitted. ## Integration services * See if your support package is still valid * [Weblate provisioned backup storage](https://docs.weblate.org/en/latest/admin/backup.md#cloudbackup) * [Discover Weblate](https://docs.weblate.org/en/latest/admin/support.md#discover-weblate) * [Contacting customer care](https://docs.weblate.org/en/latest/admin/support.md#support-contact) #### HINT Purchased support packages are already activated upon purchase and can be used without integrating them. ## Contacting customer care #### HINT If you do not have a support package yet, please refer to the [Reporting issues in Weblate](https://docs.weblate.org/en/latest/contributing/issues.md) section for available community resources. Subscribers can reach Weblate Care directly through the following channels: * Email support at [care@weblate.org](mailto:care@weblate.org). * The [customer care portal](https://care.weblate.org/) * The support form is available in the Weblate management interface after [Integrating support](https://docs.weblate.org/en/latest/admin/support.md#activate-support). A subscription ensures timely and reliable help with setup, maintenance, and troubleshooting. #### NOTE **Sending encrypted content** If you want to send an encrypted content, please use the public key for [care@weblate.org](mailto:care@weblate.org) with ID `0961 62CE 141D 7FE4 B15D A9FA 73D9 298A CB26 03F0`. This public key is available on the most commonly used key servers, using WKD or [directly from weblate.org](https://weblate.org/.well-known/openpgpkey/hu/7oq6zfqsndhzsmw94xm1e5yu8me8sjsx?l=care). ## Discover Weblate #### Versionadded Added in version 4.5.2. *Discover* is an opt-in service making it easier for translators to find other Weblate instances and communities. Users can browse registered sites and find projects to contribute to on [https://weblate.org/discover/](https://weblate.org/discover/). ### Getting listed #### Versionchanged Changed in version 2026.7.1: Discover Weblate registration can be started directly from the management interface without manually copying the activation token. #### NOTE Make sure you are OK with publishing your instance name, URL, tally of projects, components, and users, together with names of public and protected projects for use on *Discover*. Use the Discover Weblate panel in the management interface to manage the listing. If you have an activated support package, list your server by clicking Enable discovery. If the instance is not connected to weblate.org yet, start the registration by clicking Enable Discover Weblate: ![image](screenshots/support-discovery.webp) This opens the registration form on weblate.org and returns to your Weblate management interface to complete activation with discovery already enabled. The registration flow can be used from an account that has a support subscription, but it registers the Discover Weblate listing; activating a purchased support package is handled by [Integrating support](https://docs.weblate.org/en/latest/admin/support.md#activate-support). Unlinking the support package disables the Discover Weblate listing. All steps for listing a server manually, for example from older Weblate versions: 1. Register yourself at [https://weblate.org/user/](https://weblate.org/user/) 2. Register your Weblate site at [https://weblate.org/subscription/discovery/](https://weblate.org/subscription/discovery/) 3. Copy the activation token into your Weblate management interface. 4. Confirm you want your Weblate listed by clicking Enable discovery from the Discover Weblate panel: ![image](screenshots/support-discovery.webp) ### Listing customization You are encouraged to provide an image (570 x 260 pixels) and description of your Weblate site at [https://weblate.org/user/](https://weblate.org/user/). This improves your instance’s visibility in the list. # admin/translating.md # Translation process ## Suggestion voting Everyone can add suggestions by default, to be accepted by signed in users. Suggestion voting can be used to make use of a string when more than one signed-in user agrees, by setting up the [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) with Suggestion voting to turn on voting, and Automatically accept suggestions to set a threshold for accepted suggestions (this includes a vote from the user making the suggestion if it is cast). #### NOTE Once automatic acceptance is set up, normal users lose the privilege to directly save translations or accept suggestions. This can be overridden with the Edit string when suggestions are enforced [permission](https://docs.weblate.org/en/latest/admin/access.md#privileges). You can combine these with [access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) into one of the following setups: * Users suggest and vote for suggestions and a limited group controls what is accepted. - Turn on voting. - Turn off automatic acceptance. - Don’t let users save translations. * Users suggest and vote for suggestions with automatic acceptance once the defined number of them agree. - Turn on voting. - Set the desired number of votes for automatic acceptance. * Optional voting for suggestions. (Can optionally be used by users when they are unsure about a translation by making multiple suggestions.) - Only turn on voting. ## Additional info on source strings Enhance the translation process by adding additional info to the strings including explanations, string priorities, check flags and visual context. Some of that info may be extracted from the translation files and some may be added by editing the additional string info: ![image](screenshots/source-review-edit.webp) Access this directly from the translation interface by clicking the “Edit” icon next to Screenshot context or Flags. ![image](screenshots/source-information.webp) #### SEE ALSO * [Source string location](https://docs.weblate.org/en/latest/formats.md#format-location) * [Source string description](https://docs.weblate.org/en/latest/formats.md#format-description) * [Context](https://docs.weblate.org/en/latest/formats.md#format-context) ### Strings prioritization String priority can be changed to offer higher priority strings for translation earlier by using the `priority` flag. #### HINT This can be used to order the flow of translation in a logical manner. #### SEE ALSO [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) ### Translation flags Customization of quality checks and other Weblate behavior, see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks). The string flags are also inherited from the [Translation flags](https://docs.weblate.org/en/latest/admin/projects.md#component-check-flags) at [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) and flags from the translation file (see [Localization file formats](https://docs.weblate.org/en/latest/formats.md)). #### SEE ALSO * [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks) * [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) ### Explanation #### Versionchanged Changed in version 4.1: In previous versions this has been called Extra context. #### Versionchanged Changed in version 4.18: Support for syncing explanation with a file was introduced. Use the explanation to clarify scope or usage of the translation. You can use Markdown to include links and other markup. Some file formats support storing explanation within the file, see [Explanation](https://docs.weblate.org/en/latest/formats.md#format-explanation). #### HINT Weblate can also display description present in the translation file for some formats, see [Source string description](https://docs.weblate.org/en/latest/formats.md#format-description). ## Screenshots and visual context You can upload a screenshot showing a given source string in use within your program. This helps translators understand where it is used, and how it should be translated. The uploaded screenshot is shown in the translation context sidebar: ![image](screenshots/screenshot-context.webp) In addition to [Additional info on source strings](https://docs.weblate.org/en/latest/admin/translating.md#additional), screenshots can be managed in the Weblate UI, kept in sync from the repository, or handled through the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). ### Managing screenshots in the UI Each screenshot is stored for a specific translation language. In the translate page, screenshots attached to the source language are shown for every translation of the string, while screenshots attached to any other language are shown only for that language. You can add a screenshot directly from the translate page using Upload screenshot in the Screenshots panel, or open the separate management interface under the Operations menu. There you can upload screenshots, assign them to source strings manually, or let Weblate find strings in the image using text recognition (OCR) with the Find strings in image button. Matching source strings can be assigned individually, in a selected batch, or all at once. To associate an uploaded screenshot with the current string, use Add existing screenshot in the translation editor. See [Adding an existing screenshot](https://docs.weblate.org/en/latest/user/translating.md#add-existing-screenshot) for the workflow and required permission. The screenshot listing summarizes uploaded screenshots and lets you search or filter them: ![image](screenshots/screenshot-listing.webp) Once a screenshot is uploaded, this interface handles management and source string association: ![image](screenshots/screenshot-ocr.webp) Use the screenshot listing search to find screenshots by name, repository path, language, assigned source string, source string context, or source string location. The search accepts plain text as well as advanced screenshot queries, see [Searching for screenshots](https://docs.weblate.org/en/latest/user/search.md#search-screenshots). For example, use `NOT has:string` to find unassigned screenshots, `has:string` to find assigned screenshots, or `repository:fastlane` to review screenshots discovered from repository paths. You can upload a screenshot from a local file, paste it from the clipboard, or provide a URL to download an image from an external source. URL-based uploads may be restricted based on the [`ALLOWED_ASSET_DOMAINS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_DOMAINS) setting, which controls which domains are trusted for downloading external assets, including any redirects followed while fetching the image, and [`ASSET_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_RESTRICT_PRIVATE), which rejects internal or non-public targets unless they are included in [`ASSET_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_PRIVATE_ALLOWLIST). The [`ALLOWED_ASSET_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_SIZE) setting limits maximal size for the asset. ### Managing screenshots from the repository You can add or update screenshots directly from your Version Control System (VCS) repository. To enable this feature, you can either set a screenshot file mask when creating a component, which will be monitored for updates in the repository, or you can add or update screenshots when uploading them manually. To connect a manually uploaded screenshot with later repository updates, fill in Repository path to screenshot with the path tracked in the repository. When the repository is updated, the system will automatically scan for changes. Existing screenshots in the repository will be updated, and new screenshots matching the specified screenshot file mask will be added to the component. For application projects, a practical workflow is: 1. Capture source-language screenshots for the most visible user interface. 2. Store them in a stable repository path, for example below `fastlane/metadata/android/en-US/images/phoneScreenshots/`. 3. Configure [Screenshot file mask](https://docs.weblate.org/en/latest/admin/projects.md#component-screenshot-filemask) for that path. 4. Update the component repository so Weblate discovers or refreshes the screenshots. 5. Use OCR or source string search to assign screenshots to the matching source strings, and review the Source strings without screenshots counter for important strings still missing visual context. #### SEE ALSO [Screenshot file mask](https://docs.weblate.org/en/latest/admin/projects.md#component-screenshot-filemask) ![image](screenshots/screenshot-filemask-repository-filename.webp) ### Managing screenshots through the API Screenshot workflows are also available through the REST API. Use [`GET /api/components/(string:project)/(string:component)/screenshots/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-screenshots-) to list screenshots for one component, [`POST /api/screenshots/`](https://docs.weblate.org/en/latest/api.md#post--api-screenshots-) to create screenshots, [`POST /api/screenshots/(int:id)/file/`](https://docs.weblate.org/en/latest/api.md#post--api-screenshots-(int-id)-file-) to replace the image, [`POST /api/screenshots/(int:id)/units/`](https://docs.weblate.org/en/latest/api.md#post--api-screenshots-(int-id)-units-) and [`DELETE /api/screenshots/(int:id)/units/(int:unit_id)`](https://docs.weblate.org/en/latest/api.md#delete--api-screenshots-(int-id)-units-(int-unit_id)) to manage source string associations, and [`DELETE /api/screenshots/(int:id)/`](https://docs.weblate.org/en/latest/api.md#delete--api-screenshots-(int-id)-) to delete screenshots. Screenshot API objects include the related translation and the optional repository path used for repository-based updates. # admin/upgrade.md # Upgrading Weblate ## Docker image upgrades The official Weblate Docker image (see [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md)) integrates all upgrade steps. Typically, no manual interaction is needed beyond pulling the latest (or at least newer) version. #### SEE ALSO [Upgrading the Docker container](https://docs.weblate.org/en/latest/admin/install/docker.md#upgrading-docker) ## Generic upgrade instructions Always look for new changes to [Software requirements](https://docs.weblate.org/en/latest/admin/install.md#requirements) before upgrading. Once all requirements are installed or upgraded, ensure your `settings.py` matches the changes in the configuration (consult `settings_example.py` for correct values). Always check [Version-specific instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#version-specific-instructions) before upgrading. If you are skipping any versions, be sure to follow instructions for all versions you are skipping during such upgrade. It’s sometimes better to upgrade gradually to an intermediate version to ensure a smooth migration. Upgrading across multiple releases should work, but is not as well tested as single version upgrades! #### NOTE Always back up the full database before upgrading, so that you can roll back the database if the upgrade fails, see [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md). 1. Wait for the Celery queues to become empty, then stop the WSGI and Celery processes to avoid old processes running while upgrading. Otherwise incompatible changes in the database might occur. The Celery task queue is not a stable interface across releases, so queued tasks from the old version are not guaranteed to work after the upgrade. You can monitor queue length in the [Management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface) or by using [`celery_queues`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-celery_queues). 2. Upgrade Weblate For pip installs it can be achieved by: ```sh uv pip install -U "weblate[all]==version" ``` Or, if you just want to get the latest released version: ```sh uv pip install -U "weblate[all]" ``` If you don’t want to install all of the optional dependencies do: ```sh uv pip install -U weblate ``` Using Git checkout, you need to fetch new source code and update your installation: ```sh cd weblate-src git pull # Update Weblate inside your Python environment . ~/weblate-env/bin/uv pip install -e '.[all]' # Install dependencies directly when not using Python environment uv pip install --upgrade -e . # Install optional dependencies directly when not using a Python environment uv pip install --upgrade -e '.[all]' ``` 3. New Weblate releases might have new [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps), check if they cover the features you want. 4. Upgrade the configuration file by following either `settings_example.py`, or [Version-specific instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#version-specific-instructions). 5. Upgrade the database: ```sh weblate migrate --noinput ``` 6. Collect updated static files (see [Running server](https://docs.weblate.org/en/latest/admin/install.md#server) and [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files)): ```sh weblate collectstatic --noinput ``` 7. If you are running an installation from Git, you should also regenerate locale files every time you upgrade. You can do this by invoking: ```sh weblate compilemessages ``` 8. Verify that your setup is sane (see also [Production setup](https://docs.weblate.org/en/latest/admin/install.md#production)): ```sh weblate check --deploy ``` 9. Restart the Celery worker (see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery)). Some upgrades run translation-memory scope backfill and consolidation in the background using periodic Celery tasks. Keep Celery running after the upgrade and monitor progress in Administration > Performance report. See [Translation-memory scopes](https://docs.weblate.org/en/latest/admin/memory.md#memory-scopes) for details. ## Version-specific instructions #### Versionchanged Changed in version 5.0: Version specific instructions are now included in the release notes, see [Weblate 2026.10](https://docs.weblate.org/en/latest/changes.md). ### Upgrade from an older unsupported release Direct upgrades are only supported for releases from the current or previous calendar year. If you need to upgrade across this boundary, upgrade first to an intermediate version as listed below. Upgrades skipping this step are not supported and will break. * If you are upgrading from the 2.x release, always first upgrade to 3.0.1. * If you are upgrading from the 3.x release, always first upgrade to 4.0.4. * If you are upgrading from the 4.x release, always first upgrade to 5.0.2. * If you are upgrading from 5.0.x-5.9.x, always first upgrade to 5.10.4. * Upgrades from 5.10.x and newer are currently directly supported. #### SEE ALSO * [Upgrade from 2.20 to 3.0 in Weblate 3.0 documentation](https://docs.weblate.org/en/weblate-3.0.1/admin/upgrade.html#upgrade-3) * [Upgrade from 3.11 to 4.0 in Weblate 4.0 documentation](https://docs.weblate.org/en/weblate-4.0.4/admin/upgrade.html#upgrade-from-3-11-to-4-0) * [Upgrade from 4.x to 5.0.2 in Weblate 5.0 documentation](https://docs.weblate.org/en/weblate-5.0.2/changes.html) ## Migrating from other databases to PostgreSQL #### WARNING MySQL and MariaDB are no longer supported in Weblate. You must migrate to PostgreSQL before upgrading. If you are running Weblate with MySQL or MariaDB, consider migrating to PostgreSQL for better performance by doing the following steps. Remember to stop both, the web and Celery servers beforehand, otherwise you might end up with inconsistent data. ### Creating a database in PostgreSQL It is usually a good idea to run Weblate in a separate database, and a separate user account: ```sh # If PostgreSQL was not installed before, set the main password sudo -u postgres psql postgres -c "\password postgres" # Create a database user called "weblate" sudo -u postgres createuser -D -P weblate # Create the database "weblate" owned by "weblate" sudo -u postgres createdb -E UTF8 -O weblate weblate ``` ### Migrating to PostgreSQL using pgloader The [pgloader](https://pgloader.io/) is a generic migration tool to migrate data to PostgreSQL. You can use it to migrate your Weblate database. 1. Adjust your `settings.py` to use PostgreSQL as database. 2. Migrate the schema in the PostgreSQL database: ```sh weblate migrate weblate sqlflush | weblate dbshell ``` 3. Run the pgloader to transfer the data. The following script can be used to migrate the database, but you might want to learn more about [pgloader](https://pgloader.io/) to better understand what it does, and tweak it to match your setup: > ```postgresql > LOAD DATABASE > FROM mysql://weblate:password@localhost/weblate > INTO postgresql://weblate:password@localhost/weblate > WITH include no drop, truncate, create no tables, create no indexes, no foreign keys, disable triggers, reset sequences, data only > ALTER SCHEMA 'weblate' RENAME TO 'public' > ; > ``` ## Migrating from Pootle As Weblate was originally written as a replacement for Pootle, it is supported to migrate the user accounts from it. You can dump the users from Pootle and import them using [`importusers`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-importusers). # admin/workspaces.md # Workspaces Workspaces group related translation projects. They sit above projects and provide a shared place for project listings, workspace-scoped access control, and billing details when the billing module is enabled. Workspace membership does not grant access to translate or manage projects in the workspace. Project access is still controlled by the project access control settings and project teams, see [Project access control](https://docs.weblate.org/en/latest/admin/access.md#acl). The workspace page lists projects in that workspace that you can access. ![image](screenshots/workspace-projects.webp) Signed-in users can also review grouped project and component findings on the workspace Diagnostics tab. See [Project and workspace diagnostics overviews](https://docs.weblate.org/en/latest/devel/alerts.md#diagnostics-overviews). Signed-in users can open Projects ↓ My workspaces to list workspaces where they have an explicit workspace-team assignment. This list does not include workspaces merely because the user has site-wide management access. Site managers can list all workspaces in the management interface at Manage ↓ Workspaces. ![image](screenshots/workspaces.webp) Workspace statistics aggregate all owned and shared content, including projects and restricted components that you cannot access. Project listings and actions remain permission-filtered. See [statistics access filtering](https://docs.weblate.org/en/latest/admin/access.md#statistics-access-filtering). The workspace Files menu downloads a ZIP archive of owned components that you can access and have permission to download. Workspace membership does not bypass project access control or component restrictions. The menu also provides Upload translation guidance. Uploading at workspace level is not supported; select a project and open an individual translation to upload a file. Users who can edit translations in an accessible project can choose Operations ↓ Search and replace to replace text across permission-filtered owned project content in the workspace. The existing [Search and replace](https://docs.weblate.org/en/latest/user/translating.md#search-replace) preview and confirmation workflow applies. ## Workspace removal Users with the Edit workspace settings permission can remove a workspace from Operations ↓ Organize or remove. Only empty workspaces can be removed. Move or remove all projects in the workspace first. Workspaces associated with billing cannot be removed. ## Project creation and moves Projects can be created with or without a workspace: * Creating a project in a workspace requires the Add projects to workspace permission for that workspace. * Creating a project without a workspace requires the site-wide Add new projects permission. When creating a project with the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api), pass the workspace UUID in the `workspace` field. Existing projects can be moved between workspaces from the project Organize tab or by changing the `workspace` field with the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). Moving a project requires permission to edit the project and the Edit workspace settings permission for the source and target workspace. The target workspace also requires the Add projects to workspace permission. Moving a project out of a workspace also requires the site-wide Add new projects permission. ## Workspace settings Workspace settings define workspace identity and defaults inherited by projects and components. ### Workspace name Verbose workspace name used in workspace listings and project organization. ### Use workspace translation memory Whether projects in this workspace can use translation memory shared within the workspace. Individual projects also have to enable workspace translation memory. ### Contribute to workspace translation memory Whether projects in this workspace can contribute translations to the workspace translation memory. Individual projects also have to enable contribution. Users with permission to edit the workspace can open Operations ↓ Translation memory to browse, download, delete, or rebuild automatically created workspace translation-memory entries. See [User interface](https://docs.weblate.org/en/latest/admin/memory.md#memory-user). ### Translation license Default translation license for projects and components in this workspace. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Translation license](https://docs.weblate.org/en/latest/admin/projects.md#component-license) ### Contributor license agreement Default contributor license agreement for projects and components in this workspace. Markdown can be used for text formatting or inserting links. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Contributor license agreement](https://docs.weblate.org/en/latest/admin/projects.md#component-agreement) ### Adding new translation Default behavior for requests to create new translations in projects and components in this workspace. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Adding new translation](https://docs.weblate.org/en/latest/admin/projects.md#component-new-lang) ### Language code style Default language code style for translations created by Weblate in projects and components in this workspace. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Language code style](https://docs.weblate.org/en/latest/admin/projects.md#component-language-code-style) ### Secondary language Default secondary language to show together with the source language while translating projects and components in this workspace. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Secondary languages](https://docs.weblate.org/en/latest/user/profile.md#secondary-languages) * [Secondary language](https://docs.weblate.org/en/latest/admin/projects.md#component-secondary-language) ### Translation flags Workspace-level translation flags. These are merged with project, component, and translation flags instead of being inherited as a replacement. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) ### Commit, add, delete, merge, add-on, and merge request messages Default commit and merge request message templates for projects and components in this workspace. These templates use the same markup as component message settings. The built-in defaults follow Conventional Commits and include Weblate links where available. Use Restore site default next to a message editor to restore the current installation default for that message. #### SEE ALSO * [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings) * [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup) * [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/latest/admin/projects.md#component-commit-message) ## Settings inheritance Settings inheritance lets common defaults be configured once and reused in lower scopes: * Workspaces define defaults for projects in the workspace. * Projects define defaults for categories and components in the project. * Categories define defaults for nested categories and components in the category. * Components use the effective value from the nearest inherited scope unless inheritance is disabled for that setting. This is available for translation license, contributor license agreement, adding new translations, language code style, secondary language, and commit message templates. Project, category, and component settings expose Inherit from workspace, Inherit from project, or Inherit from category checkboxes for these values. When inheritance is enabled, the inherited value is shown in the settings form; disable inheritance and save to edit the stored override value. Translation flags are handled differently. Workspace, project, category, component, and translation flags are merged, so each level can add flags without replacing the lower levels. When a workspace is created, these defaults are copied from the current installation defaults. Later changes to installation defaults do not update existing workspaces. Workspace-less projects also store their own defaults when created and do not inherit from a workspace unless moved into one and configured to inherit. When upgrading existing installations, Weblate consolidates matching settings: if all components in a project use the same value, the value is moved to the project and those components inherit it. The same consolidation is then applied from projects to workspaces. Category settings are initialized to inherit from their parent and matching explicit child overrides can be consolidated to the category. Differing values remain configured directly on the lower scope. #### SEE ALSO * [Workspace settings](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-settings) * [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) ## Workspace access control Workspaces have workspace-scoped teams. These teams control workspace-level actions only; they do not grant translation access to the projects in the workspace. ![image](screenshots/workspace-access.webp) The default workspace teams are: Owners : Can edit workspace settings, add projects to the workspace, manage workspace access, and view or pay billing plans assigned to the workspace. Project creators : Can add projects to the workspace. Users can still view a workspace page when they can access at least one project in that workspace. This does not grant billing access or permission to add more projects. ## Billing When [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing) is enabled, a billing plan is assigned to a workspace. Projects in that workspace count against the workspace billing plan. Users with Edit workspace settings permission can view and pay the billing plan. Billing notification e-mails are sent to these users. Billing is optional. Workspaces are still available when the billing module is not installed. ## Upgrading from billing owners Older Weblate versions stored billing owners directly on billing plans. These users are migrated to the workspace Owners team for the workspace covered by the billing plan. #### SEE ALSO * [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects) * [Access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) * [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing) * [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) # api.md # Weblate’s REST API The API is accessible on the `/api/` URL and it is based on [Django REST framework](https://www.django-rest-framework.org/). You can use it directly or by [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc). The API is also documented using OpenAPI 3.1 on the `/api/schema/` URL, you can browse at `/api/docs/`. #### NOTE OpenAPI is available as a feature preview. The documentation is most likely incomplete at this point and subject to change. Please consult the documentation below for more detailed information on the API. ## Authentication and generic parameters The read-only API is available without authentication unless [`REQUIRE_LOGIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REQUIRE_LOGIN) is turned on. Unauthenticated requests are heavily throttled (by default to 100 requests per day), so it is recommended to use authentication. The authentication uses a token, which you can get in your profile. Use it in the `Authorization` header with the `Token` or `Bearer` scheme. Unsupported schemes, such as `Basic`, return [401 Unauthorized](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/401), even for public endpoints or when you are signed in using a browser session. ### ANY / Generic request behaviour for the API, the headers, status codes and parameters here apply to all endpoints as well. * **Query Parameters:** * **format** – Response format (overrides [Accept](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2)). Possible values depend on REST framework setup, by default `json`, `csv` and `api` are supported. The latter provides a web browser interface for the API. * **page** – Returns given page of paginated results (use next and previous fields in response to automate the navigation). * **page_size** – Return the given number of items per request. The default is 50 and the maximum is 1000. For the units endpoints the default is 100 with a maximum of 10000. The default value is also configurable using the PAGE_SIZE setting. * **Request Headers:** * [Accept](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2) – the response content type depends on [Accept](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2) header * [Authorization](https://www.rfc-editor.org/rfc/rfc7235#section-4.2) – optional token to authenticate as `Authorization: Token YOUR-TOKEN` * **Response Headers:** * [Content-Type](https://www.rfc-editor.org/rfc/rfc7231#section-3.1.1.5) – this depends on [Accept](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2) header of request * [Allow](https://www.rfc-editor.org/rfc/rfc7231#section-7.4.1) – list of allowed HTTP methods on object * **Response JSON Object:** * **detail** (*string*) – verbose description of the result (for HTTP status codes other than [200 OK](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200)) * **count** (*int*) – total item count for object lists * **next** (*string*) – next page URL for object lists * **previous** (*string*) – previous page URL for object lists * **results** (*array*) – results for object lists * **url** (*string*) – URL to access this resource using the API * **web_url** (*string*) – URL to access this resource using web browser * **Status Codes:** * [200 OK](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/200) – when request was correctly handled * [201 Created](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/201) – when a new object was created successfully * [204 No Content](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/204) – when an object was deleted successfully * [400 Bad Request](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/400) – when form parameters are missing * [401 Unauthorized](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/401) – when authentication credentials are invalid or the authentication scheme is unsupported * [403 Forbidden](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/403) – when access is denied * [429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status/429) – when throttling is in place ### Authentication tokens #### Versionchanged Changed in version 4.10: Project scoped tokens were introduced in the 4.10 release. Each user has a personal access token which can be obtained in the user profile. Newly generated user tokens have the `wlu_` prefix. It is possible to create project scoped tokens for API access to given project only. These tokens can be identified by the `wlp_` prefix. #### SEE ALSO * [Registration and user profile](https://docs.weblate.org/en/latest/user/profile.md) * [Per-project access tokens](https://docs.weblate.org/en/latest/admin/access.md#project-api) * [Project access control](https://docs.weblate.org/en/latest/admin/access.md#acl) ### Authentication examples **Example request:** ```http GET /api/ HTTP/1.1 Host: example.com Accept: application/json, text/javascript Authorization: Token YOUR-TOKEN ``` **Example response:** ```http HTTP/1.0 200 OK Date: Fri, 25 Mar 2016 09:46:12 GMT Server: WSGIServer/0.1 Python/2.7.11+ Vary: Accept, Accept-Language, Cookie X-Frame-Options: SAMEORIGIN Content-Type: application/json Content-Language: en Allow: GET, HEAD, OPTIONS { "projects":"http://example.com/api/projects/", "components":"http://example.com/api/components/", "translations":"http://example.com/api/translations/", "languages":"http://example.com/api/languages/" } ``` **CURL example:** ```sh curl \ -H "Authorization: Token TOKEN" \ https://example.com/api/ ``` ### Passing Parameters Examples For the [POST](https://www.rfc-editor.org/rfc/rfc7231#section-4.3.3) method the parameters can be specified either as form submission (*application/x-www-form-urlencoded*) or as JSON (*application/json*). **Form request example:** ```http POST /api/projects/hello/repository/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/x-www-form-urlencoded Authorization: Token TOKEN operation=pull ``` **JSON request example:** ```http POST /api/projects/hello/repository/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Token TOKEN Content-Length: 20 {"operation":"pull"} ``` **CURL example:** ```sh curl \ -d operation=pull \ -H "Authorization: Token TOKEN" \ http://example.com/api/components/hello/weblate/repository/ ``` **CURL JSON example:** ```sh curl \ --data-binary '{"operation":"pull"}' \ -H "Content-Type: application/json" \ -H "Authorization: Token TOKEN" \ http://example.com/api/components/hello/weblate/repository/ ``` ### Components and categories To access a component which is nested inside a [Category](https://docs.weblate.org/en/latest/admin/projects.md#category), you need to URL encode the category name into a component name separated with a slash. For example `usage` placed in a `docs` category needs to be used as `docs%252Fusage`. Full URL in this case would be for example `https://example.com/api/components/hello/docs%252Fusage/repository/`. ### API rate limiting The API requests are rate limited; the default configuration limits it to 100 requests per day for anonymous users and 5000 requests per hour for authenticated users. Configure the default limits in `settings.py` using [`API_RATELIMIT_ANON`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_ANON) and [`API_RATELIMIT_USER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_USER). In the Docker container this can be configured using [`WEBLATE_API_RATELIMIT_ANON`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_ANON) and [`WEBLATE_API_RATELIMIT_USER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_USER). Use [`API_RATELIMIT_USER_OVERRIDES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_USER_OVERRIDES) to give an automation account a different limit. Use [`API_RATELIMIT_IP_OVERRIDES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_IP_OVERRIDES) for individual IP addresses or networks, including anonymous CI clients: ```python API_RATELIMIT_USER_OVERRIDES = {"automation": "20000/hour"} API_RATELIMIT_IP_OVERRIDES = { "192.0.2.42": None, "198.51.100.0/24": "10000/hour", "2001:db8::/48": "10000/hour", } ``` An explicit username override takes precedence over IP rules. Otherwise, the most specific matching network applies; an individual address is equivalent to a single-address network. A value of `None` exempts matching requests from API rate limits, including the anonymous limit. Authentication and permissions still apply: an exemption does not grant access to private projects or write operations. Limits are counted per authenticated user, or per client IP for anonymous requests. Clients within a network do not share a single budget. Each override rule and rate has a separate budget, so changing a rule or rate starts a new budget. Requests without an override use the default limits. IP rules use the client address resolved by Weblate. Behind a reverse proxy, configure [`IP_BEHIND_REVERSE_PROXY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_BEHIND_REVERSE_PROXY), [`IP_PROXY_HEADER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_HEADER), and [`IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_OFFSET) correctly. The trusted proxy must supply the client address, and untrusted clients must not be able to bypass it. Exempting a shared proxy address can exempt all clients using that proxy. In Docker, configure the equivalent JSON mappings using [`WEBLATE_API_RATELIMIT_USER_OVERRIDES`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_USER_OVERRIDES) and [`WEBLATE_API_RATELIMIT_IP_OVERRIDES`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_IP_OVERRIDES). Use JSON `null` for exemptions. The status of rate limiting is reported in following headers: | `X-RateLimit-Limit` | Allowed number of requests to perform | |-------------------------|------------------------------------------------------| | `X-RateLimit-Remaining` | Remaining number of requests to perform | | `X-RateLimit-Reset` | Number of seconds until the rate-limit window resets | Requests exempt from rate limiting do not include these headers. #### Versionchanged Changed in version 4.1: Added ratelimiting status headers. #### SEE ALSO * [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) * [Rate limiting](https://docs.weblate.org/en/latest/user/translating.md#user-rate) * [`WEBLATE_API_RATELIMIT_ANON`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_ANON) * [`WEBLATE_API_RATELIMIT_USER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_USER) ### Error responses #### Versionchanged Changed in version 5.10: Error responses were endpoint specific before this release. Weblate error responses are formatted based on [Error Response Format](https://drf-standardized-errors.readthedocs.io/en/latest/error_response.html). ## API Entry Point ### GET /api/ The API root entry point. **Example request:** ```http GET /api/ HTTP/1.1 Host: example.com Accept: application/json, text/javascript Authorization: Token YOUR-TOKEN ``` **Example response:** ```http HTTP/1.0 200 OK Date: Fri, 25 Mar 2016 09:46:12 GMT Server: WSGIServer/0.1 Python/2.7.11+ Vary: Accept, Accept-Language, Cookie X-Frame-Options: SAMEORIGIN Content-Type: application/json Content-Language: en Allow: GET, HEAD, OPTIONS { "projects":"http://example.com/api/projects/", "components":"http://example.com/api/components/", "translations":"http://example.com/api/translations/", "languages":"http://example.com/api/languages/" } ``` ## Users #### Versionadded Added in version 4.0. ### GET /api/users/ Returns a list of users if you have permissions to see manage users. If not, then you get to see only your own details. * **Query Parameters:** * **username** (*string*) – Username to search for * **id** (*int*) – User ID to search for * **email** (*string*) – Email to search for (case-insensitive, exact match). Requires `user.view` or `user.edit` permission; the parameter is ignored for unprivileged users. Username searches by users without the global `user.view` or `user.edit` permission exclude bot accounts other than the caller’s own account. #### SEE ALSO Users object attributes are documented at [`GET /api/users/(str:username)/`](https://docs.weblate.org/en/latest/api.md#get--api-users-(str-username)-). ### POST /api/users/ Creates a new user. Requires the global `user.edit` permission. See [Access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) for the user management permission model. * **Parameters:** * **username** (*string*) – Username * **full_name** (*string*) – User full name * **email** (*string*) – User email * **is_superuser** (*boolean*) – Is user superuser? (optional) * **is_active** (*boolean*) – Is user active? (optional) * **is_bot** (*boolean*) – Is user bot? (optional) (used for project scoped tokens) ### GET /api/users/(*str:* username)/ Returns information about users. * **Parameters:** * **username** (*string*) – User’s username * **Response JSON Object:** * **username** (*string*) – username of a user * **full_name** (*string*) – full name of a user * **email** (*string*) – email of a user * **is_superuser** (*boolean*) – whether the user is a super user * **is_active** (*boolean*) – whether the user is active * **is_bot** (*boolean*) – whether the user is bot (used for project scoped tokens) * **date_joined** (*string*) – date the user is created * **last_login** (*string*) – date the user last signed in * **groups** (*array*) – link to associated groups; see [`GET /api/groups/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-groups-(int-id)-) * **profile** (*object*) – user profile preferences; see [User profile](https://docs.weblate.org/en/latest/api.md#api-user-profile). Returned only with the `user.view` or `user.edit` permission. **Example JSON data:** ```json { "email": "user@example.com", "full_name": "Example User", "username": "exampleusername", "groups": [ "http://example.com/api/groups/2/", "http://example.com/api/groups/3/" ], "profile": { "language": "en", "languages": [ "http://example.com/api/languages/cs/" ], "secondary_languages": [], "translated": 42, "suggested": 3, "uploaded": 1, "commented": 5, "theme": "auto", "hide_completed": false, "secondary_in_zen": true, "hide_source_secondary": false, "wide_tables": false, "listing_columns": ["untranslated", "untranslated_words", "untranslated_chars", "nottranslated", "checks", "suggestions", "comments"], "editor_link": "", "translate_mode": 0, "zen_mode": 0, "special_chars": "", "nearby_strings": 10, "auto_watch": true, "contribute_personal_tm": true, "dashboard_view": 1, "dashboard_component_list": null, "watched": [], "website": "https://example.com/", "contact": "", "liberapay": "", "fediverse": "", "codesite": "", "github": "", "twitter": "", "linkedin": "", "location": "", "company": "", "public_email": "", "commit_email": "", "commit_name": 0, "last_2fa": "" }, "is_superuser": true, "is_active": true, "is_bot": false, "date_joined": "2020-03-29T18:42:42.617681Z", "url": "http://example.com/api/users/exampleusername/", "contributions_url": "http://example.com/api/users/exampleusername/contributions/", "statistics_url": "http://example.com/api/users/exampleusername/statistics/" } ``` ### PUT /api/users/(*str:* username)/ Changes the user parameters. Requires the global `user.edit` permission unless a user is updating their own account or profile fields. See [Access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) for the user management permission model. * **Parameters:** * **username** (*string*) – User’s username * **Response JSON Object:** * **username** (*string*) – username of a user * **full_name** (*string*) – full name of a user * **email** (*string*) – email of a user * **is_superuser** (*boolean*) – whether the user is a super user * **is_active** (*boolean*) – whether the user is active * **is_bot** (*boolean*) – whether the user is bot (used for project scoped tokens) * **date_joined** (*string*) – date the user is created * **profile** (*object*) – updated profile preferences when included in the request; see [User profile](https://docs.weblate.org/en/latest/api.md#api-user-profile) ### PATCH /api/users/(*str:* username)/ Changes the user parameters. Requires the global `user.edit` permission unless a user is updating their own account or profile fields. See [Access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) for the user management permission model. * **Parameters:** * **username** (*string*) – User’s username * **Response JSON Object:** * **username** (*string*) – username of a user * **full_name** (*string*) – full name of a user * **email** (*string*) – email of a user * **is_superuser** (*boolean*) – whether the user is a super user * **is_active** (*boolean*) – whether the user is active * **is_bot** (*boolean*) – whether the user is bot (used for project scoped tokens) * **date_joined** (*string*) – date the user is created * **profile** (*object*) – updated profile preferences when included in the request; see [User profile](https://docs.weblate.org/en/latest/api.md#api-user-profile) ### DELETE /api/users/(*str:* username)/ Deletes all user information and marks the user inactive. Requires the global `user.edit` permission. See [Access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) for the user management permission model. * **Parameters:** * **username** (*string*) – User’s username ### POST /api/users/(*str:* username)/groups/ Associate groups with a user. Requires the global `user.edit` permission. See [Access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) for the user management permission model. This permission authorizes membership changes for every team, including project and workspace teams; no separate permission over the target team is required. * **Parameters:** * **username** (*string*) – User’s username * **Form Parameters:** * **string group_id** – The unique group ID ### DELETE /api/users/(*str:* username)/groups/ #### Versionadded Added in version 4.13.1. Remove user from a group. Requires the global `user.edit` permission. See [Access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) for the user management permission model. This permission authorizes membership changes for every team, including project and workspace teams; no separate permission over the target team is required. * **Parameters:** * **username** (*string*) – User’s username * **Form Parameters:** * **string group_id** – The unique group ID ### GET /api/users/(*str:* username)/statistics/ List statistics of a user. * **Parameters:** * **username** (*string*) – User’s username * **Response JSON Object:** * **translated** (*int*) – Number of translations by user * **suggested** (*int*) – Number of suggestions by user * **uploaded** (*int*) – Number of uploads by user * **commented** (*int*) – Number of comments by user * **languages** (*int*) – Number of languages user can translate ### GET /api/users/(*str:* username)/contributions/ List translations with contributions from a user. * **Parameters:** * **username** (*string*) – User’s username * **Response JSON Object:** * **translations** (*array*) – link to translations; see [`GET /api/translations/(string:project)/(string:component)/(string:language)/`](https://docs.weblate.org/en/latest/api.md#get--api-translations-(string-project)-(string-component)-(string-language)-) ### GET /api/users/(*str:* username)/notifications/ List subscriptions of a user. * **Parameters:** * **username** (*string*) – User’s username * **Response JSON Object:** * **project** (*string*) – Link to the project, or `null` for other scopes * **component** (*string*) – Link to the component, or `null` for other scopes ### POST /api/users/(*str:* username)/notifications/ Associate subscriptions with a user. * **Parameters:** * **username** (*string*) – User’s username * **Request JSON Object:** * **notification** (*string*) – Name of notification registered * **scope** (*int*) – Scope of notification from the available choices * **frequency** (*int*) – Frequency choices for notifications ### GET /api/users/(*str:* username)/notifications/(*int:* subscription_id)/ Get a subscription associated with a user. * **Parameters:** * **username** (*string*) – User’s username * **subscription_id** (*int*) – ID of notification registered * **Response JSON Object:** * **project** (*string*) – Link to the project, or `null` for other scopes * **component** (*string*) – Link to the component, or `null` for other scopes ### PUT /api/users/(*str:* username)/notifications/(*int:* subscription_id)/ Edit a subscription associated with a user. * **Parameters:** * **username** (*string*) – User’s username * **subscription_id** (*int*) – ID of notification registered * **Request JSON Object:** * **notification** (*string*) – Name of notification registered * **scope** (*int*) – Scope of notification from the available choices * **frequency** (*int*) – Frequency choices for notifications ### PATCH /api/users/(*str:* username)/notifications/(*int:* subscription_id)/ Edit a subscription associated with a user. * **Parameters:** * **username** (*string*) – User’s username * **subscription_id** (*int*) – ID of notification registered * **Request JSON Object:** * **notification** (*string*) – Name of notification registered * **scope** (*int*) – Scope of notification from the available choices * **frequency** (*int*) – Frequency choices for notifications ### DELETE /api/users/(*str:* username)/notifications/(*int:* subscription_id)/ Delete a subscription associated with a user. * **Parameters:** * **username** (*string*) – User’s username * **subscription_id** – Name of notification registered * **subscription_id** – int ## User profile #### Versionadded Added in version 2026.8. The user API exposes profile preferences in a nested `profile` object. The object is returned on [`GET /api/users/(str:username)/`](https://docs.weblate.org/en/latest/api.md#get--api-users-(str-username)-) only for callers with the `user.view` or `user.edit` permission. Users without those permissions can still update their own profile through [`PATCH /api/users/(str:username)/`](https://docs.weblate.org/en/latest/api.md#patch--api-users-(str-username)-); the response then includes the updated `profile` object. Profile fields mirror the settings described in [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile). ## Groups #### Versionadded Added in version 4.0. ### GET /api/groups/ Returns a list of groups if you have permissions to see manage groups. If not, then you get to see only the groups the user is a part of. #### SEE ALSO Group object attributes are documented at [`GET /api/groups/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-groups-(int-id)-). ### POST /api/groups/ Creates a new group. * **Parameters:** * **name** (*string*) – Group name * **project_selection** (*int*) – Group of project selection from given options * **language_selection** (*int*) – Group of languages selected from given options * **defining_project** (*str*) – link to the defining project, used for [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl); see [`GET /api/projects/(string:project)/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-) ### GET /api/groups/(*int:* id)/ Returns information about the group. * **Parameters:** * **id** (*int*) – Group’s ID * **Response JSON Object:** * **name** (*string*) – name of a group * **project_selection** (*int*) – integer corresponding to group of projects * **language_selection** (*int*) – integer corresponding to group of languages * **roles** (*array*) – link to associated roles; see [`GET /api/roles/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-roles-(int-id)-) * **projects** (*array*) – link to associated projects; see [`GET /api/projects/(string:project)/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-) * **components** (*array*) – link to associated components; see [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-) * **componentlists** (*array*) – link to associated componentlist; see [`GET /api/component-lists/(str:slug)/`](https://docs.weblate.org/en/latest/api.md#get--api-component-lists-(str-slug)-) * **defining_project** (*str*) – link to the defining project, used for [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl); see [`GET /api/projects/(string:project)/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-) * **admins** (*array*) – link to associated administrators; see [`GET /api/users/(str:username)/`](https://docs.weblate.org/en/latest/api.md#get--api-users-(str-username)-) **Example JSON data:** ```json { "name": "Guests", "defining_project": null, "project_selection": 3, "language_selection": 1, "url": "http://example.com/api/groups/1/", "roles": [ "http://example.com/api/roles/1/", "http://example.com/api/roles/2/" ], "languages": [ "http://example.com/api/languages/en/", "http://example.com/api/languages/cs/", ], "projects": [ "http://example.com/api/projects/demo1/", "http://example.com/api/projects/demo/" ], "componentlist": "http://example.com/api/component-lists/new/", "components": [ "http://example.com/api/components/demo/weblate/" ], "admins": [ "http://example.com/api/users/exampleusername/" ] } ``` ### PUT /api/groups/(*int:* id)/ Changes the group parameters. * **Parameters:** * **id** (*int*) – Group’s ID * **Response JSON Object:** * **name** (*string*) – name of a group * **project_selection** (*int*) – integer corresponding to group of projects * **language_selection** (*int*) – integer corresponding to group of languages ### PATCH /api/groups/(*int:* id)/ Changes the group parameters. * **Parameters:** * **id** (*int*) – Group’s ID * **Response JSON Object:** * **name** (*string*) – name of a group * **project_selection** (*int*) – integer corresponding to group of projects * **language_selection** (*int*) – integer corresponding to group of languages ### DELETE /api/groups/(*int:* id)/ Deletes the group. * **Parameters:** * **id** (*int*) – Group’s ID ### POST /api/groups/(*int:* id)/roles/ Associate roles with a group. * **Parameters:** * **id** (*int*) – Group’s ID * **Form Parameters:** * **string role_id** – The unique role ID ### DELETE /api/groups/(*int:* id)/roles/(*int:* role_id) Delete role from a group. * **Parameters:** * **id** (*int*) – Group’s ID * **role_id** (*int*) – The unique role ID ### POST /api/groups/(*int:* id)/components/ Associate components with a group. * **Parameters:** * **id** (*int*) – Group’s ID * **Form Parameters:** * **string component_id** – The unique component ID ### DELETE /api/groups/(*int:* id)/components/(*int:* component_id) Delete component from a group. * **Parameters:** * **id** (*int*) – Group’s ID * **component_id** (*int*) – The unique component ID ### POST /api/groups/(*int:* id)/projects/ Associate projects with a group. * **Parameters:** * **id** (*int*) – Group’s ID * **Form Parameters:** * **string project_id** – The unique project ID ### DELETE /api/groups/(*int:* id)/projects/(*int:* project_id) Delete project from a group. * **Parameters:** * **id** (*int*) – Group’s ID * **project_id** (*int*) – The unique project ID ### POST /api/groups/(*int:* id)/languages/ Associate languages with a group. * **Parameters:** * **id** (*int*) – Group’s ID * **Form Parameters:** * **string language_code** – The unique language code ### DELETE /api/groups/(*int:* id)/languages/(*string:* language_code) Delete language from a group. * **Parameters:** * **id** (*int*) – Group’s ID * **language_code** (*string*) – The unique language code ### POST /api/groups/(*int:* id)/componentlists/ Associate componentlists with a group. * **Parameters:** * **id** (*int*) – Group’s ID * **Form Parameters:** * **string component_list_id** – The unique componentlist ID ### DELETE /api/groups/(*int:* id)/componentlists/(*int:* component_list_id) Delete componentlist from a group. * **Parameters:** * **id** (*int*) – Group’s ID * **component_list_id** (*int*) – The unique componentlist ID ### POST /api/groups/(*int:* id)/admins/ #### Versionadded Added in version 5.5. Add user to team admins. * **Parameters:** * **id** (*int*) – Group’s ID * **Form Parameters:** * **string user_id** – The user’s ID ### DELETE /api/groups/(*int:* id)/admins/(*int:* user_id) #### Versionadded Added in version 5.5. Delete user from team admins. * **Parameters:** * **id** (*int*) – Group’s ID * **user_id** (*integer*) – The user’s ID ## Roles ### GET /api/roles/ Returns a list of all roles associated with user. If user is superuser, then list of all existing roles is returned. #### SEE ALSO Roles object attributes are documented at [`GET /api/roles/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-roles-(int-id)-). ### POST /api/roles/ Creates a new role. * **Parameters:** * **name** (*string*) – Role name * **permissions** (*array*) – List of codenames of permissions ### GET /api/roles/(*int:* id)/ Returns information about the role. * **Parameters:** * **id** (*int*) – Role’s ID * **Response JSON Object:** * **name** (*string*) – Role name * **permissions** (*array*) – list of codenames of permissions **Example JSON data:** ```json { "name": "Access repository", "permissions": [ "vcs.access", "vcs.view" ], "url": "http://example.com/api/roles/1/", } ``` ### PUT /api/roles/(*int:* id)/ Changes the role parameters. * **Parameters:** * **id** (*int*) – Role’s ID * **Response JSON Object:** * **name** (*string*) – Role name * **permissions** (*array*) – list of codenames of permissions ### PATCH /api/roles/(*int:* id)/ Changes the role parameters. * **Parameters:** * **id** (*int*) – Role’s ID * **Response JSON Object:** * **name** (*string*) – Role name * **permissions** (*array*) – list of codenames of permissions ### DELETE /api/roles/(*int:* id)/ Deletes the role. * **Parameters:** * **id** (*int*) – Role’s ID ## Languages ### GET /api/languages/ Returns a list of all languages. #### SEE ALSO Language object attributes are documented at [`GET /api/languages/(string:language)/`](https://docs.weblate.org/en/latest/api.md#get--api-languages-(string-language)-). ### POST /api/languages/ Creates a new language. * **Parameters:** * **code** (*string*) – Language name * **name** (*string*) – Language name * **direction** (*string*) – Text direction * **population** (*int*) – Number of speakers * **plural** (*object*) – Language plural formula and number ### GET /api/languages/(*string:* language)/ Returns information about the language. * **Parameters:** * **language** (*string*) – Language code * **Response JSON Object:** * **code** (*string*) – Language code * **direction** (*string*) – Text direction * **plural** (*object*) – Object of language plural information * **aliases** (*array*) – Array of aliases for language * **Request JSON Object:** * **population** (*int*) – Number of speakers **Example JSON data:** ```json { "code": "en", "direction": "ltr", "name": "English", "population": 159034349015, "plural": { "id": 75, "source": 0, "number": 2, "formula": "n != 1", "type": 1 }, "aliases": [ "english", "en_en", "base", "source", "eng" ], "url": "http://example.com/api/languages/en/", "web_url": "http://example.com/languages/en/", "statistics_url": "http://example.com/api/languages/en/statistics/" } ``` ### PUT /api/languages/(*string:* language)/ Changes the language parameters. * **Parameters:** * **language** (*string*) – Language’s code * **Request JSON Object:** * **name** (*string*) – Language name * **direction** (*string*) – Text direction * **population** (*int*) – Number of speakers * **plural** (*object*) – Language plural details ### PATCH /api/languages/(*string:* language)/ Changes the language parameters. * **Parameters:** * **language** (*string*) – Language’s code * **Request JSON Object:** * **name** (*string*) – Language name * **direction** (*string*) – Text direction * **population** (*int*) – Number of speakers * **plural** (*object*) – Language plural details ### DELETE /api/languages/(*string:* language)/ Deletes the language. * **Parameters:** * **language** (*string*) – Language’s code ### GET /api/languages/(*string:* language)/statistics/ Returns statistics for a language. * **Parameters:** * **language** (*string*) – Language code #### SEE ALSO Returned attributes are described in [Statistics](https://docs.weblate.org/en/latest/api.md#api-statistics). ## Projects ### GET /api/projects/ Returns a list of all projects. #### SEE ALSO Project object attributes are documented at [`GET /api/projects/(string:project)/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-). ### POST /api/projects/ Creates a new project. * **Parameters:** * **name** (*string*) – Project name * **slug** (*string*) – Project slug * **web** (*string*) – Project website * **workspace** (*string*) – Optional workspace UUID. Creating a project in a workspace requires Add projects to workspace permission for that workspace. When omitted, Weblate can use the only eligible workspace. Creating a project without an eligible workspace requires the site-wide Add new projects permission. See [Project creation and moves](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-project-creation). * **access_control** (*integer*) – [Access control](https://docs.weblate.org/en/latest/admin/projects.md#project-access-control) * **public_sharing** (*boolean*) – [Public sharing](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing) * **use_shared_tm** (*boolean*) – [Use shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-shared-tm) * **contribute_shared_tm** (*boolean*) – [Contribute to shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-shared-tm) * **use_workspace_tm** (*boolean*) – [Use workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-workspace-tm) * **contribute_workspace_tm** (*boolean*) – [Contribute to workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-workspace-tm) * **autoclean_tm** (*boolean*) – [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-autoclean-tm) Omit `access_control` to use the configured default. Explicit non-default access control requires a superuser unless a billing plan determines the value. On Hosted Weblate, Custom access control is unavailable and each translation-memory contribution setting is forced to match its corresponding usage setting. ### GET /api/projects/(*string:* project)/ Returns information about the project. * **Parameters:** * **project** (*string*) – Project URL slug * **Response JSON Object:** * **name** (*string*) – project name * **slug** (*string*) – project slug * **web** (*string*) – project website * **components_list_url** (*string*) – URL to components list; see [`GET /api/projects/(string:project)/components/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-components-) * **repository_url** (*string*) – URL to repository status; see [`GET /api/projects/(string:project)/repository/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-repository-) * **changes_list_url** (*string*) – URL to changes list; see [`GET /api/projects/(string:project)/changes/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-changes-) * **reports_url** (*string*) – URL to list or generate scoped reports; see [`GET /api/projects/(string:project)/reports/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-reports-) * **translation_review** (*boolean*) – [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) * **source_review** (*boolean*) – [Enable source reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-source-review) * **enable_hooks** (*boolean*) – [Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks) * **workspace** (*string*) – workspace UUID, or `null` when the project is not assigned to a workspace * **instructions** (*string*) – [Translation instructions](https://docs.weblate.org/en/latest/admin/projects.md#project-instructions) * **language_aliases** (*string*) – [Language aliases](https://docs.weblate.org/en/latest/admin/projects.md#project-language-aliases) * **license** (*string*) – [Translation license](https://docs.weblate.org/en/latest/admin/projects.md#project-license) * **access_control** (*integer*) – [Access control](https://docs.weblate.org/en/latest/admin/projects.md#project-access-control) * **public_sharing** (*boolean*) – [Public sharing](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing) * **use_shared_tm** (*boolean*) – [Use shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-shared-tm) * **contribute_shared_tm** (*boolean*) – [Contribute to shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-shared-tm) * **use_workspace_tm** (*boolean*) – [Use workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-workspace-tm) * **contribute_workspace_tm** (*boolean*) – [Contribute to workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-workspace-tm) * **autoclean_tm** (*boolean*) – [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-autoclean-tm) * **announcements_url** (*string*) – URL to announcements; see [`GET /api/projects/(string:project)/announcements/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-announcements-) **Example JSON data:** ```json { "name": "Hello", "slug": "hello", "url": "http://example.com/api/projects/hello/", "web": "https://weblate.org/", "web_url": "http://example.com/projects/hello/" } ``` ### PATCH /api/projects/(*string:* project)/ #### Versionadded Added in version 4.3. Edit a project by a [PATCH](https://www.rfc-editor.org/rfc/rfc5789#section-2) request. The `project` value is the project slug. To avoid using a wrong identifier, use the project `url` returned by [`GET /api/projects/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-) or [`GET /api/projects/(string:project)/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-). The request body accepts project fields such as `instructions`, `license`, `access_control`, and translation-memory settings. **Example JSON data:** ```json { "instructions": "Translate consistently.", "license": "MIT", "use_shared_tm": true, "access_control": 100 } ``` Changing `access_control` or `public_sharing` requires permission to manage project access. Making a project publicly accessible can require licenses on its components when [`LICENSE_REQUIRED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LICENSE_REQUIRED) is enabled. On Hosted Weblate, Custom access control is unavailable and each translation-memory contribution setting is forced to match its corresponding usage setting. Changing `workspace` moves the project. Moving a project requires permission to edit the project and the Edit workspace settings permission for the source and target workspace. The target workspace also requires the Add projects to workspace permission. Moving a project out of a workspace also requires the site-wide Add new projects permission. See [Project creation and moves](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-project-creation). * **Parameters:** * **project** (*string*) – Project URL slug * **instructions** (*string*) – [Translation instructions](https://docs.weblate.org/en/latest/admin/projects.md#project-instructions) * **license** (*string*) – [Translation license](https://docs.weblate.org/en/latest/admin/projects.md#project-license) * **access_control** (*integer*) – [Access control](https://docs.weblate.org/en/latest/admin/projects.md#project-access-control) * **public_sharing** (*boolean*) – [Public sharing](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing) * **use_shared_tm** (*boolean*) – [Use shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-shared-tm) * **contribute_shared_tm** (*boolean*) – [Contribute to shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-shared-tm) * **use_workspace_tm** (*boolean*) – [Use workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-workspace-tm) * **contribute_workspace_tm** (*boolean*) – [Contribute to workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-workspace-tm) * **autoclean_tm** (*boolean*) – [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-autoclean-tm) * **workspace** (*string*) – Optional workspace UUID, or `null` to move the project out of a workspace ### PUT /api/projects/(*string:* project)/ #### Versionadded Added in version 4.3. Edit a project by a [PUT](https://www.rfc-editor.org/rfc/rfc7231#section-4.3.4) request. Changing `workspace` follows the same permission checks as [`PATCH /api/projects/(string:project)/`](https://docs.weblate.org/en/latest/api.md#patch--api-projects-(string-project)-). * **Parameters:** * **project** (*string*) – Project URL slug * **instructions** (*string*) – [Translation instructions](https://docs.weblate.org/en/latest/admin/projects.md#project-instructions) * **license** (*string*) – [Translation license](https://docs.weblate.org/en/latest/admin/projects.md#project-license) * **access_control** (*integer*) – [Access control](https://docs.weblate.org/en/latest/admin/projects.md#project-access-control) * **public_sharing** (*boolean*) – [Public sharing](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing) * **use_shared_tm** (*boolean*) – [Use shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-shared-tm) * **contribute_shared_tm** (*boolean*) – [Contribute to shared translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-shared-tm) * **use_workspace_tm** (*boolean*) – [Use workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-use-workspace-tm) * **contribute_workspace_tm** (*boolean*) – [Contribute to workspace translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-contribute-workspace-tm) * **autoclean_tm** (*boolean*) – [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/projects.md#project-autoclean-tm) ### DELETE /api/projects/(*string:* project)/ Deletes a project. * **Parameters:** * **project** (*string*) – Project URL slug ### GET /api/projects/(*string:* project)/changes/ Returns a list of project changes. This is essentially a project scoped [`GET /api/changes/`](https://docs.weblate.org/en/latest/api.md#get--api-changes-) accepting same params. * **Parameters:** * **project** (*string*) – Project URL slug * **Response JSON Object:** * **results** (*array*) – array of component objects; see [`GET /api/changes/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-changes-(int-id)-) ### GET /api/projects/(*string:* project)/file/ #### Versionadded Added in version 5.5. Downloads all available translations associated with the project as an archive file using the requested format and language. * **Parameters:** * **project** (*string*) – Project URL slug * **Query Parameters:** * **format** (*string*) – The archive format to use; If not specified, defaults to `zip`; Supported formats: `zip` and `zip:CONVERSION` where `CONVERSION` is one of converters listed at [Downloading translations](https://docs.weblate.org/en/latest/user/files.md#download). * **language_code** (*string*) – The language code to download; If not specified, all languages are included. ### GET /api/projects/(*string:* project)/repository/ Returns information about the VCS repository status. This endpoint contains only an overall summary for all repositories for the project. To get more detailed status use [`GET /api/components/(string:project)/(string:component)/repository/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-repository-). Repository status includes repositories where the user has a VCS permission on the component owning that repository. Repositories whose owners do not grant this permission are omitted and reported separately. * **Parameters:** * **project** (*string*) – Project URL slug * **Response JSON Object:** * **needs_commit** (*boolean*) – whether there are any pending changes to commit * **needs_merge** (*boolean*) – whether there are any upstream changes to merge * **needs_push** (*boolean*) – whether there are any local changes to push * **included_components** (*array*) – full paths of project components included in the status * **skipped_components** (*array*) – full paths of project components omitted from the status * **permission_blockers** (*array*) – full paths of components preventing access to omitted repositories **Example JSON data:** ```json { "included_components": ["hello/app"], "needs_commit": true, "needs_merge": false, "needs_push": true, "permission_blockers": ["shared/glossary"], "skipped_components": ["hello/glossary"] } ``` ### POST /api/projects/(*string:* project)/repository/ Performs given operation on the VCS repository. Repository operations process repositories where the user has the requested VCS permission on the component owning that repository. Repositories whose owners do not grant this permission are skipped. The request is denied when no repository is eligible for the operation. * **Parameters:** * **project** (*string*) – Project URL slug * **Request JSON Object:** * **operation** (*string*) – Operation to perform: one of `push`, `pull`, `commit`, `reset`, `cleanup`, `file-sync`, `file-scan` * **background** (*boolean*) – Schedule the operation as a background task instead of waiting for it to finish. Defaults to `false`. * **Response JSON Object:** * **result** (*boolean*) – result of a synchronous operation * **included_components** (*array*) – full paths of project components included in the operation * **skipped_components** (*array*) – full paths of project components omitted from the operation * **permission_blockers** (*array*) – full paths of components preventing access to omitted repositories * **detail** (*string*) – Status of a background operation * **task_url** (*string*) – URL for tracking a background operation; see [`GET /api/tasks/(str:uuid)/`](https://docs.weblate.org/en/latest/api.md#get--api-tasks-(str-uuid)-) With `background` set to `true`, the endpoint returns `202 Accepted`. Repeating an identical queued operation returns the existing task URL. A conflicting operation returns `423 Locked` and the active task URL when available. Eligible project repositories are processed sequentially in one task. **CURL example:** ```sh curl \ -d operation=pull \ -H "Authorization: Token TOKEN" \ http://example.com/api/projects/hello/repository/ ``` **JSON request example:** ```http POST /api/projects/hello/repository/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Token TOKEN Content-Length: 20 {"operation":"pull"} ``` **JSON response example:** ```http HTTP/1.0 200 OK Date: Tue, 12 Apr 2016 09:32:50 GMT Server: WSGIServer/0.1 Python/2.7.11+ Vary: Accept, Accept-Language, Cookie X-Frame-Options: SAMEORIGIN Content-Type: application/json Content-Language: en Allow: GET, POST, HEAD, OPTIONS { "included_components": ["hello/app"], "permission_blockers": ["shared/glossary"], "result": true, "skipped_components": ["hello/glossary"] } ``` **Background JSON request example:** ```http POST /api/projects/hello/repository/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Token TOKEN {"operation":"pull","background":true} ``` **Background JSON response example:** ```http HTTP/1.0 202 Accepted Content-Type: application/json { "detail": "Repository operation has been queued.", "included_components": ["hello/app"], "permission_blockers": ["shared/glossary"], "skipped_components": ["hello/glossary"], "task_url": "https://example.com/api/tasks/01234567-89ab-cdef-0123-456789abcdef/" } ``` ### GET /api/projects/(*string:* project)/components/ Returns a list of translation components in the given project. * **Parameters:** * **project** (*string*) – Project URL slug * **Response JSON Object:** * **results** (*array*) – array of component objects; see [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-) ### POST /api/projects/(*string:* project)/components/ #### Versionchanged Changed in version 4.3: The `zipfile` and `docfile` parameters are now accepted for VCS-less components, see [Local files](https://docs.weblate.org/en/latest/vcs.md#vcs-local). #### Versionchanged Changed in version 4.6: The cloned repositories are now automatically shared within a project using [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls). Use `disable_autoshare` to turn off this. Creates translation components in the given project. #### HINT Use [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls) when creating multiple components from a single VCS repository. #### NOTE Most of the component creation happens in the background. Check the `task_url` attribute of created component and follow the progress there. * **Parameters:** * **project** (*string*) – Project URL slug * **Form Parameters:** * **file zipfile** – ZIP file to upload into Weblate for translations initialization * **file docfile** – Document to translate * **string from_component** – Optional source component reference used to duplicate the new component. Accepts either a numeric component ID or a full Weblate component path. When provided, the new component inherits the source component configuration and translations into a new local repository. Repository fields such as `repo`, `vcs`, `branch`, `push`, and `push_branch` can not be combined with this option. * **boolean disable_autoshare** – Disables automatic repository sharing via [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls). * **Request JSON Object:** * **object** – Component parameters, see [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-) * **Response JSON Object:** * **result** (*object*) – Created component object; see [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-) JSON can not be used when uploading the files using the `zipfile` and `docfile` parameters. The data has to be uploaded as *multipart/form-data*. **CURL form request example:** ```sh curl \ --form docfile=@strings.html \ --form name=Weblate \ --form slug=weblate \ --form file_format=html \ --form new_lang=add \ -H "Authorization: Token TOKEN" \ http://example.com/api/projects/hello/components/ ``` **CURL JSON request example:** ```sh curl \ --data-binary '{ "branch": "main", "file_format": "po", "file_format_params": { "po_line_wrap": 65535, "po_no_location": true }, "filemask": "po/*.po", "name": "Weblate", "slug": "weblate", "repo": "https://github.com/WeblateOrg/hello.git", "template": "", "new_base": "po/hello.pot", "vcs": "git" }' \ -H "Content-Type: application/json" \ -H "Authorization: Token TOKEN" \ http://example.com/api/projects/hello/components/ ``` **JSON request to create a new component from Git:** ```http POST /api/projects/hello/components/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Token TOKEN Content-Length: 20 { "branch": "main", "file_format": "po", "file_format_params": { "po_line_wrap": 65535, "po_no_location": true }, "filemask": "po/*.po", "name": "Weblate", "slug": "weblate", "repo": "https://github.com/WeblateOrg/hello.git", "template": "", "new_base": "po/hello.pot", "vcs": "git" } ``` **JSON request to create a new component from another one:** ```http POST /api/projects/hello/components/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Token TOKEN Content-Length: 20 { "from_component": "hello/weblate", "name": "Weblate", "slug": "weblate" } ``` **JSON response example:** ```http HTTP/1.0 200 OK Date: Tue, 12 Apr 2016 09:32:50 GMT Server: WSGIServer/0.1 Python/2.7.11+ Vary: Accept, Accept-Language, Cookie X-Frame-Options: SAMEORIGIN Content-Type: application/json Content-Language: en Allow: GET, POST, HEAD, OPTIONS { "branch": "main", "file_format": "po", "file_format_params": { "po_line_wrap": 65535, "po_no_location": true }, "filemask": "po/*.po", "git_export": "", "license": "", "license_url": "", "name": "Weblate", "slug": "weblate", "project": { "name": "Hello", "slug": "hello", "source_language": { "code": "en", "direction": "ltr", "population": 159034349015, "name": "English", "url": "http://example.com/api/languages/en/", "web_url": "http://example.com/languages/en/" }, "url": "http://example.com/api/projects/hello/", "web": "https://weblate.org/", "web_url": "http://example.com/projects/hello/" }, "repo": "file:///home/nijel/work/weblate-hello", "template": "", "new_base": "", "url": "http://example.com/api/components/hello/weblate/", "vcs": "git", "web_url": "http://example.com/projects/hello/weblate/" } ``` ### GET /api/projects/(*string:* project)/languages/ Returns paginated statistics for all languages within a project. * **Parameters:** * **project** (*string*) – Project URL slug * **Response JSON Object:** * **results** (*array*) – array of translation statistics objects * **language** (*string*) – language name * **code** (*string*) – language code * **total** (*int*) – total number of strings * **translated** (*int*) – number of translated strings * **translated_percent** (*float*) – percentage of translated strings * **total_words** (*int*) – total number of words * **translated_words** (*int*) – number of translated words * **words_percent** (*float*) – percentage of translated words ### GET /api/projects/(*string:* project)/statistics/ Returns statistics for a project. * **Parameters:** * **project** (*string*) – Project URL slug #### SEE ALSO Returned attributes are described in [Statistics](https://docs.weblate.org/en/latest/api.md#api-statistics). ### GET /api/projects/(*string:* project)/metrics/ #### Versionadded Added in version 2026.8. Returns translation metrics for the project components visible to the caller. Components are identified by their project-relative path and the result is grouped by component and language. When multiple components have the same project-relative path, `@` and the component ID are appended to each colliding path. The OpenMetrics representation exposes `weblate_translation_info` and `weblate_*` gauges compatible with the project translation statistics. Strings containing suggestions use `weblate_strings_with_suggestions` to distinguish them from the server-wide `weblate_suggestions` object count. The CSV representation contains one row for each component, language, and numeric metric. * **Parameters:** * **project** (*string*) – Project URL slug * **Query Parameters:** * **format** (*string*) – Response format; use `openmetrics` or `csv` for monitoring and tabular output. ### GET /api/projects/(*string:* project)/categories/ #### Versionadded Added in version 5.0: Returns categories for a project. See [`GET /api/categories/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-categories-(int-id)-) for field definitions. * **param project:** Project URL slug * **type project:** string ### GET /api/projects/(*string:* project)/labels/ #### Versionadded Added in version 5.3: Returns labels for a project. * **param project:** Project URL slug * **type project:** string * **>json int id:** ID of the label * **>json string name:** name of the label * **>json string color:** color of the label ### POST /api/projects/(*string:* project)/labels/ #### Versionadded Added in version 5.3: Creates a label for a project. * **param project:** Project URL slug * **type project:** string * **json int id:** ID of the announcement * **>json string message:** announcement text * **>json string severity:** color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green) * **>json date expiry:** hide after this date, ISO 8601 extended format date (optional) * **>json bool notify:** send notification to subscribed users? (optional) ### POST /api/projects/(*string:* project)/languages/(*string:* language_code)/announcements/ #### Versionadded Added in version 2026.6: Creates an announcement for a specified `language_code` in a project. * **param project:** Project URL slug * **type project:** string * **param language_code:** Language code * **type language_code:** string * **json int id:** ID of the announcement * **>json string message:** announcement text * **>json string severity:** color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green) * **>json date expiry:** hide after this date, ISO 8601 extended format date (optional) * **>json bool notify:** send notification to subscribed users? (optional) ### POST /api/projects/(*string:* project)/announcements/ #### Versionadded Added in version 5.17: Creates an announcement for a project. * **param project:** Project URL slug * **type project:** string * **json string name:** Backup file name, for example `1718803200.zip` * **>json string timestamp:** Backup creation time in ISO 8601 format * **>json int size:** Backup file size in bytes ### POST /api/projects/(*string:* project)/backups/ #### Versionadded Added in version 2026.7: Schedules creation of a new [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) archive. Once ready, the backup appears in [`GET /api/projects/(string:project)/backups/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-backups-). * **param project:** Project URL slug * **type project:** string * **>json string detail:** Result message * **>json string url:** URL to list backups ### GET /api/projects/(*string:* project)/backups/(*string:* backup)/ #### Versionadded Added in version 2026.7: Downloads a [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) archive. * **param project:** Project URL slug * **type project:** string * **param backup:** Backup file name, e.g. `1718803200.zip` * **type backup:** string ## Components #### HINT Use [`POST /api/projects/(string:project)/components/`](https://docs.weblate.org/en/latest/api.md#post--api-projects-(string-project)-components-) to create new components. ### GET /api/components/ Returns a list of translation components. #### SEE ALSO Component object attributes are documented at [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-). ### GET /api/components/(*string:* project)/(*string:* component)/ Returns information about the translation component. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Response JSON Object:** * **project** (*object*) – the translation project; see [`GET /api/projects/(string:project)/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-) * **name** (*string*) – [Component name](https://docs.weblate.org/en/latest/admin/projects.md#component-name) * **slug** (*string*) – [Component slug](https://docs.weblate.org/en/latest/admin/projects.md#component-slug) * **vcs** (*string*) – [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) * **vcs_params** (*object*) – [Version control parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs-params) * **linked_component** (*string*) – component whose repository is linked via [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls) * **repo** (*string*) – [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo), this is the actual repository URL even when [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls) are used, use `linked_component` to detect this situation * **git_export** (*string*) – [Exported repository URL](https://docs.weblate.org/en/latest/admin/projects.md#component-git-export) * **branch** (*string*) – [Repository branch](https://docs.weblate.org/en/latest/admin/projects.md#component-branch), this is the actual repository branch even when [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls) are used * **push** (*string*) – [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push), this is the actual repository URL even when [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls) are used * **push_branch** (*string*) – [Push branch](https://docs.weblate.org/en/latest/admin/projects.md#component-push-branch), this is the actual repository branch even when [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls) are used * **filemask** (*string*) – [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) * **template** (*string*) – [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template) * **edit_template** (*string*) – [Edit base file](https://docs.weblate.org/en/latest/admin/projects.md#component-edit-template) * **intermediate** (*string*) – [Intermediate language file](https://docs.weblate.org/en/latest/admin/projects.md#component-intermediate) * **new_base** (*string*) – [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base) * **file_format** (*string*) – [File format](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format) * **file_format_params** (*object*) – [File format parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format-params) * **license** (*string*) – [Translation license](https://docs.weblate.org/en/latest/admin/projects.md#component-license) * **agreement** (*string*) – [Contributor license agreement](https://docs.weblate.org/en/latest/admin/projects.md#component-agreement) * **new_lang** (*string*) – [Adding new translation](https://docs.weblate.org/en/latest/admin/projects.md#component-new-lang) * **language_code_style** (*string*) – [Language code style](https://docs.weblate.org/en/latest/admin/projects.md#component-language-code-style) * **source_language** (*object*) – source language object; see [`GET /api/languages/(string:language)/`](https://docs.weblate.org/en/latest/api.md#get--api-languages-(string-language)-) * **check_flags** (*string*) – [Translation flags](https://docs.weblate.org/en/latest/admin/projects.md#component-check-flags) * **priority** (*string*) – [Priority](https://docs.weblate.org/en/latest/admin/projects.md#component-priority) * **enforced_checks** (*string*) – [Enforced checks](https://docs.weblate.org/en/latest/admin/projects.md#component-enforced-checks) * **restricted** (*string*) – [Restricted access](https://docs.weblate.org/en/latest/admin/projects.md#component-restricted) * **repoweb** (*string*) – [Repository browser](https://docs.weblate.org/en/latest/admin/projects.md#component-repoweb) * **report_source_bugs** (*string*) – [Source string bug reporting address](https://docs.weblate.org/en/latest/admin/projects.md#component-report-source-bugs) * **merge_style** (*string*) – [Merge style](https://docs.weblate.org/en/latest/admin/projects.md#component-merge-style) * **commit_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/latest/admin/projects.md#component-commit-message) * **add_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/latest/admin/projects.md#component-add-message) * **delete_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/latest/admin/projects.md#component-delete-message) * **merge_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/latest/admin/projects.md#component-merge-message) * **addon_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/latest/admin/projects.md#component-addon-message) * **pull_message** (*string*) – [Commit, add, delete, merge, add-on, and merge request messages](https://docs.weblate.org/en/latest/admin/projects.md#component-pull-message) * **allow_translation_propagation** (*string*) – [Allow translation propagation](https://docs.weblate.org/en/latest/admin/projects.md#component-allow-translation-propagation) * **hide_glossary_matches** (*boolean*) – [Do not show glossary matches](https://docs.weblate.org/en/latest/admin/projects.md#component-hide-glossary-matches) * **contribute_project_tm** (*boolean*) – [Contribute to project translation memory](https://docs.weblate.org/en/latest/admin/projects.md#component-contribute-project-tm) * **enable_suggestions** (*string*) – [Enable suggestions](https://docs.weblate.org/en/latest/admin/projects.md#component-enable-suggestions) * **suggestion_voting** (*string*) – [Suggestion voting](https://docs.weblate.org/en/latest/admin/projects.md#component-suggestion-voting) * **suggestion_autoaccept** (*string*) – [Automatically accept suggestions](https://docs.weblate.org/en/latest/admin/projects.md#component-suggestion-autoaccept) * **push_on_commit** (*boolean*) – [Push on commit](https://docs.weblate.org/en/latest/admin/projects.md#component-push-on-commit); linked repositories expose the effective value from the linked component * **locked** (*bool*) – Whether component is locked, this field is read-only; see [`GET /api/components/(string:project)/(string:component)/lock/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-lock-) * **commit_pending_age** (*integer*) – [Age of changes to commit](https://docs.weblate.org/en/latest/admin/projects.md#component-commit-pending-age); linked repositories expose the effective value from the linked component * **auto_lock_error** (*boolean*) – [Lock on error](https://docs.weblate.org/en/latest/admin/projects.md#component-auto-lock-error); linked repositories expose the effective value from the linked component * **language_regex** (*string*) – [Language filter](https://docs.weblate.org/en/latest/admin/projects.md#component-language-regex) * **variant_regex** (*string*) – [Variants regular expression](https://docs.weblate.org/en/latest/admin/projects.md#component-variant-regex) * **is_glossary** (*bool*) – [Use as a glossary](https://docs.weblate.org/en/latest/admin/projects.md#component-is-glossary) * **glossary_color** (*string*) – [Glossary color](https://docs.weblate.org/en/latest/admin/projects.md#component-glossary-color) * **repository_url** (*string*) – URL to repository status; see [`GET /api/components/(string:project)/(string:component)/repository/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-repository-) * **translations_url** (*string*) – URL to translations list; see [`GET /api/components/(string:project)/(string:component)/translations/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-translations-) * **lock_url** (*string*) – URL to lock status; see [`GET /api/components/(string:project)/(string:component)/lock/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-lock-) * **changes_list_url** (*string*) – URL to changes list; see [`GET /api/components/(string:project)/(string:component)/changes/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-changes-) * **task_url** (*string*) – URL to a background task (if any); see [`GET /api/tasks/(str:uuid)/`](https://docs.weblate.org/en/latest/api.md#get--api-tasks-(str-uuid)-) * **reports_url** (*string*) – URL to list or generate scoped reports; see [`GET /api/components/(string:project)/(string:component)/reports/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-reports-) * **announcements_url** (*string*) – URL to announcements; see [`GET /api/components/(string:project)/(string:component)/announcements/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-announcements-) Repository fields, including `linked_component`, are returned only with the View upstream repository location permission. **Example JSON data:** ```json { "branch": "main", "file_format": "po", "file_format_params": { "po_line_wrap": 65535, "po_no_location": true }, "filemask": "po/*.po", "git_export": "", "license": "", "license_url": "", "name": "Weblate", "slug": "weblate", "project": { "name": "Hello", "slug": "hello", "source_language": { "code": "en", "direction": "ltr", "population": 159034349015, "name": "English", "url": "http://example.com/api/languages/en/", "web_url": "http://example.com/languages/en/" }, "url": "http://example.com/api/projects/hello/", "web": "https://weblate.org/", "web_url": "http://example.com/projects/hello/" }, "source_language": { "code": "en", "direction": "ltr", "population": 159034349015, "name": "English", "url": "http://example.com/api/languages/en/", "web_url": "http://example.com/languages/en/" }, "repo": "file:///home/nijel/work/weblate-hello", "template": "", "new_base": "", "url": "http://example.com/api/components/hello/weblate/", "vcs": "git", "web_url": "http://example.com/projects/hello/weblate/" } ``` ### PATCH /api/components/(*string:* project)/(*string:* component)/ Edit a component by a [PATCH](https://www.rfc-editor.org/rfc/rfc5789#section-2) request. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **source_language** (*string*) – Project source language code (optional) * **Request JSON Object:** * **name** (*string*) – name of component * **slug** (*string*) – slug of component * **repo** (*string*) – VCS repository URL * **hide_glossary_matches** (*boolean*) – [Do not show glossary matches](https://docs.weblate.org/en/latest/admin/projects.md#component-hide-glossary-matches) * **contribute_project_tm** (*boolean*) – [Contribute to project translation memory](https://docs.weblate.org/en/latest/admin/projects.md#component-contribute-project-tm) Linking to another Weblate component using an [internal URL](https://docs.weblate.org/en/latest/vcs.md#internal-urls) requires permission to edit the referenced component. Changing [Restricted access](https://docs.weblate.org/en/latest/admin/projects.md#component-restricted) follows the same direct component-access restrictions as the web interface. **CURL example:** ```sh curl \ --data-binary '{"name": "new name"}' \ -H "Content-Type: application/json" \ -H "Authorization: Token TOKEN" \ PATCH http://example.com/api/projects/hello/components/ ``` **JSON request example:** ```http PATCH /api/projects/hello/components/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Token TOKEN Content-Length: 20 { "name": "new name" } ``` **JSON response example:** ```http HTTP/1.0 200 OK Date: Tue, 12 Apr 2016 09:32:50 GMT Server: WSGIServer/0.1 Python/2.7.11+ Vary: Accept, Accept-Language, Cookie X-Frame-Options: SAMEORIGIN Content-Type: application/json Content-Language: en Allow: GET, POST, HEAD, OPTIONS { "branch": "main", "file_format": "po", "file_format_params": { "po_line_wrap": 65535, "po_no_location": true }, "filemask": "po/*.po", "git_export": "", "license": "", "license_url": "", "name": "new name", "slug": "weblate", "project": { "name": "Hello", "slug": "hello", "source_language": { "code": "en", "direction": "ltr", "population": 159034349015, "name": "English", "url": "http://example.com/api/languages/en/", "web_url": "http://example.com/languages/en/" }, "url": "http://example.com/api/projects/hello/", "web": "https://weblate.org/", "web_url": "http://example.com/projects/hello/" }, "repo": "file:///home/nijel/work/weblate-hello", "template": "", "new_base": "", "url": "http://example.com/api/components/hello/weblate/", "vcs": "git", "web_url": "http://example.com/projects/hello/weblate/" } ``` ### PUT /api/components/(*string:* project)/(*string:* component)/ Edit a component by a [PUT](https://www.rfc-editor.org/rfc/rfc7231#section-4.3.4) request. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Request JSON Object:** * **branch** (*string*) – VCS repository branch * **file_format** (*string*) – file format of translations * **file_format_params** (*object*) – parameters related to the file * **filemask** (*string*) – mask of translation files in the repository * **name** (*string*) – name of component * **slug** (*string*) – slug of component * **repo** (*string*) – VCS repository URL * **template** (*string*) – base file for monolingual translations * **new_base** (*string*) – base file for adding new translations * **vcs** (*string*) – version control system * **vcs_params** (*object*) – [Version control parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs-params) * **hide_glossary_matches** (*boolean*) – [Do not show glossary matches](https://docs.weblate.org/en/latest/admin/projects.md#component-hide-glossary-matches) * **contribute_project_tm** (*boolean*) – [Contribute to project translation memory](https://docs.weblate.org/en/latest/admin/projects.md#component-contribute-project-tm) ### DELETE /api/components/(*string:* project)/(*string:* component)/ Deletes a component. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug ### GET /api/components/(*string:* project)/(*string:* component)/changes/ Returns a list of component changes. This is essentially a component scoped [`GET /api/changes/`](https://docs.weblate.org/en/latest/api.md#get--api-changes-) accepting same params. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Response JSON Object:** * **results** (*array*) – array of component objects; see [`GET /api/changes/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-changes-(int-id)-) ### GET /api/components/(*string:* project)/(*string:* component)/file/ #### Versionadded Added in version 4.9. Downloads all available translations associated with the component as an archive file using the requested format. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Query Parameters:** * **format** (*string*) – The archive format to use; If not specified, defaults to `zip`; Supported formats: `zip` and `zip:CONVERSION` where `CONVERSION` is one of converters listed at [Downloading translations](https://docs.weblate.org/en/latest/user/files.md#download). ### GET /api/components/(*string:* project)/(*string:* component)/screenshots/ Returns a list of component screenshots. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Response JSON Object:** * **results** (*array*) – array of component screenshots; see [`GET /api/screenshots/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-screenshots-(int-id)-) ### GET /api/components/(*string:* project)/(*string:* component)/lock/ Returns component lock status. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Response JSON Object:** * **locked** (*boolean*) – whether component is locked for updates **Example JSON data:** ```json { "locked": false } ``` ### POST /api/components/(*string:* project)/(*string:* component)/lock/ Sets component lock status. Response is same as [`GET /api/components/(string:project)/(string:component)/lock/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-lock-). * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Request JSON Object:** * **lock** – Boolean whether to lock or not. **CURL example:** ```sh curl \ -d lock=true \ -H "Authorization: Token TOKEN" \ http://example.com/api/components/hello/weblate/repository/ ``` **JSON request example:** ```http POST /api/components/hello/weblate/repository/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Token TOKEN Content-Length: 20 {"lock": true} ``` **JSON response example:** ```http HTTP/1.0 200 OK Date: Tue, 12 Apr 2016 09:32:50 GMT Server: WSGIServer/0.1 Python/2.7.11+ Vary: Accept, Accept-Language, Cookie X-Frame-Options: SAMEORIGIN Content-Type: application/json Content-Language: en Allow: GET, POST, HEAD, OPTIONS {"locked":true} ``` ### GET /api/components/(*string:* project)/(*string:* component)/repository/ Returns information about the VCS repository status. The response is same as for [`GET /api/projects/(string:project)/repository/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-repository-). Repository status requires component-wide permission on the component that owns the repository, including when accessing it through a linked component in another project. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Response JSON Object:** * **needs_commit** (*boolean*) – whether there are any pending changes to commit * **needs_merge** (*boolean*) – whether there are any upstream changes to merge * **needs_push** (*boolean*) – whether there are any local changes to push * **remote_commit** (*string*) – Remote commit information * **status** (*string*) – VCS repository status as reported by VCS * **merge_failure** – Text describing merge failure or null if there is none ### POST /api/components/(*string:* project)/(*string:* component)/repository/ Performs the given operation on a VCS repository. See [`POST /api/projects/(string:project)/repository/`](https://docs.weblate.org/en/latest/api.md#post--api-projects-(string-project)-repository-) for documentation. Repository operations require component-wide permission on the component that owns the repository, including when accessing it through a linked component in another project. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Request JSON Object:** * **operation** (*string*) – Operation to perform: one of `push`, `pull`, `commit`, `reset`, `cleanup` * **Response JSON Object:** * **result** (*boolean*) – result of the operation **CURL example:** ```sh curl \ -d operation=pull \ -H "Authorization: Token TOKEN" \ http://example.com/api/components/hello/weblate/repository/ ``` **JSON request example:** ```http POST /api/components/hello/weblate/repository/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Token TOKEN Content-Length: 20 {"operation":"pull"} ``` **JSON response example:** ```http HTTP/1.0 200 OK Date: Tue, 12 Apr 2016 09:32:50 GMT Server: WSGIServer/0.1 Python/2.7.11+ Vary: Accept, Accept-Language, Cookie X-Frame-Options: SAMEORIGIN Content-Type: application/json Content-Language: en Allow: GET, POST, HEAD, OPTIONS {"result":true} ``` ### GET /api/components/(*string:* project)/(*string:* component)/monolingual_base/ Downloads base file for monolingual translations. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug ### GET /api/components/(*string:* project)/(*string:* component)/new_template/ Downloads template file for new translations. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug ### GET /api/components/(*string:* project)/(*string:* component)/translations/ Returns a list of translation objects in the given component. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Response JSON Object:** * **results** (*array*) – array of translation objects; see [`GET /api/translations/(string:project)/(string:component)/(string:language)/`](https://docs.weblate.org/en/latest/api.md#get--api-translations-(string-project)-(string-component)-(string-language)-) ### POST /api/components/(*string:* project)/(*string:* component)/translations/ Creates new translation in the given component. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Request JSON Object:** * **language_code** (*string*) – translation language code; see [`GET /api/languages/(string:language)/`](https://docs.weblate.org/en/latest/api.md#get--api-languages-(string-language)-) * **from_component** (*array*) – optional ordered list of source component references used for automatic translation. Accepts numeric component IDs or full Weblate component paths. For form submissions this field can be provided multiple times. * **Response JSON Object:** * **result** (*object*) – new translation object created **CURL example:** ```sh curl \ -d language_code=cs \ -H "Authorization: Token TOKEN" \ http://example.com/api/projects/hello/components/ ``` **JSON request example:** ```http POST /api/projects/hello/components/ HTTP/1.1 Host: example.com Accept: application/json Content-Type: application/json Authorization: Token TOKEN Content-Length: 20 { "language_code": "cs", "from_component": ["hello/weblate", 123] } ``` **JSON response example:** ```http HTTP/1.0 200 OK Date: Tue, 12 Apr 2016 09:32:50 GMT Server: WSGIServer/0.1 Python/2.7.11+ Vary: Accept, Accept-Language, Cookie X-Frame-Options: SAMEORIGIN Content-Type: application/json Content-Language: en Allow: GET, POST, HEAD, OPTIONS { "failing_checks": 0, "failing_checks_percent": 0, "failing_checks_words": 0, "filename": "po/cs.po", "fuzzy": 0, "fuzzy_percent": 0.0, "fuzzy_words": 0, "have_comment": 0, "have_suggestion": 0, "is_template": false, "is_source": false, "language": { "code": "cs", "direction": "ltr", "population": 1303174280 "name": "Czech", "url": "http://example.com/api/languages/cs/", "web_url": "http://example.com/languages/cs/" }, "language_code": "cs", "id": 125, "last_author": null, "last_change": null, "share_url": "http://example.com/engage/hello/cs/", "total": 4, "total_words": 15, "translate_url": "http://example.com/translate/hello/weblate/cs/", "translated": 0, "translated_percent": 0.0, "translated_words": 0, "url": "http://example.com/api/translations/hello/weblate/cs/", "web_url": "http://example.com/projects/hello/weblate/cs/" } ``` ### GET /api/components/(*string:* project)/(*string:* component)/statistics/ Returns paginated statistics for all translations within component. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug #### SEE ALSO Returned attributes are described in [Statistics](https://docs.weblate.org/en/latest/api.md#api-statistics). ### GET /api/components/(*string:* project)/(*string:* component)/links/ Returns projects linked with a component. Component managers see every linked project. Other callers see only linked projects they can access. #### Versionadded Added in version 4.5. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Response JSON Object:** * **projects** (*array*) – associated projects; see [`GET /api/projects/(string:project)/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-) ### POST /api/components/(*string:* project)/(*string:* component)/links/ Associate project with a component. This requires permission to edit the component and the target project. #### Versionadded Added in version 4.5. #### Versionchanged Changed in version 5.17. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **Form Parameters:** * **string project_slug** – Project slug * **int category_id** – Category ID in the target project (optional). The category must belong to the specified project. ### DELETE /api/components/(*string:* project)/(*string:* component)/links/(*string:* project_slug)/ Remove association of a project with a component. #### Versionadded Added in version 4.5. * **Parameters:** * **project** (*string*) – Project URL slug * **component** (*string*) – Component URL slug * **project_slug** (*string*) – Slug of the project to remove ### GET /api/components/(*string:* project)/(*string:* component)/reports/ Lists accessible reports generated directly for a component. ### POST /api/components/(*string:* project)/(*string:* component)/reports/ Schedules a report using the component as its scope. The request and response match [`POST /api/reports/`](https://docs.weblate.org/en/latest/api.md#post--api-reports-); scope fields must be omitted. ### GET /api/components/(*string:* project)/(*string:* component)/announcements/ #### Versionadded Added in version 5.17: Returns announcements for a component. * **param project:** Project URL slug * **type project:** string * **param component:** Component URL slug * **type component:** string * **>json int id:** ID of the announcement * **>json string message:** announcement text * **>json string severity:** color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green) * **>json date expiry:** hide after this date, ISO 8601 extended format date (optional) * **>json bool notify:** send notification to subscribed users? (optional) ### POST /api/components/(*string:* project)/(*string:* component)/announcements/ #### Versionadded Added in version 5.17: Creates an announcement for a component. * **param project:** Project URL slug * **type project:** string * **param component:** Component URL slug * **type component:** string * **json int id:** ID of the announcement * **>json string message:** announcement text * **>json string severity:** color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green) * **>json date expiry:** hide after this date, ISO 8601 extended format date (optional) * **>json bool notify:** send notification to subscribed users? (optional) ### POST /api/translations/(*string:* project)/(*string:* component)/(*string:* language)/announcements/ #### Versionadded Added in version 5.17: Creates an announcement for a translation. * **param project:** Project URL slug * **type project:** string * **param component:** Component URL slug * **type component:** string * **param language:** Translation language code * **type language:** string * ** ## Add-ons #### Versionadded Added in version 4.4.1. ### GET /api/addons/ Returns a list of add-ons the caller can manage. Site-wide add-on managers can access site-wide add-ons without gaining access to project or component add-on configuration. #### SEE ALSO Add-on object attributes are documented at [`GET /api/addons/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-addons-(int-id)-). ### GET /api/addons/(*int:* id)/ Returns information about add-on information. * **Parameters:** * **id** (*int*) – Add-on ID * **Response JSON Object:** * **name** (*string*) – name of an add-on * **component** (*string*) – URL of a related component object * **configuration** (*object*) – Optional add-on configuration #### SEE ALSO [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md) ### POST /api/components/(*string:* project)/(*string:* component)/addons/ Creates a new add-on. The xgettext and Meson extraction add-ons accept `data_dirs` in `configuration` as an ordered list of repository-relative ITS data directories, for example `{"data_dirs": ["po"]}`. Each directory must contain an `its/` subdirectory. See [Update POT file (xgettext)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-xgettext) for supported formats and validation. * **Parameters:** * **project_slug** (*string*) – Project slug * **component_slug** (*string*) – Component slug * **Request JSON Object:** * **name** (*string*) – name of an add-on * **configuration** (*object*) – Optional add-on configuration ### PATCH /api/addons/(*int:* id)/ Edit partial information about add-on. * **Parameters:** * **id** (*int*) – Add-on ID * **Response JSON Object:** * **configuration** (*object*) – Optional add-on configuration ### PUT /api/addons/(*int:* id)/ Edit full information about add-on. * **Parameters:** * **id** (*int*) – Add-on ID * **Response JSON Object:** * **configuration** (*object*) – Optional add-on configuration ### DELETE /api/addons/(*int:* id)/ Delete add-on. * **Parameters:** * **id** (*int*) – Add-on ID ### POST /api/addons/(*int:* id)/trigger/ Trigger a manual run of an add-on that supports manual triggering. #### Versionadded Added in version 5.17.1. * **Parameters:** * **id** (*int*) – Add-on ID ## Component lists #### Versionadded Added in version 4.0. ### GET /api/component-lists/ Returns a list of component lists. #### SEE ALSO Component list object attributes are documented at [`GET /api/component-lists/(str:slug)/`](https://docs.weblate.org/en/latest/api.md#get--api-component-lists-(str-slug)-). ### GET /api/component-lists/(*str:* slug)/ Returns information about component list. * **Parameters:** * **slug** (*string*) – Component list slug * **Response JSON Object:** * **name** (*string*) – name of a component list * **slug** (*string*) – slug of a component list * **show_dashboard** (*boolean*) – whether to show it on a dashboard * **components** (*array*) – link to associated components; see [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-) * **auto_assign** (*array*) – automatic assignment rules ### PUT /api/component-lists/(*str:* slug)/ Changes the component list parameters. * **Parameters:** * **slug** (*string*) – Component list slug * **Request JSON Object:** * **name** (*string*) – name of a component list * **slug** (*string*) – slug of a component list * **show_dashboard** (*boolean*) – whether to show it on a dashboard ### PATCH /api/component-lists/(*str:* slug)/ Changes the component list parameters. * **Parameters:** * **slug** (*string*) – Component list slug * **Request JSON Object:** * **name** (*string*) – name of a component list * **slug** (*string*) – slug of a component list * **show_dashboard** (*boolean*) – whether to show it on a dashboard ### DELETE /api/component-lists/(*str:* slug)/ Deletes the component list. * **Parameters:** * **slug** (*string*) – Component list slug ### GET /api/component-lists/(*str:* slug)/components/ #### Versionadded Added in version 5.0.1: List components in a component list. * **param slug:** Component list slug * **type slug:** string * **form string component_id:** Component ID * **>json array results:** array of component objects; see [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-) ### POST /api/component-lists/(*str:* slug)/components/ Associate component with a component list. * **Parameters:** * **slug** (*string*) – Component list slug * **Form Parameters:** * **string component_id** – Component ID ### DELETE /api/component-lists/(*str:* slug)/components/(*str:* component_slug) Disassociate a component from the component list. * **Parameters:** * **slug** (*string*) – Component list slug * **component_slug** (*string*) – Component slug ## Glossary #### Versionchanged Changed in version 4.5: Glossaries are now stored as regular components, translations and strings, please use respective API instead. ## Reports ### GET /api/reports/ Lists stored reports accessible to the authenticated user. The optional `kind`, `workspace`, `project`, `category`, and `component` query parameters filter the result. The Manage reports permission is authoritative for the selected scope and includes reports containing data from private projects and restricted components below that scope. ### POST /api/reports/ Schedules report generation and returns `202 Accepted` with a `task_url`. The task result links to the created report. The `kind` is one of `credits`, `contributor_stats`, `cost_estimate`, or `translator_work`. Specify at most one of `workspace`, `project`, `category`, or `component`; omitting all of them creates a global report. Contribution reports require `start` and `end` ISO 8601 timestamps. A workspace can be selected when the user has Manage reports for it, even without access to the regular workspace page. ### GET /api/reports/(*int:* id)/ Returns report metadata, generation parameters, stored JSON `data`, and links to the JSON, HTML, and reStructuredText renderings. ### GET /api/reports/(*int:* id)/json/ Downloads only the stored report data without metadata. ### GET /api/reports/(*int:* id)/html/ Downloads an HTML rendering of the stored report. ### GET /api/reports/(*int:* id)/rst/ Downloads a reStructuredText rendering of the stored report. ## Tasks #### Versionadded Added in version 4.4. ### GET /api/tasks/ Listing of the tasks is currently not available. ### GET /api/tasks/(*str:* uuid)/ Returns information about a task. Authentication is required. * **Parameters:** * **uuid** (*string*) – Task UUID * **Response JSON Object:** * **completed** (*boolean*) – Whether the task has completed * **progress** (*int*) – Task progress in percent * **result** (*object*) – Task result or progress details * **log** (*string*) – Task log * **cancellable** (*boolean*) – Whether the task can be cancelled ### DELETE /api/tasks/(*str:* uuid)/ Cancels a running task when its `cancellable` property is `true`. Repository operation tasks cannot be cancelled because interruption can leave a repository operation incomplete. ## Statistics ### GET /api/(*str:* object)/statistics/ There are several statistics endpoints for objects and all of them contain same structure. * **Parameters:** * **object** (*string*) – URL path * **Response JSON Object:** * **total** (*int*) – total number of strings * **total_words** (*int*) – total number of words * **total_chars** (*int*) – total number of characters * **last_change** (*timestamp*) – date of last change * **translated** (*int*) – number of translated strings * **translated_percent** (*float*) – percentage of translated strings * **translated_words** (*int*) – number of translated words * **translated_words_percent** (*float*) – percentage of translated words * **translated_chars** (*int*) – number of translated characters * **translated_chars_percent** (*float*) – percentage of translated characters * **fuzzy** (*int*) – number of fuzzy (marked for edit) strings * **fuzzy_words** (*int*) – number of fuzzy (marked for edit) words * **fuzzy_chars** (*int*) – number of fuzzy (marked for edit) characters * **fuzzy_percent** (*float*) – percentage of fuzzy (marked for edit) strings * **fuzzy_words_percent** (*float*) – percentage of fuzzy (marked for edit) words * **fuzzy_chars_percent** (*float*) – percentage of fuzzy (marked for edit) characters * **failing** (*int*) – number of failing checks * **failing_percent** (*float*) – percentage of failing checks * **approved** (*int*) – number of approved strings * **approved_words** (*int*) – number of approved words * **approved_chars** (*int*) – number of approved characters * **approved_percent** (*float*) – percentage of approved strings * **approved_words_percent** (*float*) – percentage of approved words * **approved_chars_percent** (*float*) – percentage of approved characters * **readonly** (*int*) – number of read-only strings * **readonly_words** (*int*) – number of read-only words * **readonly** – number of read-only characters * **readonly_percent** (*float*) – percentage of read-only strings * **readonly_words_percent** (*float*) – percentage of read-only words * **readonly_char_percent** (*float*) – percentage of read-only characters * **suggestions** (*int*) – number of strings with suggestions * **comments** (*int*) – number of strings with comments * **name** (*string*) – object name * **url** (*string*) – URL to access the object (if applicable) * **url_translate** (*string*) – URL to access the translation (if applicable) * **code** (*string*) – language code (if applicable) #### SEE ALSO * [`GET /api/languages/(string:language)/statistics/`](https://docs.weblate.org/en/latest/api.md#get--api-languages-(string-language)-statistics-) * [`GET /api/projects/(string:project)/statistics/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-statistics-) * [`GET /api/categories/(int:id)/statistics/`](https://docs.weblate.org/en/latest/api.md#get--api-categories-(int-id)-statistics-) * [`GET /api/components/(string:project)/(string:component)/statistics/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-statistics-) * [`GET /api/translations/(string:project)/(string:component)/(string:language)/statistics/`](https://docs.weblate.org/en/latest/api.md#get--api-translations-(string-project)-(string-component)-(string-language)-statistics-) ## Metrics ### GET /api/metrics/ Returns server metrics. #### Versionchanged Changed in version 5.6.1: Metrics can now be exposed in OpenMetrics compatible format with `?format=openmetrics`. #### Versionchanged Changed in version 2026.8: OpenMetrics responses now include `HELP` and `TYPE` metadata and use the versioned OpenMetrics content type. * **Response JSON Object:** * **units** (*int*) – Number of units * **units_translated** (*int*) – Number of translated units * **users** (*int*) – Number of users * **changes** (*int*) – Number of changes * **projects** (*int*) – Number of projects * **components** (*int*) – Number of components * **translations** (*int*) – Number of translations * **languages** (*int*) – Number of used languages * **checks** (*int*) – Number of triggered quality checks * **configuration_errors** (*int*) – Number of configuration errors * **suggestions** (*int*) – Number of pending suggestions * **celery_queues** (*object*) – Lengths of Celery queues, see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) * **name** (*string*) – Configured server name * **version** (*string*) – Running Weblate version, included when [`VERSION_DISPLAY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VERSION_DISPLAY) is `show` or `soft` In OpenMetrics format, the version is exposed as `weblate_info{version="..."} 1` when [`VERSION_DISPLAY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VERSION_DISPLAY) is `show` or `soft`. All metrics are exposed as gauges. Project metrics expose translation statistics for each visible component and language at [`GET /api/projects/(string:project)/metrics/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-metrics-). They include translated, total, fuzzy, failing-check, and approved string, word, and character counts; suggestions; comments; and translated and approved percentages. ## Search ### GET /api/search/ #### Versionadded Added in version 4.18. Returns site-wide search results as a list. There is no pagination on the result set, only first few matches are returned for each category. The search looks for: - Projects - Categories - Components - Languages - Users * **Parameters:** * **q** – Search query string * **Response JSON Object:** * **name** (*str*) – Name of the matched item. * **url** (*str*) – Web URL of the matched item. * **category** (*str*) – Category of the matched item. ## Categories ### GET /api/categories/ #### Versionadded Added in version 5.0. Lists available categories. See [`GET /api/categories/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-categories-(int-id)-) for field definitions. ### POST /api/categories/ #### Versionadded Added in version 5.0. Creates a new category. See [`GET /api/categories/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-categories-(int-id)-) for field definitions. ### GET /api/categories/(*int:* id)/ #### Versionadded Added in version 5.0. * **Parameters:** * **id** (*int*) – Category ID * **Response JSON Object:** * **name** (*str*) – Name of category. * **slug** (*str*) – Slug of category. * **project** (*str*) – Link to a project. * **category** (*str*) – Link to a parent category. * **announcements_url** (*string*) – URL to announcements; see [`GET /api/categories/(int:id)/announcements/`](https://docs.weblate.org/en/latest/api.md#get--api-categories-(int-id)-announcements-) * **reports_url** (*string*) – URL to list or generate scoped reports; see [`GET /api/categories/(int:id)/reports/`](https://docs.weblate.org/en/latest/api.md#get--api-categories-(int-id)-reports-) ### PATCH /api/categories/(*int:* id)/ #### Versionadded Added in version 5.0: Edit partial information about category. * **param id:** Category ID * **type id:** int * **>json object configuration:** Optional category configuration ### PUT /api/categories/(*int:* id)/ #### Versionadded Added in version 5.0: Edit full information about category. * **param id:** Category ID * **type id:** int * **>json object configuration:** Optional category configuration ### DELETE /api/categories/(*int:* id)/ #### Versionadded Added in version 5.0: Delete category. * **param id:** Category ID * **type id:** int ### GET /api/categories/(*int:* id)/statistics/ #### Versionadded Added in version 5.5. Returns statistics for a category. * **Parameters:** * **id** (*int*) – Category ID #### SEE ALSO Returned attributes are described in [Statistics](https://docs.weblate.org/en/latest/api.md#api-statistics). ### GET /api/categories/(*int:* id)/reports/ Lists accessible reports generated directly for a category. ### POST /api/categories/(*int:* id)/reports/ Schedules a report using the category as its scope. The request and response match [`POST /api/reports/`](https://docs.weblate.org/en/latest/api.md#post--api-reports-); scope fields must be omitted. ### GET /api/categories/(*int:* id)/announcements/ #### Versionadded Added in version 5.17.1: Returns announcements for a category. * **param id:** Category ID * **type id:** int * **>json int id:** ID of the announcement * **>json string message:** announcement text * **>json string severity:** color of the message, one of `info` (light blue), `warning` (yellow), `danger` (red), `success` (green) * **>json date expiry:** hide after this date, ISO 8601 extended format date (optional) * **>json bool notify:** send notification to subscribed users? (optional) ### POST /api/categories/(*int:* id)/announcements/ #### Versionadded Added in version 5.17.1: Creates an announcement for a category. * **param id:** Category ID * **type id:** int * ** ## Notification hooks Notification hooks allow external applications to notify Weblate that the VCS repository has been updated. Weblate matches the delivery to components by repository URL; see [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching). The generic hook endpoints return diagnostics intended to help configure repository notifications. The `match_status` object contains: `repository_matches` : Number of components whose repository URL matches the payload. `branch_matches` : Number of repository matches whose configured branch matches the payload. For events without a branch, every repository match is counted as a branch match. `enabled_hook_matches` : Number of branch matches whose project has hooks enabled. A successful update response names the updated project/component slugs in `message` and returns their absolute API URLs in `updated_components`. These diagnostics include private projects and restricted components because matching does not apply user access control. Components managed through an authenticated integration are excluded from generic matching and diagnostics; currently this applies to the GitHub (via Weblate GitHub app) VCS backend. When an update event completes target matching but schedules no update, the response uses HTTP status code 202 and retains `match_status` so the repository, branch, and project hook settings can be diagnosed. Ping and ignored events return HTTP status code 201 without matching diagnostics. These responses can confirm that a supplied repository URL is registered, but do not grant access to the linked API objects or expose repository content, translations, or credentials. See [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching) for the security and compatibility implications. You can use repository endpoints for projects, components and translations to update individual repositories; see [`POST /api/projects/(string:project)/repository/`](https://docs.weblate.org/en/latest/api.md#post--api-projects-(string-project)-repository-) for documentation. ### GET /hooks/update/(*string:* project)/(*string:* component)/ #### Deprecated Deprecated since version 2.6: Please use [`POST /api/components/(string:project)/(string:component)/repository/`](https://docs.weblate.org/en/latest/api.md#post--api-components-(string-project)-(string-component)-repository-) instead which works properly with authentication for ACL limited projects. #### Versionremoved Removed in version 5.14. ### GET /hooks/update/(*string:* project)/ #### Deprecated Deprecated since version 2.6: Please use [`POST /api/projects/(string:project)/repository/`](https://docs.weblate.org/en/latest/api.md#post--api-projects-(string-project)-repository-) instead which works properly with authentication for ACL limited projects. #### Versionremoved Removed in version 5.14. ### POST /hooks/github/ Special hook for handling GitHub notifications and automatically updating matching components. #### NOTE GitHub includes direct support for notifying Weblate: enable Weblate service hook in repository settings and set the URL to the URL of your Weblate installation. #### SEE ALSO [GitHub notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-notifications) : For instruction on setting up GitHub integration [https://docs.github.com/en/get-started/customizing-your-github-workflow/exploring-integrations/about-webhooks](https://docs.github.com/en/get-started/customizing-your-github-workflow/exploring-integrations/about-webhooks) : Generic information about GitHub Webhooks [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS) : For enabling hooks for whole Weblate ### POST /hooks/gitlab/ Special hook for handling GitLab notifications and automatically updating matching components. #### SEE ALSO [GitLab notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-notifications) : For instruction on setting up GitLab integration [https://docs.gitlab.com/user/project/integrations/webhooks/](https://docs.gitlab.com/user/project/integrations/webhooks/) : Generic information about GitLab Webhooks [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS) : For enabling hooks for whole Weblate ### POST /hooks/bitbucket/ Special hook for handling Bitbucket notifications and automatically updating matching components. #### SEE ALSO [Bitbucket notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-notifications) : For instruction on setting up Bitbucket integration [https://support.atlassian.com/bitbucket-cloud/docs/manage-webhooks/](https://support.atlassian.com/bitbucket-cloud/docs/manage-webhooks/) : Generic information about Bitbucket Webhooks [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS) : For enabling hooks for whole Weblate ### POST /hooks/pagure/ Special hook for handling Pagure notifications and automatically updating matching components. #### SEE ALSO [Pagure notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-notifications) : For instruction on setting up Pagure integration [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS) : For enabling hooks for whole Weblate ### POST /hooks/azure/ Special hook for handling Azure DevOps notifications and automatically updating matching components. #### NOTE Please ensure that Resource details to send is set to *All*, otherwise Weblate will not be able to match your Azure repository. #### SEE ALSO [Azure Repos notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-repos-notifications) : For instruction on setting up Azure integration [https://learn.microsoft.com/en-us/azure/devops/service-hooks/services/webhooks?view=azure-devops](https://learn.microsoft.com/en-us/azure/devops/service-hooks/services/webhooks?view=azure-devops) : Generic information about Azure DevOps Web Hooks [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS) : For enabling hooks for whole Weblate ### POST /hooks/gitea/ Special hook for handling Gitea Webhook notifications and automatically updating matching components. #### SEE ALSO [Gitea notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-notifications) : For instruction on setting up Gitea integration [https://docs.gitea.com/usage/repository/webhooks](https://docs.gitea.com/usage/repository/webhooks) : Generic information about Gitea Webhooks [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS) : For enabling hooks for whole Weblate ### POST /hooks/forgejo/ Special hook for handling Forgejo Webhook notifications and automatically updating matching components. #### SEE ALSO [Forgejo notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-forgejo-notifications) : For instruction on setting up Forgejo integration [https://forgejo.org/docs/latest/user/webhooks/](https://forgejo.org/docs/latest/user/webhooks/) : Generic information about Forgejo Webhooks [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS) : For enabling hooks for whole Weblate ### POST /hooks/gitee/ Special hook for handling Gitee Webhook notifications and automatically updating matching components. #### SEE ALSO [Gitee notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitee-notifications) : For instruction on setting up Gitee integration [https://help.gitee.com/webhook](https://help.gitee.com/webhook) : Generic information about Gitee Webhooks [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS) : For enabling hooks for whole Weblate ## RSS feeds Changes in translations are exported in RSS feeds. The feeds contain only changes in projects and components the requesting user can access. Filtered RSS feeds are available from the changes browser. These accept the same filters as the changes page, for example `action`, `user`, `exclude_user`, and `period`. ### GET /changes/rss/ Retrieves RSS feed with recent changes matching changes browsing filters. ### GET /changes/rss/(*string:* project)/(*string:* component)/(*string:* language)/ Retrieves RSS feed with recent changes matching changes browsing filters in a translation. ### GET /changes/rss/(*string:* project)/(*string:* component)/ Retrieves RSS feed with recent changes matching changes browsing filters in a component. ### GET /changes/rss/(*string:* project)/-/(*string:* language)/ Retrieves RSS feed with recent changes matching changes browsing filters in a project language. ### GET /changes/rss/-/-/(*string:* language)/ Retrieves RSS feed with recent changes matching changes browsing filters in a language. ### GET /exports/rss/(*string:* project)/(*string:* component)/(*string:* language)/ Retrieves RSS feed with recent changes for a translation. ### GET /exports/rss/(*string:* project)/(*string:* component)/ Retrieves RSS feed with recent changes for a component. ### GET /exports/rss/(*string:* project)/ Retrieves RSS feed with recent changes for a project. ### GET /exports/rss/language/(*string:* language)/ Retrieves RSS feed with recent changes for a language. ### GET /exports/rss/ Retrieves RSS feed with recent changes for Weblate instance. #### SEE ALSO [RSS on Wikipedia](https://en.wikipedia.org/wiki/RSS) # changes.md # Weblate 2026.10 *Not yet released.* ### New features * Added support for [component-mounted add-on APIs](https://docs.weblate.org/en/latest/contributing/addons.md#component-addon-api). * The [Statistics generator](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-generate-generate) can generate component-wide locale lists with native language names, text direction, and translation statistics. * Added [SPDX contributor comments](https://docs.weblate.org/en/latest/formats/gettext.md#gettext-contributor-comments) as a PO file format parameter, replacing the contributor comments add-on. * Added an inherited [language creation policy](https://docs.weblate.org/en/latest/workflows.md#workflow-language-restrictions) allowing existing project target languages while requesting maintainer approval for new languages. * Added configurable per-user and IP/network [API rate limits and exemptions](https://docs.weblate.org/en/latest/api.md#api-rate), including Docker configuration. ### Improvements * Improved checks, automatic fixes, glossary matching, and machine translation for [independent alternatives in multivalue formats](https://docs.weblate.org/en/latest/formats.md#format-multivalue). * Added a thumbnail picker to associate existing [screenshots](https://docs.weblate.org/en/latest/user/translating.md#add-existing-screenshot) with a string from the translation editor. * [Repository maintenance](https://docs.weblate.org/en/latest/admin/continuous.md#repository-maintenance) now checks permissions on the repository-owning component and explains where missing permissions are required. * [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation) using other components now prefers translations with matching source text and context. * Aligned [string search filters](https://docs.weblate.org/en/latest/user/search.md#search-strings) with the status overview’s order and colors, and added an All strings option to clear the query. * Added monthly instance activity to the [data sent with support integration](https://docs.weblate.org/en/latest/admin/support.md#support-data) for activity monitoring and discovery ranking. * Improved [repository maintenance](https://docs.weblate.org/en/latest/admin/continuous.md#repository-maintenance) with disabled push controls when push configuration is missing and direct links to component VCS settings. * The [automatic translation add-on](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) can create approved strings, falling back to translated strings when reviews are disabled for the target language. * Added independent term alternatives and scoped metadata to [TBX glossaries](https://docs.weblate.org/en/latest/formats/tbx.md#tbx), including metadata-preserving TBX exports. * Whitespace characters are now rendered consistently in the source string display and the translation editor, and different kinds of whitespace are now distinguishable from each other. * History View details and Revert actions are larger, more widely spaced, and show a hover and focus background. * Added a [keyboard shortcut](https://docs.weblate.org/en/latest/user/translating.md#keyboard) to approve a translation and save and continue. * Clarified [translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) explanations and effective per-language review settings, with links to workflow configuration. * Reworked the [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) tab to use the same layout as suggestions, and it now shows the [translation memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) context of each match. * The [xgettext](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-xgettext) and [Meson](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-meson) extraction add-ons now bundle common XML translation rules and support project-local ITS directories for extracting mixed source formats into a shared POT. ### Security fixes * Limited the number and aggregate size of alternatives accepted by the translation editor. * Prevented component ZIP imports from overwriting version control metadata on case-insensitive filesystems. * Prevented notification subscriptions from exposing inaccessible project and component settings through the REST API. ### Bug fixes * Improved [SSH repository connections](https://docs.weblate.org/en/latest/vcs.md#ssh-repos) for hosts with unreachable addresses by staggering IPv4 and IPv6 connection attempts and reporting failed addresses and the destination port. * Fixed [status widgets](https://docs.weblate.org/en/latest/devel/share.md#promotion) for categories, category-language pages, and workspaces. * Fixed double-counted statistics in nested [categories](https://docs.weblate.org/en/latest/admin/projects.md#category) and stale statistics after deleting [String labels](https://docs.weblate.org/en/latest/devel/translations.md#labels). * Fixed MIME nesting of inline branding images in [notification e-mails](https://docs.weblate.org/en/latest/user/profile.md#notifications) and reduced their size without changing image quality. * Fixed false positives from the [consecutive duplicated words check](https://docs.weblate.org/en/latest/user/checks.md#check-duplicate) in South Asian languages with grammatical word repetition. * Fixed [Docker startup warning checks](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-startup-warnings) failing when the warning directory is missing or inaccessible. * Fixed an [upgrade](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) failure when migrating dismissed component alerts from releases before 2026.8. ### Compatibility * API throttles now read [`API_RATELIMIT_ANON`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_ANON) and [`API_RATELIMIT_USER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_USER) directly; `REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"]` is no longer used by Weblate’s throttle classes. * [API authentication](https://docs.weblate.org/en/latest/api.md#api-generic) now rejects unsupported authentication schemes, such as Basic, with HTTP 401, including when a valid browser session is present. * Notification subscription API responses now expose `project` and `component` as nullable URL strings instead of nested objects. ### Upgrading * Existing [contributor comments add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-authors) are migrated to component file format parameters. Remove the obsolete add-on from custom [`WEBLATE_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_ADDONS) and [`DEFAULT_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_ADDONS) settings; inherited add-on behavior no longer applies to new components. * There is a change in [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS); `weblate.api` should be added. * In non-Docker settings, remove the `anon_throttle` and `user_throttle` arguments from `get_drf_settings` and assign those rates to [`API_RATELIMIT_ANON`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_ANON) and [`API_RATELIMIT_USER`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_USER). Migrate any custom `REST_FRAMEWORK["DEFAULT_THROTTLE_RATES"]["anon"]` or `["user"]` values to these settings as well. Existing Docker rate-limit environment variables continue to work. Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/172?closed=1). # Weblate 2026.9.1 *Released on September 8th 2026.* ### New features * Added per-user [notification diagnostics](https://docs.weblate.org/en/latest/user/profile.md#notifications) for users and administrators, with compact explanations of matching subscriptions for object paths. ### Improvements * Added explicit [search result refresh](https://docs.weblate.org/en/latest/user/search.md#search-results-cache) in the translation editors and improved recovery when saved search results expire. * [Docker development tests](https://docs.weblate.org/en/latest/contributing/start.md#dev-docker) now automatically prepare an isolated test environment without requiring application startup or the Dev Container CLI. * Added a [development container](https://docs.weblate.org/en/latest/contributing/start.md#devcontainer) for tests and lint, with an optional [application QA profile](https://docs.weblate.org/en/latest/contributing/start.md#dev-docker), isolated storage per Git worktree, dynamically allocated localhost application and mailbox ports, and Chromium diagnostics and mandatory browser test commands. * Improved [translation statistics](https://docs.weblate.org/en/latest/devel/reporting.md#stats) calculation performance and avoided redundant parent updates when loading check and label details. * Added posting and displaying scoped [announcements](https://docs.weblate.org/en/latest/admin/announcements.md) on category-language pages. * Added a dismissible diagnostic for [glossaries](https://docs.weblate.org/en/latest/user/glossary.md#glossary-terminology) with disabled string management when they use a local repository or contain terminology. * Clarified [incident reporting](https://docs.weblate.org/en/latest/security/incident-reporting.md), reporting deadlines, and security notifications for hosted and self-hosted users. * The Manage reports permission now consistently grants access to complete [translation reports](https://docs.weblate.org/en/latest/devel/reporting.md) for the selected scope, including private projects and restricted components below it. * Docker deployments now use a combined [Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) worker by default, reducing memory usage while increasing task throughput. Use [`CELERY_WORKER_MODE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-CELERY_WORKER_MODE) to select the combined, split, or single worker setup. * Improved [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing) detail page loading performance by batching related project, invoice, and audit log queries. * Further reduced [Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) worker memory usage by sharing preloaded URL configuration between worker processes and loading bitmap widget rendering dependencies only when needed. * Docker startup configuration warnings are now available as [deployment checks](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-startup-warnings), including in horizontally scaled deployments. * Reduced peak memory use and task duration for [notification digests](https://docs.weblate.org/en/latest/user/profile.md#notifications) by processing recipients in bounded batches and limiting each summary to 100 entries. ### Security fixes * Prevented repeated [authenticator app registration](https://docs.weblate.org/en/latest/admin/auth.md#fa) from creating duplicate devices and allowing reuse of one-time codes. Existing equivalent duplicate devices are merged while preserving consumed codes. * Borg backup passphrases are now recursively scrubbed from Sentry error reports, including when a custom event scrubber is configured. * Font overrides are now restricted to fonts uploaded to the same project. * Engage pages and status widgets no longer disclose Private or Custom projects unless [Public sharing](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing) is enabled. * Prevented excessive CPU consumption while checking malformed Markdown and MDX syntax. ### Bug fixes * Fixed the approved-only [commit policy](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) blocking commits for languages with reviews disabled by workflow settings. * Fixed the [uWSGI configuration example](https://docs.weblate.org/en/latest/admin/install.md#uwsgi) to use the virtual environment’s Python when launching helpers for SSH repository operations. * Fixed language context and links in change history for scoped [announcements](https://docs.weblate.org/en/latest/admin/announcements.md) and other language-specific events. * Restored [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) API v1 translation support while retaining modern API language discovery and glossary improvements. * REST API unit updates now enforce the same translation text length limit as the web editor. * HTML void elements in [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) translations are now kept self-closing after sanitization, preventing invalid MDX output. * The [`autotranslate API endpoint`](https://docs.weblate.org/en/latest/api.md#post--api-translations-(string-project)-(string-component)-(string-language)-autotranslate-) now correctly describes its accepted request body fields (`q`, `mode`, `auto_source`, `component`, `engines`, `threshold`) in the OpenAPI schema instead of incorrectly reflecting the Translation resource. * Links outside tab navigation now correctly activate their target tabs, fixing upload links for missing translations and new components. * Error reporting integrations now distinguish informational messages from exceptions and reliably report the explicitly handled exception. * The default Celery per-child memory limit now accommodates the application’s baseline memory usage, avoiding unnecessary worker recycling. * Backup services now start only after settings and database backup files are fully updated, while backups to different Borg repositories can run in parallel. ### Compatibility * Anonymous access to engage pages and status widgets is now disabled by default for Private and Custom projects. Enable [Public sharing](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing) to preserve existing shared links after upgrading. Public and Protected projects are unchanged. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * Authenticator app registrations started before this upgrade must be restarted. Sessions referencing a removed duplicate device may require two-factor verification again. * Docker deployments now default to the combined Celery worker mode. If your deployment relies on separate workers for each queue or configures them using `CELERY_MAIN_OPTIONS`, `CELERY_NOTIFY_OPTIONS`, `CELERY_MEMORY_OPTIONS`, `CELERY_TRANSLATE_OPTIONS`, or `CELERY_BACKUP_OPTIONS`, set `CELERY_WORKER_MODE=split` to preserve the previous behavior. * The Docker `CELERY_SINGLE_PROCESS` environment variable is deprecated. Use `CELERY_WORKER_MODE=single` instead; the compatibility alias logs a startup warning. ### Contributors Code contributions : Michal Čihař, Karen Konou, Shweta Singh, michael-smt Translations contributions : ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Ldm Public, hoanghuy309, Vaclovas Intas (Vac31.), Matthaiks, Adam Havránek, VfBFan, reducedradius, Bone NI, Yaron Shahrabani, Любомир Василев, Fjuro, Andrei Stepanov, Arif Budiman, Watchman89 Documentation contributions : Michal Čihař, Shweta Singh, michael-smt [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/173?closed=1). # Weblate 2026.9 *Released on September 3rd 2026.* ### New features * [Repository maintenance actions](https://docs.weblate.org/en/latest/admin/continuous.md#repository-maintenance) now run as background tasks, avoiding request and proxy timeouts. Project-wide maintenance remains available for authorized repositories and lists components skipped because of linked-component permissions. The [`repository API`](https://docs.weblate.org/en/latest/api.md#post--api-projects-(string-project)-repository-) supports the same behavior using `background: true`. * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) can optionally create components from a monolingual base or new base file when no translation files exist yet. * Added [Version control parameters](https://docs.weblate.org/en/latest/vcs.md#vcs-params) to configure repository behavior per component, including force pushing, opting out of pull requests, and GitHub pull request automerge. * Added [Migrating existing components](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-migrate) for migrating existing Git and GitHub components to the Weblate GitHub App integration. * Added a Visible columns in lists preference to choose which statistics columns are shown in project, component, and language lists. See [Preferences](https://docs.weblate.org/en/latest/user/profile.md#profile-preferences). ### Improvements * AWS SES can now be used as the outbound e-mail transport in Docker deployments by setting [`WEBLATE_EMAIL_BACKEND`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_EMAIL_BACKEND) to `django_ses.SESBackend`. Region, endpoint, and SES v2 API opt-in are configurable via [`WEBLATE_AWS_SES_REGION_NAME`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_AWS_SES_REGION_NAME), [`WEBLATE_AWS_SES_REGION_ENDPOINT`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_AWS_SES_REGION_ENDPOINT), and [`WEBLATE_USE_SES_V2`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_USE_SES_V2). * Removing the final Weblate workspace connection for a GitHub account, or removing the workspace holding it, now also uninstalls the [Weblate GitHub App](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-register) from GitHub. * [Update POT file (xgettext)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-xgettext) now accepts multiple custom keywords (newline-separated) passed to xgettext via `--keyword`, enabling extraction from different function names. * [Screenshot images](https://docs.weblate.org/en/latest/admin/translating.md#screenshots) are now cached in browsers to reduce repeated downloads. * Administrators can now find removed accounts by their former e-mail address in the audit log until [`AUDITLOG_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUDITLOG_EXPIRY). See [Privacy regulations compliance](https://docs.weblate.org/en/latest/security/privacy-compliance.md). * Deployment diagnostics now detect slow filesystem metadata access in data and cache directories, and validate VCS command versions during configuration health checks instead of every process startup. See [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance) and [`VCS_BACKENDS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_BACKENDS). * Clarified the instance-wide impact of roles containing site-wide permissions, including [site-wide user management](https://docs.weblate.org/en/latest/admin/access.md#site-wide-user-management). * Improved translation file loading performance for metadata-only string changes. * Reduced [Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) worker startup memory usage by avoiding duplicate Django system checks and loading font rendering only when needed. * [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing) audit logs now identify users who change plans, initiate payments, or merge billings. * Assigning languages to a team now uses an All languages toggle which disables the language choice when turned on, and a manually chosen set of languages is kept when toggling it. See [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl). * Management notices now distinguish support package activation, status refresh, unlinking, and Discover Weblate registration. * Clarified generic [notification hook](https://docs.weblate.org/en/latest/api.md#hooks) matching and privacy behavior. * Clarified that Weblate does not populate Git submodules. See [Git submodules](https://docs.weblate.org/en/latest/vcs.md#git-submodules). * The initial [Search and replace](https://docs.weblate.org/en/latest/user/translating.md#search-replace) action is now labeled Review changes to distinguish it from confirmation. * The [translation flags](https://docs.weblate.org/en/latest/admin/translating.md#additional-flags) editor now supports reopening flags for editing, arrow-key navigation, and copying with `Ctrl`+`C`. It also keeps commas inside quoted values intact, allowing flags such as `regex:"^.{1,32}$"` to be typed and pasted. * Repository failure alerts now provide guidance matching repository URL validation errors. See [Troubleshooting repository URLs](https://docs.weblate.org/en/latest/vcs.md#vcs-repository-url-troubleshooting). ### Security fixes * Component discovery now limits repository paths and file-mask comparisons to prevent excessive resource consumption from specially crafted repositories. * Rejected [two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa) attempts now apply [`AUTH_LOCK_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTH_LOCK_ATTEMPTS), invalidate pending password sign-ins on lock or password change, and accept six-digit TOTP codes with leading zeroes. * [Project backup restores](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) now preserve all project, category, and component settings. They also allowlist repository metadata for Git, git-svn, and Mercurial to prevent archives from supplying executable configuration or repository indirection. * Project administrators can no longer remove [API tokens](https://docs.weblate.org/en/latest/api.md#api-tokens) belonging to other projects. * User listings and site-wide searches no longer expose project-scoped [API tokens](https://docs.weblate.org/en/latest/api.md#api-tokens) to users without global user viewing or editing permission. * Project and workspace [translation memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) now respects restricted component access, and restricted components no longer contribute to shared translation memory. * Webhook target matching no longer falls back to host/path suffix matching. Component repository URLs must match a repository URL from the webhook payload. See [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching). ### Bug fixes * LLM-based machine translation services now report invalid provider responses more clearly, custom [OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-openai) and [Mistral](https://docs.weblate.org/en/latest/admin/machine.md#mt-mistral) models no longer require a model-listing endpoint, and OpenAI automatic selection supports API keys restricted to older GPT models. * Daily metric collection now uses independent tasks and more efficient database queries to reduce peak memory usage and avoid losing all scopes when one collection fails. * Database dump failures are now shown in the [backups management interface](https://docs.weblate.org/en/latest/admin/backup.md#automated-backup). * GitLab merge request forks now disable Git LFS to avoid missing-object push failures. See [Git LFS](https://docs.weblate.org/en/latest/vcs.md#git-lfs). * Notification e-mails now wrap long strings instead of overflowing, keeping the View button reachable without horizontal scrolling. * Creating additional components for a repository imported through the [GitHub App](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-repositories) no longer fails without showing any error, and component creation errors which previously could go unreported are now always displayed. ### Compatibility * The `json_sort_keys` [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) is now a choice between `none`, `case_sensitive`, and `case_insensitive` instead of a boolean, including when reading or writing it through the component REST API; existing components are migrated automatically. See [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-). * The Git with force push version control system has been replaced by the `git_force_push` [version control parameter](https://docs.weblate.org/en/latest/vcs.md#vcs-params); existing components are migrated automatically. * Component and category removal now preserves automatically generated translation memory by default. See [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) for the optional cleanup behavior. * Mercurial and Subversion repository hosts can now be trusted using [`VCS_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_PRIVATE_ALLOWLIST) without restricting Git to the same hosts through [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS). * The [`project deletion REST API endpoint`](https://docs.weblate.org/en/latest/api.md#delete--api-projects-(string-project)-) now returns `202 Accepted` instead of `204 No Content` and contains a task URL in the response to track asynchronous deletion progress. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * Docker deployments need to configure trusted proxy addresses. Set [`WEBLATE_TRUSTED_PROXY_ADDRESSES`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_TRUSTED_PROXY_ADDRESSES) to preserve client IP addresses in nginx logs and Weblate when `WEBLATE_IP_PROXY_HEADER=HTTP_X_FORWARDED_FOR` is used; otherwise, the immediate TCP peer is used. ### Contributors Code contributions : Michal Čihař, Karen Konou, Gersona, Spyder, mmustafasenoglu, Kartik Ohri, Shweta Singh, Fabian Berg Translations contributions : Yuri Chornoivan, Matthaiks, Steve, hoanghuy309, VfBFan, António Oliveira, Andrei Stepanov, Adam Havránek, Dick Groskamp, Aindriú Mac Giolla Eoin, Andi Chandler, Lee Vincent, Michal Čihař, Milo Ivir, Ldm Public, Peter Vančo, Alos (bop2039), Tarás Lavrentiev, Lito Parra, goeran, Любомир Василев, Vik, Bone NI, Pierfrancesco Passerini, CYAXXX, Yaron Shahrabani, Pavel Borecki, حسين نور الإسلام, amano, reducedradius, Fjuro, Frostre_, Sup! 0_0, Ulrik, xiezhihai, Yoshi, Alexander Gabilondo, Eduard Ereza Martínez, Watchman89, Kyotaro Iijima, AlexYang, justcontributor, Background update, Arif Budiman, Harsha Kanaparthi, notlin4, KuroisKitsune, Zahid Rizky Fakhri, Michal Várady, Massimo Pissarello, HThuren, SeyhaLite, David Wagener, Yauhen, Anucha Hlownonkor, michael0820, Artyom Rybakov, Nhật Nhật, 子悦解说, Mahdi B. Jahani, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) Documentation contributions : Michal Čihař, Gersona, Karen Konou, Spyder, mmustafasenoglu, Kartik Ohri, Shweta Singh [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/168?closed=1). # Weblate 2026.8.1 *Released on August 7th 2026.* ### New features * Project and component APIs now expose all user-configurable settings, including access control and translation-memory settings. See [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md). * Added the [`metrics`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-metrics) command for retrieving server metrics locally in JSON, CSV, or OpenMetrics format. ### Bug fixes * Task progress now requires authentication and works for aggregate automatic translation operations. * Docker Celery worker logging no longer emits duplicate records through both Celery and Weblate log handlers. * Component creation through the REST API now returns the background task URL in the response when creation work is queued. * Large language model machine translation services no longer fail when the optional persona and style settings are absent from the stored configuration, as happens when the service is installed through the REST API. * [`import_json`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_json) now preserves the component source language for newly imported components from JSON exports. * Repository actions now require permission on every component sharing the affected repository, including linked components in other projects. * Legal document confirmation now explicitly covers the linked privacy policy. See [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal). * Add-on change history now retains only explicitly public configuration values and marks changed credential fields as redacted. * Translator work reports with metrics can now be displayed and downloaded as HTML. * Repository credentials are now consistently hidden from web and API output. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, i4i, Alafi, Kartik Ohri Translations contributions : Yuri Chornoivan, hoanghuy309, goeran, peterxy, Ldm Public, António Oliveira, CYAXXX, Aindriú Mac Giolla Eoin, Valeria Sofia Azañero, DocNoc, Libre, MrLeaves, Matt P, Yaron Shahrabani, VfBFan, Lee Vincent, Michal Čihař, Andrei Stepanov, cat, Любомир Василев, Artyom Rybakov, Matthaiks, reducedradius, Peter Vančo, Steve, Anmoll Gupta, justcontributor, Besnik Bleta Documentation contributions : Michal Čihař, i4i, Kartik Ohri [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/171?closed=1). # Weblate 2026.8 *Released on August 3rd 2026.* ### New features * Added a Show all columns in lists using horizontal scrolling preference to keep all listing columns visible on narrow screens instead of hiding them. * [Workspaces](https://docs.weblate.org/en/latest/admin/workspaces.md#workspaces) now provide aggregate translation statistics and historical metrics, a permission-filtered My workspaces list, archive downloads, search and replace, upload guidance, workspace translation memory management, and [removal of empty workspaces](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-removal) not associated with billing. * Added [project-level translation metrics](https://docs.weblate.org/en/latest/devel/integration.md#monitoring-translation-progress) in JSON, CSV, and OpenMetrics formats. * Added opt-in [Sample configuration to start Granian with ASGI](https://docs.weblate.org/en/latest/admin/install.md#running-granian-asgi) deployment support, including [`WEBLATE_ASGI`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ASGI) for Docker containers and asynchronous machine translation editor, GitHub App connection, and repository refresh requests. * Added grouped project and workspace Diagnostics views with state, severity, category, and actionable-by-user filters. Component diagnostics now track dismissal ownership, reopen after relevant changes, and notify only project maintainers who can act on warnings and errors. * Added API endpoints for listing, adding, accepting, rejecting, and voting on translation suggestions. * [Translation reports](https://docs.weblate.org/en/latest/devel/reporting.md) are now generated in the background, stored for later download, available at workspace scope, and include translator work analysis. * Added Use keywords exclusively option to [Update POT file (xgettext)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-xgettext), allowing projects to disable xgettext default keywords and rely only on a custom keyword. * Added API support for reading and updating [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile) preferences. See [Users](https://docs.weblate.org/en/latest/api.md#api-users) endpoint. * Added [Maximum number of lines](https://docs.weblate.org/en/latest/user/checks.md#check-max-lines) and [AsciiDoc markup](https://docs.weblate.org/en/latest/user/checks.md#check-asciidoc-markup) quality checks for limiting the number of translation lines and validating AsciiDoc strings. * Added [Limiting translation languages](https://docs.weblate.org/en/latest/workflows.md#workflow-language-restrictions), including per-language control for restricting direct translation editing to privileged users. * Added support for legacy Qt Linguist TS version 1 files. See [Qt Linguist .ts](https://docs.weblate.org/en/latest/formats/qt.md#qtling). * Weblate is now available in Lao language. ### Improvements * Authenticated web-action rate-limit lockouts are now recorded in the [Audit log](https://docs.weblate.org/en/latest/user/profile.md#audit-log) with the affected scope and request path. * OpenMetrics API responses now include metric metadata and a versioned content type. * Add-on management now uses separate configuration, logs, and components tabs, while [activity logs](https://docs.weblate.org/en/latest/admin/addons.md#addon-activity-logging) distinguish pending, successful, failed, and skipped executions and explain skipped executions. * Expanded [Selected change events](https://docs.weblate.org/en/latest/admin/addons.md#change-actions) documentation with detailed event semantics and improved OpenAPI schema accuracy. * Improved loading performance for multi-language matrix views, dashboard component lists, category histories, and shared component listings. * Translation memory management now loads origin summaries more efficiently, shows active and pending entry counts, and reports the number of entries processed during import. * Static assets now use content-hashed filenames, and CAPTCHA JavaScript is loaded only when needed. * [Amazon Translate](https://docs.weblate.org/en/latest/admin/machine.md#mt-aws) machine translation now supports configuring formality, brevity, and profanity masking. * Improved [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots) OCR reliability and error reporting when downloading recognition data. * Repository failure alerts now link directly to component version control settings for users who can edit them, keep technical errors in English, and localize actionable diagnoses for each viewer, including GitHub pull request restrictions. * Celery workers now prefetch fewer tasks by default to reduce memory usage and improve task distribution. * Improved the recommended [Sample configuration to start Granian](https://docs.weblate.org/en/latest/admin/install.md#running-granian) configuration and Docker container worker resilience for Weblate’s WSGI workload. * Deployment checks now detect corrupted PostgreSQL relation statistics. * [Community diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) now show source-string screenshot coverage, recommend key translation-instruction topics, and distinguish inbound from outbound repository automation. * User-provided links, such as those in comments, announcements, and profiles, are now underlined and use a higher contrast color. ### Bug fixes * [Disabling password authentication](https://docs.weblate.org/en/latest/admin/access.md#site-wide-user-management) from site-wide user management now regenerates the user’s personal API key by default. * Category, project, and comment statistics now stay consistent after component topology and comment changes, and category metrics are collected correctly. * Mercurial repository filenames beginning with a dash are now handled safely. * URLs containing backslashes are now rejected as invalid. * Protected outbound HTTP and Git connections now bind to validated public addresses; protected Git operations fail closed when clients cannot enforce that binding ([GHSA-45m9-pf98-8jmq](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-45m9-pf98-8jmq)). * Permanent same-host Git HTTP redirects are now validated and stored as canonical component repository URLs. * Self-service REST API e-mail changes are now restricted to verified addresses ([GHSA-x84p-6892-473c](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-x84p-6892-473c)). * REST API authorization now consistently protects internal accounts, restricted components, add-on configuration, component sharing, repository links, and review states. * [Project backup imports](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) now validate restored data before creating project state, skip repository-linked components the importer cannot access, and no longer load archive-supplied Mercurial configuration or shared-repository indirection ([GHSA-f66g-8pcg-jm8r](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-f66g-8pcg-jm8r), [GHSA-327h-qqgm-qv55](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-327h-qqgm-qv55)). * Rebuilding project translation memory no longer removes entries imported from files. * Suggestion submission and rejection now reject excessively long suggestion text and rejection reasons. * Restricted components are now available on Hosted Weblate when the billing plan permits private projects. * Machine translation and translation memory AJAX lookups no longer disclose whether inaccessible unit IDs exist. * [RSS feeds](https://docs.weblate.org/en/latest/api.md#rss) no longer disclose change history from inaccessible projects or restricted components ([GHSA-vvc6-wvqm-w5gc](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-vvc6-wvqm-w5gc)). * Authenticated legacy GitHub App webhooks can again trigger repository updates through the [generic GitHub webhook endpoint](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-notifications). ### Compatibility * django-compressor is no longer used, and the `COMPRESS_*` settings have been removed. * Legal document styling is now provided through an overridable template instead of Weblate’s global stylesheet. See [Customizing legal documents and styles](https://docs.weblate.org/en/latest/admin/optionals.md#legal-customization). * When [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE) is enabled, Mercurial and Subversion repository hosts must be explicitly included in [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS); Git over HTTPS and SSH enforces connection address pinning without an allowlist entry. * Outbound HTTP proxy configuration is limited to the per-protocol environment variables documented in [HTTP proxy](https://docs.weblate.org/en/latest/admin/install.md#http-proxy). * Git SSH validates configured `HostName` and `Port` destinations before connecting; administrator SSH configuration remains trusted, and [`SSH_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SSH_EXTRA_ARGS) can override connection routing and address pinning. * Git LFS object transfers are unsupported and disabled for Weblate-managed repositories; LFS-tracked files remain pointer files. * The project and component `credits` REST API endpoints and their `credits_url` response fields have been replaced by scoped `reports` endpoints and `reports_url`. Credits report generation is now asynchronous; clients need to submit a `credits` report, follow the returned task URL, and fetch the completed report. See [`POST /api/reports/`](https://docs.weblate.org/en/latest/api.md#post--api-reports-). * The top-level `languages` field on user REST API responses has been removed; use `profile.languages` instead. See [User profile](https://docs.weblate.org/en/latest/api.md#api-user-profile). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are changes in `settings_example.py`, most notably the new `STORAGES` configuration and removal of the `COMPRESS_*` settings; please adjust your settings accordingly. * Running **weblate compress** is no longer necessary; **weblate collectstatic --noinput** now prepares versioned static assets without clearing the static storage. ### Contributors Code contributions : Michal Čihař, Karen Konou, Nikunj Tyagi, Weblate CI, Shweta Singh, Gersona, Giacomo La Serra, Kartik Ohri, mmustafasenoglu, Mustafa Senoğlu, “Emmanuelle Bonnemay”, Nicolas Lepage, “Guillaume Lagorce”, “Jérémie Jadé”, “Matthias le Coach”, Любомир Василев, Spyder Translations contributions : António Oliveira, hoanghuy309, reducedradius, Michal Čihař, Andrei Stepanov, 為什麼不加空格, BoneNI, Любомир Василев, Adam Havránek, Libre, Horus68, Peter Vančo, Aindriú Mac Giolla Eoin, Matthaiks, VfBFan, Ldm Public, Mickaël Binos, Lee Vincent, Dick Groskamp, Rafael Fontenelle, Justin Parrot, Valeria Sofia Azañero, Priit Jõerüüt, Frank Paul Silye, goeran, Abduqadir Abliz, Arif Budiman, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Aniwene Madolomani, Pierfrancesco Passerini, Andi Chandler, Thunderstrike116, Giacomo La Serra, Ulrik, Cyborus, PPNplus, justcontributor, AlexYang, Kyotaro Iijima, Rajkumar Ramadoss, Yuri Chornoivan, DocNoc, Anucha Hlownonkor, Milo Ivir, Alexander Gabilondo, mbutsk, Oğuz Ersen, nautilusx, Yago Raña Gayoso, Blueberry, Yoshihoko, suyeon kim, Azharul Haque, win7guru, Matt P, Miguel A. Bouzada Documentation contributions : Michal Čihař, Nikunj Tyagi, Shweta Singh, Gersona, Giacomo La Serra, Weblate CI, Kartik Ohri, Karen Konou, mmustafasenoglu, Mustafa Senoğlu, Robert Wolff [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/167?closed=1). # Weblate 2026.7.1 *Released on July 10th 2026.* ### New features * Added [`INTERNAL_BOT_EMAIL_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-INTERNAL_BOT_EMAIL_TEMPLATE) to customize internal bot e-mail addresses. ### Improvements * Restricted components now show a status icon in component listings. * Permission checks now reuse materialized team membership data from lightweight relation lookups. * Documented that intermediate language files are hidden from language listings and can make target strings read-only. * Component diagnostics now warn when regular [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) PO files are configured as monolingual PO files. * Translation memory fuzzy lookups are now faster on large translation memories. * Permission denied messages when saving translations, editing glossaries, or voting on suggestions now show more specific reasons. * Comment notifications for strings you translated now also include strings you previously commented on or suggested translations for. * Comments and suggestions now auto-watch the project when Automatically watch projects on contribution is enabled. * Clarified Hosted Weblate repository access guidance in [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md). * [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings) now includes filters for comments by the current user and separate source string comment lookups. * Code-hosting account pages now consistently use Code-hosting connections and provider-neutral connected account wording. * [Discover Weblate](https://docs.weblate.org/en/latest/admin/support.md#discover-weblate) registration can now be started from the management interface without manually copying the activation token. * [Discover Weblate](https://docs.weblate.org/en/latest/admin/support.md#discover-weblate) can now be managed from a dedicated management panel, registration starts with discovery enabled, and protected projects are included in the listing. * Updated the [OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-openai), [Mistral](https://docs.weblate.org/en/latest/admin/machine.md#mt-mistral), and [Anthropic](https://docs.weblate.org/en/latest/admin/machine.md#mt-anthropic) model lists for currently supported models. ### Bug fixes * Filtered translation and zen navigation now reuse a stable session result list, keeping positions and counts stable after translated strings leave the filter. * Component priority icons are no longer shown on translation listings. * [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#check-punctuation-spacing) no longer flags Markdown image markers as French punctuation and now shows which punctuation marks triggered the check. * [Fedora Messaging](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-fedora-messaging-publish) received several reliability fixes. * The Things to check panel no longer uses error highlighting for suggestions and other non-error translation states. * Translation workflow customization now makes it clearer when per-language workflow settings are disabled until customization is enabled. * Anonymous user permission caches are now isolated between requests. * GitHub App setup now explains that a workspace is required instead of showing a permission error when no workspace exists. * LLM automatic suggestion settings no longer show `null` for empty language-specific instructions. * File format feature tables now better match actual format support, including descriptions, context, plural metadata, obsolete string removal, specialized file extensions, and merged variants. * Accepting a project invitation now automatically adds the project to the user’s watched projects. * Dismissing a failing check no longer shows a JSON parsing error in the translation editor. * Screenshot searches without an explicit field now match screenshot names only, and the search box links to the full screenshot search documentation. * Anonymous and internal bot accounts can no longer be edited through generic user management. * LLM machine translation suggestions now recover from more malformed structured JSON replies. * Azure AI Translator settings now reject malformed region names before validating service connectivity. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * Weblate now requires the PostgreSQL `btree_gist` extension for translation memory lookups. The migration installs it automatically when the database user has sufficient privileges. Installations using a non-superuser database user should pre-create it before upgrading; see [Creating a database in PostgreSQL](https://docs.weblate.org/en/latest/admin/install.md#dbsetup-postgres). ### Contributors Code contributions : Michal Čihař, Karen Konou, Weblate CI, Benjamin Alan Jamie, Kartik Ohri Translations contributions : Michal Čihař, António Oliveira, 大学没毕业, 為什麼不加空格, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), hoanghuy309, Libre, VfBFan, Peter Vančo, Jim Kats, ButterflyOfFire, Kiên Trần Trung, skittles poopy, Ulrik, Horus68, Mickaël Binos, Adam Havránek Documentation contributions : Michal Čihař, mayank-dev-15, Benjamin Alan Jamie [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/170?closed=1). # Weblate 2026.7 *Released on July 1st 2026.* ### New features * Added [Safe MDX](https://docs.weblate.org/en/latest/user/checks.md#check-safe-mdx), [Source string length](https://docs.weblate.org/en/latest/user/checks.md#check-source-max-length), and [Accelerator key](https://docs.weblate.org/en/latest/user/checks.md#check-accelerator) quality checks for [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) JSX expressions, source length limits, and accelerator key consistency. * Added [Mistral](https://docs.weblate.org/en/latest/admin/machine.md#mt-mistral) machinery integration for Mistral LLM automatic suggestions. * Added [Registering the GitHub App from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-register) for connecting GitHub repositories through a Weblate GitHub App. * [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) backups can now be created and downloaded via the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). * Added file format parameters for translating individual YAML front matter values in [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md#markdown) and [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) files and escaping formula-like values in [CSV files](https://docs.weblate.org/en/latest/formats/csv.md#csv) files. * Added an option to capitalize the text in status badge widgets. * Added [workspace translation memory](https://docs.weblate.org/en/latest/admin/memory.md#memory-scopes) with asynchronous scope backfill for existing translation memory entries. * Added [`analyze_translator_work`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-analyze_translator_work) to estimate realistic daily translator throughput from change history. ### Improvements * RTL editing and translation display now handle bidirectional text better, including Unicode isolate controls in the [Visual keyboard](https://docs.weblate.org/en/latest/user/translating.md#visual-keyboard). * Management interface access control is now more fine-grained with dedicated site-wide permissions. * Default commit and merge request message templates now use Conventional Commits, settings forms can restore installation defaults, and pull request messages use a compact language progress matrix. * Documented [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) customizations and added options to hide legal pages or disable document numbering. * Expanded [security documentation](https://docs.weblate.org/en/latest/security/index.md) for data residency, EU cloud sovereignty, release artifacts, supported versions, release verification, SBOMs, dependency handling, vulnerability reporting, hosted-service incident response, and self-hosted operator responsibilities. * [Update LINGUAS file](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-linguas) better detects `LINGUAS` file presence. * [Update POT file (xgettext)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-xgettext) can now leave the xgettext language blank to let xgettext guess it from source file extensions. * [Update POT file (xgettext)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-xgettext), [Update POT file (Meson)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-meson), [Update gettext template (Django)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-django), and [Update POT file (Sphinx)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-sphinx) can now keep source locations in generated POT files even when translated PO files omit locations. * Add-ons installed at higher scopes are now shown on lower-scope add-on pages, and broad-scope add-ons can list affected components with compatibility details. * [`WEBLATE_ALLOWED_ASSET_SIZE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ALLOWED_ASSET_SIZE) is now available in Docker container. * LLM automatic suggestions now use translated examples, language-specific instructions, richer glossary context, and structured placeholder context for more reliable output. * Meta descriptions now better match single-project and self-hosted installations. * Zen mode, filtered searches, nearby strings, translation form submissions, and add-on management pages now load more efficiently on large sites. * Added [Packaging Weblate for distributions](https://docs.weblate.org/en/latest/admin/install/source.md#distribution-packaging) guidance for distribution maintainers. * Large component imports now avoid duplicate translation-memory processing. * [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) files can now be configured to remove obsolete strings on save, including during repository maintenance. * [Bulk accepting suggestions](https://docs.weblate.org/en/latest/user/translating.md#suggestions) now confirms the number of affected suggestions, can approve them for reviewers, and processes the acceptance in the background. * Committing large numbers of pending translations now queues browser requests in the background and avoids duplicate repository commit tasks. * Change-event notification add-ons can now use presets for translation content events, all events, or selected individual events. * [Fedora Messaging](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-fedora-messaging-publish) now validates secure broker connections and exposes delivery timing and topic prefix settings. * Component diagnostics now sort entries by severity, color-code severity badges, and show the error count on the Diagnostics tab. * [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance) now shows PostgreSQL database disk usage next to server disk usage and warns when the database usage cannot be collected. * [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance) now shows PostgreSQL database disk usage next to server disk usage and warns when the database usage cannot be collected or there is not enough free space in the backup destination to store a database dump. * The [Search and replace](https://docs.weblate.org/en/latest/user/translating.md#search-replace) preview now keeps the search parameters editable so the query can be refined before applying replacements. ### Bug fixes * [Regular expression](https://docs.weblate.org/en/latest/user/checks.md#check-regex) and [Placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-placeholders) now enforce regular expression timeouts when evaluating source-string flags ([**CVE 2026-62326**](https://www.cve.org/CVERecord?id=CVE-2026-62326), [GHSA-r52j-4vjp-q949](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-r52j-4vjp-q949)). * Restricted component changes are no longer exposed through nested project, component, or translation API change endpoints ([**CVE 2026-62249**](https://www.cve.org/CVERecord?id=CVE-2026-62249), [GHSA-92m8-wv36-prmx](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-92m8-wv36-prmx)). * ZIP downloads, including [App store metadata files](https://docs.weblate.org/en/latest/formats/appstore.md#appstore) translation bundles, no longer follow child symbolic links outside the downloaded tree ([**CVE 2026-61792**](https://www.cve.org/CVERecord?id=CVE-2026-61792), [GHSA-xwj4-fp82-r2rj](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-xwj4-fp82-r2rj)). * Teams enforcing two-factor authentication now also withhold site-wide permissions from human members without 2FA configured ([**CVE 2026-61790**](https://www.cve.org/CVERecord?id=CVE-2026-61790), [GHSA-x86c-ff69-cr2m](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-x86c-ff69-cr2m)). * Globally scoped HTML and AJAX object lookups no longer disclose object existence in private projects ([**CVE 2026-55227**](https://www.cve.org/CVERecord?id=CVE-2026-55227), [GHSA-2p9g-x3cv-5hh4](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-2p9g-x3cv-5hh4)). * Team API access checks now prevent project managers from reading private-project team data or expanding scoped team assignments outside their allowed projects ([**CVE 2026-55228**](https://www.cve.org/CVERecord?id=CVE-2026-55228), [GHSA-2q2q-jr9g-v9rf](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-2q2q-jr9g-v9rf)). * Malformed `replacements` flags no longer abort source length checks. * Empty component lists are no longer exposed to users without component list management permission. * Glossary handling no longer duplicates TBX terms or shows source-language terms in both translation columns. * Duplicate string alerts now offer a cleanup action to remove repeated strings from translation files. * [Gerrit review requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gerrit) review pushes can again include Gerrit push options in the target branch. * Webhook target fallback matching is now stricter and reported in component diagnostics. * Creating components linked with `weblate://` no longer waits on the shared repository lock during the request. * Project and workspace translation license defaults now follow component and project licenses more closely. * Component and category API `PATCH` requests no longer remove the category when the field is omitted. * Document and translation-memory uploads now enforce [`TRANSLATION_UPLOAD_MAX_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-TRANSLATION_UPLOAD_MAX_SIZE), and API document uploads validate file extensions. * [reStructuredText syntax error](https://docs.weblate.org/en/latest/user/checks.md#check-rst-syntax) now detects inline roles wrapped in stray backticks. * [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html) now efficiently detects changed placeholder-only HTML attribute values in translations. * [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) no longer wraps text configured to fit on one line, checks source strings, and refreshes rendered previews after source edits. * Bitmap widgets and [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) previews now use Matplotlib and no longer require Pango, Cairo, librsvg, or GObject Introspection. * Repository reset and update history now keeps attribution, records remote update failures, and includes follow-up translation-file reconciliation. * Updating repository URLs now validates compatible Git history without requiring an immediate successful merge. * [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation) no longer validates hidden component fields when using machine translation. * Strings marked for edit links now include all strings needing editing, checking, or rewriting. * Anonymous permission checks no longer fail when loading teams scoped to projects or workspaces. * API project creation can again use the user’s only eligible workspace when no explicit workspace is supplied. * Git auto-maintenance is now disabled for Weblate-managed repositories to avoid concurrent detached maintenance jobs. * Interrupted Git repository operations are now either recovered and recorded or surfaced as a repository alert. * Watched translations on the dashboard now include category path segments. * Unsupported upload levels now show an upload placeholder pointing to individual translations. * Component API responses no longer expose repository export, push branch, or repository browser links to users without repository access. ### Compatibility * [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) now handles DeepL API versions internally, uses v3 for glossary management and language discovery, and no longer supports DeepL API v1. * [Fedora Messaging](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-fedora-messaging-publish) topics now include category path segments, and broker settings are stored as an AMQP URL with existing host and SSL settings migrated automatically. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are changes in `settings_example.py`, most notably in `SOCIAL_AUTH_PIPELINE` and `SOCIAL_AUTH_DISCONNECT_PIPELINE`; please adjust your settings accordingly. * Existing translation-memory entries are moved to scoped storage by a periodic Celery background task. Keep Celery running after the upgrade; translation-memory suggestions can be incomplete until the backfill finishes. ### Contributors Code contributions : Michal Čihař, Karen Konou, Weblate CI, michael-smt, Samuel Gomes, Dinis Sales, Gersona, Harsha C, Kartik Ohri, Besnik Bleta, fahadhewad Translations contributions : Dick Groskamp, Michal Čihař, 為什麼不加空格, VfBFan, Любомир Василев, 이정희, Aindriú Mac Giolla Eoin, Yaron Shahrabani, jiahaisheng, Horus68, Andrei Stepanov, Martin Srebotnjak, Peter Vančo, Hotripak, 大王叫我来巡山, Milo Ivir, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Mickaël Binos, Besnik Bleta, Frank Paul Silye, Matthaiks, abd sak, Hoseok Seo, Fulup Jakez, Gaël TISSERAND (Gtisseran), Azamat Аituganov, Mahirə Həsənova, Pierfrancesco Passerini, Libre, Mohamed Aymane Farhi, Júlia Rosell Saldaña, پرویز قادر, Jim Kats, Miguel A. Bouzada, Manuela Silva, reducedradius, Hanssium, Uh idk, Arif Budiman, Feike Donia, Zahid Rizky Fakhri, Emin Tufan Çetin, ojppe, தமிழ்நேரம், António Oliveira, Rumuz AGO, justcontributor, Flynn, Ștefan Zaharia, Nozomu Matsui, H-Media, Ecron, Weblate CI, Balázs Meskó, Fjuro, goeran, Adam Havránek, Priit Jõerüüt, Astrid Høie Silden, Alan S. Muhammed (Alan Kurdish), hoanghuy309, Yamin Siahmargooei, MeahNunh, Kartik Ohri, Valeria Sofia Azañero, Tuomas Hietala, Rafael Fontenelle, Yuri Chornoivan, AWwue-work, Kristoffer Grundström, ssantos, Andi Chandler, Ldm Public, Alc4Traz45, Szafranek13, hms5232, Victor K, 大学没毕业 Documentation contributions : Michal Čihař, michael-smt, Karen Konou, Gersona, Weblate CI, Kartik Ohri, Besnik Bleta, fahadhewad, Harsha C [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/166?closed=1). # Weblate 2026.6.1 *Released on June 1st 2026.* ### Bug fixes * Language-wide [Announcements](https://docs.weblate.org/en/latest/admin/announcements.md) no longer break language overview pages. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/169?closed=1). # Weblate 2026.6 *Released on June 1st 2026.* ### New features * [Announcements](https://docs.weblate.org/en/latest/admin/announcements.md) can now also be managed via the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) for specific project languages. * Team memberships can now be limited to selected languages for per-user translation permissions. * Added [cost estimates](https://docs.weblate.org/en/latest/devel/reporting.md#cost-estimate) to translation reports. * Added optional [OpenTelemetry tracing](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors) for backend requests and tasks, and [Google Cloud Error Reporting](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors) for handled server errors. * Added [Workspaces](https://docs.weblate.org/en/latest/admin/workspaces.md) to group related projects, with workspace project listings, workspace-scoped teams and project creation permissions, inherited workspace, project, and category defaults for selected component settings, and billing details when available. ### Improvements * Docker containers can now configure [`WEBLATE_SAML_SECURITY_CONFIG`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SAML_SECURITY_CONFIG) to customize SAML security settings, and adjust [`WEBLATE_FORMATS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_FORMATS) using [`WEBLATE_ADD_FORMATS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADD_FORMATS) and [`WEBLATE_REMOVE_FORMATS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_REMOVE_FORMATS). * Improved performance of the [Inconsistent](https://docs.weblate.org/en/latest/user/checks.md#check-inconsistent) check on large projects. * Translation flag fields now use a tag-based editor with autocompletion and grouped suggestions for all known flags. * [Contributor stats](https://docs.weblate.org/en/latest/devel/reporting.md#stats) now de-duplicate repeated work on the same string by default, with an option to count all changes. * [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md) now documents HTTPS access-token URLs and dedicated-user SSH URLs for accessing repositories, and [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md) now explains why squash merging Weblate conflict-resolution pull requests can require a repository reset. * [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) now include dismissible component diagnostics for community localization. * [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots) now support bulk assignment from search or image text recognition results, make finding strings in uploaded images easier to discover, show source string coverage counts, and include advanced listing search. * [Software Bill of Material](https://docs.weblate.org/en/latest/security/release-artifacts.md#sbom) release artifacts now include CISA 2025 document-level metadata. ### Bug fixes * Outbound URL validation now rejects additional non-public targets ([**CVE 2026-50127**](https://www.cve.org/CVERecord?id=CVE-2026-50127), [GHSA-vmfc-9982-2m45](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-vmfc-9982-2m45)). * Project-language [Announcements](https://docs.weblate.org/en/latest/admin/announcements.md) no longer appear across the whole project. * Hardened [`POST /api/screenshots/`](https://docs.weblate.org/en/latest/api.md#post--api-screenshots-) access checks against private project enumeration. * Registration-attempt account activity e-mails now link to password reset to help users finish account setup. * [Inviting new users](https://docs.weblate.org/en/latest/admin/access.md#invite-user) links now work for signed-in users whose account owns the invited e-mail address. * Searching for strings with content changes without a recorded author now supports `changed_by:""`, and combined change filters now apply to the same change event. * Gitea and Forgejo pull requests no longer reconfigure existing fork remotes to point to the source repository. * Project and category language translation sessions now keep strings grouped by component priority and show component switch warnings reliably. * Engage page task links now stay centered and show the target translation language. * Gettext POT update add-ons now rescan translations after committing updated POT and PO files. * Git repositories now update branches correctly when the remote also has a tag with the same name. * Conflicting repository setup alerts now allow same-branch direct pushes. * Obsolete cleanup schedules are now removed from Celery beat during upgrade. * Translation pages for workspace projects no longer crash when workspace fields are deferred. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There is a change in [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS); `weblate.workspaces` should be added. * The database migrations might take longer on larger instances. ### Contributors Code contributions : Michal Čihař, Karen Konou, Weblate CI, Basheer Radman, michael-smt, Kristián Kunc, felixfon Translations contributions : Michal Čihař, VfBFan, 大王叫我来巡山, Emin Tufan Çetin, Basheer Radman, 為什麼不加空格, Peter Vančo, Christian Wia, Любомир Василев, Matthaiks, Andrei Stepanov, Libre, Besnik Bleta, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Balázs Meskó, Aindriú Mac Giolla Eoin, Adam Havránek, Dick Groskamp, Arif Budiman, Mickaël Binos, Ryo Nakano, hoanghuy309, Pierfrancesco Passerini, Alefsander Ribeiro Nascimento, Massimo Pissarello, justcontributor, 이정희, Cabdi Waaxid Siciid, Yaron Shahrabani, User2068, Kyotaro Iijima, pan93412, jernejp21, libermax, Phileas Fogg, Fjuro, Jim Kats, Fulup Jakez, Priit Jõerüüt, Ldm Public, Andi Chandler, Burak SDN, ojppe Documentation contributions : Michal Čihař, VfBFan, Basheer Radman, Weblate CI, michael-smt, felixfon [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/165?closed=1). # Weblate 2026.5 *Released on May 15th 2026.* ### New features * Added [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) support for translating Markdown text while preserving JSX syntax, with [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) shared with [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md#markdown) for line wrapping, code blocks, front matter, and placeholder handling. * Added extended [LLM translation context](https://docs.weblate.org/en/latest/admin/machine.md#llm-translation-context) for automatic suggestions, covering string context, explanations, secondary-language translations, plurals, failing checks, and placeholders. * Added a digest-only translation activity summary notification, see [Notifications](https://docs.weblate.org/en/latest/user/profile.md#notifications). * [CSV](https://docs.weblate.org/en/latest/formats/csv.md#csv) and [XLSX](https://docs.weblate.org/en/latest/formats/excel.md#xlsx) downloads in [Downloading translations](https://docs.weblate.org/en/latest/user/files.md#download) now export plural strings as separate plural-form rows that can be imported back. * Added Gettext PO and POT [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) to control whether Weblate updates the `Language-Team`, `Last-Translator`, `X-Generator`, and `Report-Msgid-Bugs-To` headers. * Added a [backup](https://docs.weblate.org/en/latest/admin/management.md#backup-management-command) to run configured backup services synchronously. * The translation memory lookup API can now skip fuzzy matching with the `exact` query parameter. * Added [Translation files CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-files) to publish translation files to the configured CDN. ### Improvements * Using DOS line endings can now be configured using the `dos_eol` [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). * [OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-openai) and [Alibaba](https://docs.weblate.org/en/latest/admin/machine.md#mt-alibaba) no longer require their vendor Python SDKs. * Audited project and component setting changes are now recorded in history. * Gerrit review pushes now use [Push branch](https://docs.weblate.org/en/latest/admin/projects.md#component-push-branch) as the target branch. * Weblate now checks whether [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) allows executing generated helper files. * The [Software Bill of Material](https://docs.weblate.org/en/latest/security/release-artifacts.md#sbom) is now generated during release and published as a versioned release asset instead of being stored in the source repository. * The translating page now separates screenshots from string information, collapses rarely used string details, and groups glossary and screenshot actions more consistently. * Project access management now paginates users and better explains site-wide automatic team assignments. * Added provider-oriented code-hosting documentation and Gettext-style [Plural formula](https://docs.weblate.org/en/latest/admin/languages.md#plural-formula) guidance. * The Python wheel no longer ships source translation catalogs, test files, or deployment example files, reducing the installed package size. * The engage page now highlights actionable translation task buckets for newcomers. * [RSS feeds](https://docs.weblate.org/en/latest/api.md#rss) can now use the same filters as the changes browsing page. * [Update gettext template (Django)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-django) now supports gettext PO files used as templates when they are excluded by the language filter. * Reworked [Weblate threat model](https://docs.weblate.org/en/latest/security/threat-model.md) into a contract-style document. ### Bug fixes * Hardened search previews and [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) suggestion origins against XSS, and stopped exposing database error details in upload failures ([**CVE 2026-45106**](https://www.cve.org/CVERecord?id=CVE-2026-45106) / [GHSA-6wxc-8mgq-w26m](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-6wxc-8mgq-w26m)). * Screenshot URL uploads, remote HTML extraction in [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs), and URL health-check redirects now reject internal or non-public targets by default. * Gerrit review pushes now reject target branches containing push options, track the target branch before invoking `git-review`, and suggest short branch names when full refs are supplied. * Category [Announcements](https://docs.weblate.org/en/latest/admin/announcements.md) no longer appear across the whole project, and translation announcement deletion now honors language-scoped permissions. * Merge request pushes now refresh stale fork remotes after changing repository hosting. * Plural counts parsed from translation file headers are now bounded, and plural formulas are rejected when they can evaluate outside the configured plural form range. * [Per-project access tokens](https://docs.weblate.org/en/latest/admin/access.md#project-api) expiring today now remain valid until the end of the day. * Malformed ALTCHA CAPTCHA submissions and repository URLs in webhook payloads no longer cause server errors. * [Placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-placeholders) now merges overlapping non-nested spans from multiple flags. * [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md#backup) logs no longer include OpenSSH post-quantum key exchange warnings from remote Borg connections. * Category repository paths are now handled more safely during cleanup and moves. * Locked component pages now show an unsubscribe action after subscribing to unlock notifications. * [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) imports now restore in the background to avoid web worker memory limits. ### Compatibility * The `dos-eol` flag is no longer supported. Use the `dos_eol` [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) instead. * The registration CAPTCHA now uses the ALTCHA widget v3 protocol with Argon2id proof-of-work. * The `set_language_team` project attribute has been replaced with the `po_set_language_team` file format parameter at the component level; see [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). * Weblate now uses calendar versioning for releases, see [Release cycle](https://docs.weblate.org/en/latest/security/releases.md#release-cycle). * Weblate now uses stricter dependency version constraints to better control runtime environment. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * The `ALTCHA_MAX_NUMBER` setting has been replaced by [`ALTCHA_COST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALTCHA_COST), [`ALTCHA_MEMORY_COST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALTCHA_MEMORY_COST), and [`ALTCHA_PARALLELISM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALTCHA_PARALLELISM); please adjust your settings accordingly. * The upgrading policy was changed, and upgrades are only supported from the current or previous calendar year. * The `COMMENT_CLEANUP_DAYS` and `SUGGESTION_CLEANUP_DAYS` settings are migrated once to site-wide [Stale comment removal](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-removal-comments) and [Stale suggestion removal](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-removal-suggestions) add-ons; configure those add-ons instead. ### Contributors Code contributions : Michal Čihař, Karen Konou, AliceVisek, Gersona, Weblate CI Translations contributions : 이정희, Andrei Stepanov, Milo Ivir, ssantos, 大王叫我来巡山, Kaya Zeren, reducedradius, Peter Vančo, amano, Michal Čihař, Anucha Hlownonkor, Yaron Shahrabani, UDP, Максим Горпиніч, Agnieszka C, VfBFan, Blueberry, ojppe, Francisco Serrador, Aindriú Mac Giolla Eoin, Fjuro, Любомир Василев, Frank Paul Silye, Temuri Doghonadze, Yuri Chornoivan, Sergio Granadoz, Sketch6580, Hyeonjeong Lee, 為什麼不加空格, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), justcontributor, Kristijan "Fremen" Velkovski, Pierfrancesco Passerini, Besnik Bleta, Arif Budiman, Andi Chandler, jernejp21, Manuela Silva, Sjur N Moshagen, Abduqadir Abliz, Laitei, Кирилл Ванин, Matthaiks, Nozomu Matsui, Dick Groskamp, MrZwave, hoanghuy309, Jim Spentzos, Adam Havránek, Ricky Tigg, Christian Wia, ButterflyOfFire Documentation contributions : Michal Čihař, Gersona, Karen Konou, AliceVisek [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/162?closed=1). # changes/contributors/2026.10.md # changes/contributors/2026.5.md Code contributions : Michal Čihař, Karen Konou, AliceVisek, Gersona, Weblate CI Translations contributions : 이정희, Andrei Stepanov, Milo Ivir, ssantos, 大王叫我来巡山, Kaya Zeren, reducedradius, Peter Vančo, amano, Michal Čihař, Anucha Hlownonkor, Yaron Shahrabani, UDP, Максим Горпиніч, Agnieszka C, VfBFan, Blueberry, ojppe, Francisco Serrador, Aindriú Mac Giolla Eoin, Fjuro, Любомир Василев, Frank Paul Silye, Temuri Doghonadze, Yuri Chornoivan, Sergio Granadoz, Sketch6580, Hyeonjeong Lee, 為什麼不加空格, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), justcontributor, Kristijan "Fremen" Velkovski, Pierfrancesco Passerini, Besnik Bleta, Arif Budiman, Andi Chandler, jernejp21, Manuela Silva, Sjur N Moshagen, Abduqadir Abliz, Laitei, Кирилл Ванин, Matthaiks, Nozomu Matsui, Dick Groskamp, MrZwave, hoanghuy309, Jim Spentzos, Adam Havránek, Ricky Tigg, Christian Wia, ButterflyOfFire Documentation contributions : Michal Čihař, Gersona, Karen Konou, AliceVisek # changes/contributors/2026.6.1.md Code contributions : Michal Čihař Documentation contributions : Michal Čihař # changes/contributors/2026.6.md Code contributions : Michal Čihař, Karen Konou, Weblate CI, Basheer Radman, michael-smt, Kristián Kunc, felixfon Translations contributions : Michal Čihař, VfBFan, 大王叫我来巡山, Emin Tufan Çetin, Basheer Radman, 為什麼不加空格, Peter Vančo, Christian Wia, Любомир Василев, Matthaiks, Andrei Stepanov, Libre, Besnik Bleta, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Balázs Meskó, Aindriú Mac Giolla Eoin, Adam Havránek, Dick Groskamp, Arif Budiman, Mickaël Binos, Ryo Nakano, hoanghuy309, Pierfrancesco Passerini, Alefsander Ribeiro Nascimento, Massimo Pissarello, justcontributor, 이정희, Cabdi Waaxid Siciid, Yaron Shahrabani, User2068, Kyotaro Iijima, pan93412, jernejp21, libermax, Phileas Fogg, Fjuro, Jim Kats, Fulup Jakez, Priit Jõerüüt, Ldm Public, Andi Chandler, Burak SDN, ojppe Documentation contributions : Michal Čihař, VfBFan, Basheer Radman, Weblate CI, michael-smt, felixfon # changes/contributors/2026.7.1.md Code contributions : Michal Čihař, Karen Konou, Weblate CI, Benjamin Alan Jamie, Kartik Ohri Translations contributions : Michal Čihař, António Oliveira, 大学没毕业, 為什麼不加空格, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), hoanghuy309, Libre, VfBFan, Peter Vančo, Jim Kats, ButterflyOfFire, Kiên Trần Trung, skittles poopy, Ulrik, Horus68, Mickaël Binos, Adam Havránek Documentation contributions : Michal Čihař, mayank-dev-15, Benjamin Alan Jamie # changes/contributors/2026.7.md Code contributions : Michal Čihař, Karen Konou, Weblate CI, michael-smt, Samuel Gomes, Dinis Sales, Gersona, Harsha C, Kartik Ohri, Besnik Bleta, fahadhewad Translations contributions : Dick Groskamp, Michal Čihař, 為什麼不加空格, VfBFan, Любомир Василев, 이정희, Aindriú Mac Giolla Eoin, Yaron Shahrabani, jiahaisheng, Horus68, Andrei Stepanov, Martin Srebotnjak, Peter Vančo, Hotripak, 大王叫我来巡山, Milo Ivir, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Mickaël Binos, Besnik Bleta, Frank Paul Silye, Matthaiks, abd sak, Hoseok Seo, Fulup Jakez, Gaël TISSERAND (Gtisseran), Azamat Аituganov, Mahirə Həsənova, Pierfrancesco Passerini, Libre, Mohamed Aymane Farhi, Júlia Rosell Saldaña, پرویز قادر, Jim Kats, Miguel A. Bouzada, Manuela Silva, reducedradius, Hanssium, Uh idk, Arif Budiman, Feike Donia, Zahid Rizky Fakhri, Emin Tufan Çetin, ojppe, தமிழ்நேரம், António Oliveira, Rumuz AGO, justcontributor, Flynn, Ștefan Zaharia, Nozomu Matsui, H-Media, Ecron, Weblate CI, Balázs Meskó, Fjuro, goeran, Adam Havránek, Priit Jõerüüt, Astrid Høie Silden, Alan S. Muhammed (Alan Kurdish), hoanghuy309, Yamin Siahmargooei, MeahNunh, Kartik Ohri, Valeria Sofia Azañero, Tuomas Hietala, Rafael Fontenelle, Yuri Chornoivan, AWwue-work, Kristoffer Grundström, ssantos, Andi Chandler, Ldm Public, Alc4Traz45, Szafranek13, hms5232, Victor K, 大学没毕业 Documentation contributions : Michal Čihař, michael-smt, Karen Konou, Gersona, Weblate CI, Kartik Ohri, Besnik Bleta, fahadhewad, Harsha C # changes/contributors/2026.8.1.md Code contributions : Michal Čihař, i4i, Alafi, Kartik Ohri Translations contributions : Yuri Chornoivan, hoanghuy309, goeran, peterxy, Ldm Public, António Oliveira, CYAXXX, Aindriú Mac Giolla Eoin, Valeria Sofia Azañero, DocNoc, Libre, MrLeaves, Matt P, Yaron Shahrabani, VfBFan, Lee Vincent, Michal Čihař, Andrei Stepanov, cat, Любомир Василев, Artyom Rybakov, Matthaiks, reducedradius, Peter Vančo, Steve, Anmoll Gupta, justcontributor, Besnik Bleta Documentation contributions : Michal Čihař, i4i, Kartik Ohri # changes/contributors/2026.8.md Code contributions : Michal Čihař, Karen Konou, Nikunj Tyagi, Weblate CI, Shweta Singh, Gersona, Giacomo La Serra, Kartik Ohri, mmustafasenoglu, Mustafa Senoğlu, “Emmanuelle Bonnemay”, Nicolas Lepage, “Guillaume Lagorce”, “Jérémie Jadé”, “Matthias le Coach”, Любомир Василев, Spyder Translations contributions : António Oliveira, hoanghuy309, reducedradius, Michal Čihař, Andrei Stepanov, 為什麼不加空格, BoneNI, Любомир Василев, Adam Havránek, Libre, Horus68, Peter Vančo, Aindriú Mac Giolla Eoin, Matthaiks, VfBFan, Ldm Public, Mickaël Binos, Lee Vincent, Dick Groskamp, Rafael Fontenelle, Justin Parrot, Valeria Sofia Azañero, Priit Jõerüüt, Frank Paul Silye, goeran, Abduqadir Abliz, Arif Budiman, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Aniwene Madolomani, Pierfrancesco Passerini, Andi Chandler, Thunderstrike116, Giacomo La Serra, Ulrik, Cyborus, PPNplus, justcontributor, AlexYang, Kyotaro Iijima, Rajkumar Ramadoss, Yuri Chornoivan, DocNoc, Anucha Hlownonkor, Milo Ivir, Alexander Gabilondo, mbutsk, Oğuz Ersen, nautilusx, Yago Raña Gayoso, Blueberry, Yoshihoko, suyeon kim, Azharul Haque, win7guru, Matt P, Miguel A. Bouzada Documentation contributions : Michal Čihař, Nikunj Tyagi, Shweta Singh, Gersona, Giacomo La Serra, Weblate CI, Kartik Ohri, Karen Konou, mmustafasenoglu, Mustafa Senoğlu, Robert Wolff # changes/contributors/2026.9.1.md Code contributions : Michal Čihař, Karen Konou, Shweta Singh, michael-smt Translations contributions : ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Ldm Public, hoanghuy309, Vaclovas Intas (Vac31.), Matthaiks, Adam Havránek, VfBFan, reducedradius, Bone NI, Yaron Shahrabani, Любомир Василев, Fjuro, Andrei Stepanov, Arif Budiman, Watchman89 Documentation contributions : Michal Čihař, Shweta Singh, michael-smt # changes/contributors/2026.9.md Code contributions : Michal Čihař, Karen Konou, Gersona, Spyder, mmustafasenoglu, Kartik Ohri, Shweta Singh, Fabian Berg Translations contributions : Yuri Chornoivan, Matthaiks, Steve, hoanghuy309, VfBFan, António Oliveira, Andrei Stepanov, Adam Havránek, Dick Groskamp, Aindriú Mac Giolla Eoin, Andi Chandler, Lee Vincent, Michal Čihař, Milo Ivir, Ldm Public, Peter Vančo, Alos (bop2039), Tarás Lavrentiev, Lito Parra, goeran, Любомир Василев, Vik, Bone NI, Pierfrancesco Passerini, CYAXXX, Yaron Shahrabani, Pavel Borecki, حسين نور الإسلام, amano, reducedradius, Fjuro, Frostre_, Sup! 0_0, Ulrik, xiezhihai, Yoshi, Alexander Gabilondo, Eduard Ereza Martínez, Watchman89, Kyotaro Iijima, AlexYang, justcontributor, Background update, Arif Budiman, Harsha Kanaparthi, notlin4, KuroisKitsune, Zahid Rizky Fakhri, Michal Várady, Massimo Pissarello, HThuren, SeyhaLite, David Wagener, Yauhen, Anucha Hlownonkor, michael0820, Artyom Rybakov, Nhật Nhật, 子悦解说, Mahdi B. Jahani, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) Documentation contributions : Michal Čihař, Gersona, Karen Konou, Spyder, mmustafasenoglu, Kartik Ohri, Shweta Singh # changes/contributors/5.10.1.md Code contributions : Michal Čihař, nijel, Gersona, Javier Pérez, Mehdi El Oualy, Allan Nordhøy, Malte L., StoyanDimitrov, 49 Translations contributions : Dick Groskamp, VfBFan, Rafael Fontenelle, Besnik Bleta, 大学没毕业, 大王叫我来巡山, Xzonn, Agnieszka C, Linerly, Peter Vančo, Aindriú Mac Giolla Eoin, Uijong Wei, BouenMarsh, Sagiri, qtm, Martin Srebotnjak, Blueberry, Horus68, Aksel Azwaw, Yaron Shahrabani, Петро Узбек, Meta Sonic, Ldm Public, Michal Čihař, Lang Q, தமிழ்நேரம், amano, MERCRED, Milo Ivir, dsa-t, JY3, Balázs Meskó, Christian Wia, Szymon Ignaczak, Nichathip Polaueng, Chang-Chia Tseng, Emil Schildknecht Nielsen, Turkish Wold, Yılmaz Durmaz, Gadzio742, Nahil4, Yi Chi Fauzi, Максим Горпиніч, Fjuro, Sketch6580, Любомир Василев, Massimo Pissarello, Julien Humbert, Ricky Tigg, Ihor Hordiichuk, Kaya Zeren, Reno Tx, Miguel A. Bouzada, n1ck, Andi Chandler, Tuomas Hietala, Priit Jõerüüt, Trond Kjetil Bremnes, Pierfrancesco Passerini, Jesper Hertel, VisionR1, pan93412, Miguel, Lynilia, Mohammed Al Otaibi, Dwi Cahyono, awadhiworld, Kyotaro Iijima, Prachi Joshi, 이정희, Carlos Manuel Picos, Vaclovas Intas, Yuri, StoyanDimitrov, Mehdi El Oualy, Vlăduț Ilie, Ettore Atalan, qywter11 qywter11, Yuri Chornoivan, Temuri Doghonadze, hugoalh, Burak Hüseyin Ekseli, leyakid803, 김인수, bovirus, WaldiS, Filipe Mota (BlackSpirits), Alyaksandr Koshal, Мирослав Николић, پرویز قادر, cat, Ilyes Kouachi, ButterflyOfFire, Eduard Ereza Martínez, nautilusx, Matthaiks, Vin Documentation contributions : Michal Čihař, Rafael Fontenelle, AliceVisek, Gersona, StoyanDimitrov, Mehdi El Oualy # changes/contributors/5.10.2.md Code contributions : Michal Čihař, nijel, Gersona, Javier Pérez, Mehdi El Oualy, Allan Nordhøy, Malte L., StoyanDimitrov, 49 Translations contributions : Dick Groskamp, VfBFan, Rafael Fontenelle, Besnik Bleta, 大学没毕业, 大王叫我来巡山, Xzonn, Agnieszka C, Linerly, Peter Vančo, Aindriú Mac Giolla Eoin, Uijong Wei, BouenMarsh, Sagiri, qtm, Martin Srebotnjak, Blueberry, Horus68, Aksel Azwaw, Yaron Shahrabani, Петро Узбек, Meta Sonic, Ldm Public, Michal Čihař, Lang Q, தமிழ்நேரம், amano, MERCRED, Milo Ivir, dsa-t, JY3, Balázs Meskó, Christian Wia, Szymon Ignaczak, Nichathip Polaueng, Chang-Chia Tseng, Emil Schildknecht Nielsen, Turkish Wold, Yılmaz Durmaz, Gadzio742, Nahil4, Yi Chi Fauzi, Максим Горпиніч, Fjuro, Sketch6580, Любомир Василев, Massimo Pissarello, Julien Humbert, Ricky Tigg, Ihor Hordiichuk, Kaya Zeren, Reno Tx, Miguel A. Bouzada, n1ck, Andi Chandler, Tuomas Hietala, Priit Jõerüüt, Trond Kjetil Bremnes, Pierfrancesco Passerini, Jesper Hertel, VisionR1, pan93412, Miguel, Lynilia, Mohammed Al Otaibi, Dwi Cahyono, awadhiworld, Kyotaro Iijima, Prachi Joshi, 이정희, Carlos Manuel Picos, Vaclovas Intas, Yuri, StoyanDimitrov, Mehdi El Oualy, Vlăduț Ilie, Ettore Atalan, qywter11 qywter11, Yuri Chornoivan, Temuri Doghonadze, hugoalh, Burak Hüseyin Ekseli, leyakid803, 김인수, bovirus, WaldiS, Filipe Mota (BlackSpirits), Alyaksandr Koshal, Мирослав Николић, پرویز قادر, cat, Ilyes Kouachi, ButterflyOfFire, Eduard Ereza Martínez, nautilusx, Matthaiks, Vin, Rostyslav, RViktor Documentation contributions : Michal Čihař, Rafael Fontenelle, AliceVisek, Gersona, StoyanDimitrov, Mehdi El Oualy # changes/contributors/5.10.3.md Code contributions : Michal Čihař, nijel, Gersona, Javier Pérez, Mehdi El Oualy, Allan Nordhøy, Malte L., StoyanDimitrov, 49 Translations contributions : Dick Groskamp, VfBFan, Rafael Fontenelle, Besnik Bleta, 大学没毕业, 大王叫我来巡山, Xzonn, Agnieszka C, Linerly, Peter Vančo, Aindriú Mac Giolla Eoin, Uijong Wei, BouenMarsh, Sagiri, qtm, Martin Srebotnjak, Blueberry, Horus68, Aksel Azwaw, Yaron Shahrabani, Петро Узбек, Meta Sonic, Ldm Public, Michal Čihař, Lang Q, தமிழ்நேரம், amano, MERCRED, Milo Ivir, dsa-t, JY3, Balázs Meskó, Christian Wia, Szymon Ignaczak, Nichathip Polaueng, Chang-Chia Tseng, Emil Schildknecht Nielsen, Turkish Wold, Yılmaz Durmaz, Gadzio742, Nahil4, Yi Chi Fauzi, Максим Горпиніч, Fjuro, Sketch6580, Любомир Василев, Massimo Pissarello, Julien Humbert, Ricky Tigg, Ihor Hordiichuk, Kaya Zeren, Reno Tx, Miguel A. Bouzada, n1ck, Andi Chandler, Tuomas Hietala, Priit Jõerüüt, Trond Kjetil Bremnes, Pierfrancesco Passerini, Jesper Hertel, VisionR1, pan93412, Miguel, Lynilia, Mohammed Al Otaibi, Dwi Cahyono, awadhiworld, Kyotaro Iijima, Prachi Joshi, 이정희, Carlos Manuel Picos, Vaclovas Intas, Yuri, StoyanDimitrov, Mehdi El Oualy, Vlăduț Ilie, Ettore Atalan, qywter11 qywter11, Yuri Chornoivan, Temuri Doghonadze, hugoalh, Burak Hüseyin Ekseli, leyakid803, 김인수, bovirus, WaldiS, Filipe Mota (BlackSpirits), Alyaksandr Koshal, Мирослав Николић, پرویز قادر, cat, Ilyes Kouachi, ButterflyOfFire, Eduard Ereza Martínez, nautilusx, Matthaiks, Vin, Rostyslav, RViktor, Sveinn í Felli, Basheer Radman, dedakir923, xuars Documentation contributions : Michal Čihař, Rafael Fontenelle, AliceVisek, Gersona, StoyanDimitrov, Mehdi El Oualy # changes/contributors/5.10.4.md Code contributions : Michal Čihař Translations contributions : Vinko Kastelic, Dick Groskamp, Amalia Nostalgia, VfBFan, Balázs Úr, william chen, Michal Čihař, cat Documentation contributions : Michal Čihař # changes/contributors/5.10.md Code contributions : Michal Čihař, nijel, Gersona, Javier Pérez, Mehdi El Oualy, Allan Nordhøy, Malte L., StoyanDimitrov, 49 Translations contributions : Dick Groskamp, VfBFan, Rafael Fontenelle, Besnik Bleta, 大学没毕业, 大王叫我来巡山, Xzonn, Agnieszka C, Linerly, Peter Vančo, Aindriú Mac Giolla Eoin, Uijong Wei, BouenMarsh, Sagiri, qtm, Martin Srebotnjak, Blueberry, Horus68, Aksel Azwaw, Yaron Shahrabani, Петро Узбек, Meta Sonic, Ldm Public, Michal Čihař, Lang Q, தமிழ்நேரம், amano, MERCRED, Milo Ivir, dsa-t, JY3, Balázs Meskó, Christian Wia, Szymon Ignaczak, Nichathip Polaueng, Chang-Chia Tseng, Emil Schildknecht Nielsen, Turkish Wold, Yılmaz Durmaz, Gadzio742, Nahil4, Yi Chi Fauzi, Максим Горпиніч, Fjuro, Sketch6580, Любомир Василев, Massimo Pissarello, Julien Humbert, Ricky Tigg, Ihor Hordiichuk, Kaya Zeren, Reno Tx, Miguel A. Bouzada, n1ck, Andi Chandler, Tuomas Hietala, Priit Jõerüüt, Trond Kjetil Bremnes, Pierfrancesco Passerini, Jesper Hertel, VisionR1, pan93412, Miguel, Lynilia, Mohammed Al Otaibi, Dwi Cahyono, awadhiworld, Kyotaro Iijima, Prachi Joshi, 이정희, Carlos Manuel Picos, Vaclovas Intas, Yuri, StoyanDimitrov, Mehdi El Oualy, Vlăduț Ilie, Ettore Atalan, qywter11 qywter11, Yuri Chornoivan, Temuri Doghonadze, hugoalh, Burak Hüseyin Ekseli, leyakid803, 김인수, bovirus Documentation contributions : Michal Čihař, Rafael Fontenelle, AliceVisek, Gersona, StoyanDimitrov, Mehdi El Oualy # changes/contributors/5.11.1.md Code contributions : Michal Čihař, Kartik Ohri, nijel, AliceVisek, Cédric Krier Translations contributions : xuars, Fjuro, Yaron Shahrabani, VfBFan, Michal Čihař, Yauhen, RViktor, cat, Andrei Stepanov, Ettore Atalan, 大学没毕业, Miguel A. Bouzada, ssantos, Emin Tufan Çetin, Jeff Huang, Christian Wia, Murun Battulga, Сергей, Peter Vančo, Dick Groskamp, amano, Julien Humbert, தமிழ்நேரம், WofWca, dedakir923, Rafael Fontenelle, Heimen Stoffels, Manuela Silva, ball, Francisco Serrador, Linerly, Sveinn í Felli, Floee Rozario, Ricky Tigg Documentation contributions : Michal Čihař, AliceVisek, Kartik Ohri, Cédric Krier # changes/contributors/5.11.2.md Code contributions : Michal Čihař Translations contributions : Yauhen, Michal Čihař, Romeostar, RViktor, Francisco Serrador, ابْنُ السَدِيمِ, Alejandra Wheeler, xuars, پرویز قادر, amano, Andrei Stepanov, Jim Kats, dedakir923, Amalia Nostalgia, Aindriú Mac Giolla Eoin, elid, abdelbasset jabrane, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Rafael Fontenelle, Zahid Rizky Fakhri Documentation contributions : Michal Čihař # changes/contributors/5.11.3.md Code contributions : Michal Čihař Documentation contributions : Michal Čihař # changes/contributors/5.11.4.md Code contributions : Michal Čihař, مهدي الوالي Documentation contributions : Michal Čihař # changes/contributors/5.11.md Code contributions : Michal Čihař, Gersona, Kartik Ohri, Mehdi El Oualy, Yash Kumar, nijel, Viktor Khokhryakov, AliceVisek, KasukabeDefenceForce Translations contributions : Michal Čihař, Vinko Kastelic, Dick Groskamp, ButterflyOfFire, Amalia Nostalgia, VfBFan, Balázs Úr, william chen, Alexander Gabilondo, cat, Fjuro, Ritwik, Rafael Fontenelle, Bee Crankson, Ldm Public, Christian Wia, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), தமிழ்நேரம், Emilia Meza, elid, xuars, Andi Chandler, RViktor, Tuukka Salminen, Yaron Shahrabani, Chang-Chia Tseng, Manuela Silva, Espea Tiviq, dedakir923, Besnik Bleta, ប៉ុកណូ រ៉ូយ៉ាល់, Dag Høidahl, Priit Jõerüüt, pan93412, Miguel A. Bouzada, Vũ Minh Nguyên, CyrTranslit, Avi Markovitz, Temuri Doghonadze, Matthaiks, Champ0999, Yauhen, Massimo Pissarello, Sketch6580, Максим Горпиніч, Emin Tufan Çetin, Agnieszka C, Ettore Atalan, Любомир Василев, Marc Riera, adiee5, 大王叫我来巡山, JY3, amano, Сергей, Ricky Tigg, Martin Srebotnjak, Gideon Wentink, Yuri Chornoivan Documentation contributions : Michal Čihař, Gersona, Kartik Ohri, Yash Kumar, AliceVisek, gpatel-fr # changes/contributors/5.12.1.md Code contributions : Michal Čihař Translations contributions : VfBFan, qywter11 qywter11, Manuela Silva Documentation contributions : Michal Čihař # changes/contributors/5.12.2.md Code contributions : Michal Čihař Translations contributions : eulalio, Linerly, Peter Vančo, Yaron Shahrabani, VfBFan, Roland Reck, Manuela Silva, Abduqadir Abliz, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Zahid Rizky Fakhri, Michal Čihař, Matthaiks, Drugi Sapog, Yuri Chornoivan, Agnieszka C, Massimo Pissarello, Fjuro, Sketch6580, Любомир Василев, newidyn, Zulfar Documentation contributions : Michal Čihař # changes/contributors/5.12.md Code contributions : Michal Čihař, nijel, Kartik Ohri, مهدي الوالي, Gersona, Mehdi El Oualy, KasukabeDefenceForce, AliceVisek, ButterflyOfFire, Benjamin Alan Jamie, michael-smt, Javi Boo, Karen Konou, Shubham Padia, KarenKonou, zoe, Zoe Translations contributions : Michal Čihař, Yauhen, Romeostar, RViktor, Francisco Serrador, ابْنُ السَدِيمِ, Alejandra Wheeler, xuars, پرویز قادر, amano, Andrei Stepanov, Jim Kats, dedakir923, Amalia Nostalgia, Aindriú Mac Giolla Eoin, elid, abdelbasset jabrane, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Rafael Fontenelle, Zahid Rizky Fakhri, Miguel A. Bouzada, Yaron Shahrabani, Fjuro, Jose Delvani, Jim Spentzos, Michał Korczak, Taufik Adi Wicaksono, joel MKO, Ldm Public, Carmelo Serraino, Yu Ting, Alex, Yago Raña Gayoso, Boonsita Noijad, Massimo Pissarello, 大王叫我来巡山, rimasx, Abhinav Ohri, Любомир Василев, Manuela Silva, Juzé, Licaon Kter, Anon, Ecron, ButterflyOfFire, Milo Ivir, Yuliia Ozkan, Christian Wia, Nat A, Drugi Sapog, Martin Srebotnjak, searinminecraft, Chou Chamnan, Priit Jõerüüt, Matthaiks, Sketch6580, Максим Горпиніч, Сергей, cat, Roland Reck, Agnieszka C, VfBFan, Besnik Bleta, Dick Groskamp, Pierfrancesco Passerini, PriitUring, Ding User, 大学没毕业, Peter Vančo, pan93412, Κyriaki L, Marijn Scholtus, Emin Tufan Çetin, Zulfar, Oasis Tri, zenobit, Abduqadir Abliz, ssantos, தமிழ்நேரம், lm, gogu, Andi Chandler, hugoalh, Linerly, Murun Battulga, Teitei, Wael Ibrahim, Burak Hüseyin Ekseli, Eduard Ereza Martínez, Tuomas Hietala, Taiki Ohno Documentation contributions : Michal Čihař, Kartik Ohri, AliceVisek, Gersona, KasukabeDefenceForce, ButterflyOfFire, Benjamin Alan Jamie, michael-smt, Renan LE CARO, nijel, Yuki Noda, zoe, Zoe # changes/contributors/5.13.1.md Code contributions : Michal Čihař, nijel, alisa, Gersona, Karen Konou, Kartik Ohri, softworkz, Paul Harriet Asiñero Translations contributions : pan93412, eulalio, Zahid Rizky Fakhri, Maciej Olko, Aindriú Mac Giolla Eoin, Christian Wia, Fjuro, Brian Njoroge, ssantos, Junghyuk Kwon, hugoalh, Alexis Launay, Wolf, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Yaron Shahrabani, Marija Grineviciute, Milo Ivir, Данил Костенков, Dick Groskamp, abdelbasset jabrane, CyrTranslit, cat, Michal Čihař, VfBFan, Wuzzy, Michalis, Deleted User, Francisco Serrador, Adolfo Jayme Barrientos, Ricky Tigg, Nicolas Van Aarsen, Julien Humbert, Jérôme, Nifou, Miguel A. Bouzada, elid, RViktor, Taufik Adi Wicaksono, Reza Almanda, Sveinn í Felli, Massimo Pissarello, Kyotaro Iijima, amano, 이정희, WaldiS, tomkolp, Piotr Kołtun, Horus68, Manuela Silva, Alan Marques, Rafael Fontenelle, Alefsander Ribeiro Nascimento, Simona Iacob, Nicoara Alex, Golubev Alexander, Сергей, Blueberry, Mingun, xXx, Vin, BouenMarsh, gfbdrgn, Igor Polyakov, qtm, Alexey Napalkov, Julija Juli, Reno Tx, தமிழ்நேரம், Kaya Zeren, Yuri Chornoivan, Ihor Hordiichuk, Mirka Danylenko, Tymofii Lytvynenko, Andrij Mizyk, Максим Горпиніч, 大王叫我来巡山, Sketch6580, JY3, 大学没毕业, Xiang Heng Wei, yangyangdaji, Xzonn, Peter Dave Hello, 峡州仙士, Winston Sung, Toomore Chiang, Haowei Hsu, Chang-Chia Tseng, notlin4, Supaplex, n1ck, Changseop Yeom, Ldm Public, Vitalii, Yago Raña Gayoso, Agnieszka C, Nguyễn Ngọc Khánh Documentation contributions : Michal Čihař, nijel, Kartik Ohri, Paul Harriet Asiñero # changes/contributors/5.13.2.md Code contributions : Michal Čihař Translations contributions : Divarrek, VfBFan Documentation contributions : Michal Čihař, nijel # changes/contributors/5.13.3.md Code contributions : Michal Čihař, Benjamin Alan Jamie, Raphael Michel, nijel Translations contributions : Michal Čihař, eulalio, Zahid Rizky Fakhri, Divarrek, Sam Plimmer, amano, Sketch6580, Manuela Silva, Aindriú Mac Giolla Eoin, Максим Горпиніч, Milo Ivir, qywter11 qywter11, 大学没毕业, Changseop Yeom, Marija Grineviciute Documentation contributions : Michal Čihař, Benjamin Alan Jamie, Raphael Michel, nijel # changes/contributors/5.13.md Code contributions : Michal Čihař, nijel, michael-smt, Kartik Ohri, مهدي الوالي, Benjamin Alan Jamie, Gersona, KarenKonou, Julian Wachholz, Jana, softworkz, Luc Didry, Paul Harriet Asiñero, Wouter van Os, Martin Komara, Karen Konou, Pavan Chilukuri Translations contributions : Emin Tufan Çetin, VfBFan, 大王叫我来巡山, Horus68, Aindriú Mac Giolla Eoin, Zulfar, Сергей, Besnik Bleta, Andi Chandler, Drugi Sapog, Eisuke Kawashima, wang, தமிழ்நேரம், Abduqadir Abliz, Yago Raña Gayoso, Manuela Silva, Arantxa, Linerly, Dick Groskamp, John, Peter Vančo, Jim Kats, WaldiS, caendeith, Michal Čihař, Florent, RViktor, hugoalh, Arun K Varghese, Wael Ibrahim, Juno Takano, Chang-Chia Tseng, eulalio, Fjuro, jonnysemon, Michael Neuendorf, Shizeeg Unadequatov, oxisol, Pierfrancesco Passerini, 大学没毕业, Любомир Василев, Ильсур Фаритович Ирназаров, Rafael Fontenelle, Yu Ting, J. Lavoie, Ilsur Irnazarov, Poesty Li, Xentrox Aero, amano, ButterflyOfFire, gfbdrgn, Zahid Rizky Fakhri, searinminecraft, Miguel A. Bouzada, pan93412, Mohammed Al Otaibi, Pexauteau Santander, Avi Markovitz, Helder Santana, qtm, Christian Wia, Ricky Tigg, Priit Jõerüüt, LucasMZ, VisionR1, ssantos, Yauhen, Clément Lyonnet, yangyangdaji, Максим Горпиніч, Matthaiks, Agnieszka C, Aleš Hakl, Yaron Shahrabani, Massimo Pissarello, 이정희, Dinh Nguyen, Martin Srebotnjak, Thunderstrike116, sletego, Sketch6580, 안정언, AlaxLima, Deniil, Tuomas Hietala, Λευθέρης Τρόμπακας, M. D. Kulkarni (MDK), Golubev Alexander Documentation contributions : Michal Čihař, nijel, Benjamin Alan Jamie, Julian Wachholz, Jana, Nik Clayton, Gersona, softworkz, Paul Harriet Asiñero, Kartik Ohri, Martin Komara, KarenKonou, Martin Trigaux, Pavan Chilukuri # changes/contributors/5.14.1.md Code contributions : Michal Čihař, Karen Konou, Gersona Translations contributions : Agnieszka C, Žiga Deisinger, Anthony Guéchoum, VfBFan, eulalio, Zahid Rizky Fakhri, Максим Горпиніч, Fjuro, Aindriú Mac Giolla Eoin, Peter Vančo, Dick Groskamp, Kyotaro Iijima, Pavel Miniutka, delvani, 大王叫我来巡山, Kaya Zeren, Øjvind Fritjof Arnfred, cat, mdfaruk896852-code, Michal Čihař, GitHub webhook, Besnik Bleta, Horus68, Hotripak, Aitor Astorga, Massimo Pissarello, Rafael Fontenelle, Sketch6580, Любомир Василев, Danial Behzadi, Milo Ivir, 大学没毕业, Francisco Serrador, hoanghuy309, Arantxa, Denys Nykula, Martin Srebotnjak, Andi Chandler, Ricky Tigg, Kevin Zhang, Nataniel Dika Kurniawan Documentation contributions : Michal Čihař, DeMiro5001, Gersona, Steffen # changes/contributors/5.14.2.md Code contributions : Michal Čihař Documentation contributions : Michal Čihař # changes/contributors/5.14.3.md Code contributions : Michal Čihař Documentation contributions : Michal Čihař # changes/contributors/5.14.md Code contributions : Michal Čihař, softworkz, Gersona, Benjamin Alan Jamie, Kartik Ohri, Kai Kewley, Raphael Michel, Dmytro Doroshenko, michael-smt, IoeCmcomc, Karen Konou, Juhari Yusuf Fatahillah, eulalio, Sketch6580 Translations contributions : Michal Čihař, eulalio, Zahid Rizky Fakhri, Divarrek, Sam Plimmer, amano, Sketch6580, Manuela Silva, Aindriú Mac Giolla Eoin, Максим Горпиніч, Milo Ivir, qywter11 qywter11, 大学没毕业, Changseop Yeom, Marija Grineviciute, Peter Vančo, Laurent FAVOLE, Сергей, Royston Shufflebotham, Massimo Pissarello, Emin Tufan Çetin, Juno Takano, Horus68, Martin Srebotnjak, Altos, ovl-1, 이정희, Yauhen, cat, Jessica Patricio, Alejandro Moctezuma, Kristijan "Fremen" Velkovski, Liviu Roman, Sveinn í Felli, Yamin Siahmargooei, Besnik Bleta, Øjvind Fritjof Arnfred, Danial Behzadi, Miguel A. Bouzada, CRISTIAN ANDREI, Denis96, Ldm Public, ROSPL-GR2-2025, Dick Groskamp, Jim Kats, Graaati, coronabond, VfBFan, Любомир Василев, GitHub webhook, Agnieszka C, Arif Budiman, Yaron Shahrabani, Karen Konou, Kartik Ohri, Juhari Yusuf Fatahillah, Дмитрий Михирев, Fjuro, Yago Raña Gayoso Documentation contributions : Michal Čihař, Gersona, Kai Kewley, Raphael Michel, Benjamin Alan Jamie, michael-smt, softworkz, Karen Konou, Kartik Ohri, Juhari Yusuf Fatahillah, eulalio, Sketch6580 # changes/contributors/5.15.1.md Code contributions : Michal Čihař, Karen Konou, Kartik Ohri, ZhuHengjin, Edison, aditi-agni, aditi, Edison Dao, biplopghimire Translations contributions : eulalio, Yauhen, Emin Tufan Çetin, Priit Jõerüüt, Любомир Василев, Fjuro, Zahid Rizky Fakhri, Takeru Mikenu, ButterflyOfFire, 김인수, Manuela Silva, Pierfrancesco Passerini, Michal Čihař, 大王叫我来巡山, Dick Groskamp, Максим Горпиніч, Matthaiks, γλωσσολαλιά, Turkish Language Team 🇹🇷, Besnik Bleta, Massimo Pissarello, មនុញ្ញ - MᴇᴀнNսɴн, Jim Kats, Aindriú Mac Giolla Eoin, VfBFan Documentation contributions : Michal Čihař, ZhuHengjin, Edison, aditi-agni, aditi, Edison Dao, biplopghimire # changes/contributors/5.15.2.md Code contributions : Michal Čihař, Kartik Ohri, Karen Konou, Marek Lukášík, shyraptor, Korpyc, Benjamin Alan Jamie Translations contributions : Jim Kats, Horus68, Francisco Serrador, VfBFan, Fjuro, Andi Chandler, Eduard Ereza Martínez, Takeru Mikenu, eulalio, Mickaël Binos, Любомир Василев, Peter Vančo, Mateus Liberale Gomes, Hanu E., Pierfrancesco Passerini, amano, Blueberry, ButterflyOfFire, Basheer Radman, therealmate, មនុញ្ញ - MᴇᴀнNսɴн, தமிழ்நேரம், EdoAug, Zahid Rizky Fakhri, Milo Ivir, Kristoffer Grundström, searinminecraft, Kyotaro Iijima, adecorte, Priit Jõerüüt, Rhoslyn Prys, Shah Zaman Pathan, Daniel Nylander, Michal Čihař, Kristijan "Fremen" Velkovski, Aindriú Mac Giolla Eoin, Tuomas Hietala, 이정희, pan93412, Anusuk Sangubon, پرویز قادر, Fulup Jakez, Matthaiks, Besnik Bleta, Hotripak, 大王叫我来巡山, Agnieszka C Documentation contributions : Michal Čihař, Kartik Ohri, michael-smt, Marek Lukášík, shyraptor, Korpyc, alexis-pinon, Benjamin Alan Jamie # changes/contributors/5.15.md Code contributions : Michal Čihař, michael-smt, Steven Loria, Tudor Gradinaru, Karen Konou, Gersona, Miguel A. Bouzada, Kartik Ohri, Florian, Abtin, Aaditya Joshi, Urtzi Odriozola, Cakex2005, was000, KamikazEr101 Translations contributions : Miguel A. Bouzada, Turkish Language Team 🇹🇷, Francisco Serrador, hoanghuy309, Priit Jõerüüt, Ldm Public, eulalio, ssantos, Christian Wia, Andi Chandler, Joel A, Peter Vančo, Dick Groskamp, Besnik Bleta, Dũng Vũ, Nicola Bortoletto, Ricky Tigg, Chang-Chia Tseng, 大学没毕业, Yaron Shahrabani, Karen Konou, Michal Čihař, Minh Tâm Nguyễn, VfBFan, Miniontoby, pan93412, ButterflyOfFire, 이정희, Wirjadisastra Wiki, Sketch6580, liilliil, dreigiau, Blueberry, Jim Kats, Arif Budiman, marvel at flowers, 大王叫我来巡山, Golubev Alexander, Alyaksandr Koshal, Yauhen, 109247019824, Сергей, Manuela Silva, ابْنُ السَدِيمِ, Changseop Yeom, Daniel Nylander, Kristoffer Grundström, Annamurat Ovezov, gattyan61, Fulup Jakez, Milo Ivir, پرویز قادر, Xusi Fons, Anusuk Sangubon, Matthaiks, Gašper Pintar, Максим Горпиніч, Aindriú Mac Giolla Eoin, Fjuro, Любомир Василев, Massimo Pissarello, Pierfrancesco Passerini, Mikenu Takeru, Marazm Mamazm, Takeru Mikenu, Emin Tufan Çetin, Zahid Rizky Fakhri, Serhii Horichenko, Agnieszka C, WaldiS Documentation contributions : Michal Čihař, michael-smt, Tudor Gradinaru, Gersona, Karen Konou, Kartik Ohri, Abtin, Aaditya Joshi, Urtzi Odriozola, Cakex2005, was000, KamikazEr101 # changes/contributors/5.16.1.md Code contributions : Michal Čihař, Simon Urli, Karen Konou, Kartik Ohri, Hendrik Leethaus Translations contributions : Heimen Stoffels, Michal Čihař, delvani, Yaron Shahrabani, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Priit Jõerüüt, Zahid Rizky Fakhri, Pierfrancesco Passerini, Massimo Pissarello, Romhányi-Kakucska Viktor, Mickaël Binos, Milo Ivir, Blueberry, 大王叫我来巡山, VfBFan, Besnik Bleta, Nikolay Korotkiy, Pavel Borecki, Matthaiks, Agnieszka C, Emin Tufan Çetin, Agustina Giselle, Fjuro, RViktor, ojppe, eulalio, Pavel Miniutka, Kristoffer Grundström, Aindriú Mac Giolla Eoin, reducedradius, Максим Горпиніч, Руслан Пузич, Francisco Serrador, Kyotaro Iijima, Petr Kadlec, தமிழ்நேரம், Dick Groskamp, PICOPress, justcontributor, Valentin Ljuba, Daniel Nylander, Arantxa, Marino Díaz, Artemka Documentation contributions : Michal Čihař, michael-smt, Kartik Ohri, Hendrik Leethaus # changes/contributors/5.16.2.md Code contributions : Michal Čihař, Karen Konou, Kartik Ohri Documentation contributions : Michal Čihař # changes/contributors/5.16.md Code contributions : Michal Čihař, Kartik Ohri, Karen Konou, Serrano Pereira, moonchoe, softworkz, Gersona, hugorezende, Hendrik Leethaus, AliceVisek, devimarj, evanjhoward11, Zahid Rizky Fakhri, Francisco Serrador Translations contributions : தமிழ்நேரம், Andi Chandler, Daniel Nylander, Michal Čihař, VfBFan, ButterflyOfFire, Emin Tufan Çetin, eulalio, Milo Ivir, Yuri Chornoivan, 大王叫我来巡山, Zahid Rizky Fakhri, Peter Vančo, Kyotaro Iijima, amano, Hyeonjeong Lee, Yaron Shahrabani, Massimo Pissarello, Blueberry, Aindriú Mac Giolla Eoin, CRISTIAN ANDREI, Максим Горпиніч, Shah Zaman Pathan, Eduard Ereza Martínez, Alexis Launay, Luis Carlos González Morales, AlaxLima, Andrei Stepanov, Pierfrancesco Passerini, Valentin Ljuba, Anusuk Sangubon, Supaplex, Besnik Bleta, Matthaiks, Agnieszka C, Sketch6580, Mickaël Binos, U G, Kristoffer Grundström, Fjuro, 109247019824, Miguel A. Bouzada, Jim Spentzos, Fulup Jakez, Jim Kats, Omer I.S., nautilusx, jonnysemon, Martin Srebotnjak, Umida Hikmatilla, Arif Budiman, Ldm Public, pan93412, Heimen Stoffels, Romhányi-Kakucska Viktor, Pedro Leite, RViktor, Dick Groskamp, Alexander Gabilondo, Любомир Василев, Francisco Serrador, devimarj, Cyrille Duverne, 大学没毕业, Hotripak, delvani, A J. Documentation contributions : Michal Čihař, Kartik Ohri, moonchoe, Karen Konou, softworkz, Serhii H., shorelskyi, Gersona, hugorezende, Hendrik Leethaus, AliceVisek, devimarj, evanjhoward11 # changes/contributors/5.17.1.md Code contributions : Michal Čihař, Gersona, Karen Konou, michael-smt Translations contributions : Michal Čihař, Besnik Bleta, Kristoffer Grundström, Francisco Serrador, ButterflyOfFire, anas agha, Zahid Rizky Fakhri, pan93412, Hyeonjeong Lee, VfBFan, 大王叫我来巡山, Yuri Chornoivan, LucasMZ, Átila França, Rafael Fontenelle, Aindriú Mac Giolla Eoin, UDP, Blueberry, Hotripak, Matthaiks, Agnieszka C, Priit Jõerüüt, Martin Srebotnjak, Fjuro, Andrei Stepanov, Mickaël Binos, IEEE-754, Adrian Reyes, bovirus, Max Kleinehelleforth, justcontributor, Yago Raña Gayoso, Horus68, Любомир Василев, CYAXXX, Andi Chandler, Adam Havránek, Kyotaro Iijima, Arif Budiman, ovl-1, Laitei, Jim Kats, Omer I.S., Fulup Jakez, ojppe, Julien Humbert, Jim Spentzos, Sketch6580, Dick Groskamp, 王晨旭, Frank Paul Silye, Anucha Hlownonkor, Milo Ivir Documentation contributions : Michal Čihař, Gersona, michael-smt # changes/contributors/5.17.md Code contributions : Michal Čihař, michael-smt, Kartik Ohri, bogusdominica, Karen Konou, Sven Hüster, Gersona, subnix, matilde-gillia, Steven Loria, felixfon, baltenaxis, Claw Explorer, Samuel Gomes Translations contributions : PICOPress, Blueberry, Deleted User, Francisco Serrador, eulalio, Pavel Miniutka, Amir E. Aharoni, hoanghuy309, nKsyn, Jim Kats, Martin Srebotnjak, Zahid Rizky Fakhri, symegac, Francesco Marinucci, Michal Čihař, Hyeonjeong Lee, ovl-1, Tarás Lavrentiev, Edson Wolf, Yuri Chornoivan, Omer I.S., Arantxa, Tuomas Hietala, Milo Ivir, justcontributor, Kristoffer Grundström, Andi Chandler, Andrei Stepanov, ButterflyOfFire, Átila França, Мария Рангелова, EESF-2, CzaroGame, Agnieszka C, Manuela Silva, پرویز قادر, JiZPaper, Fjuro, Alexis Launay, tfr tint, Candied-Ecard, Kyotaro Iijima, Priit Jõerüüt, Matthaiks, Besnik Bleta, delvani, Mickaël Binos, VfBFan, UDP, Aindriú Mac Giolla Eoin, Adam Havránek, mohammadA, 大王叫我来巡山, Sketch6580, Dick Groskamp, Heimen Stoffels, Yaron Shahrabani, Любомир Василев, Максим Горпиніч, Emin Tufan Çetin, Horus68, Sjur N Moshagen, Peter Vančo, Romhányi-Kakucska Viktor, ZayedRashid, Julien Lepiller, Massimo Pissarello, Jeff Huang, ojppe, தமிழ்நேரம், ibragimov, Sylvestre Ledru, Ldm Public, pan93412, Jernej Pangerc, Luciana Waldbaur, username-generic, jonnysemon, syl, Arif Budiman, Max Kleinehelleforth, Carp300, Yago Raña Gayoso, anas agha, Ettore Atalan Documentation contributions : Michal Čihař, Kartik Ohri, Sven Hüster, Dylan Kiss (dyki), Gersona, michael-smt, matilde-gillia, Steven Loria, baltenaxis, Claw Explorer, Samuel Gomes # changes/contributors/5.7.1.md Code contributions : Michal Čihař, Mehdi El Oualy, Mehdi Eloualy Translations contributions : Michal Čihař, Miguel A. Bouzada, Ldm Public, gallegonovato, Besnik Bleta, Yaron Shahrabani, Alefsander Ribeiro Nascimento, Aindriú Mac Giolla Eoin, Massimo Pissarello, hugoalh, Xzonn, Jose Delvani, 大王叫我来巡山, Сергей, Milo Ivir, VfBFan, Blueberry, Ihor Hordiichuk, Christian Wia, Fjuro, simmon, Chikita Isaac, Oğuz Ersen, 马牛逼(Felix), Sketch6580, Emin Tufan Çetin, Simona Iacob, Andi Chandler, Jorge Gemetto, Assem Askarova, Julien Humbert, Peter Vančo, Wuzzy, ovl-1, Jim Kats, WaldiS, Nicolas MAGERE, Eduard Ereza Martínez, Kaya Zeren, Pierfrancesco Passerini, Dick Groskamp, Chang-Chia Tseng, Anon, Priit Jõerüüt, 이정희, Taufik Adi Wicaksono, Balázs Úr, Saranpat Visetrit, Vlăduț Ilie Documentation contributions : Michal Čihař, Robin # changes/contributors/5.7.2.md Code contributions : Michal Čihař, Mehdi Eloualy Translations contributions : Christian Wia, Ihor Hordiichuk, Hanaa MSB, Hoseok Seo, پرویز قادر, Reno Tx, Jose Delvani, Artemka, Blueberry, Elisabeth Pieringer, VfBFan, ɴᴇᴋᴏ, Andi Chandler, Yaron Shahrabani, Michal Čihař, Miguel A. Bouzada, gallegonovato, Besnik Bleta, Sketch6580, Aindriú Mac Giolla Eoin, Fjuro, 大王叫我来巡山 Documentation contributions : Michal Čihař # changes/contributors/5.7.md Code contributions : Michal Čihař, João Ferreira, Paul Harriet Asiñero, gers, Benjamin Alan Jamie, John R. D’Orazio, Tobias Schlatter, Max Wittig, Mehdi Eloualy, michael-smt, Jochen Sprickerhof, Vincent, Dwayne Bailey, Bastien Montagne Translations contributions : Jose Delvani, Julija Juli, Andi Chandler, pan93412, Milo Ivir, gallegonovato, ngocanhtve, kapatych, Marco Ciampa, Balázs Úr, Artemka, Ricky From Hong Kong, Massimo Pissarello, dreigiau, Ihor Hordiichuk, Allan Nordhøy, Selyan Sliman Amiri, iwonder, Besnik Bleta, Nathan, yangyangdaji, Priit Jõerüüt, Aindriú Mac Giolla Eoin, Diego Beraldin, Marino Díaz, پرویز قادر, Horus68, ssantos, M. D. Kulkarni (MDK), Miguel A. Bouzada, A. Bento, mpt.c, ovl-1, Fjuro, Luna, Antônio Breno, alefsanderribeiro, Alefsander Ribeiro Nascimento, Ian Perdiansah, amano, Petter Reinholdtsen, Malik Shoaib, Emin Tufan Çetin, John kh, Сергей, tygyh, Semih, Balázs Meskó, Martin Najemi, Yaron Shahrabani, Rhoslyn Prys Documentation contributions : Michal Čihař, Benjamin Alan Jamie, Paul Harriet Asiñero, Allan Nordhøy, Max Wittig, Mehdi Eloualy, Vincent, LE MEILLAT, gers, lotigara # changes/contributors/5.8.1.md Code contributions : Michal Čihař Documentation contributions : Michal Čihař # changes/contributors/5.8.2.md Code contributions : Michal Čihař, Paul Harriet Asiñero, michael-smt, gers, Mehdi El Oualy Translations contributions : VfBFan, 大王叫我来巡山, Любомир Василев, Miguel A. Bouzada, Besnik Bleta, Yuri Chornoivan, Wuzzy, Michal Čihař, gallegonovato, Vin, Blueberry, befag74614, Agnieszka C, Rhoslyn Prys, Aindriú Mac Giolla Eoin, Fulup Jakez, Christian Wia, ssantos, Vlăduț Ilie, Fjuro, amano, Andi Chandler, Peter Vančo, test-session, famese, Yaron Shahrabani, Geert-Jan Knapen, Ricky From Hong Kong, Tymofii Lytvynenko, Dick Groskamp, Horus68, Reno Tx, Jim Kats, Massimo Pissarello, Florent, Ihor Hordiichuk, hugoalh, Vaclovas Intas, Milo Ivir, Jim Spentzos, Dženan, Claudio Filho F Filho, 大学没毕业, پرویز قادر Documentation contributions : Michal Čihař, Benjamin Alan Jamie, gers, gersona # changes/contributors/5.8.3.md Code contributions : Michal Čihař, Mehdi El Oualy Documentation contributions : Michal Čihař # changes/contributors/5.8.4.md Code contributions : Michal Čihař, gersona, Mehdi El Oualy Documentation contributions : Michal Čihař # changes/contributors/5.8.md Code contributions : Michal Čihař, Mehdi Eloualy, Mehdi El Oualy, gers, michael-smt, ButterflyOfFire, Saurmanđal, Paul Harriet Asiñero, Ingo Brückl, Vincent, Jakub Boukal, nijel Translations contributions : gallegonovato, Jose Delvani, Andi Chandler, Massimo Pissarello, Christian Wia, Kaya Zeren, Muhammad B Madara, Assem Askarova, pan93412, Reno Tx, Sagiri, symegac, Allan Nordhøy, VfBFan, Peter Vančo, Yaron Shahrabani, Dick Groskamp, Besnik Bleta, Masahiro Fujimoto, Kyotaro Iijima, ButterflyOfFire, Michal Čihař, پرویز قادر, amano, Mirka Danylenko, Yuri Chornoivan, Milo Ivir, Blueberry, Julien Humbert, JY3, Ricky Tigg, Hotripak, Vin, Fjuro, 大王叫我来巡山, Miguel A. Bouzada, Любомир Василев, Aindriú Mac Giolla Eoin, Coool (github.com/Coool), Ihor Hordiichuk, Martin Srebotnjak, Сергей, jonnysemon, Wuzzy, Ldm Public, Nived, Hoseok Seo, Tuomas Hietala, Andrey, solokot, Agnieszka C, Luna, Alan Marques, ssantos, Yamin Siahmargooei, Vaclovas Intas, Linerly, Victor K, Rhoslyn Prys, Iker García Calviño, Milan Šalka, Justin Nogossek, Floure, Eduardo Malaspina, Oğuz Ersen, Priit Jõerüüt, Jeff Huang Documentation contributions : Michal Čihař, gers, Jorge, michael-smt, Mehdi Eloualy, Paul Harriet Asiñero, Ingo Brückl, Mehdi El Oualy # changes/contributors/5.9.1.md Code contributions : Michal Čihař Documentation contributions : Michal Čihař # changes/contributors/5.9.2.md Code contributions : Michal Čihař, Gersona Translations contributions : Horus68, Peter Vančo, cat, Rafael Fontenelle, Blueberry, Christian Wia, 大学没毕业, Yılmaz Durmaz, gallegonovato, Miguel A. Bouzada, VfBFan, Michal Čihař, Максим Горпиніч, Besnik Bleta, Aindriú Mac Giolla Eoin, Yaron Shahrabani, Fjuro, 大王叫我来巡山, Massimo Pissarello, Любомир Василев Documentation contributions : Michal Čihař, Rafael Fontenelle # changes/contributors/5.9.md Code contributions : Michal Čihař, Mehdi El Oualy, Paul Harriet Asiñero, Yusi Z, Mehdi Eloualy, gers, nijel, michael-smt, gersona, Gersona Translations contributions : Michal Čihař, Besnik Bleta, gallegonovato, Blueberry, cat, Fjuro, Sketch6580, Massimo Pissarello, Linerly, 大王叫我来巡山, 大学没毕业, Yuri Chornoivan, VfBFan, JY3, Miguel A. Bouzada, Dick Groskamp, Aindriú Mac Giolla Eoin, Andi Chandler, Kristoffer Grundström, Christian Wia, Claudio Filho F Filho, Yaron Shahrabani, Milo Ivir, Kaya Zeren, Neaten “Awrawman” Awrawman, Agnieszka C, Jeff Huang, Fulup Jakez, Milan Šalka, nautilusx, Любомир Василев, notlin4, immeteor2, kowih83264, WaldiS, ssantos, Reno Tx, Johan Jacobsson, Peter Vančo, Sveinn í Felli, Oliver, Yvan Zo, meshari alnaim, தமிழ்நேரம், searinminecraft, Jwtiyar Nariman, gitelo4516, Vision, Chang-Chia Tseng, Kyotaro Iijima, Ricky Tigg, ei9, Martin Srebotnjak, Horus68, 이정희, Максим Горпиніч, Sylvain Pichon, Ldm Public, Слободан Симић(Slobodan Simić), Priit Jõerüüt, Hugo, UTUMI Hirosi, Сергей, symegac, Winston Sung, ChinskiKaczynski, Rafael Fontenelle Documentation contributions : Michal Čihař, Paul Harriet Asiñero, gers, michael-smt, Benjamin Alan Jamie, Gersona, Mehdi Eloualy # changes/v0.md # Weblate 0.x series ## Weblate 0.9 *Released on April 18th 2012.* * Fixed import of unknown languages. * Improved listing of nearby messages. * Improved several checks. * Documentation updates. * Added definition for several more languages. * Various code cleanups. * Documentation improvements. * Changed file layout. * Update helper scripts to Django 1.4. * Improved navigation while translating. * Better handling of po file renames. * Better validation while creating component. * Integrated full setup into syncdb. * Added list of recent changes to all translation pages. * Check for untranslated strings ignores format string only messages. ## Weblate 0.8 *Released on April 3rd 2012.* * Replaced own full text search with Whoosh. * Various fixes and improvements to checks. * New command updatechecks. * Lot of translation updates. * Added dictionary for storing most frequently used terms. * Added /admin/report/ for overview of repositories status. * Machine translation services no longer block page loading. * Management interface now contains also useful actions to update data. * Records log of changes made by users. * Ability to postpone commit to Git to generate less commits from single user. * Possibility to browse failing checks. * Automatic translation using already translated strings. * New about page showing used versions. * Django 1.4 compatibility. * Ability to push changes to remote repo from web interface. * Added review of translations done by others. ## Weblate 0.7 *Released on February 16th 2012.* * Direct support for GitHub notifications. * Added support for cleaning up orphaned checks and translations. * Displays nearby strings while translating. * Displays similar strings while translating. * Improved searching for string. ## Weblate 0.6 *Released on February 14th 2012.* * Added various checks for translated messages. * Tunable access control. * Improved handling of translations with new lines. * Added client side sorting of tables. * Please check upgrading instructions in case you are upgrading. ## Weblate 0.5 *Released on February 12th 2012.* * Support for machine translation using following online services: : * [Apertium APy](https://docs.weblate.org/en/latest/admin/machine.md#mt-apertium-apy) * [Azure AI Translator](https://docs.weblate.org/en/latest/admin/machine.md#mt-microsoft-translator) * [MyMemory](https://docs.weblate.org/en/latest/admin/machine.md#mt-mymemory) * Several new translations. * Improved merging of upstream changes. * Better handle concurrent git pull and translation. * Propagating works for fuzzy changes as well. * Propagating works also for file upload. * Fixed file downloads while using FastCGI (and possibly others). ## Weblate 0.4 *Released on February 8th 2012.* * Added usage guide to documentation. * Fixed API hooks not to require CSRF protection. ## Weblate 0.3 *Released on February 8th 2012.* * Better display of source for plural translations. * New documentation in Sphinx format. * Displays secondary languages while translating. * Improved error page to give list of existing projects. * New per language stats. ## Weblate 0.2 *Released on February 7th 2012.* * Improved validation of several forms. * Warn users on profile upgrade. * Remember URL for login. * Naming of text areas while entering plural forms. * Automatic expanding of translation area. ## Weblate 0.1 *Released on February 6th 2012.* * Initial release. # changes/v1.md # Weblate 1.x series ## Weblate 1.9 *Released on May 6th 2014.* * Django 1.6 compatibility. * No longer maintained compatibility with Django 1.4. * Management commands for locking/unlocking translations. * Improved support for Qt TS files. * Users can now delete their account. * Avatars can be disabled. * Merged first and last name attributes. * Avatars are now fetched and cached server side. * Added support for shields.io badge. ## Weblate 1.8 *Released on November 7th 2013.* * Please check manual for upgrade instructions. * Nicer listing of project summary. * Better visible options for sharing. * More control over anonymous users privileges. * Supports login using third party services, check manual for more details. * Users can login by e-mail instead of username. * Documentation improvements. * Improved source strings review. * Searching across all strings. * Better tracking of source strings. * Captcha protection for registration. ## Weblate 1.7 *Released on October 7th 2013.* * Please check manual for upgrade instructions. * Support for checking Python brace format string. * Per component customization of quality checks. * Detailed per translation stats. * Changed way of linking suggestions, checks and comments to strings. * Users can now add text to commit message. * Support for subscribing on new language requests. * Support for adding new translations. * Widgets and charts are now rendered using Pillow instead of Pango + Cairo. * Add status badge widget. * Dropped invalid text direction check. * Changes in dictionary are now logged in history. * Performance improvements for translation view. ## Weblate 1.6 *Released on July 25th 2013.* * Nicer error handling on registration. * Browsing of changes. * Fixed sorting of machine translation suggestions. * Improved support for MyMemory machine translation. * Added support for Amagama machine translation. * Various optimizations on frequently used pages. * Highlights searched phrase in search results. * Support for automatic fixups while saving the message. * Tracking of translation history and option to revert it. * Added support for Google Translate API. * Added support for managing SSH host keys. * Various form validation improvements. * Various quality checks improvements. * Performance improvements for import. * Added support for voting on suggestions. * Cleanup of admin interface. ## Weblate 1.5 *Released on April 16th 2013.* * Please check manual for upgrade instructions. * Added public user pages. * Better naming of plural forms. * Added support for TBX export of glossary. * Added support for Bitbucket notifications. * Activity charts are now available for each translation, language or user. * Extended options of import_project admin command. * Compatible with Django 1.5. * Avatars are now shown using libravatar. * Added possibility to pretty print JSON export. * Various performance improvements. * Indicate failing checks or fuzzy strings in progress bars for projects or languages as well. * Added support for custom pre-commit hooks and committing additional files. * Rewritten search for better performance and user experience. * New interface for machine translations. * Added support for monolingual po files. * Extend amount of cached metadata to improve speed of various searches. * Now shows word counts as well. ## Weblate 1.4 *Released on January 23rd 2013.* * Fixed deleting of checks/comments on string deletion. * Added option to disable automatic propagation of translations. * Added option to subscribe for merge failures. * Correctly import on projects which needs custom ttkit loader. * Added sitemaps to allow easier access by crawlers. * Provide direct links to string in notification e-mails or feeds. * Various improvements to admin interface. * Provide hints for production setup in admin interface. * Added per language widgets and engage page. * Improved translation locking handling. * Show code snippets for widgets in more variants. * Indicate failing checks or fuzzy strings in progress bars. * More options for formatting commit message. * Fixed error handling with machine translation services. * Improved automatic translation locking behaviour. * Support for showing changes from previous source string. * Added support for substring search. * Various quality checks improvements. * Support for per project ACL. * Basic code coverage by unit tests. ## Weblate 1.3 *Released on November 16th 2012.* * Compatibility with PostgreSQL database backend. * Removes languages removed in upstream git repository. * Improved quality checks processing. * Added new checks (BBCode, XML markup and newlines). * Support for optional rebasing instead of merge. * Possibility to relocate Weblate (for example to run it under /weblate path). * Support for manually choosing file type in case autodetection fails. * Better support for Android resources. * Support for generating SSH key from web interface. * More visible data exports. * New buttons to enter some special characters. * Support for exporting dictionary. * Support for locking down whole Weblate installation. * Checks for source strings and support for source strings review. * Support for user comments for both translations and source strings. * Better changes log tracking. * Changes can now be monitored using RSS. * Improved support for RTL languages. ## Weblate 1.2 *Released on August 14th 2012.* * Weblate now uses South for database migration, please check upgrade instructions if you are upgrading. * Fixed minor issues with linked git repos. * New introduction page for engaging people with translating using Weblate. * Added widgets which can be used for promoting translation projects. * Added option to reset repository to origin (for privileged users). * Project or component can now be locked for translations. * Possibility to disable some translations. * Configurable options for adding new translations. * Configuration of git commits per project. * Simple antispam protection. * Better layout of main page. * Support for automatically pushing changes on every commit. * Support for e-mail notifications of translators. * List only used languages in preferences. * Improved handling of not known languages when importing project. * Support for locking translation by translator. * Optionally maintain `Language-Team` header in po file. * Include some statistics in about page. * Supports (and requires) django-registration 0.8. * Caching counts of strings with failing checks. * Checking of requirements during setup. * Documentation improvements. ## Weblate 1.1 *Released on July 4th 2012.* * Improved several translations. * Better validation while creating component. * Added support for shared git repositories across components. * Do not necessary commit on every attempt to pull remote repo. * Added support for offloading indexing. ## Weblate 1.0 *Released on May 10th 2012.* * Improved validation while adding/saving component. * Experimental support for Android component files (needs patched ttkit). * Updates from hooks are run in background. * Improved installation instructions. * Improved navigation in dictionary. # changes/v2.md # Weblate 2.x series ## Weblate 2.20 *Released on April 4th 2018.* * Improved speed of cloning subversion repositories. * Changed repository locking to use third party library. * Added support for downloading only strings needing action. * Added support for searching in several languages at once. * New add-on to configure gettext output wrapping. * New add-on to configure JSON formatting. * Added support for authentication in API using RFC 6750 compatible Bearer authentication. * Added support for automatic translation using machine translation services. * Added support for HTML markup in whiteboard messages. * Added support for mass changing state of strings. * Translate-toolkit at least 2.3.0 is now required, older versions are no longer supported. * Added built-in translation memory. * Added componentlists overview to dashboard and per component list overview pages. * Added support for DeepL machine translation service. * Machine translation results are now cached inside Weblate. * Added support for reordering committed changes. ## Weblate 2.19.1 *Released on February 20th 2018.* * Fixed migration issue on upgrade from 2.18. * Improved file upload API validation. ## Weblate 2.19 *Released on February 15th 2018.* * Fixed imports across some file formats. * Display human friendly browser information in audit log. * Added TMX exporter for files. * Various performance improvements for loading translation files. * Added option to disable access management in Weblate in favor of Django one. * Improved glossary lookup speed for large strings. * Compatibility with django_auth_ldap 1.3.0. * Configuration errors are now stored and reported persistently. * Honor ignore flags in whitespace autofixer. * Improved compatibility with some Subversion setups. * Improved built-in machine translation service. * Added support for SAP Translation Hub service. * Added support for Microsoft Terminology service. * Removed support for advertisement in notification e-mails. * Improved translation progress reporting at language level. * Improved support for different plural formulas. * Added support for Subversion repositories not using stdlayout. * Added add-ons to customize translation workflows. ## Weblate 2.18 *Released on December 15th 2017.* * Extended contributor stats. * Improved configuration of special characters virtual keyboard. * Added support for DTD file format. * Changed keyboard shortcuts to less likely collide with browser/system ones. * Improved support for approved flag in XLIFF files. * Added support for not wrapping long strings in gettext PO files. * Added button to copy permalink for current translation. * Dropped support for Django 1.10 and added support for Django 2.0. * Removed locking of translations while translating. * Added support for adding new strings to monolingual translations. * Added support for translation workflows with dedicated reviewers. ## Weblate 2.17.1 *Released on October 13th 2017.* * Fixed running testsuite in some specific situations. * Locales updates. ## Weblate 2.17 *Released on October 13th 2017.* * Weblate by default does shallow Git clones now. * Improved performance when updating large translation files. * Added support for blocking certain e-mails from registration. * Users can now delete their own comments. * Added preview step to search and replace feature. * Client side persistence of settings in search and upload forms. * Extended search capabilities. * More fine grained per project ACL configuration. * Default value of BASE_DIR has been changed. * Added two step account removal to prevent accidental removal. * Project access control settings is now editable. * Added optional spam protection for suggestions using Akismet. ## Weblate 2.16 *Released on August 11th 2017.* * Various performance improvements. * Added support for nested JSON format. * Added support for WebExtension JSON format. * Fixed git exporter authentication. * Improved CSV import in certain situations. * Improved look of Other translations widget. * The max-length checks is now enforcing length of text in form. * Make the commit_pending age configurable per component. * Various user interface cleanups. * Fixed component/project/site wide search for translations. ## Weblate 2.15 *Released on June 30th 2017.* * Show more related translations in other translations. * Add option to see translations of current string to other languages. * Use 4 plural forms for Lithuanian by default. * Fixed upload for monolingual files of different format. * Improved error messages on failed authentication. * Keep page state when removing word from glossary. * Added direct link to edit secondary language translation. * Added Perl format quality check. * Added support for rejecting reused passwords. * Extended toolbar for editing RTL languages. ## Weblate 2.14.1 *Released on May 24th 2017.* * Fixed possible error when paginating search results. * Fixed migrations from older versions in some corner cases. * Fixed possible CSRF on project watch and unwatch. * The password reset no longer authenticates user. * Fixed possible CAPTCHA bypass on forgotten password. ## Weblate 2.14 *Released on May 17th 2017.* * Add glossary entries using AJAX. * The logout now uses POST to avoid CSRF. * The API key token reset now uses POST to avoid CSRF. * Weblate sets Content-Security-Policy by default. * The local editor URL is validated to avoid self-XSS. * The password is now validated against common flaws by default. * Notify users about important activity with their account such as password change. * The CSV exports now escape potential formulas. * Various minor improvements in security. * The authentication attempts are now rate limited. * Suggestion content is stored in the history. * Store important account activity in audit log. * Ask for password confirmation when removing account or adding new associations. * Show time when suggestion has been made. * There is new quality check for trailing semicolon. * Ensure that search links can be shared. * Included source string information and screenshots in the API. * Allow to overwrite translations through API upload. ## Weblate 2.13.1 *Released on Apr 12th 2017.* * Fixed listing of managed projects in profile. * Fixed migration issue where some permissions were missing. * Fixed listing of current file format in translation download. * Return HTTP 404 when trying to access project where user lacks privileges. ## Weblate 2.13 *Released on Apr 12th 2017.* * Fixed quality checks on translation templates. * Added quality check to trigger on losing translation. * Add option to view pending suggestions from user. * Add option to automatically build component lists. * Default dashboard for unauthenticated users can be configured. * Add option to browse 25 random strings for review. * History now indicates string change. * Better error reporting when adding new translation. * Added per language search within project. * Group ACLs can now be limited to certain permissions. * The per project ACLs are now implemented using Group ACL. * Added more fine grained privileges control. * Various minor UI improvements. ## Weblate 2.12 *Released on Mar 3rd 2017.* * Improved admin interface for groups. * Added support for Yandex Translate API. * Improved speed of site wide search. * Added project and component wide search. * Added project and component wide search and replace. * Improved rendering of inconsistent translations. * Added support for opening source files in local editor. * Added support for configuring visual keyboard with special characters. * Improved screenshot management with OCR support for matching source strings. * Default commit message now includes translation information and URL. * Added support for Joomla translation format. * Improved reliability of import across file formats. ## Weblate 2.11 *Released on Jan 31st 2017.* * Include language detailed information on language page. * Mercurial backend improvements. * Added option to specify translation component priority. * More consistent usage of Group ACL even with less used permissions. * Added WL_BRANCH variable to hook scripts. * Improved developer documentation. * Better compatibility with various Git versions in Git exporter add-on. * Included per project and component stats. * Added language code mapping for better support of Microsoft Translate API. * Moved fulltext cleanup to background job to make translation removal faster. * Fixed displaying of plural source for languages with single plural form. * Improved error handling in import_project. * Various performance improvements. ## Weblate 2.10.1 *Released on Jan 20th 2017.* * Do not leak account existence on password reset form ([**CVE 2017-5537**](https://www.cve.org/CVERecord?id=CVE-2017-5537)). ## Weblate 2.10 *Released on Dec 15th 2016.* * Added quality check to check whether plurals are translated differently. * Fixed GitHub hooks for repositories with authentication. * Added optional Git exporter module. * Support for Microsoft Cognitive Services Translator API. * Simplified project and component user interface. * Added automatic fix to remove control characters. * Added per language overview to project. * Added support for CSV export. * Added CSV download for stats. * Added matrix view for quick overview of all translations. * Added basic API for changes and strings. * Added support for Apertium APy server for machine translations. ## Weblate 2.9 *Released on Nov 4th 2016.* * Extended parameters for createadmin management command. * Extended import_json to be able to handle with existing components. * Added support for YAML files. * Project owners can now configure translation component and project details. * Use “Watched” instead of “Subscribed” projects. * Projects can be watched directly from project page. * Added multi language status widget. * Highlight secondary language if not showing source. * Record suggestion deletion in history. * Improved UX of languages selection in profile. * Fixed showing whiteboard messages for component. * Keep preferences tab selected after saving. * Show source string comment more prominently. * Automatically install Gettext PO merge driver for Git repositories. * Added search and replace feature. * Added support for uploading visual context (screenshots) for translations. ## Weblate 2.8 *Released on Aug 31st 2016.* * Documentation improvements. * Translations. * Updated bundled JavaScript libraries. * Added list_translators management command. * Django 1.8 is no longer supported. * Fixed compatibility with Django 1.10. * Added Subversion support. * Separated XML validity check from XML mismatched tags. * Fixed API to honor HIDE_REPO_CREDENTIALS settings. * Show source change in Zen mode. * Alt+PageUp/PageDown/Home/End now works in Zen mode as well. * Add tooltip showing exact time of changes. * Add option to select filters and search from translation page. * Added UI for translation removal. * Improved behavior when inserting placeables. * Fixed auto locking issues in Zen mode. ## Weblate 2.7 *Released on Jul 10th 2016.* * Removed Google web translate machine translation. * Improved commit message when adding translation. * Fixed Google Translate API for Hebrew language. * Compatibility with Mercurial 3.8. * Added import_json management command. * Correct ordering of listed translations. * Show full suggestion text, not only a diff. * Extend API (detailed repository status, statistics, …). * Testsuite no longer requires network access to test repositories. ## Weblate 2.6 *Released on Apr 28th 2016.* * Fixed validation of components with language filter. * Improved support for XLIFF files. * Fixed machine translation for non English sources. * Added REST API. * Django 1.10 compatibility. * Added categories to whiteboard messages. ## Weblate 2.5 *Released on Mar 10th 2016.* * Fixed automatic translation for project owners. * Improved performance of commit and push operations. * New management command to add suggestions from command-line. * Added support for merging comments on file upload. * Added support for some GNU extensions to C printf format. * Documentation improvements. * Added support for generating translator credits. * Added support for generating contributor stats. * Site wide search can search only in one language. * Improve quality checks for Armenian. * Support for starting translation components without existing translations. * Support for adding new translations in Qt TS. * Improved support for translating PHP files. * Performance improvements for quality checks. * Fixed site wide search for failing checks. * Added option to specify source language. * Improved support for XLIFF files. * Extended list of options for import_project. * Improved targeting for whiteboard messages. * Support for automatic translation across projects. * Optimized fulltext search index. * Added management command for auto translation. * Added placeables highlighting. * Added keyboard shortcuts for placeables, checks and machine translations. * Improved translation locking. * Added quality check for AngularJS interpolation. * Added extensive group based ACLs. * Clarified terminology on strings needing edit (formerly fuzzy). * Clarified terminology on strings needing action and untranslated strings. * Support for Python 3. * Dropped support for Django 1.7. * Dropped dependency on msginit for creating new gettext PO files. * Added configurable dashboard views. * Improved notifications on parse errors. * Added option to import components with duplicate name to import_project. * Improved support for translating PHP files. * Added XLIFF export for dictionary. * Added XLIFF and gettext PO export for all translations. * Documentation improvements. * Added support for configurable automatic group assignments. * Improved adding of new translations. ## Weblate 2.4 *Released on Sep 20th 2015.* * Improved support for PHP files. * Ability to add ACL to anonymous user. * Improved configurability of import_project command. * Added CSV dump of history. * Avoid copy/paste errors with whitespace characters. * Added support for Bitbucket webhooks. * Tighter control on fuzzy strings on translation upload. * Several URLs have changed, you might have to update your bookmarks. * Hook scripts are executed with VCS root as current directory. * Hook scripts are executed with environment variables describing current component. * Add management command to optimize fulltext index. * Added support for error reporting to Rollbar. * Projects now can have multiple owners. * Project owners can manage themselves. * Added support for `javascript-format` used in gettext PO. * Support for adding new translations in XLIFF. * Improved file format autodetection. * Extended keyboard shortcuts. * Improved dictionary matching for several languages. * Improved layout of most of pages. * Support for adding words to dictionary while translating. * Added support for filtering languages to be managed by Weblate. * Added support for translating and importing CSV files. * Rewritten handling of static files. * Direct login/registration links to third-party service if that’s the only one. * Commit pending changes on account removal. * Add management command to change site name. * Add option to configure default committer. * Add hook after adding new translation. * Add option to specify multiple files to add to commit. ## Weblate 2.3 *Released on May 22nd 2015.* * Dropped support for Django 1.6 and South migrations. * Support for adding new translations when using Java Property files. * Allow to accept suggestion without editing. * Improved support for Google OAuth 2.0. * Added support for Microsoft .resx files. * Tuned default robots.txt to disallow big crawling of translations. * Simplified workflow for accepting suggestions. * Added project owners who always receive important notifications. * Allow to disable editing of monolingual template. * More detailed repository status view. * Direct link for editing template when changing translation. * Allow to add more permissions to project owners. * Allow to show secondary language in Zen mode. * Support for hiding source string in favor of secondary language. ## Weblate 2.2 *Released on Feb 19th 2015.* * Performance improvements. * Fulltext search on location and comments fields. * New SVG/JavaScript-based activity charts. * Support for Django 1.8. * Support for deleting comments. * Added own SVG badge. * Added support for Google Analytics. * Improved handling of translation filenames. * Added support for monolingual JSON translations. * Record component locking in a history. * Support for editing source (template) language for monolingual translations. * Added basic support for Gerrit. ## Weblate 2.1 *Released on Dec 5th 2014.* * Added support for Mercurial repositories. * Replaced Glyphicon font by Awesome. * Added icons for social authentication services. * Better consistency of button colors and icons. * Documentation improvements. * Various bugfixes. * Automatic hiding of columns in translation listing for small screens. * Changed configuration of filesystem paths. * Improved SSH keys handling and storage. * Improved repository locking. * Customizable quality checks per source string. * Allow to hide completed translations from dashboard. ## Weblate 2.0 *Released on Nov 6th 2014.* * New responsive UI using Bootstrap. * Rewritten VCS backend. * Documentation improvements. * Added whiteboard for site wide messages. * Configurable strings priority. * Added support for JSON file format. * Fixed generating mo files in certain cases. * Added support for GitLab notifications. * Added support for disabling translation suggestions. * Django 1.7 support. * ACL projects now have user management. * Extended search possibilities. * Give more hints to translators about plurals. * Fixed Git repository locking. * Compatibility with older Git versions. * Improved ACL support. * Added buttons for per language quotes and other special characters. * Support for exporting stats as JSONP. # changes/v3.md # Weblate 3.x series ## Weblate 3.11.3 *Released on March 11th 2020.* * Fixed searching for fields with certain priority. * Fixed predefined query for recently added strings. * Fixed searching returning duplicate matches. * Fixed notifications rendering in Gmail. * Fixed reverting changes from the history. * Added links to events in digest notifications. * Fixed email for account removal confirmation. * Added support for Slack authentication in Docker container. * Avoid sending notifications for not subscribed languages. * Include Celery queues in performance overview. * Fixed documentation links for add-ons. * Reduced false negatives for unchanged translation check. * Raised bleach dependency to address [**CVE 2020-6802**](https://www.cve.org/CVERecord?id=CVE-2020-6802). * Fixed listing project level changes in history. * Fixed stats invalidation in some corner cases. * Fixed searching for certain string states. * Improved format string checks behavior on missing percent. * Fixed authentication using some third party providers. ## Weblate 3.11.2 *Released on February 22nd 2020.* * Fixed rendering of suggestions. * Fixed some strings wrongly reported as having no words. ## Weblate 3.11.1 *Released on February 20th 2020.* * Documented Celery setup changes. * Improved filename validation on component creation. * Fixed minimal versions of some dependencies. * Fixed adding groups with certain Django versions. * Fixed manual pushing to upstream repository. * Improved glossary matching. ## Weblate 3.11 *Released on February 17th 2020.* * Allow using VCS push URL during component creation via API. * Rendered width check now shows image with the render. * Fixed links in notifications e-mails. * Improved look of plaintext e-mails. * Display ignored checks and allow to make them active again. * Display nearby keys on monolingual translations. * Added support for grouping string shapings. * Recommend upgrade to new Weblate versions in the system checks. * Provide more detailed analysis for duplicate language alert. * Include more detailed license info on the project pages. * Automatically unshallow local copies if needed. * Fixed download of strings needing action. * New alert to warn about using the same file mask twice. * Improve XML placeables extraction. * The [`SINGLE_PROJECT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SINGLE_PROJECT) can now enforce redirection to chosen project. * Added option to resolve comments. * Added bulk editing of flags. * Added support for [String labels](https://docs.weblate.org/en/latest/devel/translations.md#labels). * Added bulk edit add-on. * Added option for [Enforcing checks](https://docs.weblate.org/en/latest/admin/checks.md#enforcing-checks). * Increased default validity of confirmation links. * Improved Matomo integration. * Fixed [Has been translated](https://docs.weblate.org/en/latest/user/checks.md#check-translated) to correctly handle source string change. * Extended automatic updates configuration by [`AUTO_UPDATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTO_UPDATE). * LINGUAS add-ons now do full sync of translations in Weblate. ## Weblate 3.10.3 *Released on January 18th 2020.* * Support for translate-toolkit 2.5.0. ## Weblate 3.10.2 *Released on January 18th 2020.* * Add lock indication to projects. * Fixed CSS bug causing flickering in some web browsers. * Fixed searching on systems with non-English locales. * Improved repository matching for GitHub and Bitbucket hooks. * Fixed data migration on some Python 2.7 installations. * Allow configuration of Git shallow cloning. * Improved background notification processing. * Fixed broken form submission when navigating back in web browser. * New add-on to configure YAML formatting. * Fixed same plurals check to not fire on single plural form languages. * Fixed regex search on some fields. ## Weblate 3.10.1 *Released on January 9th 2020.* * Extended API with translation creation. * Fixed several corner cases in data migrations. * Compatibility with Django 3.0. * Improved data clean-up performance. * Added support for customizable security.txt. * Improved breadcrumbs in changelog. * Improved translations listing on dashboard. * Improved HTTP responses for webhooks. * Added support for GitLab merge requests in Docker container. ## Weblate 3.10 *Released on December 20th 2019.* * Improved application user interface. * Added doublespace check. * Fixed creating new languages. * Avoid sending auditlog notifications to deleted e-mails. * Added support for read-only strings. * Added support for Markdown in comments. * Allow placing translation instruction text in project info. * Add copy to clipboard for secondary languages. * Improved support for Mercurial. * Improved Git repository fetching performance. * Add search lookup for age of string. * Show source language for all translations. * Show context for nearby strings. * Added support for notifications on repository operations. * Improved translation listings. * Extended search capabilities. * Added support for automatic translation strings marked for editing. * Avoid sending duplicate notifications for linked component alerts. * Improve default merge request message. * Better indicate string state in Zen mode. * Added support for more languages in Yandex Translate. * Improved look of notification e-mails. * Provide choice for translation license. ## Weblate 3.9.1 *Released on October 28th 2019.* * Remove some unneeded files from backups. * Fixed potential crash in reports. * Fixed cross database migration failure. * Added support for force pushing Git repositories. * Reduced risk of registration token invalidation. * Fixed account removal hitting rate limiter. * Added search based on priority. * Fixed possible crash on adding strings to JSON file. * Safe HTML check and fixup now honor source string markup. * Avoid sending notifications to invited and deleted users. * Fix SSL connection to redis in Celery in Docker container. ## Weblate 3.9 *Released on October 15th 2019.* * Include Weblate metadata in downloaded files. * Improved UI for failing checks. * Indicate missing strings in format checks. * Separate check for French punctuation spacing. * Add support for fixing some of quality checks errors. * Add separate permission to create new projects. * Extend stats for char counts. * Improve support for Java style language codes. * Added new generic check for placeholders. * Added support for WebExtension JSON placeholders. * Added support for flat XML format. * Extended API with project, component and translation removal and creation. * Added support for Gitea and Gitee webhooks. * Added new custom regex based check. * Allow to configure contributing to shared translation memory. * Added ZIP download for more translation files. * Make XLIFF standard compliant parsing of maxwidth and font. * Added new check and fixer for safe HTML markup for translating web applications. * Add component alert on unsupported configuration. * Added automatic translation add-on to bootstrap translations. * Extend automatic translation to add suggestions. * Display add-on parameters on overview. * Sentry is now supported through modern Sentry SDK instead of Raven. * Changed example settings to be better fit for production environment. * Added automated backups using BorgBackup. * Split cleanup add-on for RESX to avoid unwanted file updates. * Added advanced search capabilities. * Allow users to download their own reports. * Added localization guide to help configuring components. * Added support for GitLab merge requests. * Improved display of repository status. * Perform automated translation in the background. ## Weblate 3.8 *Released on August 15th 2019.* * Added support for simplified creating of similar components. * Added support for parsing translation flags from the XML based file formats. * Log exceptions into Celery log. * Improve performance of repository scoped add-ons. * Improved look of notification e-mails. * Fixed password reset behavior. * Improved performance on most of translation pages. * Fixed listing of languages not known to Weblate. * Add support for cloning add-ons to discovered components. * Add support for replacing file content with uploaded. * Add support for translating non VCS based content. * Added OpenGraph widget image to use on social networks. * Added support for animated screenshots. * Improved handling of monolingual XLIFF files. * Avoid sending multiple notifications for single event. * Add support for filtering changes. * Extended predefined periods for reporting. * Added webhook support for Azure Repos. * New opt-in notifications on pending suggestions or untranslated strings. * Add one click unsubscribe link to notification e-mails. * Fixed false positives with Has been translated check. * New management interface for admins. * String priority can now be specified using flags. * Added language management views. * Add checks for Qt library and Ruby format strings. * Added configuration to better fit single project installations. * Notify about new string on source string change on monolingual translations. * Added separate view for translation memory with search capability. ## Weblate 3.7.1 *Released on June 28th 2019.* * Documentation updates. * Fixed some requirements constraints. * Updated language database. * Localization updates. * Various user interface tweaks. * Improved handling of unsupported but discovered translation files. * More verbosely report missing file format requirements. ## Weblate 3.7 *Released on June 21st 2019.* * Added separate Celery queue for notifications. * Use consistent look with application for API browsing. * Include approved stats in the reports. * Report progress when updating translation component. * Allow to abort running background component update. * Extend template language for filename manipulations. * Use templates for editor link and repository browser URL. * Indicate max length and current characters count when editing translation. * Improved handling of abbreviations in unchanged translation check. * Refreshed landing page for new contributors. * Add support for configuring msgmerge add-on. * Delay opening SMTP connection when sending notifications. * Improved error logging. * Allow custom location in MO generating add-on. * Added add-ons to cleanup old suggestions or comments. * Added option to enable horizontal mode in the Zen editor. * Improved import performance with many linked components. * Fixed examples installation in some cases. * Improved rendering of alerts in changes. * Added new horizontal stats widget. * Improved format strings check on plurals. * Added font management tool. * New check for rendered text dimensions. * Added support for subtitle formats. * Include overall completion stats for languages. * Added reporting at project and global scope. * Improved user interface when showing translation status. * New Weblate logo and color scheme. * New look of bitmap badges. ## Weblate 3.6.1 *Released on April 26th 2019.* * Improved handling of monolingual XLIFF files. * Fixed digest notifications in some corner cases. * Fixed add-on script error alert. * Fixed generating MO file for monolingual PO files. * Fixed display of uninstalled checks. * Indicate administered projects on project listing. * Allow update to recover from missing VCS repository. ## Weblate 3.6 *Released on April 20th 2019.* * Add support for downloading user data. * Add-ons are now automatically triggered upon installation. * Improved instructions for resolving merge conflicts. * Cleanup add-on is now compatible with app store metadata translations. * Configurable language code syntax when adding new translations. * Warn about using Python 2 with planned termination of support in April 2020. * Extract special characters from the source string for visual keyboard. * Extended contributor stats to reflect both source and target counts. * Admins and consistency add-ons can now add translations even if disabled for users. * Fixed description of toggle disabling `Language-Team` header manipulation. * Notify users mentioned in comments. * Removed file format autodetection from component setup. * Fixed generating MO file for monolingual PO files. * Added digest notifications. * Added support for muting component notifications. * Added notifications for new alerts, whiteboard messages or components. * Notifications for administered projects can now be configured. * Improved handling of three letter language codes. ## Weblate 3.5.1 *Released on March 10th 2019.* * Fixed Celery systemd unit example. * Fixed notifications from HTTP repositories with login. * Fixed race condition in editing source string for monolingual translations. * Include output of failed add-on execution in the logs. * Improved validation of choices for adding new language. * Allow to edit file format in component settings. * Update installation instructions to prefer Python 3. * Performance and consistency improvements for loading translations. * Make Microsoft Terminology service compatible with current Zeep releases. * Localization updates. ## Weblate 3.5 *Released on March 3rd 2019.* * Improved performance of built-in translation memory. * Added interface to manage global translation memory. * Improved alerting on bad component state. * Added user interface to manage whiteboard messages. * Add-on commit message now can be configured. * Reduce number of commits when updating upstream repository. * Fixed possible metadata loss when moving component between projects. * Improved navigation in the Zen mode. * Added several new quality checks (Markdown related and URL). * Added support for app store metadata files. * Added support for toggling GitHub or Gerrit integration. * Added check for Kashida letters. * Added option to squash commits based on authors. * Improved support for XLSX file format. * Compatibility with Tesseract 4.0. * Billing add-on now removes projects for unpaid billings after 45 days. ## Weblate 3.4 *Released on January 22nd 2019.* * Added support for XLIFF placeholders. * Celery can now utilize multiple task queues. * Added support for renaming and moving projects and components. * Include characters counts in reports. * Added guided adding of translation components with automatic detection of translation files. * Customizable merge commit messages for Git. * Added visual indication of component alerts in navigation. * Improved performance of loading translation files. * New add-on to squash commits prior to push. * Improved displaying of translation changes. * Changed default merge style to rebase and made that configurable. * Better handle private use subtags in language code. * Improved performance of fulltext index updates. * Extended file upload API to support more parameters. ## Weblate 3.3 *Released on November 30th 2018.* * Added support for component and project removal. * Improved performance for some monolingual translations. * Added translation component alerts to highlight problems with a translation. * Expose XLIFF string `resname` as context when available. * Added support for XLIFF states. * Added check for non writable files in DATA_DIR. * Improved CSV export for changes. ## Weblate 3.2.2 *Released on October 20th 2018.* * Remove no longer needed Babel dependency. * Updated language definitions. * Improve documentation for add-ons, LDAP and Celery. * Fixed enabling new dos-eol and auto-java-messageformat flags. * Fixed running setup.py test from PyPI package. * Improved plurals handling. * Fixed translation upload API failure in some corner cases. * Fixed updating Git configuration in case it was changed manually. ## Weblate 3.2.1 *Released on October 10th 2018.* * Document dependency on backports.csv on Python 2.7. * Fix running tests under root. * Improved error handling in gitexport module. * Fixed progress reporting for newly added languages. * Correctly report Celery worker errors to Sentry. * Fixed creating new translations with Qt Linguist. * Fixed occasional fulltext index update failures. * Improved validation when creating new components. * Added support for cleanup of old suggestions. ## Weblate 3.2 *Released on October 6th 2018.* * Add install_addon management command for automated add-on installation. * Allow more fine grained [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit) settings. * Added support for export and import of Excel files. * Improve component cleanup in case of multiple component discovery add-ons. * Rewritten Microsoft Terminology machine translation backend. * Weblate now uses Celery to offload some processing. * Improved search capabilities and added regular expression search. * Added support for Youdao Zhiyun API machine translation. * Added support for Baidu API machine translation. * Integrated maintenance and cleanup tasks using Celery. * Improved performance of loading translations by almost 25%. * Removed support for merging headers on upload. * Removed support for custom commit messages. * Configurable editing mode (zen/full). * Added support for error reporting to Sentry. * Added support for automated daily update of repositories. * Added support for creating projects and components by users. * Built-in translation memory now automatically stores translations done. * Users and projects can import their existing translation memories. * Better management of related strings for screenshots. * Added support for checking Java MessageFormat. See [3.2 milestone on GitHub](https://github.com/WeblateOrg/weblate/milestone/36?closed=1) for detailed list of addressed issues. ## Weblate 3.1.1 *Released on July 27th 2018.* * Fix testsuite failure on some setups. ## Weblate 3.1 *Released on July 27th 2018.* * Upgrades from older version than 3.0.1 are not supported. * Allow to override default commit messages from settings. * Improve webhooks compatibility with self hosted environments. * Added support for Amazon Translate. * Compatibility with Django 2.1. * Django system checks are now used to diagnose problems with installation. * Removed support for soon shutdown libravatar service. * New add-on to mark unchanged translations as needing edit. * Add support for jumping to specific location while translating. * Downloaded translations can now be customized. * Improved calculation of string similarity in translation memory matches. * Added support by signing Git commits by GnuPG. ## Weblate 3.0.1 *Released on June 10th 2018.* * Fixed possible migration issue from 2.20. * Localization updates. * Removed obsolete hook examples. * Improved caching documentation. * Fixed displaying of admin documentation. * Improved handling of long language names. ## Weblate 3.0 *Released on June 1st 2018.* * Rewritten access control. * Several code cleanups that lead to moved and renamed modules. * New add-on for automatic component discovery. * The import_project management command has now slightly different parameters. * Added basic support for Windows RC files. * New add-on to store contributor names in PO file headers. * The per component hook scripts are removed, use add-ons instead. * Add support for collecting contributor agreements. * Access control changes are now tracked in history. * New add-on to ensure all components in a project have same translations. * Support for more variables in commit message templates. * Add support for providing additional textual context. # changes/v4.md # Weblate 4.x series ## Weblate 4.18.2 *Released on June 30th 2023.* * Fixed parsing notes from TBX. * Fixed query parsing in navigation bar search. * Fixed language filtering in reports. * Improved ModernMT languages mapping. * Disabled reused checks on languages with a single plural form. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/102?closed=1). ## Weblate 4.18.1 *Released on June 16th 2023.* * Fixed language code format for i18next. * Fixed CSS compression with dark theme. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/101?closed=1). ## Weblate 4.18 *Released on June 15th 2023.* * Improved API error messages on permission denied. * Reduced false positives of the XML checks. * Translated check accuracy has been improved. * Extended support for Fluent file format. * Avoiding signing-out user in some rate-limits. * Added support for storing glossary explanation in TBX format. * Added support for ordering strings by last update. * Extended search capabilities for finding users. * Support for automatic update of screenshots from a repository. * Improved translation memory performance. * Project stats exports to JSON/CSV now include more details; it now matches content available in the API. * Added check for reused translation. * Highlight suggested change in automatic suggestions. * Added dark theme; browser-following and manual setting are available. * The Docker container can now be used with read-only root filesystem. * Added username autocompletion when adding users to a project. * Added site-wide search for projects, components, languages and users. * New add-on Fill read-only strings with source. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/97?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * Dropped support for PostgreSQL 10, 11, MySQL 5.7 and MariaDB 10.2, 10.3. * Dropped support for Python 3.7. * The [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent) format changed identification of some strings, you might need to force reloading of the translation files to see the changes. * There are several changes in `settings_example.py`, most notable is change in `COMPRESS_OFFLINE_CONTEXT`, please adjust your settings accordingly. ## Weblate 4.17 *Released on April 17th 2023.* * Allow to filter on language in reports. * Dropped deprecated command `cleanup_celery`. * Fixed private project visibility for some teams. * Automatic translation now honors target state when translating from other components. * Improved performance of public user profiles. * Improved Sentry performance monitoring integration. * Added support for Ed25519 SSH key. * Rewritten metrics storage. * Added support for searching strings by position. * Documentation improvements. * Unchanged translation check can honor untranslatable terms from glossary. * Added automatic fixup for Devanagari danda. * Allow downloading project translation memory per language. * Added new alert on unused components. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/93?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * Migration to rewritten metrics storage might take considerable time on larger Weblate instance (expect around 15 minutes per GB of `metrics_metric` table). To reduce downtime, you can copy `weblate/metrics/migrations/*.py` from Weblate 4.17 to 4.16 and start the migration in the background. Once it is completed, perform full upgrade as usual. * Docker container now requires PostgreSQL 12 or newer, please see [Upgrading PostgreSQL container](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-postgres-upgrade) for upgrade instructions. Weblate itself supports older versions as well, when appropriate Django version is installed. #### WARNING Migration on MySQL will try to load all metrics into memory due to limitation of the Python database driver. You might need to prune metrics prior to migration if you want to continue using MySQL. Please consider switching to PostgreSQL, see [Migrating from other databases to PostgreSQL](https://docs.weblate.org/en/latest/admin/upgrade.md#database-migration). ## Weblate 4.16.4 *Released on March 16th 2023.* * Dependencies updates. * Improved background tasks scheduling. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/96?closed=1). ## Weblate 4.16.3 *Released on March 15th 2023.* * Improved session handling with project backups. * Dependencies updates. * Localization updates. * Documentation improvements. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/95?closed=1). ## Weblate 4.16.2 *Released on March 8th 2023.* * Fixed searching in the translation memory. * Fixed automatic translation with more services. * Improved rendering of overlapping glossary term matches. * Fixed plurals parsing for non-English source language in some formats. * Added support for go-i18n v2 JSON files. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/94?closed=1). ## Weblate 4.16.1 *Released on March 1st 2023.* * Fixed testsuite error. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/92?closed=1). ## Weblate 4.16 *Released on March 1st 2023.* * Format string checks now also detects duplicated formats. * Improved search performance for some specially formatted strings. * Celery beat is now storing the tasks schedule in the database. * Added support for IBM Watson Language Translator. * Dropped support for VCS integration settings deprecated in 4.14. * Added support for Bitbucket Server pull requests. * Improved conflicts handling in gettext PO files. * Added support for defining strings state when adding via API. * Added support for configuring CORS allowed origins. * Added plurals support to automatic suggestions. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/89?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * Celery beat is now storing the tasks schedule in the database, `CELERY_BEAT_SCHEDULER` and [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS) need to be changed for that. * The deprecated VCS setting for credentials is no longer supported, see [Weblate 4.14](https://docs.weblate.org/en/latest/changes/v4.md#up-4-14). * Upgrade of django-crispy-forms requires changes in [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS). * Integration of django-cors-headers requires changes in [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS) and [`MIDDLEWARE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-MIDDLEWARE). * Introduction of [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) changed default value of [`STATIC_ROOT`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-STATIC_ROOT). You might need to adjust [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files) accordingly. ## Weblate 4.15.2 *Released on January 25th 2023.* * Enabled gotext JSON and i18next v4 formats in the default configuration. * Fixed crash on uploading corrupted files. * Show stale directories in Git repository status. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/91?closed=1). ## Weblate 4.15.1 *Released on January 19th 2023.* * Fixed suggestions from automatic translation. * Fixed add-on page crash in some corner cases. * Fixed untranslating template for new translations in some cases. * Documented licensing using [REUSE 3.0](https://reuse.software/). * Fixed users pagination on team management. * Improved performance of project creation and saving. * Added support for gotext JSON files. * Added support for i18next v4 files. * Pagination in the API is now customizable. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/90?closed=1). ## Weblate 4.15 *Released on December 16th 2022.* * Added support for browsing all changes for an individual string. * Fixed plurals handling in automatic translation from other components. * Added keyboard shortcut Alt+Enter to submit string as a suggestion. * Added support for placeables in the Fluent format. * Improved performance of translation memory. * Autogenerate repoweb browsing links for well known code hosting services. * Improved performance of several views. * Improved listing of strings with plurals. * Added support for adding custom markup to HTML head. * Fixed generation of MO files in the add-on to include only translated files. * Fixed rendering of regular expression flags. * Improved placeholders check behavior with plurals. * Added support for translation files naming suitable for Google Play. * Added support for labels in API. * Added support for choosing different e-mail for commits than for notifications. * The Docker image no longer enables debug mode by default. * Order glossary terms based on the glossary component priority. * Added team administrators who can add or remove members of the team. * Added a popup confirmation before deleting users. * Added add-on to customize XML output. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/88?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * Weblate now requires `btree_gin` extension in PostgreSQL. The migration process will install it if it has sufficient privileges. See [Creating a database in PostgreSQL](https://docs.weblate.org/en/latest/admin/install.md#dbsetup-postgres) for manual setup. * The Docker image no longer enables debug mode by default. In case you want it, enable it in the environment using [`WEBLATE_DEBUG`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_DEBUG). * The database migration make take hours on larger instances due to recreating some of the indexes. * **Changed in 4.15.1:** The default value for `DEFAULT_PAGINATION_CLASS` in rest framework settings was changed. ## Weblate 4.14.2 *Released on November 5th 2022.* * Added support for removing entries from translation memory. * Improved analysis on the duplicate language alert. * Improved accuracy of the consecutive duplicated-words check. * Improved scaling of sending many notifications. * Improved string-state handling for subtitle translation. * Deprecated insecure configuration of VCS service API keys via \_TOKEN/_USERNAME configuration instead of \_CREDENTIALS list. * Fixed processing of some uploaded CSV files. * Improved whitespace changes handling in diff display. * Added link for managing automatic suggestions to the management pages. * Track comment removal/resolving in history. * Fixed restoring project backups with linked components. * Fixed CAPTCHA entering on unsuccessful registration. * Improved languages support in DeepL. * Improved webhooks compatibility with authenticated repositories. * Added support for Python 3.11. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/87?closed=1). ## Weblate 4.14.1 *Released on September 15th 2022.* * Fixed generating project backups in some situations. * Improved error reporting when uploading files. * Fetch all user verified e-mails from GitHub during authentication. * Avoid matching glossary terms on context or keys. * Added notifications for string removals. * Improved management of untranslatable terms in glossary. * List number of team members on team management page. * Add group management interface. * Always show review stats when reviews are turned on. * Added searching support in units API. * Fixed progress bar display for read-only strings in the review workflow. * Improved punctuation checks for Burmese. * Fixed garbage collecting of metrics data. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/86?closed=1). ## Weblate 4.14 *Released on August 22nd 2022.* * Track add-on changes in a history. * Fixed parsing translation from Windows RC, HTML and text files. * Extended language code style configuration options. * Added support for plurals updated in the recent CLDR releases. * Reduced memory usage while updating components with a lot of translations. * Added support for translation domain in SAP Translation Hub. * Allow absolute links in source string locations. * Improved operation behind some reverse proxies. * Extended API to cover translation memory. * Improved document translation workflow. * Improved reliability of HTML and text files translation. * Added support for project level backups. * Improved performance and memory usage of translation memory lookups. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/84?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * The Java formatting checks now match GNU gettext flags. The flags set in Weblate will be automatically migrated, but third-party scripts will need to use `java-printf-format` instead of `java-format` and `java-format` instead of `java-messageformat`. * The jellyfish dependency has been replaced by rapidfuzz. * **Changed in 4.14.2:** Deprecated insecure configuration of VCS service API keys via \_TOKEN/_USERNAME configuration instead of \_CREDENTIALS list. In Docker, please add matching \_HOST directive. For example see [`WEBLATE_GITHUB_HOST`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_GITHUB_HOST) and [`GITHUB_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITHUB_CREDENTIALS). ## Weblate 4.13.1 *Released on July 1st 2022.* * Fixed tracking suggestions in history. * Fixed parsing reverse proxy info from Cloudflare. * Make parse errors lock translation of a component. * Fixed configuring intermediate file in the discovery add-on. * Fixed DeepL translations behavior with placeholders. * Fixed untranslating strings via API. * Added support for removing a user from a group via API. * Fixed audit log for user invitation e-mails. * Fixed flag names for Java formatting strings. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/85?closed=1). ## Weblate 4.13 *Released on June 15th 2022.* * Changed behavior of updating language names. * Added pagination to projects listing. * API for creating new units now returns info about newly created unit. * Component discovery now supports configuring an intermediate language. * Added fixed encoding variants to CSV formats. * Changed handling of context and location for some formats to better fit underlying implementation. * Added support for the ResourceDictionary format. * Improved progress-bar colors for color-blind people. * Fixed variants cleanup when removing strings. * Compatibility with Django 4.1. * Added support for storing escaped XML elements in XLIFF. * Improved formatting of placeholder-check errors. * Redirect /.well-known/change-password to /accounts/password/. * Machine translation services are now configurable per project. * Added separate permission for resolving comments and grant it to the Review strings role. * Added support for storing alternative translations in the CSV file. * The placeholders check can now be case-insensitive as well. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/81?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * The [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) are now automatically updated on upgrade, use [`UPDATE_LANGUAGES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-UPDATE_LANGUAGES) to disable that. * Handling of context and location has been changed for [Windows RC files](https://docs.weblate.org/en/latest/formats/winrc.md#winrc), [HTML files](https://docs.weblate.org/en/latest/formats/html.md#html), [IDML Format](https://docs.weblate.org/en/latest/formats/idml.md#idml), and [Text files](https://docs.weblate.org/en/latest/formats/txt.md#txt) file formats. In most cases the context is now shown as location. * The machine translation services are now configured using the user interface, settings from the configuration file will be imported during the database migration. ## Weblate 4.12.2 *Released on May 11th 2022.* * Fixed rebuilding project translation-memory for some components. * Fixed sorting components by untranslated strings. * Fixed possible loss of translations while adding a new language. * Ensure Weblate SSH key is generated during migrations. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/83?closed=1). ## Weblate 4.12.1 *Released on April 29th 2022.* * Fixed pull request message title. * Improved syntax error handling in Fluent format. * Fixed avatar display in notification e-mails. * Add support for web monetization. * Fixed removal of stale source strings when removing translations. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/82?closed=1). ## Weblate 4.12 *Released on April 20th 2022.* * Added support for Amharic in [Mismatched full stop](https://docs.weblate.org/en/latest/user/checks.md#check-end-stop). * Added support for Burmese in [Mismatched question mark](https://docs.weblate.org/en/latest/user/checks.md#check-end-question). * Extended options of the [Pseudolocale generation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-generate-pseudolocale) add-on. * Added `ignore-all-checks` flag to ignore all quality checks on a string. * Avoid [Pseudolocale generation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-generate-pseudolocale) add-on to trigger failing checks. * Added support for [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests). * Added Linux-style language code to [Language code style](https://docs.weblate.org/en/latest/admin/projects.md#component-language-code-style). * Added support for rebuilding project translation memory. * Improved API for creating components from a file. * Add copy and clone buttons to other translations. * Make merge request message configurable at the component level. * Improved behavior of maximal-length restriction with XML tags. * Fixed loading Fluent files with additional comments. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/77?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are no special steps required. ## Weblate 4.11.2 *Released on March 4th 2022.* * Fixed corrupted MO files in the binary release. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/80?closed=1). ## Weblate 4.11.1 *Released on March 4th 2022.* * Fixed missing sanitizing of arguments to Git and Mercurial - [**CVE 2022-23915**](https://www.cve.org/CVERecord?id=CVE-2022-23915), see [GHSA-3872-f48p-pxqj](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-3872-f48p-pxqj) for more details. * Fixed loading fuzzy strings from CSV files. * Added support for creating teams using the API. * Fixed user mention suggestions display. * The project tokens access can now be customized. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/78?closed=1). ## Weblate 4.11 *Released on February 25th 2022.* * Fixes stored XSS - [**CVE 2022-24710**](https://www.cve.org/CVERecord?id=CVE-2022-24710), see [GHSA-6jp6-9rf9-gc66](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-6jp6-9rf9-gc66) for more details. * Fixed add-on installation using the API. * Renamed Strings needing action to Unfinished strings. * Fixed false positives from [ICU MessageFormat syntax](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format-syntax). * Indicate lock and contributor agreement on other occurrences listing. * Fixed updating PO files with obsolete strings or missing plurals. * Improved squash add-on compatibility with Gerrit. * Automatically initialize user languages based on the [Accept-Language](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.5) header. * Improved error handling on string removal. * Weblate now requires Python 3.7 or newer. * Fixed some write operations with project token authentication. * Fixed string state tracking when the strings changes in the repository. * Track string changes from the repository. * Sticky header on translations listing to improve navigation. * Fixed untranslating strings in [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop). * Fixed Git operation with non-ASCII branch names. * New add-on [Prefill translation with source](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-generate-prefill). * Added Merge without fast-forward [Merge style](https://docs.weblate.org/en/latest/admin/projects.md#component-merge-style). * Fixed [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) add-on triggering for newly added strings. * Improved punctuation checks for Burmese. * Added support for defining custom teams at project level to grant users access, see [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl). * Added documentation links to alerts. * Docker container automatically enables TLS/SSL for outgoing e-mail when needed. * Added support for searching for resolved comments. * Added support for borgbackup 1.2. * Fixed applying of Automatically translated label. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/75?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * Weblate now requires Python 3.7 or newer. * The implementation of [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl) has changed, removing the project prefix from the group names. This affects API users. * Weblate now uses `charset-normalizer` instead of `chardet` module for character set detection. * **Changed in 4.11.1:** There is a change in `REST_FRAMEWORK` setting (removal of one of the backends in `DEFAULT_AUTHENTICATION_CLASSES`). ## Weblate 4.10.1 *Released on December 22nd 2021.* * Documented changes introduced by upgrading to Django 4.0. * Fixed displaying of Automatically translated label. * Fixed API display of branch in components with a shared repository. * Improved analysis on the failed push alert. * Fixed manually editing page when browsing changes. * Improved accuracy of [Kashida letter used](https://docs.weblate.org/en/latest/user/checks.md#check-kashida). * The Weblate Docker container now uses Python 3.10. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/76?closed=1). ## Weblate 4.10 *Released on December 16th 2021.* * Added support for formality and placeholders with DeepL. * Bulk edit and search-and-replace are now available on project and language level. * Added filtering to search and replace. * Fixed: “Perform automatic translation” privilege is no longer part of the *Languages* group. * “Perform automatic translation” is in the *Administration* and the new *Automatic translation* group. * Fixed generating XLSX files with special chars. * Added ability to the GitHub authentication backend to check if the user belongs to a specific GitHub organization or team. * Improved feedback on invalid parameters passed to API. * Added support for project scoped access tokens for API. * Fixed string removal in some cases. * Fixed translating newly added strings. * Label automatically translated strings to ease their filtering. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/74?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There is a change in per-project groups, the upgrade can take long time on sites with thousands of projects. * Django 4.0 has made some incompatible changes, see [Backwards incompatible changes in 4.0](https://docs.djangoproject.com/en/stable/releases/4.0/#backwards-incompatible-4-0). Weblate still supports Django 3.2 for now, in case any of these are problematic. Most notable changes which might affect Weblate: * Dropped support for PostgreSQL 9.6, Django 4.0 supports PostgreSQL 10 and higher. * Format of [`CSRF_TRUSTED_ORIGINS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-CSRF_TRUSTED_ORIGINS) was changed. * The Docker container now uses Django 4.0, see above for changes. ## Weblate 4.9.1 *Released on November 19th 2021.* * Fixed upload of monolingual files after changing template. * Improved handling of whitespace in flags. * Add support for filtering in download API. * Fixed statistics display when adding new translations. * Mitigate issues with GitHub SSH key change. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/73?closed=1). ## Weblate 4.9 *Released on November 10th 2021.* * Provide more details for events in history. * Improved rendering of history. * Improved performance of the translation pages. * Added support for restricting translation file downloads. * The `safe-html` can now understand Markdown when used with `md-text`. * The `max-length` tag now ignores XML markup when used with `xml-text`. * Fixed dimensions of rendered texts in [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size). * Lowered app store title length to 30 to assist with upcoming Google policy changes. * Added support for customizing SSH invocation via [`SSH_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SSH_EXTRA_ARGS). * Added checks for ICU MessageFormat. * Improved error condition handling in machine translation backends. * Highlight unusual whitespace characters in the strings. * Added option to stay on translated string while editing. * Added support for customizing Borg invocation via [`BORG_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-BORG_EXTRA_ARGS). * Fixed generating of MO files for monolingual translations. * Added API endpoint to download all component translations as a ZIP file. * Added support for Python 3.10. * Added support for resending e-mail invitation from the management interface. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/71?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There is a change in storing metrics, the upgrade can take long time on larger sites. ## Weblate 4.8.1 *Released on September 10th 2021.* * Fixed user removal in Django admin interface. * Document add-on parameters in greater detail. * Fixed JavaScript error in glossary. * Add limit to number of matches in consistency check. * Improve handling of placeholders in machine translations. * Fixed creating add-ons using the API. * Added [`PRIVACY_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVACY_URL) setting to add privacy policy link to the footer. * Hide member e-mail addresses from project admins. * Improved gettext PO merging in case of conflicts. * Improved glossary highlighting. * Improved `safe-html` flag behavior with XML checks. * Fixed commit messages for linked components. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/70?closed=1). ## Weblate 4.8 *Released on August 21th 2021.* * Added support for Apple stringsdict format. * The exact search operator is now case-sensitive with PostgreSQL. * Fixed saving glossary explanations in some cases. * Documentation improvements. * Performance improvements. * Improved squash add-on compatibility with Gerrit. * Fixed adding strings to monolingual glossary components. * Improved performance in handling variants. * Fixed squash add-on sometimes skipping parsing upstream changes. * Preserve file extension for downloads. * Added support for the Fluent format. * Added support for using tabs to indent JSON formats. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/67?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. There are no additional upgrade steps needed in this release. ## Weblate 4.7.2 *Released on July 15th 2021.* * Support more language aliases to be configured on a project. * Fixed search string validation in API. * Fixed Git exporter URLs after a domain change. * Fixed cleanup add-on for Windows RC files. * Fixed possible crash in XLIFF updating. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/69?closed=1). ## Weblate 4.7.1 *Released on June 30th 2021.* * Improved popup for adding terms to glossary. * Added support for LibreTranslate machine translation service. * Added rate limiting on creating new projects. * Improved performance of file updates. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/68?closed=1). ## Weblate 4.7 *Released on June 17th 2021.* * Improved configuration health check. * Added support for `object-pascal-format` used in gettext PO, see [Object Pascal format](https://docs.weblate.org/en/latest/user/checks.md#check-object-pascal-format). * Renamed Nearby keys to Similar keys to better describe the purpose. * Added support for [draggable/i18n lang files](https://docs.weblate.org/en/latest/formats/mi18n.md#mi18n-lang). * Improved SAML authentication integration. * Fixed [Gerrit review requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gerrit) integration to better handle corner cases. * Weblate now requires Django 3.2. * Fixed inviting users when e-mail authentication is disabled. * Improved language definitions. * Added support for blocking users from contributing to a project. * Fixed automatic creation of glossary languages. * Extended documentation about add-ons. * Performance improvements for components with linked repositories. * Added support for free DeepL API. * The user management no longer needs Django admin interface. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/64?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. Notable configuration or dependencies changes: * There are several changes in `settings_example.py`, most notable middleware changes ([`MIDDLEWARE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-MIDDLEWARE)), please adjust your settings accordingly. * The [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) machine translation now has a generic `MT_DEEPL_API_URL` setting to adapt to different subscription models more flexibly. The `MT_DEEPL_API_VERSION` setting is no longer used. * Django 3.2 is now required. ## Weblate 4.6.2 *Released on May 8th 2021.* * Fixed crash after moving shared component between projects. * Fixed adding new strings to empty properties files. * Fixed copy icon alignment in RTL languages. * Extended string statistics on the Info tab. * Fixed handling of translation files ignored in Git. * Improved metrics performance. * Fixed possible bug in saving glossaries. * Fixed consistency check behavior on languages with different plural rules. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/66?closed=1). ## Weblate 4.6.1 *Released on May 2nd 2021.* * Remove obsolete spam protection code. * Improve source plural check accuracy. * Update list of user interface languages in Docker. * Improved error messages when creating pull requests. * Fixed creating pull requests on Pagure. * Fixed triggering automatically installed add-ons. * Fixed possible caching issues on upgrade. * Fixed adding new units to monolingual translations using upload. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/65?closed=1). ## Weblate 4.6 *Released on April 19th 2021.* * The auto_translate management command has now a parameter for specifying translation mode. * Added support for [Text files](https://docs.weblate.org/en/latest/formats/txt.md#txt). * Added trends and metrics for all objects. * Added support for directly copying text from secondary languages. * Added date filtering when browsing changes. * Improved activity charts. * Sender for contact form e-mails can now be configured. * Improved parameters validation in component creation API. * The rate limiting no longer applies to superusers. * Improved automatic translation add-on performance and reliability. * The rate limiting now can be customized in the Docker container. * API for creating components now automatically uses [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls). * Simplified state indication while listing strings. * Password hashing now uses Argon2 by default. * Simplified progress bars indicating translation status. * Renamed [Add missing languages](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-consistency-languages) to clarify the purpose. * Fixed saving string state to XLIFF. * Added language-wide search. * Initial support for [Scaling horizontally](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-scaling) the Docker deployment. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/61?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. Notable configuration or dependencies changes: * There are new file formats, you might want to include them in case you modified the [`WEBLATE_FORMATS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_FORMATS). * API for creating components now automatically uses [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls), see [`POST /api/projects/(string:project)/components/`](https://docs.weblate.org/en/latest/api.md#post--api-projects-(string-project)-components-). * There is a change in dependencies and [`PASSWORD_HASHERS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-PASSWORD_HASHERS) to prefer Argon2 for passwords hashing. ## Weblate 4.5.3 *Released on April 1st 2021.* * Fixed metrics collection. * Fixed possible crash when adding strings. * Improved search query examples. * Fixed possible loss of newly added strings on replace upload. ## Weblate 4.5.2 *Released on March 26th 2021.* * Configurable schedule for automatic translation. * Added Lua format check. * Ignore format strings in the [Consecutive duplicated words](https://docs.weblate.org/en/latest/user/checks.md#check-duplicate) check. * Allow uploading screenshot from a translate page. * Added forced file synchronization to the repository maintenance. * Fixed automatic suggestions for languages with a longer code. * Improved performance when adding new strings. * Several bug fixes in quality checks. * Several performance improvements. * Added integration with [Discover Weblate](https://docs.weblate.org/en/latest/admin/support.md#discover-weblate). * Fixed checks behavior with read-only strings. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/63?closed=1). ## Weblate 4.5.1 *Released on March 5th 2021.* * Fixed editing of glossary flags in some corner cases. * Extend metrics usage to improve performance of several pages. * Store correct source language in TMX files. * Better handling for uploads of monolingual PO using the API. * Improved alerts behavior on glossary components. * Improved Markdown link checks. * Indicate glossary and source language in breadcrumbs. * Paginated component listing of huge projects. * Improved performance of translation, component or project removal. * Improved bulk edit performance. * Fixed preserving “Needs editing” and “Approved” states for ODF files. * Improved interface for customizing translation-file downloads [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/62?closed=1). ## Weblate 4.5 *Released on February 19th 2021.* * Added support for `lua-format` used in gettext PO. * Added support for sharing a component between projects. * Fixed multiple unnamed variables check behavior with multiple format flags. * Dropped mailing list field on the project in favor of generic instructions for translators. * Added pseudolocale generation add-on. * Added support for TermBase eXchange files. * Added support for manually defining string variants using a flag. * Improved performance of consistency checks. * Improved performance of translation memory for long strings. * Added support for searching in explanations. * Strings can now be added and removed in bilingual formats as well. * Extend list of supported languages in Amazon Translate machine translation. * Automatically enable Java MessageFormat checks for Java Properties. * Added a new upload method to add new strings to a translation. * Added a simple interface to browse translation. * Glossaries are now stored as regular components. * Dropped specific API for glossaries as component API is used now. * Added simplified interface to toggle some of the flags. * Added support for non-translatable or forbidden terms in the glossary. * Added support for defining terminology in a glossary. * Moved text direction toggle to get more space for the visual keyboard. * Added option to automatically watch projects user-contributed to. * Added check whether translation matches the glossary. * Added support for customizing navigation text color. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/59?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. Notable configuration or dependencies changes: * The migration might take considerable time if you had big glossaries. * Glossaries are now stored as regular components. * The glossary API is removed, use regular translation API to access glossaries. * There is a change in [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS); `weblate.metrics` should be added. #### Versionchanged Changed in version 4.5.1: * There is a new dependency on the pyahocorasick module. ## Weblate 4.4.2 *Released on January 14th 2021.* * Fixed corruption of one distributed MO file. ## Weblate 4.4.1 *Released on January 13th 2021.* * Fixed reverting plural changes. * Fixed displaying help for project settings. * Improved administration of users. * Improved handling of context in monolingual PO files. * Fixed cleanup add-on behavior with HTML, ODF, IDML and Windows RC formats. * Fixed parsing of location from CSV files. * Use content compression for file downloads. * Improved user experience on importing from ZIP file. * Improved detection of file format for uploads. * Avoid duplicate pull requests on Pagure. * Improved performance when displaying ghost translations. * Reimplemented translation editor to use native browser textarea. * Fixed cleanup add-on breaking adding new strings. * Added API for add-ons. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/60?closed=1). ## Weblate 4.4 *Released on December 15th 2020.* * Improved validation when creating a component. * Weblate now requires Django 3.1. * Added support for appearance customization in the management interface. * Fixed read-only state handling in bulk edit. * Improved CodeMirror integration. * Added add-on to remove blank strings from translation files. * The CodeMirror editor is now used for translations. * Syntax highlighting in translation editor for XML, HTML, Markdown and reStructuredText. * Highlight placeables in translation editor. * Improved support for non-standard language codes. * Added alert when using ambiguous language codes. * The user is now presented with a filtered list of languages when adding a new translation. * Extended search capabilities for changes in history. * Improved billing detail pages and Libre hosting workflow. * Extended translation statistics API. * Improved “other translations” tab while translating. * Added tasks API. * Improved performance of file upload. * Improved display of user defined special characters. * Improved performance of auto-translation. * Several minor improvements in the user interface. * Improved naming of ZIP downloads. * Added option for getting notifications on unwatched projects. > [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/56?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. Notable configuration or dependencies changes: * There is a change in [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS), `weblate.configuration` has to be added there. * Django 3.1 is now required. * In case you are using MySQL or MariaDB, the minimal required versions have increased. #### Versionchanged Changed in version 4.4.1: * [Monolingual gettext](https://docs.weblate.org/en/latest/formats/gettext.md#mono-gettext) now uses both `msgid` and `msgctxt` when present. This will change identification of translation strings in such files breaking links to Weblate extended data such as screenshots or review states. Please ensure you commit pending changes in such files prior upgrading and it is recommended to force loading of affected component using [`loadpo`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-loadpo). * Increased minimal required version of translate-toolkit to address several file format issues. ## Weblate 4.3.2 *Released on November 4th 2020.* * Fixed crash on certain component file masks. * Improved accuracy of the consecutive duplicated-words check. * Added support for Pagure pull requests. * Improved error messages for failed registrations. * Reverted rendering developer comments as Markdown. * Simplified setup of Git repositories with different default branch than “master”. * Newly created internal repositories now use main as the default branch. * Reduced false positives rate of unchanged translation while translating reStructuredText. * Fixed CodeMirror display issues in some situations. * Renamed Template group to “Sources” to clarify its meaning. * Fixed GitLab pull requests on repositories with longer paths. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/58?closed=1). ## Weblate 4.3.1 *Released on October 21st 2020.* * Improved auto-translation performance. * Fixed session expiry for authenticated users. * Add support for hiding version information. * Improve hooks compatibility with Bitbucket Server. * Improved performance of translation memory updates. * Reduced memory usage. * Improved performance of Matrix view. * Added confirmation before removing a user from a project. > [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/57?closed=1). ## Weblate 4.3 *Released on October 15th 2020.* * Include user stats in the API. * Fixed component ordering on paginated pages. * Define source language for a glossary. * Rewritten support for GitHub and GitLab pull requests. * Fixed stats counts after removing suggestion. * Extended public user profile. * Fixed configuration of enforced checks. * Improve documentation about built-in backups. * Moved source language attribute from project to a component. * Add Vue I18n formatting check. * Generic placeholders check now supports regular expressions. * Improved look of Matrix mode. * Machinery is now called automatic suggestions. * Added support for interacting with multiple GitLab or GitHub instances. * Extended API to cover project updates, unit updates and removals and glossaries. * Unit API now properly handles plural strings. * Component creation can now handle ZIP file or document upload. * Consolidated API response status codes. * Support Markdown in contributor agreement. * Improved source strings tracking. * Improved JSON, YAML and CSV formats compatibility. * Added support for removing strings. * Improved performance of file downloads. * Improved repository management view. * Automatically enable java-format for Android. * Added support for localized screenshots. * Added support for Python 3.9. * Fixed translating HTML files under certain conditions. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/53?closed=1). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. Notable configuration or dependencies changes: * There are some changes in quality checks, you might want to include them in case you modified the [`CHECK_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CHECK_LIST). * The source language attribute was moved from project to a component what is exposed in the API. You will need to update [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc) in case you are using it. * The database migration to 4.3 might take long depending on number of strings you are translating (expect around one hour of migration time per 100,000 source strings). * There is a change in [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS). * There is a new setting [`SESSION_COOKIE_AGE_AUTHENTICATED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SESSION_COOKIE_AGE_AUTHENTICATED) which complements [`SESSION_COOKIE_AGE`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-SESSION_COOKIE_AGE). * In case you were using **hub** or **lab** to integrate with GitHub or GitLab, you will need to reconfigure this, see [`GITHUB_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITHUB_CREDENTIALS) and [`GITLAB_CREDENTIALS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITLAB_CREDENTIALS). #### Versionchanged Changed in version 4.3.1: * The Celery configuration was changed to add `memory` queue. Please adjust your startup scripts and `CELERY_TASK_ROUTES` setting. #### Versionchanged Changed in version 4.3.2: * The `post_update` method of add-ons now takes extra `skip_push` parameter. ## Weblate 4.2.2 *Released on September 2nd 2020.* * Fixed matching of source strings for JSON formats. * Fixed login redirect for some authentication configurations. * Fixed LDAP authentication with group sync. * Fixed crash in reporting automatic translation progress. * Fixed Git commit squashing with trailers enabled. * Fixed creating local VCS components using the API. ## Weblate 4.2.1 *Released on August 21st 2020.* * Fixed saving plurals for some locales in Android resources. * Fixed crash in the cleanup add-on for some XLIFF files. * Allow setting up localization CDN in Docker image. ## Weblate 4.2 *Released on August 18th 2020.* * Improved user pages and added listing of users. * Dropped support for migrating from 3.x releases, migrate through 4.1 or 4.0. * Added exports into several monolingual formats. * Improved activity charts. * Number of displayed nearby strings can be configured. * Added support for locking components experiencing repository errors. * Simplified main navigation (replaced buttons with icons). * Improved language code handling in Google Translate integration. * The Git squash add-on can generate `Co-authored-by:` trailers. * Improved query search parser. * Improved user feedback from format strings checks. * Improved performance of bulk state changes. * Added compatibility redirects after project or component renaming. * Added notifications for strings approval, component locking and license change. * Added support for ModernMT. * Allow to avoid overwriting approved translations on file upload. * Dropped support for some compatibility URL redirects. * Added check for ECMAScript template literals. * Added option to watch a component. * Removed leading dot from JSON unit keys. * Removed separate Celery queue for translation memory. * Allow translating all components a language at once. * Allow to configure `Content-Security-Policy` HTTP headers. * Added support for aliasing languages at project level. * New add-on to help with HTML or JavaScript localization, see [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs). * The Weblate domain is now configured in the settings, see [`SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SITE_DOMAIN). * Add support for searching by component and project. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. Notable configuration or dependencies changes: * Upgrade from 3.x releases is not longer supported, please upgrade to 4.0 or 4.1 first. * There are some new and updated requirements. * There are several changes in `settings_example.py`, most notable new middleware and changed application ordering. * The keys for JSON based formats no longer include leading dot. The strings are adjusted during the database migration, but external components might need adjustment in case you rely on keys in exports or API. * The Celery configuration was changed to no longer use `memory` queue. Please adjust your startup scripts and `CELERY_TASK_ROUTES` setting. * The Weblate domain is now configured in the settings, see [`SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SITE_DOMAIN) (or [`WEBLATE_SITE_DOMAIN`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SITE_DOMAIN)). You will have to configure it before running Weblate. * The username and email fields on user database now should be case insensitive unique. It was mistakenly not enforced with PostgreSQL. ## Weblate 4.1.1 *Released on June 19th 2020.* * Fixed changing autofix or add-ons configuration in Docker. * Fixed possible crash in “About” page. * Improved installation of byte-compiled locale files. * Fixed adding words to glossary. * Fixed keyboard shortcuts for machinery. * Removed debugging output causing discarding log events in some setups. * Fixed lock indication on project listing. * Fixed listing GPG keys in some setups. * Added option for which DeepL API version to use. * Added support for acting as SAML Service Provider, see [SAML authentication](https://docs.weblate.org/en/latest/admin/auth.md#saml-auth). ## Weblate 4.1 *Released on June 15th 2020.* * Added support for creating new translations with included country code. * Added support for searching source strings with screenshot. * Extended info available in the stats insights. * Improved search editing on “Translate” pages. * Improve handling of concurrent repository updates. * Include source language in project creation form. * Include changes count in credits. * Fixed UI language selection in some cases. * Possibility to allow certain registration methods with registrations closed. * Improved lookup of related terms in glossary. * Improved translation memory matches. * Group same machinery results. * Add direct link to edit screenshot from translate page. * Improved removal confirmation dialog. * Include templates in ZIP download. * Add support for Markdown and notification configuration in announcements. * Extended details in check listings. * Added support for new file formats: [Laravel PHP strings](https://docs.weblate.org/en/latest/formats/laravel.md#laravel-php), [HTML files](https://docs.weblate.org/en/latest/formats/html.md#html), [OpenDocument Format](https://docs.weblate.org/en/latest/formats/odf.md#odf), [IDML Format](https://docs.weblate.org/en/latest/formats/idml.md#idml), [Windows RC files](https://docs.weblate.org/en/latest/formats/winrc.md#winrc), [INI translations](https://docs.weblate.org/en/latest/formats/ini.md#ini), [Inno Setup INI translations](https://docs.weblate.org/en/latest/formats/innosetup.md#islu), [GWT properties](https://docs.weblate.org/en/latest/formats/gwt.md#gwt), [go-i18n JSON files](https://docs.weblate.org/en/latest/formats/go-i18n.md#go-i18n-json), [ARB File](https://docs.weblate.org/en/latest/formats/arb.md#arb). * Consistently use dismissed as state of dismissed checks. * Add support for configuring default add-ons to enable. * Fixed editor keyboard shortcut to dismiss checks. * Improved machine translation of strings with placeholders. * Show ghost translation for user languages to ease starting them. * Improved language code parsing. * Show translations in user language first in the list. * Renamed shapings to more generic name variants. * Added new quality checks: [Multiple unnamed variables](https://docs.weblate.org/en/latest/user/checks.md#check-unnamed-format), [Long untranslated](https://docs.weblate.org/en/latest/user/checks.md#check-long-untranslated), [Consecutive duplicated words](https://docs.weblate.org/en/latest/user/checks.md#check-duplicate). * Reintroduced support for wiping translation memory. * Fixed option to ignore source checks. * Added support for configuring different branch for pushing changes. * API now reports rate limiting status in the HTTP headers. * Added support for Google Translate V3 API (Advanced). * Added ability to restrict access on component level. * Added support for whitespace and other special chars in translation flags, see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks). * Always show rendered text check if enabled. * API now supports filtering of changes. * Added support for sharing glossaries between projects. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. Notable configuration or dependencies changes: * There are several changes in `settings_example.py`, most notable middleware changes, please adjust your settings accordingly. * There are new file formats, you might want to include them in case you modified the [`WEBLATE_FORMATS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_FORMATS). * There are new quality checks, you might want to include them in case you modified the [`CHECK_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CHECK_LIST). * There is change in `DEFAULT_THROTTLE_CLASSES` setting to allow reporting of rate limiting in the API. * There are some new and updated requirements. * There is a change in [`INSTALLED_APPS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-INSTALLED_APPS). * The `MT_DEEPL_API_VERSION` setting has been removed in Version 4.7. The [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) machine translation now uses the new `MT_DEEPL_API_URL` instead. You might need to adjust `MT_DEEPL_API_URL` to match your subscription. ## Weblate 4.0.4 *Released on May 7th 2020.* * Fixed testsuite execution on some Python 3.8 environments. * Typo fixes in the documentation. * Fixed creating components using the API in some cases. * Fixed JavaScript errors breaking mobile navigation. * Fixed crash on displaying some checks. * Fixed screenshots listing. * Fixed monthly digest notifications. * Fixed intermediate translation behavior with units non existing in translation. ## Weblate 4.0.3 *Released on May 2nd 2020.* * Fixed possible crash in reports. * User mentions in comments are now case insensitive. * Fixed PostgreSQL migration for non superusers. * Fixed changing the repository URL while creating component. * Fixed crash when upstream repository is gone. ## Weblate 4.0.2 *Released on April 27th 2020.* * Improved performance of translation stats. * Improved performance of changing labels. * Improved bulk edit performance. * Improved translation memory performance. * Fixed possible crash on component deletion. * Fixed displaying of translation changes in some corner cases. * Improved warning about too long celery queue. * Fixed possible false positives in the consistency check. * Fixed deadlock when changing linked component repository. * Included edit distance in changes listing and CSV and reports. * Avoid false positives of punctuation spacing check for Canadian French. * Fixed XLIFF export with placeholders. * Fixed false positive with zero width check. * Improved reporting of configuration errors. * Fixed bilingual source upload. * Automatically detect supported languages for DeepL machine translation. * Fixed progress bar display in some corner cases. * Fixed some checks triggering on non translated strings. ## Weblate 4.0.1 *Released on April 16th 2020.* * Fixed package installation from PyPI. ## Weblate 4.0 *Released on April 16th 2020.* * Weblate now requires Python 3.6 or newer. * Added management overview of component alerts. * Added component alert for broken repository browser URLs. * Improved sign in and registration pages. * Project access control and workflow configuration integrated to project settings. * Added check and highlighter for i18next interpolation and nesting. * Added check and highlighter for percent placeholders. * Display suggestions failing checks. * Record source string changes in history. * Upgraded Microsoft Translator to version 3 API. * Reimplemented translation memory backend. * Added support for several `is:` lookups in [Searching](https://docs.weblate.org/en/latest/user/search.md). * Allow to make [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same) avoid the built-in words exceptions. * Improved comments extraction from monolingual po files. * Renamed whiteboard messages to announcements. * Fixed occasional problems with registration mails. * Improved LINGUAS update add-on to handle more syntax variants. * Fixed editing monolingual XLIFF source file. * Added support for exact matching in [Searching](https://docs.weblate.org/en/latest/user/search.md). * Extended API to cover screenshots, users, groups, componentlists and extended creating projects. * Add support for source upload on bilingual translations. * Added support for intermediate language from developers. * Added support for source strings review. * Extended download options for platform wide translation memory. # changes/v5.md # Weblate 5.x series ## Weblate 5.17.1 *Released on April 30th 2026.* ### New features * Add-ons that opt in to manual triggering can now be run from add-on management and the [Add-ons](https://docs.weblate.org/en/latest/api.md#addons-api). * Admins can now clean up blocked or abusive users by reverting edits, rejecting pending suggestions, and deleting comments across project or site-wide scopes. * Admin user management can now find users by audit log IP address. * [Announcements](https://docs.weblate.org/en/latest/admin/announcements.md) can now also be managed via the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) for categories. * Added [LTEngine](https://docs.weblate.org/en/latest/admin/machine.md#mt-ltengine) machine translation service. ### Improvements * Improved documentation for the global `user.edit` permission, [Autoclean translation memory](https://docs.weblate.org/en/latest/admin/memory.md#autoclean-tm), [Terminology](https://docs.weblate.org/en/latest/user/glossary.md#glossary-terminology), and current [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) management options in the UI. * Improved [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots) documentation and linked it from the screenshots UI. * Documented restoring Docker-based setups from backups, see [Restoring Docker based setup](https://docs.weblate.org/en/latest/admin/backup.md#restore-docker). * Clarified [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) to state that Celery queues should be empty before upgrading. * The OpenAPI schema is cleaner and now describes action endpoints with their actual list, statistics, status, upload, and download response payloads. * The web installation flow for [Add missing languages](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-consistency-languages) now shows a preview and requires confirmation before creating missing language files across projects, categories, or site-wide scopes. * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) now offers guided client-side presets, suggests presets detected from component repository layouts, validates `{{ component }}` more clearly, and includes a worked discovery-template example in the docs. * Superuser and site-wide team changes are now tracked in [Audit log](https://docs.weblate.org/en/latest/user/profile.md#audit-log). * URL validation alerts now show clearer errors for project website and repository browser URLs, and project-level machine translation validation better explains private or local endpoint restrictions on hosted and self-managed sites. * [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) now attributes copied translations to the add-on user and records automatic translation results in the add-on activity log. * Extended the conflicting repository setup alert to direct Git pushes, see [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts). * [Profile](https://docs.weblate.org/en/latest/user/profile.md#profile) links now show an external-link warning where possible. * Client-side popup notifications triggered by JavaScript now use Bootstrap toasts, with higher-contrast dark theme colors for Bootstrap subtle and emphasis variants. * The SSH keys management page can now remove stored host keys so changed host keys can be replaced there. * Project listings now show review progress columns when any listed project has reviews enabled. ### Bug fixes * Image URLs in Markdown are now escaped before rendering ([**CVE 2026-44264**](https://www.cve.org/CVERecord?id=CVE-2026-44264) / [GHSA-5cmv-3rc4-7279](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-5cmv-3rc4-7279)). * Tightened [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) input validation to prevent translation enumeration ([**CVE 2026-44263**](https://www.cve.org/CVERecord?id=CVE-2026-44263) / [GHSA-gcg5-86jr-f7jg](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-gcg5-86jr-f7jg)). * Project backup imports now revalidate component repository URLs before restoring from backup ([**CVE 2026-41654**](https://www.cve.org/CVERecord?id=CVE-2026-41654) / [GHSA-cwcx-382v-8m9g](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-cwcx-382v-8m9g)). * Fixed revert links in the translate-view history tab after moving a component to another project. * Invitation acceptance now verifies the invited e-mail address and invitation expiry before granting team membership. * [Inconsistent reStructuredText](https://docs.weblate.org/en/latest/user/checks.md#check-rst-references) no longer crashes on repeated explicit-link targets. * The [Add-ons](https://docs.weblate.org/en/latest/api.md#addons-api) now validates required add-on configuration when installing add-ons. * Component updates no longer time out waiting on their own repository lock during validation. * [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#check-punctuation-spacing) check no longer triggers false positives for placeholders. * Repository alerts, history entries, and task messages now preserve multiline Git and SSH backend error output. * Interrupted Git rebases now recover more reliably after worker restarts, and signal-terminated backend commands are reported more clearly. * Borg backups that finish with warnings are no longer shown as failed in the management UI, and backup logs now show `C` entries for files that changed during the backup. * Git exporter no longer rejects shared-history fetches just because the first negotiated `have` revisions are newer than Weblate’s local history. * [Weblate Translation Memory](https://docs.weblate.org/en/latest/admin/machine.md#mt-weblate-translation-memory) automatic translation avoids broad PostgreSQL searches. * Malformed IPv6 repository URLs no longer crash SSH host key detection. * [Update POT file (xgettext)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-xgettext) and related POT update add-ons now replace the standard descriptive-title placeholder in normalized POT headers again. * [Update gettext template (Django)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-django) now skips repository `locale` trees during preflight validation, fixing components that store `django.pot` in a top-level `locale` directory. * Screenshot OCR now skips corrupted or truncated image files instead of failing the request. * Monolingual component validation now honors [Source language](https://docs.weblate.org/en/latest/admin/projects.md#component-source-language) when checking duplicate files alongside a separate [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template). * [Translation memory upload](https://docs.weblate.org/en/latest/admin/memory.md#memory-user) and [`import_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_memory) now report a validation error for TMX files missing the required header instead of failing the request. * [Weblate Translation Memory](https://docs.weblate.org/en/latest/admin/machine.md#mt-weblate-translation-memory) no longer misses boundary similarity matches after stricter lookups. * The missing file-mask matches [alert](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) is now restored after rescans that leave only the source translation. * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) now disables inherited string management for discovered formats that do not support adding or removing strings. * Automatic translation from other components now ignores read-only source candidates with empty translations. * Project component pagination now keeps the Components tab active when jumping to a typed page number. * Markdown rendering now falls back to escaped plain text when the parser fails. * Forgejo and Gitea test deliveries with sample loopback repository URLs no longer trigger slow suffix matching against all components. ### Compatibility * Password changes now regenerate personal API keys by default ([**CVE 2026-41519**](https://www.cve.org/CVERecord?id=CVE-2026-41519) / [GHSA-6j8j-4qp3-36p2](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-6j8j-4qp3-36p2)). * [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE) and [`WEBHOOK_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_RESTRICT_PRIVATE) now reject URLs whose hostnames cannot be resolved during validation unless the host is explicitly allowed. * [Profile](https://docs.weblate.org/en/latest/user/profile.md#profile) URL validation now rejects obvious direct file download URLs and invalid code site or Fediverse profile links. * Uploads now enforce [`TRANSLATION_UPLOAD_MAX_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-TRANSLATION_UPLOAD_MAX_SIZE), [`COMPONENT_ZIP_UPLOAD_MAX_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-COMPONENT_ZIP_UPLOAD_MAX_SIZE), and [`PROJECT_BACKUP_UPLOAD_MAX_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_UPLOAD_MAX_SIZE) before parsing. Component ZIP imports and project backup restores now share stricter ZIP archive safety checks, including total uncompressed data limits for project backup imports. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Gersona, Karen Konou, michael-smt Translations contributions : Michal Čihař, Besnik Bleta, Kristoffer Grundström, Francisco Serrador, ButterflyOfFire, anas agha, Zahid Rizky Fakhri, pan93412, Hyeonjeong Lee, VfBFan, 大王叫我来巡山, Yuri Chornoivan, LucasMZ, Átila França, Rafael Fontenelle, Aindriú Mac Giolla Eoin, UDP, Blueberry, Hotripak, Matthaiks, Agnieszka C, Priit Jõerüüt, Martin Srebotnjak, Fjuro, Andrei Stepanov, Mickaël Binos, IEEE-754, Adrian Reyes, bovirus, Max Kleinehelleforth, justcontributor, Yago Raña Gayoso, Horus68, Любомир Василев, CYAXXX, Andi Chandler, Adam Havránek, Kyotaro Iijima, Arif Budiman, ovl-1, Laitei, Jim Kats, Omer I.S., Fulup Jakez, ojppe, Julien Humbert, Jim Spentzos, Sketch6580, Dick Groskamp, 王晨旭, Frank Paul Silye, Anucha Hlownonkor, Milo Ivir Documentation contributions : Michal Čihař, Gersona, michael-smt [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/164?closed=1). ## Weblate 5.17 *Released on April 15th 2026.* ### New features * Added [`PROJECT_WEB_RESTRICT_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_ALLOWLIST) to exempt selected project slugs from project website restriction settings. * Added [`WEBSITE_ALERTS_ENABLED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBSITE_ALERTS_ENABLED) setting to allow disabling project website availability checks and alerts. * Added new management command [`list_format_features`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-list_format_features), which generates RST documentation snippets describing the supported features for every file format. * Shared components can now be categorized within the target project, including through the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) using the `category_id` parameter. * Added [Update POT file (xgettext)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-xgettext), [Update POT file (Meson)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-meson), [Update gettext template (Django)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-django), and [Update POT file (Sphinx)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-sphinx) to update POT files with configurable update cadence. * Added [`PASSWORD_RESET_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PASSWORD_RESET_URL) to customize the sign-in page password reset link, useful for external identity providers (Docker env: [`WEBLATE_PASSWORD_RESET_URL`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_PASSWORD_RESET_URL)). * Added [bulk user invitations](https://docs.weblate.org/en/latest/admin/access.md#invite-user). * Added [Objective-C format](https://docs.weblate.org/en/latest/user/checks.md#check-objc-format). * Added Forgejo notification webhook, see [Forgejo notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-forgejo-notifications). * Added translation memory API filtering, scoped access, and bulk lookup support. * Added `from_component` support to the REST API for creating components from existing component content and for seeding new translations by automatic translation from existing components. * [Announcements](https://docs.weblate.org/en/latest/admin/announcements.md) can now be managed via the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) for projects, components and translations. * Added a `soft` mode to [`VERSION_DISPLAY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VERSION_DISPLAY) to hide the Weblate version from prominent UI while keeping it available on the About page and [`GET /api/metrics/`](https://docs.weblate.org/en/latest/api.md#get--api-metrics-). ### Improvements * Track origin of newly added source strings. * Markdown now uses `auto-safe-html` by default, applying [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html) and [Unsafe HTML cleanup](https://docs.weblate.org/en/latest/user/checks.md#autofix-html) only to plain text and source strings that contain standard HTML markup or valid custom elements. * Improved LLM interfaces for better reliability. * Improved logic for adding monolingual plurals in [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md). * Added a component alert for conflicting merge request repository setup, see [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts). * Improved plural handling in [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation). * Improved error messages in some [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) endpoints. * Updated Microsoft Entra ID authentication docs and Microsoft sign-in branding while keeping legacy Azure AD backend identifiers and documentation anchors for compatibility. * Improved performance of project and category search result pages with very large match sets. * Docker now exposes [`WEBLATE_COMMIT_PENDING_HOURS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_COMMIT_PENDING_HOURS), [`WEBLATE_SOCIAL_AUTH_KEYCLOAK_ID_KEY`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SOCIAL_AUTH_KEYCLOAK_ID_KEY) for customizing the Keycloak unique user identifier claim, and [`WEBLATE_NGINX_IPV6`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_NGINX_IPV6) for controlling IPv6 listeners in the bundled NGINX. * Project history now records project backups and project/component restore events. * Improved documentation with auto-generated snippets for [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons), [Translation types capabilities](https://docs.weblate.org/en/latest/formats.md#fmt-capabs), [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks), and [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) machines, and clarified merge-conflict behavior for exported repositories using shallow clones by default. * Added [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE) to reject project website and repository browser URLs targeting internal or non-public addresses, [`WEBHOOK_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_RESTRICT_PRIVATE) to reject webhook URLs targeting internal or non-public addresses, and [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE) to reject repository and push URLs targeting internal or non-public addresses. These are exposed in Docker as [`WEBLATE_PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_PROJECT_WEB_RESTRICT_PRIVATE), [`WEBLATE_WEBHOOK_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_WEBHOOK_RESTRICT_PRIVATE), and [`WEBLATE_VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_VCS_RESTRICT_PRIVATE). * Improved performance of [Weblate](https://docs.weblate.org/en/latest/admin/machine.md#mt-weblate) lookups. * Screenshot and font upload forms now honor [`ALLOWED_ASSET_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_SIZE) which now defaults to 10 MB. * Expanded [Weblate threat model](https://docs.weblate.org/en/latest/security/threat-model.md) to cover webhook trust boundaries and delegated authorization boundaries, and clarified the instance-wide 2FA enforcement path in [Authentication](https://docs.weblate.org/en/latest/admin/auth.md). * [Reset and reapply recovery behavior](https://docs.weblate.org/en/latest/admin/continuous.md#manage-vcs-reset-reapply) now recreates missing translation files when possible and otherwise reports a clearer recovery error instead of failing later with a generic parse error. * Updated [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) to describe the current `make -C docs update-docs` workflow for generated snippets. * Linked repository components now inherit [Push on commit](https://docs.weblate.org/en/latest/admin/projects.md#component-push-on-commit), [Age of changes to commit](https://docs.weblate.org/en/latest/admin/projects.md#component-commit-pending-age), and [Lock on error](https://docs.weblate.org/en/latest/admin/projects.md#component-auto-lock-error) from the linked component that owns the repository. * Git exporter now provides clearer push and missing-revision errors to authorized users. * Faster category and project removals, and improved performance of project language counting and API listing on projects with shared components. * Clarified Git LFS limits of [Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter) in the UI and docs. * Improved [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md#backup) status reporting while keeping maintenance after failed backup attempts. * Improved loading speed for comments on the translate page and reduced repeated metric queries when rendering activity charts on overview pages with cold caches. ### Security fixes * Hardened repository boundary checks for symlink targets ([**CVE 2026-40256**](https://www.cve.org/CVERecord?id=CVE-2026-40256) / [GHSA-ffgh-3jrf-8wvh](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-ffgh-3jrf-8wvh)). * Hardened component file handling for repository symlinks ([**CVE 2026-34242**](https://www.cve.org/CVERecord?id=CVE-2026-34242) / [GHSA-hv99-mxm5-q397](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-hv99-mxm5-q397)). * Tightened [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) permission enforcement ([**CVE 2026-34393**](https://www.cve.org/CVERecord?id=CVE-2026-34393) / [GHSA-3382-gw9x-477v](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-3382-gw9x-477v)). * Hardened project-level [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) against SSRF ([**CVE 2026-34244**](https://www.cve.org/CVERecord?id=CVE-2026-34244) / [GHSA-xrwr-fcw6-fmq8](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-xrwr-fcw6-fmq8)). * Tightened location validation in [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) ([**CVE 2026-33220**](https://www.cve.org/CVERecord?id=CVE-2026-33220) / [GHSA-mqph-7h49-hqfm](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-mqph-7h49-hqfm)). * Enforced [`ALLOWED_ASSET_DOMAINS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_DOMAINS) across redirects for asset downloads ([**CVE 2026-33440**](https://www.cve.org/CVERecord?id=CVE-2026-33440) / [GHSA-5fhx-9jwj-867m](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-5fhx-9jwj-867m)). * Hardened [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) ([**CVE 2026-39845**](https://www.cve.org/CVERecord?id=CVE-2026-39845) / [GHSA-f8hv-g549-hwg2](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-f8hv-g549-hwg2)). * Removed unintended [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) API endpoints ([**CVE 2026-33214**](https://www.cve.org/CVERecord?id=CVE-2026-33214) / [GHSA-mpf5-3vph-q75r](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-mpf5-3vph-q75r)). * Tightened API access control for pending tasks ([**CVE 2026-33212**](https://www.cve.org/CVERecord?id=CVE-2026-33212) / [GHSA-vj45-x3pj-f4w4](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-vj45-x3pj-f4w4)). * Hardened [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) restore against repository-local VCS configuration and hooks from uploaded archives ([**CVE 2026-33435**](https://www.cve.org/CVERecord?id=CVE-2026-33435) / [GHSA-558g-h753-6m33](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-558g-h753-6m33)). ### Bug fixes * [Project backup](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) now preserves source translation read-only handling, and source-side pending commits without files are discarded to avoid repeated parse failures. * Fixed background failures in [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate). * Generated SSH wrapper scripts are now stored in [`CACHE_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CACHE_DIR) instead of persistent SSH storage, and obsolete or stale wrappers are cleaned up during upgrade. * Hardened Git branch handling to reject invalid branch names before repository operations. * Sanitized repository and upload backend errors before exposing them in UI and API responses. * Matching exporters now honor component file format parameters. * [Per-project access tokens](https://docs.weblate.org/en/latest/admin/access.md#project-api) now clean up stale bot users on project deletion and upgrade, and prevent removing the last assigned team to avoid orphaning the token. * Batch automatic translation now uses project-level machinery configuration instead of only site-wide settings. * Fixed sorting by the **Unreviewed** column in listings. * Fixed false positive in [Chars around XML tags](https://docs.weblate.org/en/latest/user/checks.md#check-xml-chars-around-tags) for Arabic letter Waw (“و”) adjacent to XML tags. * [Squash Git commits](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-git-squash) better handle commits applied upstream. * [`list_checks`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-list_checks) now requires exactly one `--sections` value when writing generated documentation to a file using `--output`. * Watched translations on the dashboard now use a stable language-aware ordering. * Reduced error-reporting noise for handled authentication callback failures and clarified password reset confirmation messages. * [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md) now falls back to the default API URL when base URL is empty. * [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) maps plain Portuguese to European Portuguese. * [MyMemory](https://docs.weblate.org/en/latest/admin/machine.md#mt-mymemory) now falls back to HTTP status handling when the service returns a non-JSON error response. * Push branches are no longer updated with upstream-only commits in multi-branch workflows. * POT update add-ons now fall back to the component URL for the `Report-Msgid-Bugs-To` header when the component setting is empty. * Improved repository lock error handling when deleting units. * Adding new languages now rescans only the newly added languages instead of forcing a full component scan. * [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) previews now keep the configured text box visible and render overflowing text in red. * Restored documented default encoding fallback for [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md) and [Java properties](https://docs.weblate.org/en/latest/formats/java.md) when file format parameters are not explicitly set. * Reduced repeated database queries in [Fill read-only strings with source](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-generate-fill-read-only) during the daily add-on task, and fixed auto-translation progress updates when the queued target disappears before execution. * [Android string resources](https://docs.weblate.org/en/latest/formats/android.md) now preserves template-defined escaped markup formatting when saving translations. * REST API component creation now handles temporary uploaded files for `docfile` and `zipfile` uploads. * SSH repository errors now distinguish changed host keys from missing host keys and avoid automatically trusting host key replacements. * [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) no longer treats translatable reStructuredText role content as [Placeables in automatic suggestion](https://docs.weblate.org/en/latest/user/checks.md#placeables-mt). * [Mismatched interrobang](https://docs.weblate.org/en/latest/user/checks.md#check-end-interrobang) now recognizes Arabic interrobang punctuation such as `؟!` and `!؟`. ### Compatibility * The `project_scope` class attribute on add-ons has been removed. Third-party add-ons that used `project_scope = True` should override `can_install()` to return `False` when `component` is not `None`. * The `daily()` method signature on add-ons has changed. Add-ons that previously overrode `daily(component)` to perform per-component work should now override `daily_component(component)` instead. The base `daily()` method automatically iterates components and calls `daily_component()` for each. Add-ons that can be optimized to operate at project scope should override `daily(component, project)` directly to implement project-level logic. * Dropped support for MySQL and MariaDB as the database engine. * Weblate now requires Django 6.0. * Weblate now requires Git 2.46 or newer. * Uploaded project backups are now validated more strictly during import and suspicious ZIP archives can be rejected; see [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are several changes in `settings_example.py`, most notably [`ADMINS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ADMINS) syntax has changed in Django and `SOCIAL_AUTH_PIPELINE` and `INSTALLED_APPS` need adjustments; please adjust your settings accordingly. * If you run Weblate in Docker and rely on IPv6 listeners, review [`WEBLATE_NGINX_IPV6`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_NGINX_IPV6). The default `auto` enables IPv6 listeners only when IPv6 is available in the container runtime; use `on` to always enable them or `off` to disable them. * Outbound project links, webhook URLs, and repository or push URLs pointing to internal or non-public addresses are now rejected by default. If your setup intentionally uses internal addresses, adjust the corresponding restriction settings such as [`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE), [`WEBHOOK_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_RESTRICT_PRIVATE), or [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE), and the related allowlists such as [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS). ### Contributors Code contributions : Michal Čihař, michael-smt, Kartik Ohri, bogusdominica, Karen Konou, Sven Hüster, Gersona, subnix, matilde-gillia, Steven Loria, felixfon, baltenaxis, Claw Explorer, Samuel Gomes Translations contributions : PICOPress, Blueberry, Deleted User, Francisco Serrador, eulalio, Pavel Miniutka, Amir E. Aharoni, hoanghuy309, nKsyn, Jim Kats, Martin Srebotnjak, Zahid Rizky Fakhri, symegac, Francesco Marinucci, Michal Čihař, Hyeonjeong Lee, ovl-1, Tarás Lavrentiev, Edson Wolf, Yuri Chornoivan, Omer I.S., Arantxa, Tuomas Hietala, Milo Ivir, justcontributor, Kristoffer Grundström, Andi Chandler, Andrei Stepanov, ButterflyOfFire, Átila França, Мария Рангелова, EESF-2, CzaroGame, Agnieszka C, Manuela Silva, پرویز قادر, JiZPaper, Fjuro, Alexis Launay, tfr tint, Candied-Ecard, Kyotaro Iijima, Priit Jõerüüt, Matthaiks, Besnik Bleta, delvani, Mickaël Binos, VfBFan, UDP, Aindriú Mac Giolla Eoin, Adam Havránek, mohammadA, 大王叫我来巡山, Sketch6580, Dick Groskamp, Heimen Stoffels, Yaron Shahrabani, Любомир Василев, Максим Горпиніч, Emin Tufan Çetin, Horus68, Sjur N Moshagen, Peter Vančo, Romhányi-Kakucska Viktor, ZayedRashid, Julien Lepiller, Massimo Pissarello, Jeff Huang, ojppe, தமிழ்நேரம், ibragimov, Sylvestre Ledru, Ldm Public, pan93412, Jernej Pangerc, Luciana Waldbaur, username-generic, jonnysemon, syl, Arif Budiman, Max Kleinehelleforth, Carp300, Yago Raña Gayoso, anas agha, Ettore Atalan Documentation contributions : Michal Čihař, Kartik Ohri, Sven Hüster, Dylan Kiss (dyki), Gersona, michael-smt, matilde-gillia, Steven Loria, baltenaxis, Claw Explorer, Samuel Gomes [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/158?closed=1). ## Weblate 5.16.2 *Released on March 6th 2026.* ### New features * New setting [`PUBLIC_ENGAGE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PUBLIC_ENGAGE) to make the engage page public even with [`REQUIRE_LOGIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REQUIRE_LOGIN). ### Improvements * Improved matching in [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md). * Show the number of strings waiting for review in listings. ### Bug fixes * Avoid displaying confusing status icons for ghost languages on project or category level. * Fixed missing plural source strings when creating new bilingual plural units. * Crash on certain pages with nested categories. * Improved API validation when adding strings. * Disabled throttling for incoming webhooks. * Avoid displaying non-actionable ghost languages. * Fixed highlighting in the translation editor. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Karen Konou, Kartik Ohri Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/163?closed=1). ## Weblate 5.16.1 *Released on February 26th 2026.* ### New features * [AsciiDoc files](https://docs.weblate.org/en/latest/formats/asciidoc.md), [XLIFF 1.1 and 1.2](https://docs.weblate.org/en/latest/formats/xliff.md) with Apple extensions, and [WixLocalization file](https://docs.weblate.org/en/latest/formats/wxl.md) are now supported file formats. * Added [`REGISTRATION_ALLOW_DISPOSABLE_EMAILS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REGISTRATION_ALLOW_DISPOSABLE_EMAILS) to optionally allow disposable e-mail domains during registration (Docker env: [`WEBLATE_REGISTRATION_ALLOW_DISPOSABLE_EMAILS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_REGISTRATION_ALLOW_DISPOSABLE_EMAILS)). ### Improvements * Improved documentation for translation states to clarify the difference between Needs editing, Needs rewriting, and Needs checking states. * Improved initial import of translations for [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md) and [HTML files](https://docs.weblate.org/en/latest/formats/html.md). ### Bug fixes * [Slack Webhooks](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-slack) properly delivers all events. * [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#check-punctuation-spacing) better handles XML markup. * [Stringsdict format](https://docs.weblate.org/en/latest/formats/stringsdict.md) better handle some plurals. * Improved plurals handling for language variants. * Fixed API access control. * Users can manage their own notification subscriptions via the API. * Project administrators can manage teams in their projects via the API, according to access control rules. * The add-ons listing in the API now correctly honors user permissions ([**CVE 2026-27457**](https://www.cve.org/CVERecord?id=CVE-2026-27457) / [GHSA-wppc-7cq7-cgfv](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-wppc-7cq7-cgfv)). * Fixed source column being cleared when translating monolingual [CSV files](https://docs.weblate.org/en/latest/formats/csv.md). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Simon Urli, Karen Konou, Kartik Ohri, Hendrik Leethaus Translations contributions : Heimen Stoffels, Michal Čihař, delvani, Yaron Shahrabani, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Priit Jõerüüt, Zahid Rizky Fakhri, Pierfrancesco Passerini, Massimo Pissarello, Romhányi-Kakucska Viktor, Mickaël Binos, Milo Ivir, Blueberry, 大王叫我来巡山, VfBFan, Besnik Bleta, Nikolay Korotkiy, Pavel Borecki, Matthaiks, Agnieszka C, Emin Tufan Çetin, Agustina Giselle, Fjuro, RViktor, ojppe, eulalio, Pavel Miniutka, Kristoffer Grundström, Aindriú Mac Giolla Eoin, reducedradius, Максим Горпиніч, Руслан Пузич, Francisco Serrador, Kyotaro Iijima, Petr Kadlec, தமிழ்நேரம், Dick Groskamp, PICOPress, justcontributor, Valentin Ljuba, Daniel Nylander, Arantxa, Marino Díaz, Artemka Documentation contributions : Michal Čihař, michael-smt, Kartik Ohri, Hendrik Leethaus [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/161?closed=1). ## Weblate 5.16 *Released on February 16th 2026.* ### New features * [Multiple capitals](https://docs.weblate.org/en/latest/user/checks.md#check-multiple-capital) quality check. * [Chars around XML tags](https://docs.weblate.org/en/latest/user/checks.md#check-xml-chars-around-tags) reduce translation errors for strings with XML entities. * Bulk accepting suggestions from a specific user in [Suggestions](https://docs.weblate.org/en/latest/user/translating.md#suggestions). * Cloning suggestions into translation in [Suggestions](https://docs.weblate.org/en/latest/user/translating.md#suggestions). * [`HIDE_SHARED_GLOSSARY_COMPONENTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-HIDE_SHARED_GLOSSARY_COMPONENTS) to hide glossaries shared into other projects. * Added new management command [`list_change_events`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-list_change_events), which lists all possible change events, [Selected change events](https://docs.weblate.org/en/latest/admin/addons.md#addon-choice-events). * Added Anthropic machinery integration, see [Anthropic](https://docs.weblate.org/en/latest/admin/machine.md#mt-anthropic). * Encoding for [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) can now be configured using [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) (e.g., `csv_encoding`, `properties_encoding`). * Added support for anonymous commit names via [`PRIVATE_COMMIT_NAME_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_NAME_TEMPLATE). * Consolidating identical strings in [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md#markdown), [HTML files](https://docs.weblate.org/en/latest/formats/html.md#html), and [Text files](https://docs.weblate.org/en/latest/formats/txt.md#txt) files using `*merge_duplicates` parameters in [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). ### Improvements * Delete announcements permission can be assigned to teams, see [List of privileges](https://docs.weblate.org/en/latest/admin/access.md#privileges). * [Searching](https://docs.weblate.org/en/latest/user/search.md) better reports errors in the query strings. * Regular repository maintenance is now performed in the background. * Repository cleanup now recovers failed merges or rebases. * Better visibility of [Translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) to translators. * Validation of VCS settings [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options) has been extended. * The default values for [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) and [Enable source reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-source-review) can be configured in settings. * The [`PRIVATE_COMMIT_EMAIL_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_TEMPLATE) now supports the `{user_id}` and `{site_title}` variables. * The default value for personal translation memory contribution is now based on the [`DEFAULT_AUTOCLEAN_TM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_AUTOCLEAN_TM) configuration. ### Bug fixes * Argument injection in the management console ([**CVE 2026-24126**](https://www.cve.org/CVERecord?id=CVE-2026-24126) / [GHSA-33fm-6gp7-4p47](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-33fm-6gp7-4p47)). * Adding plural strings with singular matching existing string is now prohibited for bilingual translations (see [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono)). * Automatic [Repository browser](https://docs.weblate.org/en/latest/admin/projects.md#component-repoweb) URL for common code hosting sites. * Improved cache isolation for suggestion checks to avoid interference with the parent unit checks. * Gracefully handle invalid check flags in [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks). * [App store metadata files](https://docs.weblate.org/en/latest/formats/appstore.md) no longer rewrites unchanged files. ### Compatibility * [Regular expression](https://docs.weblate.org/en/latest/user/checks.md#check-regex) no longer marks matched portions as non-translatable to allow generic regular-expression-based checking of strings. Use [Placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-placeholders) for checking regular expression matched placeholders. * The default value for [`WEBLATE_FORMATS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_FORMATS) changed because of the removal of encoding-specific formats. * File formats that only differed in encoding (CSV, GWT Properties, Java Properties, iOS Strings) have been merged into single formats. * Fonts used by Weblate are now shipped in a standalone package. * Dropped deprecated compatibility wrappers some classes with typos. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Kartik Ohri, Karen Konou, Serrano Pereira, moonchoe, softworkz, Gersona, hugorezende, Hendrik Leethaus, AliceVisek, devimarj, evanjhoward11, Zahid Rizky Fakhri, Francisco Serrador Translations contributions : தமிழ்நேரம், Andi Chandler, Daniel Nylander, Michal Čihař, VfBFan, ButterflyOfFire, Emin Tufan Çetin, eulalio, Milo Ivir, Yuri Chornoivan, 大王叫我来巡山, Zahid Rizky Fakhri, Peter Vančo, Kyotaro Iijima, amano, Hyeonjeong Lee, Yaron Shahrabani, Massimo Pissarello, Blueberry, Aindriú Mac Giolla Eoin, CRISTIAN ANDREI, Максим Горпиніч, Shah Zaman Pathan, Eduard Ereza Martínez, Alexis Launay, Luis Carlos González Morales, AlaxLima, Andrei Stepanov, Pierfrancesco Passerini, Valentin Ljuba, Anusuk Sangubon, Supaplex, Besnik Bleta, Matthaiks, Agnieszka C, Sketch6580, Mickaël Binos, U G, Kristoffer Grundström, Fjuro, 109247019824, Miguel A. Bouzada, Jim Spentzos, Fulup Jakez, Jim Kats, Omer I.S., nautilusx, jonnysemon, Martin Srebotnjak, Umida Hikmatilla, Arif Budiman, Ldm Public, pan93412, Heimen Stoffels, Romhányi-Kakucska Viktor, Pedro Leite, RViktor, Dick Groskamp, Alexander Gabilondo, Любомир Василев, Francisco Serrador, devimarj, Cyrille Duverne, 大学没毕业, Hotripak, delvani, A J. Documentation contributions : Michal Čihař, Kartik Ohri, moonchoe, Karen Konou, softworkz, Serhii H., shorelskyi, Gersona, hugorezende, Hendrik Leethaus, AliceVisek, devimarj, evanjhoward11 [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/156?closed=1). ## Weblate 5.15.2 *Released on January 14th 2026.* ### Improvements * [Statistics generator](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-generate-generate) is now triggered upon installation. * Screenshots updated from the repository have proper history. * [reStructuredText syntax error](https://docs.weblate.org/en/latest/user/checks.md#check-rst-syntax) now reports unintended list conversion. * [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same) check ignores AsciiDoc source code blocks. ### Bug fixes * Information leak via screenshots ([**CVE 2026-21889**](https://www.cve.org/CVERecord?id=CVE-2026-21889) / [GHSA-3g2f-4rjg-9385](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-3g2f-4rjg-9385)). * Explanation sync in [TermBase eXchange format](https://docs.weblate.org/en/latest/formats/tbx.md). * User interface fixes. * Clarified needs editing/checking/rewriting states. * Automatically translated flag with bulk approvals. * GitHub forks no longer trigger actions. * Tighter validation of user provided websites to avoid confusing homoglyphs. * Glossary support in [Google Cloud Translation Advanced](https://docs.weblate.org/en/latest/admin/machine.md#mt-google-translate-api-v3). * Invitations accepting when [`REQUIRE_LOGIN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REQUIRE_LOGIN) is turned on. * [CyrTranslit](https://docs.weblate.org/en/latest/admin/machine.md#mt-cyrtranslit) installation. ### Compatibility * Screenshot images are no longer served directly by the HTTP server, please adjust your HTTP server by removing serving of `/media/`. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * To make the fix for [**CVE 2026-21889**](https://www.cve.org/CVERecord?id=CVE-2026-21889) effective, the serving of `/media/` path should be removed from the HTTP server configuration; see [Serving static files](https://docs.weblate.org/en/latest/admin/install.md#static-files). ### Contributors Code contributions : Michal Čihař, Kartik Ohri, Karen Konou, Marek Lukášík, shyraptor, Korpyc, Benjamin Alan Jamie Translations contributions : Jim Kats, Horus68, Francisco Serrador, VfBFan, Fjuro, Andi Chandler, Eduard Ereza Martínez, Takeru Mikenu, eulalio, Mickaël Binos, Любомир Василев, Peter Vančo, Mateus Liberale Gomes, Hanu E., Pierfrancesco Passerini, amano, Blueberry, ButterflyOfFire, Basheer Radman, therealmate, មនុញ្ញ - MᴇᴀнNսɴн, தமிழ்நேரம், EdoAug, Zahid Rizky Fakhri, Milo Ivir, Kristoffer Grundström, searinminecraft, Kyotaro Iijima, adecorte, Priit Jõerüüt, Rhoslyn Prys, Shah Zaman Pathan, Daniel Nylander, Michal Čihař, Kristijan "Fremen" Velkovski, Aindriú Mac Giolla Eoin, Tuomas Hietala, 이정희, pan93412, Anusuk Sangubon, پرویز قادر, Fulup Jakez, Matthaiks, Besnik Bleta, Hotripak, 大王叫我来巡山, Agnieszka C Documentation contributions : Michal Čihař, Kartik Ohri, michael-smt, Marek Lukášík, shyraptor, Korpyc, alexis-pinon, Benjamin Alan Jamie [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/160?closed=1). ## Weblate 5.15.1 *Released on December 18th 2025.* ### New features * Added [`GET /api/projects/(string:project)/languages/(string:language_code)/file/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-languages-(string-language_code)-file-) to download a ZIP file of all component translations of a project for a specified language. ### Improvements * Updated list of OpenAI models. * Added [Migrating to Weblate](https://docs.weblate.org/en/latest/devel/migration.md) guide to help users migrate from other localization platforms. * Gracefully handle unreachable authentication providers. * Update language definitions to CLDR 48. ### Bug fixes * Git config file overwrite remote code execution ([**CVE 2025-68398**](https://www.cve.org/CVERecord?id=CVE-2025-68398) / [GHSA-8vcg-cfxj-p5m3](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-8vcg-cfxj-p5m3)). * Arbitrary file read via symbolic links ([**CVE 2025-68279**](https://www.cve.org/CVERecord?id=CVE-2025-68279) / [GHSA-g925-f788-4jh7](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-g925-f788-4jh7)). * Locking error that prevented updating linked components. * Fixed e-mail SSL configuration in Docker container. * Invitations on sites with required authentication. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Karen Konou, Kartik Ohri, ZhuHengjin, Edison, aditi-agni, aditi, Edison Dao, biplopghimire Translations contributions : eulalio, Yauhen, Emin Tufan Çetin, Priit Jõerüüt, Любомир Василев, Fjuro, Zahid Rizky Fakhri, Takeru Mikenu, ButterflyOfFire, 김인수, Manuela Silva, Pierfrancesco Passerini, Michal Čihař, 大王叫我来巡山, Dick Groskamp, Максим Горпиніч, Matthaiks, γλωσσολαλιά, Turkish Language Team 🇹🇷, Besnik Bleta, Massimo Pissarello, មនុញ្ញ - MᴇᴀнNսɴн, Jim Kats, Aindriú Mac Giolla Eoin, VfBFan Documentation contributions : Michal Čihař, ZhuHengjin, Edison, aditi-agni, aditi, Edison Dao, biplopghimire [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/159?closed=1). ## Weblate 5.15 *Released on December 15th 2025.* ### New features * Batch automatic translation can now be manually triggered at project language, category or component level, see [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation). * Added ability to completely disable the admin contact form by setting [`CONTACT_FORM`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CONTACT_FORM) to `"disabled"`. * Added new Ollama machinery tool for local Ollama AI model integration, see [Ollama](https://docs.weblate.org/en/latest/admin/machine.md#mt-ollama). * Added [`GET /api/units/(int:id)/comments/`](https://docs.weblate.org/en/latest/api.md#get--api-units-(int-id)-comments-) to get a list of comments for the given translation unit. * Memory contents imported from TMX files include string context. * [XLIFF 2.0](https://docs.weblate.org/en/latest/formats/xliff2.md), [Nextcloud Apps JSON files](https://docs.weblate.org/en/latest/formats/nextcloud-json.md), [JavaScript Resource Files (RESJSON)](https://docs.weblate.org/en/latest/formats/resjson.md), and [TOML](https://docs.weblate.org/en/latest/formats/toml.md) are now supported file formats. * [Fedora Messaging](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-fedora-messaging-publish) integration is now available as add-on. * Added [Laravel format](https://docs.weblate.org/en/latest/user/checks.md#check-laravel-format) quality check. ### Improvements * Added disk usage overview in [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance). * [`GET /api/groups/`](https://docs.weblate.org/en/latest/api.md#get--api-groups-) now includes `admins`. * [ModernMT](https://docs.weblate.org/en/latest/admin/machine.md#mt-modernmt) better supports language variants. * Automatically translated strings are now identified by a dedicated flag instead of a label. * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) preserves [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). * [CyrTranslit](https://docs.weblate.org/en/latest/admin/machine.md#mt-cyrtranslit) now supports Belarusian and Greek. * [Blocking users](https://docs.weblate.org/en/latest/admin/access.md#block-user) now accepts internal notes that are not visible to the user. * [Slack Webhooks](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-slack) and [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) can be installed multiple times. * Compatibility with Git SHA256 repositories. * The allowed version control URLs can now be configured using [`VCS_ALLOW_SCHEMES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_SCHEMES) and [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS). * The API timeout for creating pull requests or forking can now be configured via [`VCS_API_TIMEOUT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_API_TIMEOUT). * Improved VCS integration documentation to clarify Docker environment variables, commit authorship, hosted vs. self-hosted setup, and authentication options. * Timestamps from past are now shown with more detail. * Added two new [Translation states](https://docs.weblate.org/en/latest/workflows.md#states) to provide more detailed tracking of work-in-progress translations. ### Bug fixes * Improper invitation validation upon accepting ([**CVE 2025-64725**](https://www.cve.org/CVERecord?id=CVE-2025-64725) / [GHSA-m6hq-f4w9-qrjj](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-m6hq-f4w9-qrjj)). * Server-Side Request Forgery while cloning repository ([**CVE 2025-66407**](https://www.cve.org/CVERecord?id=CVE-2025-66407) / [GHSA-hfpv-mc5v-p9mm](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-hfpv-mc5v-p9mm)). * Over‑permissive webhook endpoint enabling mass repository updates plus component enumeration ([**CVE 2025-67492**](https://www.cve.org/CVERecord?id=CVE-2025-67492) / [GHSA-pj86-258h-qrvf](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-pj86-258h-qrvf)). * Notification settings disclosure via Weblate API ([**CVE 2025-67715**](https://www.cve.org/CVERecord?id=CVE-2025-67715) / [GHSA-3pmh-24wp-xpf4](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-3pmh-24wp-xpf4)). * [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) integration now correctly handles translating to Chinese variants. * [CSV files](https://docs.weblate.org/en/latest/formats/csv.md) format saving translations with empty source fields when using monolingual base files. * Tighter validation of user and full names to avoid confusing homoglyphs. * Avoid false positive checks upon committing pending changes. * Performance improvements for file upload. * Show glossary matches for the source language. * Pull/merge requests are now only created when necessary. ### Compatibility * Replaced custom `RequireLoginMiddleware` with Django 5.1’s `LoginRequiredMiddleware`. This makes settings `LOGIN_REQUIRED_URLS` and `LOGIN_REQUIRED_URLS_EXCEPTIONS` no longer supported, including their Docker environment variable counterparts. * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) secret length is now validated to match the Standard Webhooks specification. * Python 3.12 or newer is now required. * GLib 2.80 or newer is now required. * Dropped support for Web Monetization. * [Laravel PHP strings](https://docs.weblate.org/en/latest/formats/laravel.md) no longer includes `return` prefix in the keys. * There are several changes in `settings_example.py`, most notable are changed settings `CRISPY_ALLOWED_TEMPLATE_PACKS` and `INSTALLED_APPS`; please adjust your settings accordingly. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, michael-smt, Steven Loria, Tudor Gradinaru, Karen Konou, Gersona, Miguel A. Bouzada, Kartik Ohri, Florian, Abtin, Aaditya Joshi, Urtzi Odriozola, Cakex2005, was000, KamikazEr101 Translations contributions : Miguel A. Bouzada, Turkish Language Team 🇹🇷, Francisco Serrador, hoanghuy309, Priit Jõerüüt, Ldm Public, eulalio, ssantos, Christian Wia, Andi Chandler, Joel A, Peter Vančo, Dick Groskamp, Besnik Bleta, Dũng Vũ, Nicola Bortoletto, Ricky Tigg, Chang-Chia Tseng, 大学没毕业, Yaron Shahrabani, Karen Konou, Michal Čihař, Minh Tâm Nguyễn, VfBFan, Miniontoby, pan93412, ButterflyOfFire, 이정희, Wirjadisastra Wiki, Sketch6580, liilliil, dreigiau, Blueberry, Jim Kats, Arif Budiman, marvel at flowers, 大王叫我来巡山, Golubev Alexander, Alyaksandr Koshal, Yauhen, 109247019824, Сергей, Manuela Silva, ابْنُ السَدِيمِ, Changseop Yeom, Daniel Nylander, Kristoffer Grundström, Annamurat Ovezov, gattyan61, Fulup Jakez, Milo Ivir, پرویز قادر, Xusi Fons, Anusuk Sangubon, Matthaiks, Gašper Pintar, Максим Горпиніч, Aindriú Mac Giolla Eoin, Fjuro, Любомир Василев, Massimo Pissarello, Pierfrancesco Passerini, Mikenu Takeru, Marazm Mamazm, Takeru Mikenu, Emin Tufan Çetin, Zahid Rizky Fakhri, Serhii Horichenko, Agnieszka C, WaldiS Documentation contributions : Michal Čihař, michael-smt, Tudor Gradinaru, Gersona, Karen Konou, Kartik Ohri, Abtin, Aaditya Joshi, Urtzi Odriozola, Cakex2005, was000, KamikazEr101 [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/152?closed=1). ## Weblate 5.14.3 *Released on November 7th 2025.* ### Bug fixes * Observed HTTPS status in [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance). * Forced synchronization in the Repository maintenance. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/157?closed=1). ## Weblate 5.14.2 *Released on November 6th 2025.* ### Improvements * Performance when adding strings. ### Bug fixes * Adding terms to glossary was not working in some situations. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/155?closed=1). ## Weblate 5.14.1 *Released on November 5th 2025.* ### New features * String context are now tracked in changes history and displayed when available. ### Improvements * Document using Valkey in [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) and [Configure cache](https://docs.weblate.org/en/latest/admin/install.md#production-cache). * Added HTTP environment overview in [Performance report](https://docs.weblate.org/en/latest/admin/admin.md#manage-performance). * Docker container is using Python 3.14. * [ICU MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format) correctly handles implicit plurals. ### Bug fixes * Avoid storing inviting user information in the invited user audit log ([**CVE 2025-64326**](https://www.cve.org/CVERecord?id=CVE-2025-64326) / [GHSA-gr35-vpx2-qxhc](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-gr35-vpx2-qxhc)). * Omit admin IP address from audit log. * Counting outgoing commits in the repository status. * Listing of other translations. * SAML configuration in the Docker container. * [Translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) could miss some changes in certain situations. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Karen Konou, Gersona Translations contributions : Agnieszka C, Žiga Deisinger, Anthony Guéchoum, VfBFan, eulalio, Zahid Rizky Fakhri, Максим Горпиніч, Fjuro, Aindriú Mac Giolla Eoin, Peter Vančo, Dick Groskamp, Kyotaro Iijima, Pavel Miniutka, delvani, 大王叫我来巡山, Kaya Zeren, Øjvind Fritjof Arnfred, cat, mdfaruk896852-code, Michal Čihař, GitHub webhook, Besnik Bleta, Horus68, Hotripak, Aitor Astorga, Massimo Pissarello, Rafael Fontenelle, Sketch6580, Любомир Василев, Danial Behzadi, Milo Ivir, 大学没毕业, Francisco Serrador, hoanghuy309, Arantxa, Denys Nykula, Martin Srebotnjak, Andi Chandler, Ricky Tigg, Kevin Zhang, Nataniel Dika Kurniawan Documentation contributions : Michal Čihař, DeMiro5001, Gersona, Steffen [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/154?closed=1). ## Weblate 5.14 *Released on October 22nd 2025.* ### New features * [Flag updated translations from repository as “Needs rewriting”](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-flags-target-repo-update) is now available as an add-on. * [`DELETE /api/projects/(string:project)/labels/(int:label_id)/`](https://docs.weblate.org/en/latest/api.md#delete--api-projects-(string-project)-labels-(int-label_id)-). * Added multivalue CSV in [Downloading translations](https://docs.weblate.org/en/latest/user/files.md#download) for multivalue formats. * New global permissions have been added to control viewing teams, users and roles without edit rights, see [List of privileges](https://docs.weblate.org/en/latest/admin/access.md#privileges). * New `unit.bulk_edit` permission for bulk editing operations, replacing the overloaded use of `translation.auto` permission, see [List of privileges](https://docs.weblate.org/en/latest/admin/access.md#privileges). * [Searching for DATETIME fields](https://docs.weblate.org/en/latest/user/search.md#date-search). * Last changed lookup in [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings). * [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md) documentation. * [Do not show glossary matches](https://docs.weblate.org/en/latest/admin/projects.md#component-hide-glossary-matches) component setting. * Screenshots now can be uploaded from a URL, see [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots). ### Improvements * [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks) improvements. * Now follows [Error responses](https://docs.weblate.org/en/latest/api.md#api-errors). * Available in the OpenAPI. * Dropped long-deprecated endpoints. * Improved activity logging for [Add missing languages](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-consistency-languages) add-on. * [Inconsistent reStructuredText](https://docs.weblate.org/en/latest/user/checks.md#check-rst-references) and [reStructuredText syntax error](https://docs.weblate.org/en/latest/user/checks.md#check-rst-syntax) now support substitutions. * Improved performance for [Multiple failing checks](https://docs.weblate.org/en/latest/user/checks.md#check-multiple-failures) and [Long untranslated](https://docs.weblate.org/en/latest/user/checks.md#check-long-untranslated) checks with batch operations. * [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) can now be configured via the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). * Admins can configure [Expiration of user accounts](https://docs.weblate.org/en/latest/admin/access.md#expiring-accounts). * Rate limiting of notification e-mails, configurable by [`RATELIMIT_NOTIFICATION_LIMITS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_NOTIFICATION_LIMITS). * Repository maintenance now supports resetting the repository while keeping the current state of translations in Weblate. * Improved listing of [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) configuration. ### Bug fixes * Plurals and [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) handling on file upload. * [Team administrators](https://docs.weblate.org/en/latest/admin/access.md#team-admins) can no longer edit teams besides membership. * Highlighting syntax of overlapping elements. * Searching case sensitivity for short strings. * Inconsistent file formatting for new translations. * Memory contents imported via the [`import_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_memory) command are marked as active. * Importing some strings from [XLIFF 1.1 and 1.2](https://docs.weblate.org/en/latest/formats/xliff.md). ### Compatibility * The default attributes for [SAML authentication](https://docs.weblate.org/en/latest/admin/auth.md#saml-auth) in Docker container now matches non-Docker defaults. * Dropped long-deprecated [`GET /hooks/update/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--hooks-update-(string-project)-(string-component)-) and [`GET /hooks/update/(string:project)/`](https://docs.weblate.org/en/latest/api.md#get--hooks-update-(string-project)-). * Removed Akismet spam protection integration as it was no longer effective and used an unmaintained Python library. * New positional argument (activity_log_id) passed to the add-on event handlers, see [`weblate.addons.base.BaseAddon`](https://docs.weblate.org/en/latest/contributing/addons.md#weblate.addons.base.BaseAddon). Adjust any custom subclass accordingly. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, softworkz, Gersona, Benjamin Alan Jamie, Kartik Ohri, Kai Kewley, Raphael Michel, Dmytro Doroshenko, michael-smt, IoeCmcomc, Karen Konou, Juhari Yusuf Fatahillah, eulalio, Sketch6580 Translations contributions : Michal Čihař, eulalio, Zahid Rizky Fakhri, Divarrek, Sam Plimmer, amano, Sketch6580, Manuela Silva, Aindriú Mac Giolla Eoin, Максим Горпиніч, Milo Ivir, qywter11 qywter11, 大学没毕业, Changseop Yeom, Marija Grineviciute, Peter Vančo, Laurent FAVOLE, Сергей, Royston Shufflebotham, Massimo Pissarello, Emin Tufan Çetin, Juno Takano, Horus68, Martin Srebotnjak, Altos, ovl-1, 이정희, Yauhen, cat, Jessica Patricio, Alejandro Moctezuma, Kristijan "Fremen" Velkovski, Liviu Roman, Sveinn í Felli, Yamin Siahmargooei, Besnik Bleta, Øjvind Fritjof Arnfred, Danial Behzadi, Miguel A. Bouzada, CRISTIAN ANDREI, Denis96, Ldm Public, ROSPL-GR2-2025, Dick Groskamp, Jim Kats, Graaati, coronabond, VfBFan, Любомир Василев, GitHub webhook, Agnieszka C, Arif Budiman, Yaron Shahrabani, Karen Konou, Kartik Ohri, Juhari Yusuf Fatahillah, Дмитрий Михирев, Fjuro, Yago Raña Gayoso Documentation contributions : Michal Čihař, Gersona, Kai Kewley, Raphael Michel, Benjamin Alan Jamie, michael-smt, softworkz, Karen Konou, Kartik Ohri, Juhari Yusuf Fatahillah, eulalio, Sketch6580 [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/149?closed=1). ## Weblate 5.13.3 *Released on September 12th 2025.* ### Improvements * Text on the registration page informs about possible use of user’s data in more detail. * Clarified account removal view. ### Bug fixes * Components pagination. * [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) with same named components in different categories. * Source string location display. * Correctly track team adding via invitation in [Audit log](https://docs.weblate.org/en/latest/user/profile.md#audit-log). * [Add missing languages](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-consistency-languages) no longer includes shared component languages. * [Azure DevOps pull requests](https://docs.weblate.org/en/latest/vcs.md#azure-devops-push) API URL parsing. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Benjamin Alan Jamie, Raphael Michel, nijel Translations contributions : Michal Čihař, eulalio, Zahid Rizky Fakhri, Divarrek, Sam Plimmer, amano, Sketch6580, Manuela Silva, Aindriú Mac Giolla Eoin, Максим Горпиніч, Milo Ivir, qywter11 qywter11, 大学没毕业, Changseop Yeom, Marija Grineviciute Documentation contributions : Michal Čihař, Benjamin Alan Jamie, Raphael Michel, nijel [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/153?closed=1). ## Weblate 5.13.2 *Released on September 5th 2025.* ### Improvements * Error reporting upon validation of the file upload method. * Detailed language information in new language notifications. ### Bug fixes * Sign-in could not be completed with LDAP. * Nonspacing mark changes highlighting in history. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Translations contributions : Divarrek, VfBFan Documentation contributions : Michal Čihař, nijel [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/151?closed=1). ## Weblate 5.13.1 *Released on September 4th 2025.* ### Improvements * Smarter retries of unwritable pending changes. * Failed [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa) is visible in [Audit log](https://docs.weblate.org/en/latest/user/profile.md#audit-log). ### Bug fixes * Sign-in form not shown for LDAP. * Access control for [`GET /api/users/(str:username)/`](https://docs.weblate.org/en/latest/api.md#get--api-users-(str-username)-). * [Inconsistent reStructuredText](https://docs.weblate.org/en/latest/user/checks.md#check-rst-references) allows translatable reference names. * [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) were not properly applied in some situations. * Removed stale [Customize XML output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-xml-customize). * [LibreTranslate](https://docs.weblate.org/en/latest/admin/machine.md#mt-libretranslate) compatibility with LibreTranslate 1.7.0. * Username autocompletion in comments. * Shorten session expiry while in [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa) ([**CVE 2025-58352**](https://www.cve.org/CVERecord?id=CVE-2025-58352) / [GHSA-377j-wj38-4728](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-377j-wj38-4728)). * Statistics when using [Share in projects](https://docs.weblate.org/en/latest/admin/projects.md#component-links). * [Component Lists](https://docs.weblate.org/en/latest/admin/componentlists.md#componentlists) are no longer blocking dashboard loading. * OpenMetrics API format. ### Compatibility * Removed support for no longer working [IBM Watson Language Translator](https://docs.weblate.org/en/latest/admin/machine.md#mt-ibm). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are several changes in `settings_example.py`, most notably, `django_otp.middleware.OTPMiddleware` was removed from `MIDDLEWARE`; please adjust your settings accordingly. ### Contributors Code contributions : Michal Čihař, nijel, alisa, Gersona, Karen Konou, Kartik Ohri, softworkz, Paul Harriet Asiñero Translations contributions : pan93412, eulalio, Zahid Rizky Fakhri, Maciej Olko, Aindriú Mac Giolla Eoin, Christian Wia, Fjuro, Brian Njoroge, ssantos, Junghyuk Kwon, hugoalh, Alexis Launay, Wolf, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Yaron Shahrabani, Marija Grineviciute, Milo Ivir, Данил Костенков, Dick Groskamp, abdelbasset jabrane, CyrTranslit, cat, Michal Čihař, VfBFan, Wuzzy, Michalis, Deleted User, Francisco Serrador, Adolfo Jayme Barrientos, Ricky Tigg, Nicolas Van Aarsen, Julien Humbert, Jérôme, Nifou, Miguel A. Bouzada, elid, RViktor, Taufik Adi Wicaksono, Reza Almanda, Sveinn í Felli, Massimo Pissarello, Kyotaro Iijima, amano, 이정희, WaldiS, tomkolp, Piotr Kołtun, Horus68, Manuela Silva, Alan Marques, Rafael Fontenelle, Alefsander Ribeiro Nascimento, Simona Iacob, Nicoara Alex, Golubev Alexander, Сергей, Blueberry, Mingun, xXx, Vin, BouenMarsh, gfbdrgn, Igor Polyakov, qtm, Alexey Napalkov, Julija Juli, Reno Tx, தமிழ்நேரம், Kaya Zeren, Yuri Chornoivan, Ihor Hordiichuk, Mirka Danylenko, Tymofii Lytvynenko, Andrij Mizyk, Максим Горпиніч, 大王叫我来巡山, Sketch6580, JY3, 大学没毕业, Xiang Heng Wei, yangyangdaji, Xzonn, Peter Dave Hello, 峡州仙士, Winston Sung, Toomore Chiang, Haowei Hsu, Chang-Chia Tseng, notlin4, Supaplex, n1ck, Changseop Yeom, Ldm Public, Vitalii, Yago Raña Gayoso, Agnieszka C, Nguyễn Ngọc Khánh Documentation contributions : Michal Čihař, nijel, Kartik Ohri, Paul Harriet Asiñero [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/150?closed=1). ## Weblate 5.13 *Released on August 15th 2025.* ### New features * Enhanced [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) management with configurable status control, see [Translation memory status](https://docs.weblate.org/en/latest/admin/memory.md#memory-status). * Added [`cleanup_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-cleanup_memory) management command to remove obsolete translation memory entries. * [Catkeys file](https://docs.weblate.org/en/latest/formats/catkeys.md). * Some flags are now added to a string by default, based on locations; see [Location-based flags](https://docs.weblate.org/en/latest/admin/checks.md#location-based-flags). * Added [Translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) setting to control which translations are included when committing changes. * [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) can now be configured at the component level. * New management command [`list_file_format_params`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-list_file_format_params) to list all available file format parameters. * Tag and attribute names can now be customized for [Flat XML files](https://docs.weblate.org/en/latest/formats/flatxml.md#flatxml) with [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). ### Improvements * [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings) supports `labels_count:NUMBER` lookup. * A new [`SENTRY_MONITOR_BEAT_TASKS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-SENTRY_MONITOR_BEAT_TASKS) setting allows disabling Sentry monitoring of Celery Beat tasks. * [`WEBLATE_SOCIAL_AUTH_OIDC_TITLE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SOCIAL_AUTH_OIDC_TITLE) and [`WEBLATE_SOCIAL_AUTH_OIDC_IMAGE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SOCIAL_AUTH_OIDC_IMAGE) allow configuring the appearance of the generic OIDC authentication. * Background commits are now identified by an internal user. * Reorganized navigation menu. * When editing a language definition, a warning about automated updates is shown; see [Built-in language definitions](https://docs.weblate.org/en/latest/admin/languages.md#included-languages). * Avatars for API and internal accounts. * Adding a new TOTP device removes the existing one by default; checkbox for not removing previous ones available. * Creating pull or merge requests to remote repositories is no longer blocked by merge conflicts. * [Inconsistent reStructuredText](https://docs.weblate.org/en/latest/user/checks.md#check-rst-references) correctly handles Unicode punctuation and detects more issues. * Migration towards Bootstrap 5 has started, selected views now use Bootstrap 5. * [XLIFF 1.1 and 1.2](https://docs.weblate.org/en/latest/formats/xliff.md#xliff) now supports starting from scratch when [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects). * [OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-openai) compatibility with latest models. ### Bug fixes * [Uploading translations](https://docs.weblate.org/en/latest/user/files.md#upload) correctly tracks authorship when using Replace existing translation file. * [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) integration now correctly handles all supported source languages. * Possible crash on macOS 15 in `strxfrm`. * Internal server error on permission denied while uploading files. ### Compatibility * Some addons have been deprecated and replaced by [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params): [Customize gettext output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-customize), [Customize JSON output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-json-customize), [Customize YAML output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-yaml-customize), [Customize XML output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-xml-customize). * [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation), [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) and [`POST /api/translations/(string:project)/(string:component)/(string:language)/autotranslate/`](https://docs.weblate.org/en/latest/api.md#post--api-translations-(string-project)-(string-component)-(string-language)-autotranslate-) now support all search operators, not only limited filters. Existing add-on configuration has been migrated. API users will need to adjust invocation. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * The distributed locking now uses a different implementation and that introduced several changes in `settings_example.py`, most notably `BACKEND` in `CACHES` needs to be changed. * The Docker container is now using **granian**. This now requires explicit configuration of proxy trusted headers, including client protocol. [`WEBLATE_SECURE_PROXY_SSL_HEADER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_SECURE_PROXY_SSL_HEADER) typically needs to be added to avoid redirect loop, for example: ```yaml services: weblate: environment: WEBLATE_IP_PROXY_HEADER: HTTP_X_FORWARDED_FOR WEBLATE_SECURE_PROXY_SSL_HEADER: HTTP_X_FORWARDED_PROTO,https ``` #### SEE ALSO [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy) ### Contributors Code contributions : Michal Čihař, nijel, michael-smt, Kartik Ohri, مهدي الوالي, Benjamin Alan Jamie, Gersona, KarenKonou, Julian Wachholz, Jana, softworkz, Luc Didry, Paul Harriet Asiñero, Wouter van Os, Martin Komara, Karen Konou, Pavan Chilukuri Translations contributions : Emin Tufan Çetin, VfBFan, 大王叫我来巡山, Horus68, Aindriú Mac Giolla Eoin, Zulfar, Сергей, Besnik Bleta, Andi Chandler, Drugi Sapog, Eisuke Kawashima, wang, தமிழ்நேரம், Abduqadir Abliz, Yago Raña Gayoso, Manuela Silva, Arantxa, Linerly, Dick Groskamp, John, Peter Vančo, Jim Kats, WaldiS, caendeith, Michal Čihař, Florent, RViktor, hugoalh, Arun K Varghese, Wael Ibrahim, Juno Takano, Chang-Chia Tseng, eulalio, Fjuro, jonnysemon, Michael Neuendorf, Shizeeg Unadequatov, oxisol, Pierfrancesco Passerini, 大学没毕业, Любомир Василев, Ильсур Фаритович Ирназаров, Rafael Fontenelle, Yu Ting, J. Lavoie, Ilsur Irnazarov, Poesty Li, Xentrox Aero, amano, ButterflyOfFire, gfbdrgn, Zahid Rizky Fakhri, searinminecraft, Miguel A. Bouzada, pan93412, Mohammed Al Otaibi, Pexauteau Santander, Avi Markovitz, Helder Santana, qtm, Christian Wia, Ricky Tigg, Priit Jõerüüt, LucasMZ, VisionR1, ssantos, Yauhen, Clément Lyonnet, yangyangdaji, Максим Горпиніч, Matthaiks, Agnieszka C, Aleš Hakl, Yaron Shahrabani, Massimo Pissarello, 이정희, Dinh Nguyen, Martin Srebotnjak, Thunderstrike116, sletego, Sketch6580, 안정언, AlaxLima, Deniil, Tuomas Hietala, Λευθέρης Τρόμπακας, M. D. Kulkarni (MDK), Golubev Alexander Documentation contributions : Michal Čihař, nijel, Benjamin Alan Jamie, Julian Wachholz, Jana, Nik Clayton, Gersona, softworkz, Paul Harriet Asiñero, Kartik Ohri, Martin Komara, KarenKonou, Martin Trigaux, Pavan Chilukuri [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/143?closed=1). ## Weblate 5.12.2 *Released on June 20th 2025.* ### Improvements * [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) integration now supports using next-gen LLM model. ### Bug fixes * Restoring [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) with votes. * Improved error handling in [Apertium APy](https://docs.weblate.org/en/latest/admin/machine.md#mt-apertium-apy). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Translations contributions : eulalio, Linerly, Peter Vančo, Yaron Shahrabani, VfBFan, Roland Reck, Manuela Silva, Abduqadir Abliz, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Zahid Rizky Fakhri, Michal Čihař, Matthaiks, Drugi Sapog, Yuri Chornoivan, Agnieszka C, Massimo Pissarello, Fjuro, Sketch6580, Любомир Василев, newidyn, Zulfar Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/148?closed=1). ## Weblate 5.12.1 *Released on June 16th 2025.* ### Bug fixes * [Software Bill of Material](https://docs.weblate.org/en/latest/security/release-artifacts.md#sbom) now includes serial number. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Translations contributions : VfBFan, qywter11 qywter11, Manuela Silva Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/147?closed=1). ## Weblate 5.12 *Released on June 16th 2025.* ### Security * Exposure of personal IP address via e-mail ([**CVE 2025-49134**](https://www.cve.org/CVERecord?id=CVE-2025-49134) / [GHSA-4qqf-9m5c-w2c5](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-4qqf-9m5c-w2c5)). * Lack of rate limiting when verifying second factor ([**CVE 2025-47951**](https://www.cve.org/CVERecord?id=CVE-2025-47951) / [GHSA-57jg-m997-cx3q](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-57jg-m997-cx3q)). ### New features * Added [`POST /api/units/(int:id)/comments/`](https://docs.weblate.org/en/latest/api.md#post--api-units-(int-id)-comments-) to create a new comment for the given translation unit. * [Customize JSON output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-json-customize) now has a configurable compact mode. * Added [Non‑standard characters in Kabyle](https://docs.weblate.org/en/latest/user/checks.md#check-kabyle-characters) quality check. * [Software Bill of Material](https://docs.weblate.org/en/latest/security/release-artifacts.md#sbom) is now being provided for Weblate. * [Security, privacy and compliance](https://docs.weblate.org/en/latest/security/index.md) documentation. * Added support for [Compose Multiplatform resources](https://docs.weblate.org/en/latest/formats/compose-multiplatform-resources.md). * Added Translation Coordinator role. * [Slack Webhooks](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-slack) is now available as an add-on. * Added [`GET /api/users/(str:username)/contributions/`](https://docs.weblate.org/en/latest/api.md#get--api-users-(str-username)-contributions-) to retrieve a list of all translations contributed by the user. ### Improvements * [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same) is now skipped for Toki Pona. * [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings) supports `has:location` lookup. * Unicode whitespaces are now considered as problematic characters for [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary), see [Prohibited initial character](https://docs.weblate.org/en/latest/user/checks.md#check-prohibited-initial-character). * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) logs are now displayed nicely. * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) can be installed multiple times. * [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile) can now include contact URL. * [`POST /api/projects/`](https://docs.weblate.org/en/latest/api.md#post--api-projects-) allows non-superusers to create projects when [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing) module is enabled. * [`POST /api/groups/`](https://docs.weblate.org/en/latest/api.md#post--api-groups-) supports project-scoped team creation by non-superusers. * [`GET /api/users/`](https://docs.weblate.org/en/latest/api.md#get--api-users-) now includes `languages`. * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) documentation improved. * Improved support for extended metadata in [TermBase eXchange format](https://docs.weblate.org/en/latest/formats/tbx.md#tbx). * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) now includes a category field when available. * Uploaded fonts can be updated and changes to them are tracked, see [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts). * Weblate is now available in Bashkir language. ### Bug fixes * [Dashboard](https://docs.weblate.org/en/latest/user/profile.md#dashboard) translations ordering when paginating. * Honor DeepL API Free glossary limits in [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl). * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) delivery of project-wide events. * False reports of [Has been translated](https://docs.weblate.org/en/latest/user/checks.md#check-translated) with flags or explanation changes. * Creating new translations in [App store metadata files](https://docs.weblate.org/en/latest/formats/appstore.md). * [Search and replace](https://docs.weblate.org/en/latest/user/translating.md#search-replace) correctly handles plurals. ### Compatibility * The projects and categories default tab now shows translated languages. * If no `secret` is provided in the Webhook add-on configuration, the Webhook request will not be signed, see [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook). * [SAML authentication](https://docs.weblate.org/en/latest/admin/auth.md#saml-auth) support is no longer included in the default dependencies. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, nijel, Kartik Ohri, مهدي الوالي, Gersona, Mehdi El Oualy, KasukabeDefenceForce, AliceVisek, ButterflyOfFire, Benjamin Alan Jamie, michael-smt, Javi Boo, Karen Konou, Shubham Padia, KarenKonou, zoe, Zoe Translations contributions : Michal Čihař, Yauhen, Romeostar, RViktor, Francisco Serrador, ابْنُ السَدِيمِ, Alejandra Wheeler, xuars, پرویز قادر, amano, Andrei Stepanov, Jim Kats, dedakir923, Amalia Nostalgia, Aindriú Mac Giolla Eoin, elid, abdelbasset jabrane, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Rafael Fontenelle, Zahid Rizky Fakhri, Miguel A. Bouzada, Yaron Shahrabani, Fjuro, Jose Delvani, Jim Spentzos, Michał Korczak, Taufik Adi Wicaksono, joel MKO, Ldm Public, Carmelo Serraino, Yu Ting, Alex, Yago Raña Gayoso, Boonsita Noijad, Massimo Pissarello, 大王叫我来巡山, rimasx, Abhinav Ohri, Любомир Василев, Manuela Silva, Juzé, Licaon Kter, Anon, Ecron, ButterflyOfFire, Milo Ivir, Yuliia Ozkan, Christian Wia, Nat A, Drugi Sapog, Martin Srebotnjak, searinminecraft, Chou Chamnan, Priit Jõerüüt, Matthaiks, Sketch6580, Максим Горпиніч, Сергей, cat, Roland Reck, Agnieszka C, VfBFan, Besnik Bleta, Dick Groskamp, Pierfrancesco Passerini, PriitUring, Ding User, 大学没毕业, Peter Vančo, pan93412, Κyriaki L, Marijn Scholtus, Emin Tufan Çetin, Zulfar, Oasis Tri, zenobit, Abduqadir Abliz, ssantos, தமிழ்நேரம், lm, gogu, Andi Chandler, hugoalh, Linerly, Murun Battulga, Teitei, Wael Ibrahim, Burak Hüseyin Ekseli, Eduard Ereza Martínez, Tuomas Hietala, Taiki Ohno Documentation contributions : Michal Čihař, Kartik Ohri, AliceVisek, Gersona, KasukabeDefenceForce, ButterflyOfFire, Benjamin Alan Jamie, michael-smt, Renan LE CARO, nijel, Yuki Noda, zoe, Zoe [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/141?closed=1). ## Weblate 5.11.4 *Released on May 7th 2025.* ### Improvements * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) logs requests and responses. ### Bug fixes * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) was not triggered in some situations. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, مهدي الوالي Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/146?closed=1). ## Weblate 5.11.3 *Released on May 3rd 2025.* ### Bug fixes * Fixed release publishing. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/145?closed=1). ## Weblate 5.11.2 *Released on May 3rd 2025.* ### Improvements * Glossary performance in zen mode and automatic suggestions. * Extended supported formats for [Customize JSON output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-json-customize). ### Bug fixes * XML export no longer crashes on locations with special characters. * Improved error handling on ZIP upload. * Django 5.2 compatibility. * Avoid repeated glossary synchronizations. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Translations contributions : Yauhen, Michal Čihař, Romeostar, RViktor, Francisco Serrador, ابْنُ السَدِيمِ, Alejandra Wheeler, xuars, پرویز قادر, amano, Andrei Stepanov, Jim Kats, dedakir923, Amalia Nostalgia, Aindriú Mac Giolla Eoin, elid, abdelbasset jabrane, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), Rafael Fontenelle, Zahid Rizky Fakhri Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/144?closed=1). ## Weblate 5.11.1 *Released on April 25th 2025.* ### Improvements * [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) now include teams and categories. * Docker health check is now supported in non-web service containers. ### Bug fixes * [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests) integration now detects merge‑request conflicts more robustly. * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) is now enabled in Docker. * Removing pending glossary terms. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Kartik Ohri, nijel, AliceVisek, Cédric Krier Translations contributions : xuars, Fjuro, Yaron Shahrabani, VfBFan, Michal Čihař, Yauhen, RViktor, cat, Andrei Stepanov, Ettore Atalan, 大学没毕业, Miguel A. Bouzada, ssantos, Emin Tufan Çetin, Jeff Huang, Christian Wia, Murun Battulga, Сергей, Peter Vančo, Dick Groskamp, amano, Julien Humbert, தமிழ்நேரம், WofWca, dedakir923, Rafael Fontenelle, Heimen Stoffels, Manuela Silva, ball, Francisco Serrador, Linerly, Sveinn í Felli, Floee Rozario, Ricky Tigg Documentation contributions : Michal Čihař, AliceVisek, Kartik Ohri, Cédric Krier [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/142?closed=1). ## Weblate 5.11 *Released on April 15th 2025.* ### New features * Added [`GET /api/units/(int:id)/translations/`](https://docs.weblate.org/en/latest/api.md#get--api-units-(int-id)-translations-) to retrieve a list of all target translation units for the given source translation unit. * Added [`DELETE /api/groups/(int:id)/roles/(int:role_id)`](https://docs.weblate.org/en/latest/api.md#delete--api-groups-(int-id)-roles-(int-role_id)) to delete a role from a group. * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) is now available as an add-on. * [Automattic components formatting](https://docs.weblate.org/en/latest/user/checks.md#check-automattic-components-format) check to validate placeholders in Automattic components. * Inherited flags can now be discarded, see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks). * [Secondary languages](https://docs.weblate.org/en/latest/user/profile.md#secondary-languages) can now be specified in [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) and [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component). * [Source strings for the machine translation](https://docs.weblate.org/en/latest/admin/machine.md#mt-sources) can now be customized. ### Improvements * Weblate now uses OpenAPI Specification 3.1.1 to generate the schema for [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). * [Translator credits](https://docs.weblate.org/en/latest/devel/reporting.md#credits) and [Contributor stats](https://docs.weblate.org/en/latest/devel/reporting.md#stats) include translator’s join date. Additionally, both reports can be sorted either by the join date or the number of strings translated. * Widgets show more precise stats. * [Uploading translations](https://docs.weblate.org/en/latest/user/files.md#upload) is now tracked in history with details. * [C# format](https://docs.weblate.org/en/latest/user/checks.md#check-c-sharp-format) now supports `csharp-format` flag for compatibility with GNU gettext. * Changes in string flags are now tracked in history. * [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md) documentation extended. * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) better handles hundreds of matches. * Dismissing [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks) automatically updates propagated strings. * [Translation flags](https://docs.weblate.org/en/latest/admin/projects.md#project-check-flags) can now also be configured on the project level. * Improved rendering of [Translation flags](https://docs.weblate.org/en/latest/admin/translating.md#additional-flags) and [Explanation](https://docs.weblate.org/en/latest/admin/translating.md#additional-explanation) changes in history. * [CyrTranslit](https://docs.weblate.org/en/latest/admin/machine.md#mt-cyrtranslit) now automatically transliterates from a matching translation instead of the source strings. * Errors from creating a duplicate glossary and failure to delete a glossary are now handled gracefully. ### Bug fixes * **Security:** Cloning a component could leak component configuration into the URL ([**CVE 2025-32021**](https://www.cve.org/CVERecord?id=CVE-2025-32021)). * Fixed captcha verification when some time zone was configured. * Improved translation propagation performance. * Leading and trailing whitespace are now correctly stripped in glossary strings that also contain a [Prohibited initial character](https://docs.weblate.org/en/latest/user/checks.md#check-prohibited-initial-character). * Fixed background parsing of newly added translation files. ### Compatibility * Registration now disallows disposable e-mail domains. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * The database migration updates indexes and this might take considerable time. ### Contributors Code contributions : Michal Čihař, Gersona, Kartik Ohri, Mehdi El Oualy, Yash Kumar, nijel, Viktor Khokhryakov, AliceVisek, KasukabeDefenceForce Translations contributions : Michal Čihař, Vinko Kastelic, Dick Groskamp, ButterflyOfFire, Amalia Nostalgia, VfBFan, Balázs Úr, william chen, Alexander Gabilondo, cat, Fjuro, Ritwik, Rafael Fontenelle, Bee Crankson, Ldm Public, Christian Wia, ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝), தமிழ்நேரம், Emilia Meza, elid, xuars, Andi Chandler, RViktor, Tuukka Salminen, Yaron Shahrabani, Chang-Chia Tseng, Manuela Silva, Espea Tiviq, dedakir923, Besnik Bleta, ប៉ុកណូ រ៉ូយ៉ាល់, Dag Høidahl, Priit Jõerüüt, pan93412, Miguel A. Bouzada, Vũ Minh Nguyên, CyrTranslit, Avi Markovitz, Temuri Doghonadze, Matthaiks, Champ0999, Yauhen, Massimo Pissarello, Sketch6580, Максим Горпиніч, Emin Tufan Çetin, Agnieszka C, Ettore Atalan, Любомир Василев, Marc Riera, adiee5, 大王叫我来巡山, JY3, amano, Сергей, Ricky Tigg, Martin Srebotnjak, Gideon Wentink, Yuri Chornoivan Documentation contributions : Michal Čihař, Gersona, Kartik Ohri, Yash Kumar, AliceVisek, gpatel-fr [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/136?closed=1). ## Weblate 5.10.4 *Released on March 19th 2025.* ### Bug fixes * Fixed dismissing of checks. * Reduced overhead of rendering other strings while translating. * Improved performance of some [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) endpoints. * Fixed [Parsing language codes](https://docs.weblate.org/en/latest/admin/languages.md#language-parsing-codes) in some corner cases. * [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings) now properly finds exact match on the component. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Translations contributions : Vinko Kastelic, Dick Groskamp, Amalia Nostalgia, VfBFan, Balázs Úr, william chen, Michal Čihař, cat Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/140?closed=1). ## Weblate 5.10.3 *Released on March 13th 2025.* ### Improvements * Captcha is not shown for registrations via [Inviting new users](https://docs.weblate.org/en/latest/admin/access.md#invite-user). ### Bug fixes * Improved performance of API download endpoints. * Optimized fetching other translations while translating. * Reduced notifications overhead. * Improved handling of components using [Weblate internal URLs](https://docs.weblate.org/en/latest/vcs.md#internal-urls). * Fixed authenticating with some Git servers. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, nijel, Gersona, Javier Pérez, Mehdi El Oualy, Allan Nordhøy, Malte L., StoyanDimitrov, 49 Translations contributions : Dick Groskamp, VfBFan, Rafael Fontenelle, Besnik Bleta, 大学没毕业, 大王叫我来巡山, Xzonn, Agnieszka C, Linerly, Peter Vančo, Aindriú Mac Giolla Eoin, Uijong Wei, BouenMarsh, Sagiri, qtm, Martin Srebotnjak, Blueberry, Horus68, Aksel Azwaw, Yaron Shahrabani, Петро Узбек, Meta Sonic, Ldm Public, Michal Čihař, Lang Q, தமிழ்நேரம், amano, MERCRED, Milo Ivir, dsa-t, JY3, Balázs Meskó, Christian Wia, Szymon Ignaczak, Nichathip Polaueng, Chang-Chia Tseng, Emil Schildknecht Nielsen, Turkish Wold, Yılmaz Durmaz, Gadzio742, Nahil4, Yi Chi Fauzi, Максим Горпиніч, Fjuro, Sketch6580, Любомир Василев, Massimo Pissarello, Julien Humbert, Ricky Tigg, Ihor Hordiichuk, Kaya Zeren, Reno Tx, Miguel A. Bouzada, n1ck, Andi Chandler, Tuomas Hietala, Priit Jõerüüt, Trond Kjetil Bremnes, Pierfrancesco Passerini, Jesper Hertel, VisionR1, pan93412, Miguel, Lynilia, Mohammed Al Otaibi, Dwi Cahyono, awadhiworld, Kyotaro Iijima, Prachi Joshi, 이정희, Carlos Manuel Picos, Vaclovas Intas, Yuri, StoyanDimitrov, Mehdi El Oualy, Vlăduț Ilie, Ettore Atalan, qywter11 qywter11, Yuri Chornoivan, Temuri Doghonadze, hugoalh, Burak Hüseyin Ekseli, leyakid803, 김인수, bovirus, WaldiS, Filipe Mota (BlackSpirits), Alyaksandr Koshal, Мирослав Николић, پرویز قادر, cat, Ilyes Kouachi, ButterflyOfFire, Eduard Ereza Martínez, nautilusx, Matthaiks, Vin, Rostyslav, RViktor, Sveinn í Felli, Basheer Radman, dedakir923, xuars Documentation contributions : Michal Čihař, Rafael Fontenelle, AliceVisek, Gersona, StoyanDimitrov, Mehdi El Oualy [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/139?closed=1). ## Weblate 5.10.2 *Released on February 28th 2025.* ### Improvements * Improved [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) matching. * Visual diff now better highlights whitespace additions. * Improved performance on large projects. ### Bug fixes * Consistency of [Boolean operators](https://docs.weblate.org/en/latest/user/search.md#search-boolean) in [Searching](https://docs.weblate.org/en/latest/user/search.md). * Fixed some [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons) trigger upon installation. * Fixed restoring of Git repositories from [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup). ### Compatibility * Weblate has switched to a different library for zxcvbn integration, as the old one is no longer maintained, see [Password authentication](https://docs.weblate.org/en/latest/admin/auth.md#password-authentication). * Weblate uses proactive authentication with Git 2.46.0 and newer when HTTP credentials are supplied. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are several changes in `settings_example.py`, most notable are changed settings `AUTH_PASSWORD_VALIDATORS` and `INSTALLED_APPS`; please adjust your settings accordingly. ### Contributors Code contributions : Michal Čihař, nijel, Gersona, Javier Pérez, Mehdi El Oualy, Allan Nordhøy, Malte L., StoyanDimitrov, 49 Translations contributions : Dick Groskamp, VfBFan, Rafael Fontenelle, Besnik Bleta, 大学没毕业, 大王叫我来巡山, Xzonn, Agnieszka C, Linerly, Peter Vančo, Aindriú Mac Giolla Eoin, Uijong Wei, BouenMarsh, Sagiri, qtm, Martin Srebotnjak, Blueberry, Horus68, Aksel Azwaw, Yaron Shahrabani, Петро Узбек, Meta Sonic, Ldm Public, Michal Čihař, Lang Q, தமிழ்நேரம், amano, MERCRED, Milo Ivir, dsa-t, JY3, Balázs Meskó, Christian Wia, Szymon Ignaczak, Nichathip Polaueng, Chang-Chia Tseng, Emil Schildknecht Nielsen, Turkish Wold, Yılmaz Durmaz, Gadzio742, Nahil4, Yi Chi Fauzi, Максим Горпиніч, Fjuro, Sketch6580, Любомир Василев, Massimo Pissarello, Julien Humbert, Ricky Tigg, Ihor Hordiichuk, Kaya Zeren, Reno Tx, Miguel A. Bouzada, n1ck, Andi Chandler, Tuomas Hietala, Priit Jõerüüt, Trond Kjetil Bremnes, Pierfrancesco Passerini, Jesper Hertel, VisionR1, pan93412, Miguel, Lynilia, Mohammed Al Otaibi, Dwi Cahyono, awadhiworld, Kyotaro Iijima, Prachi Joshi, 이정희, Carlos Manuel Picos, Vaclovas Intas, Yuri, StoyanDimitrov, Mehdi El Oualy, Vlăduț Ilie, Ettore Atalan, qywter11 qywter11, Yuri Chornoivan, Temuri Doghonadze, hugoalh, Burak Hüseyin Ekseli, leyakid803, 김인수, bovirus, WaldiS, Filipe Mota (BlackSpirits), Alyaksandr Koshal, Мирослав Николић, پرویز قادر, cat, Ilyes Kouachi, ButterflyOfFire, Eduard Ereza Martínez, nautilusx, Matthaiks, Vin, Rostyslav, RViktor Documentation contributions : Michal Čihař, Rafael Fontenelle, AliceVisek, Gersona, StoyanDimitrov, Mehdi El Oualy [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/138?closed=1). ## Weblate 5.10.1 *Released on February 21st 2025.* ### Improvements * [Multiple failing checks](https://docs.weblate.org/en/latest/user/checks.md#check-multiple-failures) better shows failing checks including links to the strings. * Detailed overview of locked components on project repository management. * [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings) supports searching by source string state. ### Bug fixes * [Downloading translations](https://docs.weblate.org/en/latest/user/files.md#download) performs faster on project and language scopes. * [Zen Mode](https://docs.weblate.org/en/latest/user/translating.md#zen-mode) does not display the source string twice when editing it. * Fixed [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) terms highlighting. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, nijel, Gersona, Javier Pérez, Mehdi El Oualy, Allan Nordhøy, Malte L., StoyanDimitrov, 49 Translations contributions : Dick Groskamp, VfBFan, Rafael Fontenelle, Besnik Bleta, 大学没毕业, 大王叫我来巡山, Xzonn, Agnieszka C, Linerly, Peter Vančo, Aindriú Mac Giolla Eoin, Uijong Wei, BouenMarsh, Sagiri, qtm, Martin Srebotnjak, Blueberry, Horus68, Aksel Azwaw, Yaron Shahrabani, Петро Узбек, Meta Sonic, Ldm Public, Michal Čihař, Lang Q, தமிழ்நேரம், amano, MERCRED, Milo Ivir, dsa-t, JY3, Balázs Meskó, Christian Wia, Szymon Ignaczak, Nichathip Polaueng, Chang-Chia Tseng, Emil Schildknecht Nielsen, Turkish Wold, Yılmaz Durmaz, Gadzio742, Nahil4, Yi Chi Fauzi, Максим Горпиніч, Fjuro, Sketch6580, Любомир Василев, Massimo Pissarello, Julien Humbert, Ricky Tigg, Ihor Hordiichuk, Kaya Zeren, Reno Tx, Miguel A. Bouzada, n1ck, Andi Chandler, Tuomas Hietala, Priit Jõerüüt, Trond Kjetil Bremnes, Pierfrancesco Passerini, Jesper Hertel, VisionR1, pan93412, Miguel, Lynilia, Mohammed Al Otaibi, Dwi Cahyono, awadhiworld, Kyotaro Iijima, Prachi Joshi, 이정희, Carlos Manuel Picos, Vaclovas Intas, Yuri, StoyanDimitrov, Mehdi El Oualy, Vlăduț Ilie, Ettore Atalan, qywter11 qywter11, Yuri Chornoivan, Temuri Doghonadze, hugoalh, Burak Hüseyin Ekseli, leyakid803, 김인수, bovirus, WaldiS, Filipe Mota (BlackSpirits), Alyaksandr Koshal, Мирослав Николић, پرویز قادر, cat, Ilyes Kouachi, ButterflyOfFire, Eduard Ereza Martínez, nautilusx, Matthaiks, Vin Documentation contributions : Michal Čihař, Rafael Fontenelle, AliceVisek, Gersona, StoyanDimitrov, Mehdi El Oualy [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/137?closed=1). ## Weblate 5.10 *Released on February 14th 2025.* ### New features * [Inconsistent reStructuredText](https://docs.weblate.org/en/latest/user/checks.md#check-rst-references) check to validate reStructuredText references. * [reStructuredText syntax error](https://docs.weblate.org/en/latest/user/checks.md#check-rst-syntax) check to validate reStructuredText syntax. * API can now produce CSV output. * New management command [`import_projectbackup`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_projectbackup) to import [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup). ### Improvements * Improved error handling in [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup). * [`WEBLATE_REGISTRATION_CAPTCHA`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_REGISTRATION_CAPTCHA) is now available in Docker container. * Synchronize on shared repository now operates on all its components. * [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#check-punctuation-spacing) ignores markup such as Markdown or reStructuredText. * [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#autofix-punctuation-spacing) does not alter reStructuredText markup. * Improved validation errors in [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), see [Error responses](https://docs.weblate.org/en/latest/api.md#api-errors). * Any language changed into an alias in [Weblate language data](https://github.com/WeblateOrg/language-data/) is now reflected in all existing installations. * Blank alias languages (not linked to any translation, profile, component, …) are now automatically removed. * [Consecutive duplicated words](https://docs.weblate.org/en/latest/user/checks.md#check-duplicate) better works with markup such as Markdown or reStructuredText. * Automatically use DeepL API Free endpoint for the DeepL API Free authentication keys in [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl). * Compatibility with third-party static files storage backends for Django. * Improved language compatibility in [Azure AI Translator](https://docs.weblate.org/en/latest/admin/machine.md#mt-microsoft-translator). * [Reused translation](https://docs.weblate.org/en/latest/user/checks.md#check-reused) check gracefully handles languages which are not case sensitive. * [Enforced checks](https://docs.weblate.org/en/latest/admin/projects.md#component-enforced-checks) are now applied on strings imported from the repository. * Reduced false positives in [Mismatched colon](https://docs.weblate.org/en/latest/user/checks.md#check-end-colon) and [Mismatched full stop](https://docs.weblate.org/en/latest/user/checks.md#check-end-stop) for CJK languages. * OpenAPI schema for API includes more information. * [Regular expression](https://docs.weblate.org/en/latest/user/checks.md#check-regex) supports advanced regular expressions. * [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same) gracefully deals with case-insensitive languages. ### Bug fixes * [Reused translation](https://docs.weblate.org/en/latest/user/checks.md#check-reused) wrongly triggered after fixing the error. * Dark theme behavior in some situations. * Translation propagation sometimes did not work as expected. * *Content-Security-Policy* is now automatically set for AWS. * [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup) sometimes cached results too aggressively. * Fixed translations caching in [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup). * [Unsafe HTML cleanup](https://docs.weblate.org/en/latest/user/checks.md#autofix-html) automatic fixups honors the `ignore-safe-html` flag. * [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#check-punctuation-spacing) no longer applies to Breton. * Fixed [Squash Git commits](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-git-squash) on linked repositories. * [Multiple failing checks](https://docs.weblate.org/en/latest/user/checks.md#check-multiple-failures) avoids false positives and better lists related checks. ### Compatibility * Running tests using Django test executor is no longer supported, see [Weblate testsuite and continuous integration](https://docs.weblate.org/en/latest/contributing/tests.md). * [BBCode markup](https://docs.weblate.org/en/latest/user/checks.md#check-bbcode) check is now disabled by default. The `bbcode-text` flag is required to activate this check, see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks). * API error responses format has changed, see [Error responses](https://docs.weblate.org/en/latest/api.md#api-errors). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are several changes in `settings_example.py`, most notable are the new settings for [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) in `REST_FRAMEWORK`, `SPECTACULAR_SETTINGS`, `DRF_STANDARDIZED_ERRORS` and `INSTALLED_APPS`; please adjust your settings accordingly. * PostgreSQL 12 and MariaDB 10.4 are no longer supported. ### Contributors Code contributions : Michal Čihař, nijel, Gersona, Javier Pérez, Mehdi El Oualy, Allan Nordhøy, Malte L., StoyanDimitrov, 49 Translations contributions : Dick Groskamp, VfBFan, Rafael Fontenelle, Besnik Bleta, 大学没毕业, 大王叫我来巡山, Xzonn, Agnieszka C, Linerly, Peter Vančo, Aindriú Mac Giolla Eoin, Uijong Wei, BouenMarsh, Sagiri, qtm, Martin Srebotnjak, Blueberry, Horus68, Aksel Azwaw, Yaron Shahrabani, Петро Узбек, Meta Sonic, Ldm Public, Michal Čihař, Lang Q, தமிழ்நேரம், amano, MERCRED, Milo Ivir, dsa-t, JY3, Balázs Meskó, Christian Wia, Szymon Ignaczak, Nichathip Polaueng, Chang-Chia Tseng, Emil Schildknecht Nielsen, Turkish Wold, Yılmaz Durmaz, Gadzio742, Nahil4, Yi Chi Fauzi, Максим Горпиніч, Fjuro, Sketch6580, Любомир Василев, Massimo Pissarello, Julien Humbert, Ricky Tigg, Ihor Hordiichuk, Kaya Zeren, Reno Tx, Miguel A. Bouzada, n1ck, Andi Chandler, Tuomas Hietala, Priit Jõerüüt, Trond Kjetil Bremnes, Pierfrancesco Passerini, Jesper Hertel, VisionR1, pan93412, Miguel, Lynilia, Mohammed Al Otaibi, Dwi Cahyono, awadhiworld, Kyotaro Iijima, Prachi Joshi, 이정희, Carlos Manuel Picos, Vaclovas Intas, Yuri, StoyanDimitrov, Mehdi El Oualy, Vlăduț Ilie, Ettore Atalan, qywter11 qywter11, Yuri Chornoivan, Temuri Doghonadze, hugoalh, Burak Hüseyin Ekseli, leyakid803, 김인수, bovirus Documentation contributions : Michal Čihař, Rafael Fontenelle, AliceVisek, Gersona, StoyanDimitrov, Mehdi El Oualy [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/133?closed=1). ## Weblate 5.9.2 *Released on December 19th 2024.* ### Improvements * Renamed [Bitbucket Data Center pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-data-center-pull-requests) to match new product name. * [`GET /api/users/`](https://docs.weblate.org/en/latest/api.md#get--api-users-) supports searching by user ID. ### Bug fixes * Avoid query parser crash in multi-threaded environments. * Avoid [Automatic fixups](https://docs.weblate.org/en/latest/user/checks.md#autofix) crash on multi-value strings. * Make project tokens work when [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa) or [Contributor license agreement](https://docs.weblate.org/en/latest/admin/projects.md#component-agreement) are enforced. * Captcha solution were sometimes not accepted. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Gersona Translations contributions : Horus68, Peter Vančo, cat, Rafael Fontenelle, Blueberry, Christian Wia, 大学没毕业, Yılmaz Durmaz, gallegonovato, Miguel A. Bouzada, VfBFan, Michal Čihař, Максим Горпиніч, Besnik Bleta, Aindriú Mac Giolla Eoin, Yaron Shahrabani, Fjuro, 大王叫我来巡山, Massimo Pissarello, Любомир Василев Documentation contributions : Michal Čihař, Rafael Fontenelle [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/135?closed=1). ## Weblate 5.9.1 *Released on December 16th 2024.* ### Bug fixes * Fixed publishing package to PyPI. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/134?closed=1). ## Weblate 5.9 *Released on December 16th 2024.* ### New features * Per-project [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup) can now be configured via the Project [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). * Added [`GET /api/projects/(string:project)/machinery_settings/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-machinery_settings-). * Added [`POST /api/projects/(string:project)/machinery_settings/`](https://docs.weblate.org/en/latest/api.md#post--api-projects-(string-project)-machinery_settings-). * Translation memory import now supports files with XLIFF, PO and CSV formats, see [User interface](https://docs.weblate.org/en/latest/admin/memory.md#memory-user) and [`import_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_memory) command in [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage). * The registration CAPTCHA now includes proof-of-work mechanism ALTCHA. * Leading problematic characters in CSV are now checks for [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary), see [Prohibited initial character](https://docs.weblate.org/en/latest/user/checks.md#check-prohibited-initial-character). * Logging to [Graylog log management](https://docs.weblate.org/en/latest/admin/install.md#graylog). ### Improvements * [Google Cloud Translation Advanced](https://docs.weblate.org/en/latest/admin/machine.md#mt-google-translate-api-v3) now supports [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) (optional). * A shortcut to duplicate a component is now available directly in the menu (Operations → Duplicate this component). * Included username when generating [Translator credits](https://docs.weblate.org/en/latest/devel/reporting.md#credits). * [Bulk edit](https://docs.weblate.org/en/latest/user/translating.md#bulk-edit) shows a preview of matched strings. * [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-) exposes component lock state. * Editor in [Zen Mode](https://docs.weblate.org/en/latest/user/translating.md#zen-mode) is now stick to bottom of screen. * Added page navigation while [Translating](https://docs.weblate.org/en/latest/user/translating.md#translating). * [Appearance customization](https://docs.weblate.org/en/latest/admin/admin.md#manage-appearance) now has distinct settings for dark mode. * Improved [Translation propagation](https://docs.weblate.org/en/latest/admin/continuous.md#translation-propagation) performance. * More detailed error messages for [`POST /api/translations/(string:project)/(string:component)/(string:language)/file/`](https://docs.weblate.org/en/latest/api.md#post--api-translations-(string-project)-(string-component)-(string-language)-file-). ### Bug fixes * Using the `has:variant` field now correctly displays strings that have variants in the search language, see [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings). * Saving newly added strings in some formats. * [Java format](https://docs.weblate.org/en/latest/user/checks.md#check-java-printf-format) gracefully handles escaping. ### Compatibility * [Rollbar](https://docs.weblate.org/en/latest/admin/install.md#rollbar-errors) integration no longer includes client-side error collection. * Weblate now requires Git 2.28 or newer. * Any custom code that relied on `Change` models signals should be reviewed. * [Fedora Messaging](https://docs.weblate.org/en/latest/admin/addons.md#fedora-messaging) integration needs to be updated to be compatible with this release. * [`WEB_WORKERS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEB_WORKERS) now configures number of threads instead of processes. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Mehdi El Oualy, Paul Harriet Asiñero, Yusi Z, Mehdi Eloualy, gers, nijel, michael-smt, gersona, Gersona Translations contributions : Michal Čihař, Besnik Bleta, gallegonovato, Blueberry, cat, Fjuro, Sketch6580, Massimo Pissarello, Linerly, 大王叫我来巡山, 大学没毕业, Yuri Chornoivan, VfBFan, JY3, Miguel A. Bouzada, Dick Groskamp, Aindriú Mac Giolla Eoin, Andi Chandler, Kristoffer Grundström, Christian Wia, Claudio Filho F Filho, Yaron Shahrabani, Milo Ivir, Kaya Zeren, Neaten “Awrawman” Awrawman, Agnieszka C, Jeff Huang, Fulup Jakez, Milan Šalka, nautilusx, Любомир Василев, notlin4, immeteor2, kowih83264, WaldiS, ssantos, Reno Tx, Johan Jacobsson, Peter Vančo, Sveinn í Felli, Oliver, Yvan Zo, meshari alnaim, தமிழ்நேரம், searinminecraft, Jwtiyar Nariman, gitelo4516, Vision, Chang-Chia Tseng, Kyotaro Iijima, Ricky Tigg, ei9, Martin Srebotnjak, Horus68, 이정희, Максим Горпиніч, Sylvain Pichon, Ldm Public, Слободан Симић(Slobodan Simić), Priit Jõerüüt, Hugo, UTUMI Hirosi, Сергей, symegac, Winston Sung, ChinskiKaczynski, Rafael Fontenelle Documentation contributions : Michal Čihař, Paul Harriet Asiñero, gers, michael-smt, Benjamin Alan Jamie, Gersona, Mehdi Eloualy [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/127?closed=1). ## Weblate 5.8.4 *Released on November 19th 2024.* ### Improvements * [Searching for users](https://docs.weblate.org/en/latest/user/search.md#search-users) can search based on user changes. ### Bug fixes * Fixed occasional crash in [RSS feeds](https://docs.weblate.org/en/latest/api.md#rss). * [ICU MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format) gracefully handles plural strings. * [Bitbucket Cloud pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-cloud-pull-requests) correctly generates pull request description. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, gersona, Mehdi El Oualy Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/132?closed=1). ## Weblate 5.8.3 *Released on November 6th 2024.* ### Bug fixes * Formatting of some [Audit log](https://docs.weblate.org/en/latest/user/profile.md#audit-log) entries. * Fixed XML escaped output in some machine translation integrations. * Fixed duplicate listing of newly added glossary terms. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Mehdi El Oualy Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/131?closed=1). ## Weblate 5.8.2 *Released on November 1st 2024.* ### Bug fixes * Update outdated plural definitions during the database migration. * Reduced number of database queries when updating multiple strings. * Leading problematic characters in [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) terms are now properly stripped in uploaded files. * Improved [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) performance. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Paul Harriet Asiñero, michael-smt, gers, Mehdi El Oualy Translations contributions : VfBFan, 大王叫我来巡山, Любомир Василев, Miguel A. Bouzada, Besnik Bleta, Yuri Chornoivan, Wuzzy, Michal Čihař, gallegonovato, Vin, Blueberry, befag74614, Agnieszka C, Rhoslyn Prys, Aindriú Mac Giolla Eoin, Fulup Jakez, Christian Wia, ssantos, Vlăduț Ilie, Fjuro, amano, Andi Chandler, Peter Vančo, test-session, famese, Yaron Shahrabani, Geert-Jan Knapen, Ricky From Hong Kong, Tymofii Lytvynenko, Dick Groskamp, Horus68, Reno Tx, Jim Kats, Massimo Pissarello, Florent, Ihor Hordiichuk, hugoalh, Vaclovas Intas, Milo Ivir, Jim Spentzos, Dženan, Claudio Filho F Filho, 大学没毕业, پرویز قادر Documentation contributions : Michal Čihař, Benjamin Alan Jamie, gers, gersona [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/129?closed=1). ## Weblate 5.8.1 *Released on October 15th 2024.* ### Bug fixes * Use lower case name for the Python package. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/128?closed=1). ## Weblate 5.8 *Released on October 15th 2024.* ### New features * Added [Key filter](https://docs.weblate.org/en/latest/admin/projects.md#component-key-filter) in the component. * [Searching](https://docs.weblate.org/en/latest/user/search.md) now supports filtering by object path and [Searching for DATETIME fields](https://docs.weblate.org/en/latest/user/search.md#date-search). * Merge requests credentials can now be passed in the repository URL, see [Configuring version control credentials](https://docs.weblate.org/en/latest/admin/config.md#settings-credentials). * [Azure OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-azure-openai) automatic suggestion service. * [Bitbucket Cloud pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-cloud-pull-requests). ### Improvements * [ModernMT](https://docs.weblate.org/en/latest/admin/machine.md#mt-modernmt) supports [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). * [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) now supports specifying translation context. * [Amazon Translate](https://docs.weblate.org/en/latest/admin/machine.md#mt-aws) now supports [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). * [Automatic fixups](https://docs.weblate.org/en/latest/user/checks.md#autofix) for Devanagari danda now better handles latin script. * [Automatic fixups](https://docs.weblate.org/en/latest/user/checks.md#autofix) for French and Breton now uses a non-breaking space before colons instead of a narrow one. * [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) now has a preview OpenAPI specification. * Stale, empty glossaries are now automatically removed. * `?` now displays available [Keyboard shortcuts](https://docs.weblate.org/en/latest/user/translating.md#keyboard). * Translation and language view in the project now include basic information about the language and plurals. * [Search and replace](https://docs.weblate.org/en/latest/user/translating.md#search-replace) shows a preview of matched strings. * [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource) now support translatable attribute in its strings. * Creating component via file upload (Translate document) now supports bilingual files. ### Bug fixes * Displaying [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) setting in some cases. * Users can add component in any language already existing in a project. * [Multiple unnamed variables](https://docs.weblate.org/en/latest/user/checks.md#check-unnamed-format) better handles some strings, such as [Python brace format](https://docs.weblate.org/en/latest/user/checks.md#check-python-brace-format). ### Compatibility * Weblate now requires Python 3.11 or newer. * [Amazon Translate](https://docs.weblate.org/en/latest/admin/machine.md#mt-aws) now requires the `TranslateFullAccess` permission. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are several changes in `settings_example.py`, most notable are the new settings for [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) in `SPECTACULAR_SETTINGS` and changes in `REST_FRAMEWORK` and `INSTALLED_APPS`; please adjust your settings accordingly. ### Contributors Code contributions : Michal Čihař, Mehdi Eloualy, Mehdi El Oualy, gers, michael-smt, ButterflyOfFire, Saurmanđal, Paul Harriet Asiñero, Ingo Brückl, Vincent, Jakub Boukal, nijel Translations contributions : gallegonovato, Jose Delvani, Andi Chandler, Massimo Pissarello, Christian Wia, Kaya Zeren, Muhammad B Madara, Assem Askarova, pan93412, Reno Tx, Sagiri, symegac, Allan Nordhøy, VfBFan, Peter Vančo, Yaron Shahrabani, Dick Groskamp, Besnik Bleta, Masahiro Fujimoto, Kyotaro Iijima, ButterflyOfFire, Michal Čihař, پرویز قادر, amano, Mirka Danylenko, Yuri Chornoivan, Milo Ivir, Blueberry, Julien Humbert, JY3, Ricky Tigg, Hotripak, Vin, Fjuro, 大王叫我来巡山, Miguel A. Bouzada, Любомир Василев, Aindriú Mac Giolla Eoin, Coool (github.com/Coool), Ihor Hordiichuk, Martin Srebotnjak, Сергей, jonnysemon, Wuzzy, Ldm Public, Nived, Hoseok Seo, Tuomas Hietala, Andrey, solokot, Agnieszka C, Luna, Alan Marques, ssantos, Yamin Siahmargooei, Vaclovas Intas, Linerly, Victor K, Rhoslyn Prys, Iker García Calviño, Milan Šalka, Justin Nogossek, Floure, Eduardo Malaspina, Oğuz Ersen, Priit Jõerüüt, Jeff Huang Documentation contributions : Michal Čihař, gers, Jorge, michael-smt, Mehdi Eloualy, Paul Harriet Asiñero, Ingo Brückl, Mehdi El Oualy [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/122?closed=1). ## Weblate 5.7.2 *Released on September 5th 2024.* ### Improvements * [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa) remembers last method used by user. * Instead of redirecting, the sign-out now displays a page. * Improved readability of exception logs. ### Bug fixes * Updating of translations from the repository in linked components. * Improved rendering of digest notification e-mails. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Mehdi Eloualy Translations contributions : Christian Wia, Ihor Hordiichuk, Hanaa MSB, Hoseok Seo, پرویز قادر, Reno Tx, Jose Delvani, Artemka, Blueberry, Elisabeth Pieringer, VfBFan, ɴᴇᴋᴏ, Andi Chandler, Yaron Shahrabani, Michal Čihař, Miguel A. Bouzada, gallegonovato, Besnik Bleta, Sketch6580, Aindriú Mac Giolla Eoin, Fjuro, 大王叫我来巡山 Documentation contributions : Michal Čihař [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/126?closed=1). ## Weblate 5.7.1 *Released on August 30th 2024.* ### Improvements * Updated language names to better describe different scripts and Sinitic languages. * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) is now automatically installed for formats which need it to update non-translation content in the translated files. ### Bug fixes * Support for using Docker network names in automatic suggestion settings. * Fixed authentication using some third-party providers such as Azure. * Support for formal and informal Portuguese in [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl). * QR code for TOTP is now black/white even in dark mode. * Fixed TOTP authentication when WebAuthn is also configured for the user. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. ### Contributors Code contributions : Michal Čihař, Mehdi El Oualy, Mehdi Eloualy Translations contributions : Michal Čihař, Miguel A. Bouzada, Ldm Public, gallegonovato, Besnik Bleta, Yaron Shahrabani, Alefsander Ribeiro Nascimento, Aindriú Mac Giolla Eoin, Massimo Pissarello, hugoalh, Xzonn, Jose Delvani, 大王叫我来巡山, Сергей, Milo Ivir, VfBFan, Blueberry, Ihor Hordiichuk, Christian Wia, Fjuro, simmon, Chikita Isaac, Oğuz Ersen, 马牛逼(Felix), Sketch6580, Emin Tufan Çetin, Simona Iacob, Andi Chandler, Jorge Gemetto, Assem Askarova, Julien Humbert, Peter Vančo, Wuzzy, ovl-1, Jim Kats, WaldiS, Nicolas MAGERE, Eduard Ereza Martínez, Kaya Zeren, Pierfrancesco Passerini, Dick Groskamp, Chang-Chia Tseng, Anon, Priit Jõerüüt, 이정희, Taufik Adi Wicaksono, Balázs Úr, Saranpat Visetrit, Vlăduț Ilie Documentation contributions : Michal Čihař, Robin [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/125?closed=1). ## Weblate 5.7 *Released on August 15th 2024.* ### New features * [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa) is now supported using Passkeys, WebAuthn, authentication apps (TOTP), and recovery codes. * [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa) can be enforced at the team or project level. * [Adding new strings](https://docs.weblate.org/en/latest/devel/integration.md#adding-new-strings) can now create plural strings in the user interface. * [String labels](https://docs.weblate.org/en/latest/devel/translations.md#labels) now include description to explain them. * New [Notifications](https://docs.weblate.org/en/latest/user/profile.md#notifications) for completed translation and component. * [OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-openai) now supports custom models and URLs and offers rephrasing of existing strings. * [CyrTranslit](https://docs.weblate.org/en/latest/admin/machine.md#mt-cyrtranslit) automatic suggestion service. ### Improvements * [Format the Java properties file](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-properties-sort) can now do case-sensitive sorting. * The status widgets are now supported site-wide and language-wide, see [Building the translation community](https://docs.weblate.org/en/latest/devel/share.md#promotion). * [Activity reports](https://docs.weblate.org/en/latest/devel/review.md#reports) are now available for categories. * Highlight newlines in the editor. * [CSV files](https://docs.weblate.org/en/latest/formats/csv.md) better handle files with two fields only. * Browse mode can now be navigated using keyboard, see [Keyboard shortcuts](https://docs.weblate.org/en/latest/user/translating.md#keyboard). * `GET /api/components/(string:project)/(string:component)/credits/` and `GET /api/projects/(string:project)/credits/` API endpoints for components and projects. * [Terminology](https://docs.weblate.org/en/latest/user/glossary.md#glossary-terminology) entries in Glossary can now only be created by users with Add glossary terminology permission. * [Python brace format](https://docs.weblate.org/en/latest/user/checks.md#check-python-brace-format) detects extra curly braces. * Screenshots now can be pasted from the clipboard in [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots). ### Bug fixes * Accessibility of keyboard navigation. * [Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter) now works with all Git based [Version control integration](https://docs.weblate.org/en/latest/vcs.md#vcs). * [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) sometimes failed to render screenshot. ### Compatibility * Weblate now uses mistletoe instead of misaka as a Markdown renderer. * [Content security policy](https://docs.weblate.org/en/latest/admin/install.md#csp) is now stricter what might block third-party customizations. * Monolingual formats no longer copy comments from [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template) when adding strings to translation. * Dropped support for Amagama in [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup) as the service is no longer maintained. * Default value for [`SENTRY_SEND_PII`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SENTRY_SEND_PII) was changed. * Translation credit reports in the JSON format now follows a different format for entries. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are several changes in `settings_example.py`, most notable are the new settings for [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa) and changes in `INSTALLED_APPS`, `SOCIAL_AUTH_PIPELINE` and `MIDDLEWARE`; please adjust your settings accordingly. * [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS) is now required for WebAuthn support. If you cannot use HTTPS, please silence related check as described in [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS) documentation. ### Contributors Code contributions : Michal Čihař, João Ferreira, Paul Harriet Asiñero, gers, Benjamin Alan Jamie, John R. D’Orazio, Tobias Schlatter, Max Wittig, Mehdi Eloualy, michael-smt, Jochen Sprickerhof, Vincent, Dwayne Bailey, Bastien Montagne Translations contributions : Jose Delvani, Julija Juli, Andi Chandler, pan93412, Milo Ivir, gallegonovato, ngocanhtve, kapatych, Marco Ciampa, Balázs Úr, Artemka, Ricky From Hong Kong, Massimo Pissarello, dreigiau, Ihor Hordiichuk, Allan Nordhøy, Selyan Sliman Amiri, iwonder, Besnik Bleta, Nathan, yangyangdaji, Priit Jõerüüt, Aindriú Mac Giolla Eoin, Diego Beraldin, Marino Díaz, پرویز قادر, Horus68, ssantos, M. D. Kulkarni (MDK), Miguel A. Bouzada, A. Bento, mpt.c, ovl-1, Fjuro, Luna, Antônio Breno, alefsanderribeiro, Alefsander Ribeiro Nascimento, Ian Perdiansah, amano, Petter Reinholdtsen, Malik Shoaib, Emin Tufan Çetin, John kh, Сергей, tygyh, Semih, Balázs Meskó, Martin Najemi, Yaron Shahrabani, Rhoslyn Prys Documentation contributions : Michal Čihař, Benjamin Alan Jamie, Paul Harriet Asiñero, Allan Nordhøy, Max Wittig, Mehdi Eloualy, Vincent, LE MEILLAT, gers, lotigara [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/116?closed=1). ## Weblate 5.6.2 *Released on July 1st 2024.* ### Bug fixes * Rendering of [String labels](https://docs.weblate.org/en/latest/devel/translations.md#labels) color selection widget. * Detection of pending outgoing commits. * [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons) button layout. * Crash when installing [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) add-on. * Removal of source strings in [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary). * Validation of [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) ZIP file upon restoring ([**CVE 2024-39303**](https://www.cve.org/CVERecord?id=CVE-2024-39303) / [GHSA-jfgp-674x-6q4p](https://github.com/WeblateOrg/weblate/security/advisories/GHSA-jfgp-674x-6q4p)). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/124?closed=1). ## Weblate 5.6.1 *Released on June 24th 2024.* ### Improvements * Docker container accepts [`WEBLATE_REMOVE_ADDONS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_REMOVE_ADDONS) and [`WEBLATE_ADD_MACHINERY`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_ADD_MACHINERY) to customize automatic suggestion services and [`WEBLATE_CORS_ALLOW_ALL_ORIGINS`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_CORS_ALLOW_ALL_ORIGINS) for CORS handling in API. * Added OpenMetrics compatibility for [`GET /api/metrics/`](https://docs.weblate.org/en/latest/api.md#get--api-metrics-). ### Bug fixes * Language aliases in [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/123?closed=1). ## Weblate 5.6 *Released on June 19th 2024.* ### New features * [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons) activity log for tracking add-on activity. * Improved date range selection in [Activity reports](https://docs.weblate.org/en/latest/devel/review.md#reports). ### Improvements * [Notifications](https://docs.weblate.org/en/latest/user/profile.md#notifications) now include strings which need updating. * Improved compatibility with password managers. * Improved tracking of uploaded changes. * Gracefully handle temporary machine translation errors in automatic suggestions. * [`GET /api/units/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-units-(int-id)-) now includes `last_updated` timestamp. * [`GET /api/changes/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-changes-(int-id)-) now includes `old` and `details`. * Reduced memory usage and increased performance of some views. ### Bug fixes * Loading of strings with many glossary matches. * Fixed behavior of some site-wide [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons). * Saving strings needing editing to [Windows RC files](https://docs.weblate.org/en/latest/formats/winrc.md). * [XML markup](https://docs.weblate.org/en/latest/user/checks.md#check-xml-tags) better handle XML entities. * Automatic suggestions could mix up replacements between translated strings. ### Compatibility * Compatibility with Django 5.1. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/114?closed=1). ## Weblate 5.5.5 *Released on May 13th 2024.* ### Bug fixes * False-positive merge failure alert when using push branch. * Cleanup of stale repositories. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/121?closed=1). ## Weblate 5.5.4 *Released on May 10th 2024.* ### Improvements * Visually highlight explanation in [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary). * Add [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons) history tab in management. * New [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) when [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) might not work as expected. * [Announcements](https://docs.weblate.org/en/latest/admin/announcements.md) can be posted on project/language scope. ### Bug fixes * Improved handling placeables in [OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-openai). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/120?closed=1). ## Weblate 5.5.3 *Released on May 3rd 2024.* ### Improvements * Improved performance of rendering large lists of objects. * Component management: added links to manage project/site-wide [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons). ### Bug fixes * Fixed crashes with librsvg older than 2.46. * Daily execution of some [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/119?closed=1). ## Weblate 5.5.2 *Released on April 26th 2024.* ### Bug fixes * Fixed publishing packages to PyPI. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/118?closed=1). ## Weblate 5.5.1 *Released on April 26th 2024.* ### New features * [Searching](https://docs.weblate.org/en/latest/user/search.md) supports `source_changed:DATETIME`. * Added several new [Language code style](https://docs.weblate.org/en/latest/admin/projects.md#component-language-code-style). ### Improvements * Display more details on source string change in history. * [Azure AI Translator](https://docs.weblate.org/en/latest/admin/machine.md#mt-microsoft-translator) now supports using custom translators. * Improved error handling in [Inviting new users](https://docs.weblate.org/en/latest/admin/access.md#invite-user). * Added PNG status badge. * Added list of managed projects to the dashboard view. * More detailed status of outgoing commits. * Reduced memory usage. ### Bug fixes * Fixed skipped component update with some add-ons enabled. * Daily execution of project and site wide add-ons. * Allow editing strings when the source is marked for editing. * Updates of the last updated timestamp of a string. * Fixed project and site wide installation of [Squash Git commits](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-git-squash) and [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) add-ons. * Graceful handling of locking errors in the [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There is a change in `REST_FRAMEWORK` setting (newly added `EXCEPTION_HANDLER`). [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/117?closed=1). ## Weblate 5.5 *Released on April 20th 2024.* ### New features * [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons) can be now installed project-wide and site-wide. * API improvements. * Added [`GET /api/categories/(int:id)/statistics/`](https://docs.weblate.org/en/latest/api.md#get--api-categories-(int-id)-statistics-). * Added [`GET /api/projects/(string:project)/file/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-file-). * Added [`POST /api/groups/(int:id)/admins/`](https://docs.weblate.org/en/latest/api.md#post--api-groups-(int-id)-admins-). * Added [`DELETE /api/groups/(int:id)/admins/(int:user_id)`](https://docs.weblate.org/en/latest/api.md#delete--api-groups-(int-id)-admins-(int-user_id)). * Improved [`POST /api/translations/(string:project)/(string:component)/(string:language)/units/`](https://docs.weblate.org/en/latest/api.md#post--api-translations-(string-project)-(string-component)-(string-language)-units-). * Added [Systran](https://docs.weblate.org/en/latest/admin/machine.md#mt-systran) automatic translation support. ### Improvements * Docker container now validates user password strength by default, see [`WEBLATE_MIN_PASSWORD_SCORE`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_MIN_PASSWORD_SCORE). * Improved error reporting in [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup). * [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) better displays rendered text. * Admins can now specify username and full name when [Inviting new users](https://docs.weblate.org/en/latest/admin/access.md#invite-user). * Added [Mismatched interrobang](https://docs.weblate.org/en/latest/user/checks.md#check-end-interrobang). * [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) are now refreshed when needed, not just daily. * [Translation progress reporting](https://docs.weblate.org/en/latest/devel/reporting.md) uses specific word count for CJK languages. * Team membership changes are now tracked in [Audit log](https://docs.weblate.org/en/latest/user/profile.md#audit-log). ### Bug fixes * [Does not follow glossary](https://docs.weblate.org/en/latest/user/checks.md#check-check-glossary) works better for languages not using whitespace. * [Translation component diagnostics](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) better handle non-latin source languages. * [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) sometimes ignored `font-spacing:SPACING` flag. * Fixed per-language statistics on nested categories. * Fixed categories listing on per-language pages. * Fixed Needs editing state calculation. * Fixed changing [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) with [Gerrit review requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gerrit). * Fixed using categorized components in [Management commands](https://docs.weblate.org/en/latest/admin/management.md#manage), [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#memory) or [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation). ### Compatibility * Several API calls might be affected by stricter validation of boolean fields by Django REST Framework. For example [`POST /api/projects/(string:project)/components/`](https://docs.weblate.org/en/latest/api.md#post--api-projects-(string-project)-components-). * Uniqueness of name and slug of a component is now enforced at the database level on PostgreSQL 15+. * Docker image now ships Python packages in `/app/venv` and installs using **uv**. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are several changes in `settings_example.py`, most notable is changes in `INSTALLED_APPS` and `LOGOUT_REDIRECT_URL`, please adjust your settings accordingly. * Weblate now requires Python 3.10 and Django 5.0. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/111?closed=1). ## Weblate 5.4.3 *Released on March 26th 2024.* ### Bug fixes * Superuser access to components with [Restricted access](https://docs.weblate.org/en/latest/admin/projects.md#component-restricted). * Adjusted default `LOGIN_REQUIRED_URLS_EXCEPTIONS` to not block [Appearance customization](https://docs.weblate.org/en/latest/admin/admin.md#manage-appearance). * Avoid crash on pushing changes to diverged repository. * Avoid crash when installing [Pseudolocale generation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-generate-pseudolocale). * [Azure Repos notifications](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-repos-notifications) gracefully handles repositories with spaces in URL. * [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) gracefully handles glossaries for language variants. * [Excel Open XML](https://docs.weblate.org/en/latest/formats/excel.md) better handles blank cells. * Fixed possible data loss when merging gettext PO file changes in Git. * Repository operations on project could have skipped some components. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/115?closed=1). ## Weblate 5.4.2 *Released on February 22nd 2024.* ### Bug fixes * Displaying debugging page in case of database connection issues. * Gracefully handle migration with duplicate built-in teams. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/113?closed=1). ## Weblate 5.4.1 *Released on February 19th 2024.* ### Bug fixes * Possible crash on Weblate upgrade check when cached from the previous versions. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/112?closed=1). ## Weblate 5.4 *Released on February 15th 2024.* ### New features * [Perl brace format](https://docs.weblate.org/en/latest/user/checks.md#check-perl-brace-format) quality check. * [Mobile Kotlin resources](https://docs.weblate.org/en/latest/formats/moko-resources.md). * [Format.JS JSON file](https://docs.weblate.org/en/latest/formats/formatjs.md). * Search input is now syntax highlighted, see [Searching](https://docs.weblate.org/en/latest/user/search.md). * Weblate is now available in Tamil. ### Improvements * Better logging in [`createadmin`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-createadmin). * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) now reports skipped entries. * Adding string in a repository triggers [Notifications](https://docs.weblate.org/en/latest/user/profile.md#notifications). * [OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-openai) better handles batch translations and glossaries. * [LibreTranslate](https://docs.weblate.org/en/latest/admin/machine.md#mt-libretranslate) better handles batch translations. * Text variant of notification e-mails now properly indicate changed strings. * File downloads now honor [If-Modified-Since](https://www.rfc-editor.org/rfc/rfc7232#section-3.3). * [Number of words](https://docs.weblate.org/en/latest/devel/reporting.md#num-words) support for CJK languages. * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) now preserves [Component Lists](https://docs.weblate.org/en/latest/admin/componentlists.md#componentlists). * Nicer formatting of [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) tooltips. * [`GET /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-) now includes information about linked component. * Improved [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) configuration forms. ### Bug fixes * Plural forms handling in [Qt Linguist .ts](https://docs.weblate.org/en/latest/formats/qt.md). * Added missing documentation for [`ADMINS_CONTACT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ADMINS_CONTACT). * Automatic fixer for [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#autofix-punctuation-spacing) no longer adds new whitespace. * Pending changes committing could be omitted under some circumstances. * [Remove blank strings](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-blank) now correctly removes blank plurals. ### Compatibility * Last changed timestamp now reflects changes outside Weblate as well. This affects both [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) and the user interface. * Releases are signed by Sigstore instead of PGP, see [Verifying release artifacts](https://docs.weblate.org/en/latest/security/release-artifacts.md#verify). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/109?closed=1). ## Weblate 5.3.1 *Released on December 19th 2023.* ### Bug fixes * Not updating statistics in some situations. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/110?closed=1). ## Weblate 5.3 *Released on December 14th 2023.* ### New features * [OpenAI](https://docs.weblate.org/en/latest/admin/machine.md#mt-openai) automatic suggestion service. * [Alibaba](https://docs.weblate.org/en/latest/admin/machine.md#mt-alibaba) automatic suggestion service. * Added labels API, see [`GET /api/projects/(string:project)/labels/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-labels-). * [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). * New automatic fixer for [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#autofix-punctuation-spacing). * [Google Cloud Translation Advanced](https://docs.weblate.org/en/latest/admin/machine.md#mt-google-translate-api-v3) now better honors placeables or line breaks. ### Improvements * Reduced memory usage for statistics. * [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) performs better in [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation) and supports [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). * [Azure AI Translator](https://docs.weblate.org/en/latest/admin/machine.md#mt-microsoft-translator) supports [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt). * Improved region selection in [Google Cloud Translation Advanced](https://docs.weblate.org/en/latest/admin/machine.md#mt-google-translate-api-v3). * Added nested JSON exporter in [Downloading translations](https://docs.weblate.org/en/latest/user/files.md#download). * Improved [Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter) performance on huge repositories. ### Bug fixes * Removing stale VCS directories. ### Compatibility * Dropped Microsoft Terminology service for automatic suggestions, as it is no longer provided by Microsoft. * `labels` in units API now expose full label info, see [`GET /api/units/(int:id)/`](https://docs.weblate.org/en/latest/api.md#get--api-units-(int-id)-). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/107?closed=1). ## Weblate 5.2.1 *Released on November 22nd 2023.* ### Improvements * Show search field after no strings found while translating. * Added soft hyphen to special-characters toolbar. ### Bug fixes * Database backups compatibility with Alibaba Cloud Database PolarDB. * Crash on loading statistics calculated by previous versions. * Sort icons in dark mode. * Project level statistics no longer count categorized components twice. * Possible discarding pending translations after editing source strings. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/108?closed=1). ## Weblate 5.2 *Released on November 16th 2023.* ### New features * [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests). ### Improvements * Faster statistics updates. * Better e-mail selection in user profile. * [Automatic fixups](https://docs.weblate.org/en/latest/user/checks.md#autofix) are now applied to suggestions as well. * [DeepL](https://docs.weblate.org/en/latest/admin/machine.md#mt-deepl) can now configure default formality for translations. * Use neutral colors for progress bars and translation unit states. * [Generate MO files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-mo) can optionally include strings needing editing. * Use [Accept-Language](https://www.rfc-editor.org/rfc/rfc7231#section-5.3.5) to order translations for unauthenticated users. * Add option to directly approve suggestions with [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews) workflow. * One-click removal of project or component [Notifications](https://docs.weblate.org/en/latest/user/profile.md#notifications). * [Statistics](https://docs.weblate.org/en/latest/api.md#api-statistics) now includes character and word counts for more string states. ### Bug fixes * Fixed creating component within a category by upload. * Error handling in organizing components and categories. * Fixed moving categories between projects. * Fixed formatting of translation memory search results. * Allow non-breaking space character in [Unsafe HTML cleanup](https://docs.weblate.org/en/latest/user/checks.md#autofix-html). ### Compatibility * [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md) exporter now produces UTF-8 encoded files. * Python 3.12 is now supported, though not recommended, see [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps). ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/104?closed=1). ## Weblate 5.1.1 *Released on October 25th 2023.* ### Improvements * [Add missing languages](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-consistency-languages) now uses a dedicated user for changes. * Added button for sharing on Fediverse. * Added validation for VCS integration credentials. * Reduced overhead of statistics collection. ### Bug fixes * Added plurals validation when editing string using the API. * Replacing a file using upload when existing is corrupted. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/106?closed=1). ## Weblate 5.1 *Released on October 16th 2023.* ### New features * [Yandex v2](https://docs.weblate.org/en/latest/admin/machine.md#mt-yandex-v2) machine translation service. * [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) and [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation) are now stored with a dedicated user as an author. * [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons) changes to strings are now stored with a dedicated user as an author. * [Downloading components, categories or projects](https://docs.weblate.org/en/latest/user/files.md#download-multi) can now convert file formats. * [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) allows to fine-tune localization workflow per language. ### Improvements * [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) also shows the approval percentage in object listings. * Project is added to watched upon accepting an invitation. * Configure VCS API credentials as a Python dict from environment variables. * Improved accuracy of checks on plural messages. * Engage page better shows stats. * Strings which can not be saved to a file no longer block other strings to be written. * Fixed some API URLs for categorized components. * Show plural form examples more prominently. * Highlight whitespace in [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation). * Faster comment and component removal. * Show disabled save button reason more prominently. * New string notification can now be triggered for each string. ### Bug fixes * Improved OCR error handling in [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots). * [Automatic fixups](https://docs.weblate.org/en/latest/user/checks.md#autofix) gracefully handle strings from [Multivalue CSV file](https://docs.weblate.org/en/latest/formats/csv.md#multivalue-csv). * Occasional crash in [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) caching. * Fixed history listing for entries within a [Category](https://docs.weblate.org/en/latest/admin/projects.md#category). * Fixed editing Administration team. * [Add missing languages](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-consistency-languages) add-on could miss some languages. ### Compatibility * Categories are now included `weblate://` repository URLs. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * Upgrades from older version than 5.0.2 are not supported, please upgrade to 5.0.2 first and then continue in upgrading. * Dropped support for deprecated insecure configuration of VCS service API keys via \_TOKEN/_USERNAME in `settings.py`. * Weblate now defaults to persistent database connections in `settings_example.py` and Docker. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/100?closed=1). ## Weblate 5.0.2 *Released on September 14th 2023.* ### Improvements * Translate page performance. * Search now looks for categories as well. ### Bug fixes * Rendering of release notes on GitHub. * Listing of categorized projects. * Translating a language inside a category. * Categories sorting. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * The database upgrade can take considerable time on larger sites due to indexing changes. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/105?closed=1). ## Weblate 5.0.1 *Released on September 10th 2023.* ### New features * Added [`GET /api/component-lists/(str:slug)/components/`](https://docs.weblate.org/en/latest/api.md#get--api-component-lists-(str-slug)-components-). ### Improvements * Related glossary terms lookup is now faster. * Logging of failures when creating pull requests. * History is now loaded faster. * Added object `id` to all [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api) endpoints. * Better performance of projects with a lot of components. * Added compatibility redirects for some old URLs. ### Bug fixes * Creating component within a category. * Source strings and state display for converted formats. * Block [Edit base file](https://docs.weblate.org/en/latest/admin/projects.md#component-edit-template) on formats which do not support it. * [Reused translation](https://docs.weblate.org/en/latest/user/checks.md#check-reused) is no longer triggered for blank strings. * Performance issues while browsing some categories. * Fixed GitHub Team and Organization authentication in Docker container. * GitLab merge requests when using a customized SSH port. ### Compatibility * pyahocorasick dependency has been replaced by ahocorasick_rs. * The default value of [`IP_PROXY_OFFSET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_PROXY_OFFSET) has been changed from 1 to -1. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * The database upgrade can take considerable time on larger sites due to indexing changes. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/103?closed=1). ## Weblate 5.0 *Released on August 24th 2023.* ### New features * [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md) support, thanks to Anders Kaplan. * [Category](https://docs.weblate.org/en/latest/admin/projects.md#category) can now organize components within a project. * [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md) now has better syntax checks thanks to Henry Wilkes. * Inviting users now works with all authentication methods. * Docker container supports file backed secrets, see [Passing secrets](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-secrets). ### Improvements * Plurals handling in machine translation. * [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same) check now honors placeholders even in the strict mode. * [Reused translation](https://docs.weblate.org/en/latest/user/checks.md#check-reused) is no longer triggered for languages with a single plural form. * WebP is now supported for [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots). * Avoid duplicate notification when a user is subscribed to overlapping scopes. * OCR support for non-English languages in [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots). * [XLIFF 1.1 and 1.2](https://docs.weblate.org/en/latest/formats/xliff.md#xliff) now supports displaying source string location. * Rendering strings with plurals, placeholders or alternative translations. * User API now includes last sign in date. * User API token is now hidden for privacy reasons by default. * Faster adding terms to glossary. * Better preserve translation on source file change in [HTML files](https://docs.weblate.org/en/latest/formats/html.md) and [Text files](https://docs.weblate.org/en/latest/formats/txt.md). * Added indication of automatic assignment to team listing. * Users now have to confirm invitations to become team members. * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) can now check all plural forms with the `strict-format` flag. * [Checks and fixups](https://docs.weblate.org/en/latest/user/checks.md) browsing experience. * Highlight differences in the source string in automatic suggestions. * Visual diff now better understands compositing characters. ### Bug fixes * User names handling while committing to Git. * [Remove blank strings](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-blank) and [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) now remove all strings at once. * Language filtering in [Translation progress reporting](https://docs.weblate.org/en/latest/devel/reporting.md). * Reduced false positives of [Reused translation](https://docs.weblate.org/en/latest/user/checks.md#check-reused) when fixing the translation. * Fixed caching issues after updating screenshots from the repository. ### Compatibility * Python 3.9 or newer is now required. * Several UI URLs have been changed to be able to handle categories. ### Upgrading Please follow [Generic upgrade instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#generic-upgrade-instructions) in order to perform update. * There are several changes in `settings_example.py`, most notable is changes in `CACHES` and `SOCIAL_AUTH_PIPELINE`, please adjust your settings accordingly. * Several previously optional dependencies are now required. * The database upgrade can take considerable time on larger sites due to structure changes. [All changes in detail](https://github.com/WeblateOrg/weblate/milestone/99?closed=1). # contributing/about.md # About Weblate ## Project goals Web-based continuous localization tool with tight [Version control integration](https://docs.weblate.org/en/latest/vcs.md#vcs) supporting a wide range of [file formats](https://docs.weblate.org/en/latest/formats.md#formats), making it easy for translators to contribute. ## Project name “Weblate” is a portmanteau of the words “web” and “translate”. ## Project website The landing page is [https://weblate.org](https://weblate.org) and there is a cloud-hosted service at [https://hosted.weblate.org](https://hosted.weblate.org). The documentation can be read at [https://docs.weblate.org](https://docs.weblate.org). ## Project logos The project logos and other graphics are available in [https://github.com/WeblateOrg/graphics](https://github.com/WeblateOrg/graphics). ## Leadership This project is maintained by Michal Čihař, who can be reached at [michal@weblate.org](mailto:michal@weblate.org). ## Authors Weblate was started by Michal Čihař. Since its inception in 2012, thousands of people have contributed. # contributing/addons.md # Developing add-ons [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons) are a way to customize localization workflow in Weblate. ### *class* weblate.addons.base.BaseAddon(storage) Base class for Weblate add-ons. #### *classmethod* can_install(, component=None, category=None, project=None) → bool Check whether add-on is compatible with given component. #### change_event(change, activity_log_id: int | None = None) Event handler for change event. #### check_change_action(change) → bool Early filtering of Change actions before triggering change_event callback. #### component_update(component, activity_log_id: int | None = None) Event handler for component update. #### configure(configuration) → None Save configuration. #### daily(component=None, category=None, project=None, activity_log_id: int | None = None) Scope-aware daily entry point. Override this for project-level logic, or override daily_component() for per-component logic. #### daily_component(component, activity_log_id: int | None = None) Per-component daily processing. Override this for component-level logic. #### *classmethod* get_add_form(user, , component=None, category=None, project=None, \*\*kwargs) Return configuration form for adding new add-on. #### *classmethod* get_api_urls() Return named Django URL patterns for this provider’s API. #### get_change_details(compared_configuration) Return a public configuration snapshot and changed field names. #### get_public_configuration() Return configuration with non-public values redacted. #### *classmethod* get_public_configuration_fields() → frozenset[str] Return configuration fields which are safe for public use. #### get_settings_form(user, \*\*kwargs) Return configuration form for this add-on. #### manual(component=None, category=None, project=None, activity_log_id: int | None = None) Scope-aware manual entry point. By default this mirrors the daily handler and lets add-ons opt in explicitly by subscribing to the manual event. #### manual_component(component, activity_log_id: int | None = None) Per-component manual processing. #### post_add(translation, activity_log_id: int | None = None) Event handler after new translation is added. #### post_commit(component, store_hash: bool, activity_log_id: int | None = None) Event handler after changes are committed to the repository. #### post_install(component, store_hash: bool, activity_log_id: int | None = None) Event handler after add-on is installed. #### post_push(component, activity_log_id: int | None = None) Event handler after repository is pushed upstream. #### post_remove(translation, activity_log_id: int | None = None) Event handler after a translation is removed. #### post_update(component, previous_head: str, skip_push: bool, changed_files: list[str], parse_after_update: bool = False, activity_log_id: int | None = None) Event handler after repository is updated from upstream. * **Parameters:** * **previous_head** (*str*) – HEAD of the repository prior to update, can be blank on initial clone. * **skip_push** (*bool*) – Whether the add-on operation should skip pushing changes upstream. Usually you can pass this to underlying methods as `commit_and_push` or `commit_pending`. * **changed_files** (*list* *[**str* *]*) – Files changed by the repository update. #### pre_commit(translation, author: str, store_hash: bool, activity_log_id: int | None = None) Event handler before changes are committed to the repository. #### pre_push(component, activity_log_id: int | None = None) Event handler before repository is pushed upstream. #### pre_update(component, activity_log_id: int | None = None) Event handler before repository is updated from upstream. #### resolve_components(, component=None, category=None, project=None) Resolve scope to components iterator. #### save_state() → None Save add-on state information. #### unit_pre_create(unit, activity_log_id: int | None = None) Event handler before new unit is created. #### update_component_state(component, updater: Callable[[dict[str, object]], None]) → None Atomically merge component-scoped add-on state into the shared JSON field. #### user() Weblate user used to track changes by this add-on. Add-on hooks receive ORM objects from the `weblate.*.models` modules, including `Addon`, `Component`, `Translation`, `Category`, `Project`, `Unit`, `Change`, and `User`. Add-on configuration forms should subclass `weblate.addons.forms.BaseAddonForm`. Here is an example add-on: ```python # Copyright © Michal Čihař # # SPDX-License-Identifier: GPL-3.0-or-later from __future__ import annotations from typing import TYPE_CHECKING, ClassVar from django.utils.translation import gettext_lazy from weblate.addons.base import BaseAddon from weblate.addons.events import AddonEvent if TYPE_CHECKING: from weblate.addons.base import CompatDict from weblate.trans.models import Translation class ExampleAddon(BaseAddon): # Filter for compatible components, every key is # matched against property of component compat: ClassVar[CompatDict] = { "file_format": {"po", "po-mono"}, } # List of events add-on should receive events: ClassVar[set[AddonEvent]] = { AddonEvent.EVENT_PRE_COMMIT, } # Add-on unique identifier name = "weblate.example.example" # Verbose name shown in the user interface verbose = gettext_lazy("Example add-on") # Detailed add-on description description = gettext_lazy("This add-on does nothing it is just an example.") # Callback to implement custom behavior def pre_commit( self, translation: Translation | None, author: str, store_hash: bool, activity_log_id: int | None = None, ) -> None: return ``` ## Typing add-on configuration Add-on configuration is stored in the `Addon.configuration` JSON field, so the model keeps the persisted data as raw JSON. Add-on implementations can type their own configuration by parameterizing `BaseAddon` and `BaseAddonForm`. Use two `TypedDict` classes when the stored JSON can differ from the runtime shape: a permissive, usually `total=False`, stored configuration for legacy or missing values, and a total runtime configuration returned by `normalize_configuration()`. Runtime add-on code should read `self.configuration` or `self.get_configuration()` so it sees normalized defaults instead of raw persisted JSON. For simple add-ons where the stored and runtime shapes are identical, define a single `TypedDict` and use it for both `BaseAddon` type parameters. Keep the form’s `serialize_form()` return type aligned with the stored configuration type. ## Publishing add-on configuration Add-on change history can be visible without add-on management permission. List configuration fields that are safe to publish in the form’s `public_configuration_fields` attribute. Fields not explicitly listed are kept in the snapshot with a null value and identified as redacted. The default is an empty set so that newly added settings are not published accidentally. Use `BaseAddon.get_public_configuration()` whenever configuration is exposed outside trusted add-on management code. Internal operations which intentionally clone a working add-on can continue to use the stored configuration. ## Component-mounted add-on APIs Declare an `api_name` and return named Django URL patterns from `get_api_urls()`. Use ordinary Django converters and DRF views. Patterns are registered for every provider enabled in [`WEBLATE_ADDONS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_ADDONS), regardless of whether the add-on is installed on a component. Routes are mounted under `/api/components///addons//`. For categorized components, encode the full category and component path in the component segment, as for the component REST API. Use the installation’s `api_url` instead of constructing this URL manually. API names must contain 1 to 64 ASCII letters, digits, underscores, or hyphens, and must be globally unique among enabled provider classes. Weblate validates these declarations at startup, without querying the database, and rejects invalid or conflicting names. Providers must declare `needs_component = True`, `repo_scope = False`, and `multiple = False`. The same provider can be installed on many components, but only once on each component. Subclass `weblate.addons.api.InstalledAddonAPIView` and set its `addon_name` to the provider’s internal add-on name. The base view authenticates the request, checks component access, and resolves the installation as `self.addon`. An absent or incompatible installation returns HTTP 404. Its `permission` defaults to `component.edit` and is checked before request data is parsed. The default JSON parser bounds requests to 5 MiB, including requests without a Content-Length header. Use normal DRF serializer validation in the view methods. Document the full contract using `drf_spectacular.utils.extend_schema` and serializer field help text: OpenAPI discovers the same views used for runtime routing. Reverse endpoints using `api::`, providing `project__slug`, `slug`, and any endpoint parameters. API names are public contracts and should remain stable across implementation changes. Restart Weblate after changing provider registration; tests overriding registrations must rebuild their URL configuration and clear Django’s URL caches. The existing `/api/addons//` management API remains available. Its read-only `api_name` and `api_url` fields reflect the enabled provider’s current declaration. Both are null when the provider is disabled or incompatible. # contributing/code.md # Weblate source code Weblate is developed on [GitHub](https://github.com/WeblateOrg/weblate). You are welcome to fork the code and open pull requests. Patches in any other form are welcome too. #### SEE ALSO Check out [Weblate internals](https://docs.weblate.org/en/latest/contributing/internals.md#internals) to see how Weblate looks from inside. ## License and copyright When contributing project code, you agree to put your changes and new code under the repository license, , unless stated and agreed otherwise. New source files should follow the existing copyright and license header style. Use a different license only when there is a deliberate reason, such as files shared with repositories using more permissive licenses. #### SEE ALSO [Weblate license](https://docs.weblate.org/en/latest/contributing/license.md) explains licensing in more details. ## Writing a good patch ### Write separate changes It is annoying when you get a massive patch that is said to fix 11 odd problems, but discussions and opinions do not agree with 10 of them or 9 of them were already fixed differently. Then the person merging this change needs to extract the single interesting patch from somewhere within the massive pile of sources, and that creates a lot of extra work. Preferably, each fix that addresses an issue should be in its own patch/commit with its own description/commit message stating exactly what they correct so that all changes can be selectively applied by the maintainer or other interested parties. Furthermore, separate changes enable bisecting much better for tracking issues and regression in the future. ### Documentation Documentation can be a tedious task; however, it is necessary for someone to complete it. It makes things a lot easier if you submit the documentation together with code changes. Please remember to document methods, complex code blocks, or user-visible features. #### SEE ALSO [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) ### Test cases The tests allow us to quickly verify that the features are working as they are supposed to. To maintain this situation and improve it, all new features and functions that are added need to be tested in the test suite. Every feature that is added should get at least one valid test case that verifies that it works as documented. #### SEE ALSO [Weblate testsuite and continuous integration](https://docs.weblate.org/en/latest/contributing/tests.md) ### Commit messages Git commits should follow [Conventional Commits](https://www.conventionalcommits.org/) specification. ### Type checking Any new code should utilize [**PEP 484**](https://peps.python.org/pep-0484/) type hints. We are using **mypy** to check them because it has a Django plugin that makes type checking of Django apps practical. New and changed code should not introduce new **mypy** failures where current Django typing support makes that practical. The code base is not yet completely covered by type annotations, and some Django constructs are difficult to annotate precisely. CI therefore enforces **mypy** only for selected modules and reports other findings separately. ### Coding standard and linting the code The code should follow [**PEP 8**](https://peps.python.org/pep-0008/) coding guidelines and should be formatted using **ruff** code formatter. To check the code quality, you can use **ruff**, its configuration is stored in `pyproject.toml`. When suppressing a **ruff** diagnostic, prefer `# ruff: ignore[rule-name]` with the human-readable rule name. Place the comment on the line above the logical statement or block when that does not broaden the suppression scope. Keep the comment inline when moving it would change the scope, affect import sorting, or get between another tool’s `disable-next` comment and the code it targets. The easiest approach to enforce all this is to install **prek**. This is a third-party reimplementation of the [pre-commit](https://pre-commit.com/) tool used by Weblate. It is included in the development dependencies declared in `pyproject.toml`, so installing those dependencies makes **prek** available. To check all files manually, run: ```sh uv run prek run --all-files ``` If you prefer the original **pre-commit** client, it uses the same configuration from `.pre-commit-config.yaml`. ### Coding securely Any code for Weblate should be written with [Security by Design Principles](https://wiki.owasp.org/index.php/Security_by_Design_Principles) in mind. ## AI guidelines When contributing content to the project, you give us permission to use it as-is, and you must make sure you are allowed to distribute it to us. By submitting a change to us, you agree that the changes can and should be adopted by the project and get redistributed under the project license. Authors should be explicitly aware that the burden is on them to ensure no unlicensed code is submitted to the project. This is independent of whether AI is used or not. When contributing a pull request, you should, of course, always make sure that the proposal is of good quality and the best effort that follows our guidelines. A basic rule of thumb is that if someone can spot that the contribution was made with the help of AI, you have more work to do. We can accept code written with the help of AI into the project, but the code must still follow coding standards, be written clearly, be documented, feature test cases, and adhere to all the normal requirements we have. # contributing/code_of_conduct.md # Code of Conduct ## Our Pledge We pledge to make our community welcoming, safe, and equitable for all. We are committed to fostering an environment that respects and promotes the dignity, rights, and contributions of all individuals, regardless of characteristics including race, ethnicity, caste, color, age, physical characteristics, neurodiversity, disability, sex or gender, gender identity or expression, sexual orientation, language, philosophy or religion, national or social origin, socio-economic position, level of education, or other status. The same privileges of participation are extended to everyone who participates in good faith and in accordance with this Covenant. ## Encouraged Behaviors While acknowledging differences in social norms, we all strive to meet our community’s expectations for positive behavior. We also understand that our words and actions may be interpreted differently than we intend based on culture, background, or native language. With these considerations in mind, we agree to behave mindfully toward each other and act in ways that center our shared values, including: 1. Respecting the **purpose of our community**, our activities, and our ways of gathering. 2. Engaging **kindly and honestly** with others. 3. Respecting **different viewpoints** and experiences. 4. **Taking responsibility** for our actions and contributions. 5. Gracefully giving and accepting **constructive feedback**. 6. Committing to **repairing harm** when it occurs. 7. Behaving in other ways that promote and sustain the **well-being of our community**. ## Restricted Behaviors We agree to restrict the following behaviors in our community. Instances, threats, and promotion of these behaviors are violations of this Code of Conduct. 1. **Harassment.** Violating explicitly expressed boundaries or engaging in unnecessary personal attention after any clear request to stop. 2. **Character attacks.** Making insulting, demeaning, or pejorative comments directed at a community member or group of people. 3. **Stereotyping or discrimination.** Characterizing anyone’s personality or behavior on the basis of immutable identities or traits. 4. **Sexualization.** Behaving in a way that would generally be considered inappropriately intimate in the context or purpose of the community. 5. **Violating confidentiality**. Sharing or acting on someone’s personal or private information without their permission. 6. **Endangerment.** Causing, encouraging, or threatening violence or other harm toward any person or group. 7. Behaving in other ways that **threaten the well-being** of our community. ### Other Restrictions 1. **Misleading identity.** Impersonating someone else for any reason, or pretending to be someone else to evade enforcement actions. 2. **Failing to credit sources.** Not properly crediting the sources of content you contribute. 3. **Promotional materials**. Sharing marketing or other commercial content in a way that is outside the norms of the community. 4. **Irresponsible communication.** Failing to responsibly present content which includes, links or describes any other restricted behaviors. ## Reporting an Issue Tensions can occur between community members even when they are trying their best to collaborate. Not every conflict represents a code of conduct violation, and this Code of Conduct reinforces encouraged behaviors and norms that can help avoid conflicts and minimize harm. When an incident does occur, it is important to report it promptly. To report a possible violation, please reach the Community Moderators at [community@weblate.org](mailto:community@weblate.org). Community Moderators take reports of violations seriously and will make every effort to respond in a timely manner. They will investigate all reports of code of conduct violations, reviewing messages, logs, and recordings, or interviewing witnesses and other participants. Community Moderators will keep investigation and enforcement actions as transparent as possible while prioritizing safety and confidentiality. In order to honor these values, enforcement actions are carried out in private with the involved parties, but communicating to the whole community may be part of a mutually agreed upon resolution. ## Addressing and Repairing Harm If an investigation by the Community Moderators finds that this Code of Conduct has been violated, the following enforcement ladder may be used to determine how best to repair harm, based on the incident’s impact on the individuals involved and the community as a whole. Depending on the severity of a violation, lower rungs on the ladder may be skipped. 1. Warning 1. Event: A violation involving a single incident or series of incidents. 2. Consequence: A private, written warning from the Community Moderators. 3. Repair: Examples of repair include a private written apology, acknowledgement of responsibility, and seeking clarification on expectations. 2. Temporarily Limited Activities 1. Event: A repeated incidence of a violation that previously resulted in a warning, or the first incidence of a more serious violation. 2. Consequence: A private, written warning with a time-limited cooldown period designed to underscore the seriousness of the situation and give the community members involved time to process the incident. The cooldown period may be limited to particular communication channels or interactions with particular community members. 3. Repair: Examples of repair may include making an apology, using the cooldown period to reflect on actions and impact, and being thoughtful about re-entering community spaces after the period is over. 3. Temporary Suspension 1. Event: A pattern of repeated violation which the Community Moderators have tried to address with warnings, or a single serious violation. 2. Consequence: A private written warning with conditions for return from suspension. In general, temporary suspensions give the person being suspended time to reflect upon their behavior and possible corrective actions. 3. Repair: Examples of repair include respecting the spirit of the suspension, meeting the specified conditions for return, and being thoughtful about how to reintegrate with the community when the suspension is lifted. 4. Permanent Ban 1. Event: A pattern of repeated code of conduct violations that other steps on the ladder have failed to resolve, or a violation so serious that the Community Moderators determine there is no way to keep the community safe with this person as a member. 2. Consequence: Access to all community spaces, tools, and communication channels is removed. In general, permanent bans should be rarely used, should have strong reasoning behind them, and should only be resorted to if working through other remedies has failed to change the behavior. 3. Repair: There is no possible repair in cases of this severity. This enforcement ladder is intended as a guideline. It does not limit the ability of Community Managers to use their discretion and judgment, in keeping with the best interests of our community. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public or other spaces. Examples of representing our community include using an official email address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Attribution This Code of Conduct is adapted from the Contributor Covenant, version 3.0, permanently available at [https://www.contributor-covenant.org/version/3/0/](https://www.contributor-covenant.org/version/3/0/). Contributor Covenant is stewarded by the Organization for Ethical Source and licensed under CC BY-SA 4.0. To view a copy of this license, visit [https://creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/). For answers to common questions about Contributor Covenant, see the FAQ at [https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are provided at [https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations). Additional enforcement and community guideline resources can be found at [https://www.contributor-covenant.org/resources](https://www.contributor-covenant.org/resources). The enforcement ladder was inspired by the work of [Mozilla’s code of conduct team](https://github.com/mozilla/inclusion). # contributing/communication.md # Weblate Contributor Communication Guidelines ## GitHub Issues [GitHub Issues](https://github.com/WeblateOrg/weblate/issues) is where bugs can be reported, and features can be requested. Issue submission form provides templates for each to simplify issue creation, and review and implementation process; it also guides to other places with information like documentation, Discussions, HackerOne program, and Weblate Care. ## Weblate GitHub Discussions [GitHub Discussions](https://github.com/WeblateOrg/weblate/discussions) is a community place. Ideas, Polls, Q&A, and Show and Tell categories can be selected when posting there. General category fits all posts outside those defined categories. Weblate team members occasionally visit Discussions and can also be mentioned by their GitHub usernames. ## Weblate on Mastodon If you want to attract a wide community of Weblate users, fans, and developers to your case, you can follow and mention [@weblate@fosstodon.org](https://fosstodon.org/@weblate) on Mastodon. The Weblate team boosts good moods and bright ideas! # contributing/debugging.md # Debugging Weblate Bugs can behave as application crashes or as various misbehavior. You are welcome to collect info on any such issue and submit it to the [issue tracker](https://github.com/WeblateOrg/weblate/issues). ## Debug mode Turning on debug mode will make the exceptions show in the web browser. This is useful to debug issues in the web interface, but not suitable for a production environment because it has performance consequences and might leak private data. In a production environment, use [`ADMINS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ADMINS) to receive e-mails containing error reports, or configure error collection using a third-party service. #### SEE ALSO * [Disable debug mode](https://docs.weblate.org/en/latest/admin/install.md#production-debug) * [Properly configure admins](https://docs.weblate.org/en/latest/admin/install.md#production-admins) * [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors) ## Weblate logs Weblate can produce detailed logs of what is going on in the background. In the default configuration it uses syslog and that makes the log appear either in `/var/log/messages` or `/var/log/syslog` (depending on your syslog daemon configuration). The Celery process (see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery)) usually produces its own logs as well. The example system-wide setups logs to several files under `/var/log/celery/`. Docker containers log to their output (as per usual in the Docker world), so you can look at the logs using `docker compose logs`. You can get more detailed logs by changing [`WEBLATE_LOGLEVEL`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_LOGLEVEL). #### SEE ALSO [Sample configuration](https://docs.weblate.org/en/latest/admin/sample.md#sample-configuration) contains [`LOGGING`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-LOGGING) configuration. ## Not processing background tasks A lot of things are done in the background by Celery workers. If things like sending out e-mails or component removal does not work, there might a related issue. Things to check in that case: * Check that the Celery process is running, see [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) * Check the Celery queue status, either in [Management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface), or using [`celery_queues`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-celery_queues) * Look in the Celery logs for errors (see [Weblate logs](https://docs.weblate.org/en/latest/contributing/debugging.md#weblate-logs)) ## Not receiving e-mails from Weblate You can verify whether outgoing e-mail is working correctly by using the [`sendtestemail`](https://docs.djangoproject.com/en/stable/ref/django-admin/#django-admin-sendtestemail) management command (see [Invoking management commands](https://docs.weblate.org/en/latest/admin/management.md#invoke-manage) for instructions on how to invoke it in different environments) or by using [Management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface) under the Tools tab. These send e-mails directly, so this verifies that your SMTP configuration is correct (see [Configuring outgoing e-mail](https://docs.weblate.org/en/latest/admin/install.md#out-mail)). Most of the e-mails from Weblate are however sent in the background and there might be some issues with Celery involved as well, please see [Not processing background tasks](https://docs.weblate.org/en/latest/contributing/debugging.md#debug-tasks) for debugging that. ## Analyzing application crashes In case the application crashes, it is useful to collect as much info about the crash as possible. This can be achieved by using third-party services which can collect such info automatically. You can find info on how to set this up in [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors). ## Silent failures Lots of tasks are offloaded to Celery for background processing. Failures are not shown in the user interface, but appear in the Celery logs. Configuring [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors) helps you to notice such failures easier. ## Performance issues In case Weblate performs badly in some scenario, please collect the relevant logs showing the issue, and anything that might help figuring out where the code might be improved. See [Collecting error reports and monitoring performance](https://docs.weblate.org/en/latest/admin/install.md#collecting-errors) for information on setting up Sentry which can provide useful insights on badly performing operations. In case the slow performance is linked to the database, you can also enable logging of all database queries using following configuration after enabling [`DEBUG`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-DEBUG): ```python LOGGING["loggers"]["django.db.backends"] = {"handlers": ["console"], "level": "DEBUG"} ``` # contributing/documentation.md # Contribute to Weblate documentation You are welcome to improve the documentation page of your choice. Do it easily by clicking the Edit on GitHub button in the top-right corner of the page. ## Documentation guidelines Please respect these guidelines while writing: 1. Don’t remove part of the documentation if it’s valid. 2. Use clear and easily-understandable language. You are writing tech docs, not a poem. Not all docs readers are native speakers, be thoughtful. 3. Don’t be afraid to ask if you are not certain. If you have to ask about some feature while editing, don’t change its docs before you have the answer. This means: You change or ask. Don’t do both at the same time. 4. Verify your changes by performing described actions while following the docs. 5. Send PR with changes in small chunks to make it easier and quicker to review and merge. 6. If you want to rewrite and change the structure of a big article, do it in two steps: 1. Rewrite 2. Once the rewrite is reviewed, polished, and merged, change the structure of the paragraphs in another PR. ## Building the documentation locally Documentation can be also edited and built locally, the Python requirements are in the `docs` dependency group in `pyproject.toml`. If you already use the full development environment, `uv sync --all-extras --dev` is enough. For documentation work only, `uv sync --group docs` is sufficient. The recommended local workflow is: ```sh make -C docs update-docs ./ci/run-docs ``` The **ci/run-docs** wrapper builds the documentation with warnings treated as errors. #### HINT You will also need **graphviz** installed to build the documentation. ## Translating the documentation You can [translate the docs](https://hosted.weblate.org/projects/weblate/documentation/). ## Updating generated documentation snippets Several documentation sections use templates generated from the code. The preferred way to refresh them is: ```sh make -C docs update-docs ``` This target regenerates the snippets currently used by the documentation, including: * add-on events, built-in add-ons, and common add-on parameters * machine translation services * file format parameters and file format feature tables * permissions and built-in roles * checks and check flags Keep manually maintained text in the parent documentation page rather than adding it to autogenerated snippets. For example, [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md) includes three generated files for events, built-in add-ons, and common add-on parameters, while obsolete add-ons are maintained directly in the page. If you need to regenerate only one part, the individual management commands are documented in [Management commands](https://docs.weblate.org/en/latest/admin/management.md), and the exact commands used by `update-docs` are listed in `docs/Makefile`. # contributing/frontend.md # Weblate frontend The frontend is currently built using Bootstrap, jQuery and few third-party libraries. ## Supported browsers Weblate supports the latest, stable releases of all major browsers and platforms. Alternative browsers which use the latest version of WebKit, Blink, or Gecko, whether directly or via the platform’s web view API, are not explicitly supported. However, Weblate should (in most cases) display and function correctly in these browsers as well. Older browsers might work, but some features might be limited. ## Accessibility Weblate targets WCAG 2.2 Level AA for new and changed user-facing functionality where practical. Use semantic HTML and Bootstrap components before adding custom interaction code. When changing the frontend: - Make all interactive controls reachable and usable with a keyboard. - Keep focus order logical and preserve visible focus styling. - Prefer native buttons, links, inputs, selects, and tables over custom widgets. - Associate every form control with a label, help text, and validation errors where applicable. - Do not use color, icon shape, or position as the only way to convey state. - Announce dynamic status changes that are not otherwise visible to assistive technology. - Respect reduced-motion preferences for animation or scrolling behavior. - Test changed workflows with keyboard-only navigation and, when practical, a screen reader spot check. ## User interface conventions ### Documentation links Use the information icon for contextual links to the Weblate documentation instead of a textual Documentation button. In Django templates, use the `documentation_icon` template tag so that the link has consistent styling, labeling, and external-link behavior. Documentation icons are interactive links and have to remain keyboard-focusable. Keep textual documentation links when they are part of explanatory prose rather than a contextual action. ## Dependency management Installing and managing 3rd party libraries in the client of a Django project can be a bit tricky. This section provides a step-by-step guide on how to install and manage 3rd party libraries used by the client side of Weblate using Webpack. ### Prerequisites Before proceeding with an installation, make sure you have the following prerequisites: - A supported `Node.js` release. - The `yarn` package manager is installed on your system. - Run `cd client`. - Run `yarn install --check-files`. ### Installation To install a library, first run the following command: ```bash yarn add ``` ### Importing the Library Then, there are two ways to import the library: 1. If it is a project-wide library (it is used/needed in all/most pages): : - Import the library in `src/main.js`. - And declare it in the global scope (if needed). 2. If it is page-specific library (library is used in a specific page or template): : - Create a new file named `src/.js`. - Import the library in it. Then inject it into the `window` object to be globally accessible. - Add an entry in `webpack.config.js`: `: "src/.js"`. - Add library name in `excludePrefixes` array in `mainLicenseTransform` in `webpack.config.js`. - Add license file name in `additionalFiles` in `LicensePlugin` in `plugins` array in `webpack.config.js`. - Create a `LicenseTransform` function for the license file introduced in the previous steps and use it. Note: Replace `` with the actual name of the 3rd party library. ### Building the Library Build the libraries used by the project, by running the following command: ```bash yarn build ``` ### Including the Library Now the library is built and ready for use. To include it follow these steps: 1. If the library was imported in `src/main.js`, no further steps are required (as it is already included in `base.html`). 2. If the library was imported in its specific file `src/.js`, in `weblate/templates` use the include tags to link to the built static JavaScript file: ```django {% load static %} ``` ## Coding style Weblate relies on [Biome](https://biomejs.dev/) for formatting and linting the JavaScript and CSS code. Django templates are formatted and linted separately by **djade** and **djlint**. ## Localization Should you need any user visible text in the frontend code, it should be localizable. In most cases, all you need is to wrap your text inside `gettext` function, but there are more complex features available: ```javascript document.write(gettext("this is to be translated")); var object_count = 1 // or 0, or 2, or 3, ... s = ngettext("literal for the singular case", "literal for the plural case", object_count); fmts = ngettext("There is %s object. Remaining: %s", "There are %s objects. Remaining: %s", 11); s = interpolate(fmts, [11, 20]); // s is "There are 11 objects. Remaining: 20" ``` #### SEE ALSO [Translation topic in the Django documentation](https://docs.djangoproject.com/en/stable/topics/i18n/translation/) ## Icons Weblate currently uses [Material Design Icons](https://pictogrammers.com/library/mdi/), in case you are looking for new symbol, check that. Additionally, there is `scripts/optimize-svg` to reduce size of the SVG as most of the icons are embedded inside the HTML to allow styling of the paths. # contributing/index.md # Contributing to Weblate There are dozens of ways to improve Weblate. You can choose the one you feel comfortable with, be it coding, graphics design, documentation, sponsorship, or an idea: * [Reporting issues in Weblate](https://docs.weblate.org/en/latest/contributing/issues.md) * [Starting contributing code to Weblate](https://docs.weblate.org/en/latest/contributing/start.md) * [Weblate source code](https://docs.weblate.org/en/latest/contributing/code.md) * [Contributing to Weblate modules](https://docs.weblate.org/en/latest/contributing/modules.md) * [Subprojects and embedded code](https://docs.weblate.org/en/latest/contributing/submodules.md) * [Translating Weblate](https://docs.weblate.org/en/latest/contributing/index.md#translating-weblate) * [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) * [Weblate discussions](https://docs.weblate.org/en/latest/contributing/index.md#discussions) * [Funding Weblate development](https://docs.weblate.org/en/latest/contributing/index.md#funding-weblate) * [Weblate Contributor Communication Guidelines](https://docs.weblate.org/en/latest/contributing/communication.md) * [Code of Conduct](https://docs.weblate.org/en/latest/contributing/code_of_conduct.md) ## Translating Weblate Weblate is continually being [translated](https://hosted.weblate.org/) using Weblate itself. Feel free to take your part in the effort of making Weblate available in as many human languages as possible. It brings Weblate closer to its users! If you find a possible mistake in the source string, you can mark it with a comment in the Weblate editor. This way, it can be discussed and corrected. If you’re certain, you can also click on the link in the Source string location section and submit a PR with your correction. ## Weblate discussions If you have an idea and not sure if it’s suitable for an issue, don’t worry. You can join the community in [GitHub discussions](https://github.com/WeblateOrg/weblate/discussions). ## Funding Weblate development You can boost Weblate’s development by donating. Funds collected on donations are used to enable gratis hosting for libre software projects and to fund the ecosystem Weblate relies on. Please check the [donate page](https://weblate.org/donate/) for options, such as funding goals and the rewards you get as a proud funder. ### Supporters who have funded Weblate List of Weblate supporters: * Yashiro Ccs * Cheng-Chia Tseng * Timon Reinhard * [Cassidy James](https://cassidyjames.com/) * Loic Dachary * Marozed * [https://freedombox.org/](https://freedombox.org/) * [GNU Solidario (GNU Health)](https://www.gnuhealth.org/) * [BallotReady](https://www.ballotready.org) * Richard Nespithal * MyExpenses.Mobi * Michael Totschnig * James Valleroy * wallabag.org * [Scenari (Kelis)](https://scenari.software/) * [BibLibre (Koha community)](https://www.biblibre.com/) * Koha community * 24eme.fr * Fotema Gallery App * [Newpipe e.V.](https://newpipe-ev.de) * Daniel Leidert * ELSA-X * Port 443 Inc. * Alexander Schartz * aidX Do you want to be in the list? Please see options on the [Donate to Weblate](https://weblate.org/donate/). # contributing/internals.md # Weblate internals #### NOTE This chapter will give you basic overview of Weblate internals. Weblate derives most of its code structure from, and is based on [Django](https://www.djangoproject.com/). ## Directory structure Quick overview of directory structure of Weblate main repository: `docs` : Source code for this documentation, which can be built using [Sphinx](https://www.sphinx-doc.org/). `dev-docker` : Docker code to run development server, see [Running Weblate locally in Docker](https://docs.weblate.org/en/latest/contributing/start.md#dev-docker). `weblate` : Source code of Weblate as a [Django](https://www.djangoproject.com/) application, see [Weblate internals](https://docs.weblate.org/en/latest/contributing/internals.md#internals). `weblate/static` : Client files (CSS, Javascript and images), see [Weblate frontend](https://docs.weblate.org/en/latest/contributing/frontend.md). ## Modules Weblate consists of several Django applications (some optional, see [Optional Weblate modules](https://docs.weblate.org/en/latest/admin/optionals.md)): `accounts` > User account, profiles and notifications. `addons` > Add-ons to tweak Weblate behavior, see [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons). `api` > API based on [Django REST framework](https://www.django-rest-framework.org/). `auth` > Authentication and permissions. `billing` > The optional [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing) module. `checks` > Translation string [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks) module. `fonts` > Font rendering checks module. `formats` > File format abstraction layer based on translate-toolkit. `gitexport` > The optional [Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter) module. `lang` > Module defining language and plural models. `legal` > The optional [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) module. `machinery` > Integration of machine translation services. `memory` > Built-in translation memory, see [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory). `screenshots` > Screenshots management and OCR module. `trans` > Main module handling translations. `utils` > Various helper utilities. `vcs` > Version control system abstraction. `wladmin` > Django admin interface customization. ## Background tasks internals #### HINT This section describes Celery task internals. [Background tasks using Celery](https://docs.weblate.org/en/latest/admin/install.md#celery) describes how to configure Celery to run the tasks. Weblate uses Celery to execute tasks in the background. Some tasks are event-triggered, and some tasks are schedule-triggered. The Celery Beat is used for scheduling tasks, and django-celery-beat is used to store the periodic task schedule in the database. The tasks schedule is configured in `tasks.py` in each of the Django apps. The tasks are consumed using several queues; the routing is configured in `settings.py`. The queues were designed to separate different types of workload: `celery` : The default queue where background tasks are processed. `notify` : Delivers notification e-mails, both for events within Weblate and for authentication or registration. This is a separate queue to make e-mail delivery smooth even if there is a backlog of other tasks. `memory` : Updates translation memory entries. The updating queue can be long when importing new strings, and long processing does not matter much here, so having a separate queue avoids blocking other tasks. `backup` : The backup tasks cannot be executed in parallel, and a single dedicated worker makes this easier. `translate` : Automatic translation tasks are known to take long because they hit external services. # contributing/issues.md # Reporting issues in Weblate Weblate [issue tracker](https://github.com/WeblateOrg/weblate/issues) is hosted at GitHub. Feel welcome to report any issues you have or suggest improvements for Weblate there. There are various templates prepared to comfortably guide you through the issue report. #### NOTE If what you have found is a security issue in Weblate, please see [Product vulnerability reports](https://docs.weblate.org/en/latest/security/issues.md#security). If you are not sure about your bug report or feature request, you can try [Weblate discussions](https://docs.weblate.org/en/latest/contributing/index.md#discussions). ## Accessibility issues Accessibility problems should use the accessibility issue template. A good report includes the affected page or workflow, reproduction steps, expected and actual behavior, browser and operating system, assistive technology in use, and whether the problem occurs with keyboard-only navigation. Maintainers label accessibility reports with `accessibility`. During triage, use the impact on core workflows and available workarounds to choose priority: - Blocker: a core workflow cannot be completed. - High: a core workflow is difficult, but a workaround exists. - Medium: a non-core workflow is difficult or inconsistent. - Low: a minor issue or polish problem that does not block the workflow. See `ACCESSIBILITY.md` for Weblate’s accessibility target and reporting guidance. ## Using AI to create issues If you asked an AI tool to find problems in Weblate or its modules, you **must** make sure to reveal this fact in your report. You must also double-check the findings carefully before reporting them to us to validate that the issues are indeed existing and working exactly as the AI says. AI-based tools frequently generate inaccurate or fabricated results. It is *rarely* a good idea to just copy and paste an AI-generated report to the project. Those generated reports typically are too wordy and rarely to the point (in addition to the common fabricated details). If you actually discover an issue with an AI and you have verified it yourself to be true, write the report yourself and explain the issue as you have learned it. This makes sure the AI-generated inaccuracies and invented issues are filtered out early before they waste more people’s time. As we take security reports seriously, we investigate each report with priority. This work is both time- and energy-consuming and pulls us away from doing other meaningful work. Fake and otherwise made-up security issues effectively prevent us from doing real project work and make us waste time and resources. We ban users immediately who submit made-up fake reports to the project. ## Issues lifecycle # contributing/license.md # Weblate license ## Machine-readable licensing information Weblate comes with [REUSE 3.3](https://reuse.software/) compliant license specification in the source code. To review licensing of Weblate dependencies please see [Software Bill of Material](https://docs.weblate.org/en/latest/security/release-artifacts.md#sbom). ## License terms Copyright © Michal Čihař [michal@weblate.org](mailto:michal@weblate.org) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <[https://www.gnu.org/licenses/](https://www.gnu.org/licenses/)>. ## Weblate modules license Some Weblate modules use MIT or ISC licenses. Please check the respective repositories for the actual license. # contributing/modules.md # Contributing to Weblate modules Besides the main repository, Weblate consists of several Python modules. All these follow same structure and this documentation covers them all. For example, this covers: * [wlc](https://github.com/WeblateOrg/wlc/), Python client library, see [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc) * [translation-finder](https://github.com/WeblateOrg/translation-finder/), used to discover translatable files in the repository * [language-data](https://github.com/WeblateOrg/language-data/), language definitions for Weblate, see [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) * [translate-toolkit](https://github.com/translate/translate/), the library to manipulate the translation files, originally third-party library but now maintained by Weblate. ## Extending built-in language definitions The language definitions are in the [language-data](https://github.com/WeblateOrg/language-data/) repository. You are welcome to add missing language definitions to `languages.csv`, other files are generated from that file. The columns in the CSV file correspond to [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#id1). #### SEE ALSO * [Built-in language definitions](https://docs.weblate.org/en/latest/admin/languages.md#included-languages) * [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#id1) ## License and copyright When contributing project code, you agree to put your changes and new code under the repository license, , unless stated and agreed otherwise. New source files should follow the existing copyright and license header style. Use a different license only when there is a deliberate reason, such as files shared with repositories using more permissive licenses. #### SEE ALSO [Weblate license](https://docs.weblate.org/en/latest/contributing/license.md) explains licensing in more details. ## Writing a good patch ### Write separate changes It is annoying when you get a massive patch that is said to fix 11 odd problems, but discussions and opinions do not agree with 10 of them or 9 of them were already fixed differently. Then the person merging this change needs to extract the single interesting patch from somewhere within the massive pile of sources, and that creates a lot of extra work. Preferably, each fix that addresses an issue should be in its own patch/commit with its own description/commit message stating exactly what they correct so that all changes can be selectively applied by the maintainer or other interested parties. Furthermore, separate changes enable bisecting much better for tracking issues and regression in the future. ### Documentation Documentation can be a tedious task; however, it is necessary for someone to complete it. It makes things a lot easier if you submit the documentation together with code changes. Please remember to document methods, complex code blocks, or user-visible features. #### SEE ALSO [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) ### Test cases The tests allow us to quickly verify that the features are working as they are supposed to. To maintain this situation and improve it, all new features and functions that are added need to be tested in the test suite. Every feature that is added should get at least one valid test case that verifies that it works as documented. #### SEE ALSO [Weblate testsuite and continuous integration](https://docs.weblate.org/en/latest/contributing/tests.md) ### Commit messages Git commits should follow [Conventional Commits](https://www.conventionalcommits.org/) specification. ### Type checking Any new code should utilize [**PEP 484**](https://peps.python.org/pep-0484/) type hints. We are using **mypy** to check them because it has a Django plugin that makes type checking of Django apps practical. New and changed code should not introduce new **mypy** failures where current Django typing support makes that practical. The code base is not yet completely covered by type annotations, and some Django constructs are difficult to annotate precisely. CI therefore enforces **mypy** only for selected modules and reports other findings separately. ### Coding standard and linting the code The code should follow [**PEP 8**](https://peps.python.org/pep-0008/) coding guidelines and should be formatted using **ruff** code formatter. To check the code quality, you can use **ruff**, its configuration is stored in `pyproject.toml`. When suppressing a **ruff** diagnostic, prefer `# ruff: ignore[rule-name]` with the human-readable rule name. Place the comment on the line above the logical statement or block when that does not broaden the suppression scope. Keep the comment inline when moving it would change the scope, affect import sorting, or get between another tool’s `disable-next` comment and the code it targets. The easiest approach to enforce all this is to install **prek**. This is a third-party reimplementation of the [pre-commit](https://pre-commit.com/) tool used by Weblate. It is included in the development dependencies declared in `pyproject.toml`, so installing those dependencies makes **prek** available. To check all files manually, run: ```sh uv run prek run --all-files ``` If you prefer the original **pre-commit** client, it uses the same configuration from `.pre-commit-config.yaml`. ### Coding securely Any code for Weblate should be written with [Security by Design Principles](https://wiki.owasp.org/index.php/Security_by_Design_Principles) in mind. ## AI guidelines When contributing content to the project, you give us permission to use it as-is, and you must make sure you are allowed to distribute it to us. By submitting a change to us, you agree that the changes can and should be adopted by the project and get redistributed under the project license. Authors should be explicitly aware that the burden is on them to ensure no unlicensed code is submitted to the project. This is independent of whether AI is used or not. When contributing a pull request, you should, of course, always make sure that the proposal is of good quality and the best effort that follows our guidelines. A basic rule of thumb is that if someone can spot that the contribution was made with the help of AI, you have more work to do. We can accept code written with the help of AI into the project, but the code must still follow coding standards, be written clearly, be documented, feature test cases, and adhere to all the normal requirements we have. # contributing/release.md # Releasing Weblate ## Release cycle Weblate’s release and support lifecycle is documented in [Release cycle](https://docs.weblate.org/en/latest/security/releases.md#release-cycle). #### SEE ALSO * [Releases and supported versions](https://docs.weblate.org/en/latest/security/releases.md) * [Upgrading Weblate](https://docs.weblate.org/en/latest/admin/upgrade.md) ## Release planning The features for upcoming releases are collected using GitHub milestones, you can see our roadmap at <[https://github.com/WeblateOrg/weblate/milestones](https://github.com/WeblateOrg/weblate/milestones)>. ## Release process Things to check prior to release: 1. Check newly translated languages by **./scripts/list-translated-languages.py**. 2. Set final version by **./scripts/prepare-release**. 3. Make sure screenshots are up to date **make -j 12 -C docs update-screenshots**. 4. Merge any possibly pending translations **wlc push; git remote update; git merge origin/weblate** When building distribution packages locally, start from a clean checkout or remove ignored packaging artifacts such as `build/`, `dist/`, `weblate.egg-info/`, and generated `weblate/locale/**/*.mo` files. Perform the release: 1. Create a release **./scripts/create-release --tag** (see below for requirements). Post release manual steps: 1. Close GitHub milestone. 2. Once the Docker image is tested, add a tag and push it. 3. Include new version in `.github/workflows/migrations.yml` to cover it in migration testing. 4. Increase version in the repository by **./scripts/set-version.py**. 5. Check that readthedocs.org did build all translations of the documentation using **./scripts/rtd-projects.py**. To create tags using the **./scripts/create-release** script you will need following: * Push access to Weblate git repositories (it pushes tags) # contributing/schemas.md # Data schemas Weblate uses [JSON Schema](https://json-schema.org/) to define layout of external JSON files. ## Weblate Translation Memory Schema | | [https://weblate.org/schemas/weblate-memory.schema.json](https://weblate.org/schemas/weblate-memory.schema.json) | |---------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------| | type | *array* | | items | *The Translation Memory Item* | | type | *object* | | properties | | | - **category** | *The String Category* | | 1 is global, 2 is shared, 10000000+ are project specific, 20000000+ are user specific | | | type | *integer* | | examples | 1 | | minimum | 0 | | default | 1 | | - **origin** | *The String Origin* | | Filename or component name | | | type | *string* | | examples | test.tmx | | project/component | | | default | | | - context | *The String Context or Key* | | Translation context or key for monolingual formats | | | type | *string* | | examples | Greeting used in emails | | default | | | - **source** | *The Source String* | | type | *string* | | examples | Hello | | minLength | 1 | | default | | | - **source_language** | *The Source Language* | | ISO 639-1 / ISO 639-2 / IETF BCP 47 | | | type | *string* | | examples | en | | pattern | ^[^ ]+$ | | default | | | - **target** | *The Target String* | | type | *string* | | examples | Ahoj | | minLength | 1 | | default | | | - **target_language** | *The Target Language* | | ISO 639-1 / ISO 639-2 / IETF BCP 47 | | | type | *string* | | examples | cs | | pattern | ^[^ ]+$ | | default | | | - status | *Status* | | type | *integer* | | additionalProperties | False | | definitions | | #### SEE ALSO * [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) * [`dump_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-dump_memory) * [`import_memory`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_memory) ## Weblate user data export | | [https://weblate.org/schemas/weblate-userdata.schema.json](https://weblate.org/schemas/weblate-userdata.schema.json) | |--------------------------------|------------------------------------------------------------------------------------------------------------------------| | type | *object* | | properties | | | - **basic** | *Basic* | | type | *object* | | properties | | | - **username** | *Username* | | type | *string* | | examples | admin | | default | | | - **full_name** | *Full name* | | type | *string* | | examples | Weblate Admin | | default | | | - **email** | *E-mail* | | type | *string* | | examples | [noreply@example.com](mailto:noreply@example.com) | | default | | | format | email | | - **date_joined** | *Date joined* | | type | *string* | | examples | 2019-11-18T18:53:54.862Z | | default | | | format | date-time | | additionalProperties | False | | - **profile** | *Profile* | | type | *object* | | properties | | | - **language** | *Language* | | type | *string* | | examples | cs | | pattern | ^[^ ]\*$ | | default | | | - **suggested** | *Number of suggested strings* | | type | *integer* | | examples | 1 | | default | 0 | | - **translated** | *Number of translated strings* | | type | *integer* | | examples | 24 | | default | 0 | | - **uploaded** | *Number of uploaded screenshots* | | type | *integer* | | examples | 1 | | default | 0 | | - **hide_completed** | *Hide completed translations on the dashboard* | | type | *boolean* | | examples | False | | default | True | | - **secondary_in_zen** | *Show secondary translations in the Zen mode* | | type | *boolean* | | examples | True | | default | True | | - **hide_source_secondary** | *Hide source if a secondary translation exists* | | type | *boolean* | | examples | False | | default | True | | - wide_tables | *Show all columns in lists using horizontal scrolling* | | type | *boolean* | | examples | False | | default | False | | - listing_columns | *Visible columns in lists* | | type | *array* | | default | untranslated | | untranslated_words | | | untranslated_chars | | | nottranslated | | | checks | | | suggestions | | | comments | | | items | *Column* | | type | *string* | | enum | total, untranslated, untranslated_words, untranslated_chars, nottranslated, checks, suggestions, comments | | examples | checks | | - **editor_link** | *Editor link* | | type | *string* | | examples | | | pattern | ^.\*$ | | default | | | - **translate_mode** | *Translation editor mode* | | type | *integer* | | examples | 0 | | default | 0 | | - **zen_mode** | *Zen editor mode* | | type | *integer* | | examples | 0 | | default | 0 | | - **special_chars** | *Special characters* | | type | *string* | | examples | | | pattern | ^.\*$ | | default | | | - theme | *Theme* | | type | *string* | | examples | auto | | pattern | ^(auto|dark|light)$ | | default | auto | | - **dashboard_view** | *Default dashboard view* | | type | *integer* | | examples | 1 | | default | 0 | | - **dashboard_component_list** | *Default component list* | | default | null | | anyOf | type | | type | *integer* | | - **languages** | *Translated languages* | | type | *array* | | default | | | items | *Language code* | | type | *string* | | examples | cs | | pattern | ^.\*$ | | default | | | - **secondary_languages** | *Secondary languages* | | type | *array* | | default | | | items | *Language code* | | type | *string* | | examples | sk | | pattern | ^.\*$ | | default | | | - **watched** | *Watched projects* | | type | *array* | | default | | | items | *Project slug* | | type | *string* | | examples | weblate | | pattern | ^.\*$ | | default | | | additionalProperties | False | | - **auditlog** | *Audit log* | | type | *array* | | default | | | items | *Items* | | type | *object* | | properties | | | - **address** | *IP address* | | anyOf | type | | type | *string* | | examples | 127.0.0.1 | | pattern | ^.\*$ | | default | | | - **user_agent** | *User agent* | | type | *string* | | examples | PC / Linux / Firefox 70.0 | | pattern | ^.\*$ | | default | | | - **timestamp** | *Timestamp* | | type | *string* | | examples | 2019-11-18T18:58:30.845Z | | default | | | format | date-time | | - **activity** | *Activity* | | type | *string* | | examples | login | | pattern | ^.\*$ | | default | | | additionalProperties | False | | definitions | | #### SEE ALSO * [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile) * [`dumpuserdata`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-dumpuserdata) ## Weblate Messaging | [https://weblate.org/schemas/weblate-messaging.schema.json](https://weblate.org/schemas/weblate-messaging.schema.json) | |--------------------------------------------------------------------------------------------------------------------------| | Schema for Weblate Messaging | | type | | properties | | - **change_id** | | Numerical ID of change | | type | | - **action** | | Verbose name of the change, see Change actions source code for possible values | | type | | - **timestamp** | | ISO formatted timestamp | | type | | format | | - target | | New value of the change (eg. new translation of the string) | | type | | - old | | Old value of the change (eg. previous translation of the string) | | type | | - source | | Source string | | type | | - url | | Absolute URL to view the related object | | type | | - author | | Author username (this can be different from user for example when accepting suggestions) | | type | | - user | | type | | - project | | type | | - component | | type | | - translation | | type | | - category | | type | | items | | type | | - context | | type | | additionalProperties | | definitions | #### SEE ALSO * [Fedora Messaging](https://docs.weblate.org/en/latest/admin/addons.md#fedora-messaging) * [Webhook](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-webhook-webhook) * [Selected change events](https://docs.weblate.org/en/latest/admin/addons.md#change-actions) # contributing/snippets/code-guide.md # License and copyright When contributing project code, you agree to put your changes and new code under the repository license, , unless stated and agreed otherwise. New source files should follow the existing copyright and license header style. Use a different license only when there is a deliberate reason, such as files shared with repositories using more permissive licenses. #### SEE ALSO [Weblate license](https://docs.weblate.org/en/latest/contributing/license.md) explains licensing in more details. # Writing a good patch ## Write separate changes It is annoying when you get a massive patch that is said to fix 11 odd problems, but discussions and opinions do not agree with 10 of them or 9 of them were already fixed differently. Then the person merging this change needs to extract the single interesting patch from somewhere within the massive pile of sources, and that creates a lot of extra work. Preferably, each fix that addresses an issue should be in its own patch/commit with its own description/commit message stating exactly what they correct so that all changes can be selectively applied by the maintainer or other interested parties. Furthermore, separate changes enable bisecting much better for tracking issues and regression in the future. ## Documentation Documentation can be a tedious task; however, it is necessary for someone to complete it. It makes things a lot easier if you submit the documentation together with code changes. Please remember to document methods, complex code blocks, or user-visible features. #### SEE ALSO [Contribute to Weblate documentation](https://docs.weblate.org/en/latest/contributing/documentation.md) ## Test cases The tests allow us to quickly verify that the features are working as they are supposed to. To maintain this situation and improve it, all new features and functions that are added need to be tested in the test suite. Every feature that is added should get at least one valid test case that verifies that it works as documented. #### SEE ALSO [Weblate testsuite and continuous integration](https://docs.weblate.org/en/latest/contributing/tests.md) ## Commit messages Git commits should follow [Conventional Commits](https://www.conventionalcommits.org/) specification. ## Type checking Any new code should utilize [**PEP 484**](https://peps.python.org/pep-0484/) type hints. We are using **mypy** to check them because it has a Django plugin that makes type checking of Django apps practical. New and changed code should not introduce new **mypy** failures where current Django typing support makes that practical. The code base is not yet completely covered by type annotations, and some Django constructs are difficult to annotate precisely. CI therefore enforces **mypy** only for selected modules and reports other findings separately. ## Coding standard and linting the code The code should follow [**PEP 8**](https://peps.python.org/pep-0008/) coding guidelines and should be formatted using **ruff** code formatter. To check the code quality, you can use **ruff**, its configuration is stored in `pyproject.toml`. When suppressing a **ruff** diagnostic, prefer `# ruff: ignore[rule-name]` with the human-readable rule name. Place the comment on the line above the logical statement or block when that does not broaden the suppression scope. Keep the comment inline when moving it would change the scope, affect import sorting, or get between another tool’s `disable-next` comment and the code it targets. The easiest approach to enforce all this is to install **prek**. This is a third-party reimplementation of the [pre-commit](https://pre-commit.com/) tool used by Weblate. It is included in the development dependencies declared in `pyproject.toml`, so installing those dependencies makes **prek** available. To check all files manually, run: ```sh uv run prek run --all-files ``` If you prefer the original **pre-commit** client, it uses the same configuration from `.pre-commit-config.yaml`. ## Coding securely Any code for Weblate should be written with [Security by Design Principles](https://wiki.owasp.org/index.php/Security_by_Design_Principles) in mind. # AI guidelines When contributing content to the project, you give us permission to use it as-is, and you must make sure you are allowed to distribute it to us. By submitting a change to us, you agree that the changes can and should be adopted by the project and get redistributed under the project license. Authors should be explicitly aware that the burden is on them to ensure no unlicensed code is submitted to the project. This is independent of whether AI is used or not. When contributing a pull request, you should, of course, always make sure that the proposal is of good quality and the best effort that follows our guidelines. A basic rule of thumb is that if someone can spot that the contribution was made with the help of AI, you have more work to do. We can accept code written with the help of AI into the project, but the code must still follow coding standards, be written clearly, be documented, feature test cases, and adhere to all the normal requirements we have. # contributing/start.md # Starting contributing code to Weblate Understand the Weblate source code by going through [Weblate source code](https://docs.weblate.org/en/latest/contributing/code.md), [Weblate frontend](https://docs.weblate.org/en/latest/contributing/frontend.md) and [Weblate internals](https://docs.weblate.org/en/latest/contributing/internals.md). ## Starting with the codebase Familiarize yourself with the Weblate codebase, by having a go at the bugs labelled [good first issue](https://github.com/WeblateOrg/weblate/labels/good%20first%20issue). You are welcome to start working on these issues without asking. Just announce that in the issue, so that it’s clear that somebody is working on that issue. ## Running Weblate locally The most comfortable approach to get started with Weblate development is to follow [Installing from sources](https://docs.weblate.org/en/latest/admin/install/source.md). It will get you a Python environment with editable Weblate sources. 1. Clone the Weblate source code: ```sh git clone https://github.com/WeblateOrg/weblate.git cd weblate ``` 2. Install Weblate and all dependencies useful for development: ```sh uv sync --all-extras --dev ``` 3. Start a development server: ```sh uv run weblate runserver ``` 4. Depending on your configuration, you might also want to start Celery workers: ```sh uv run ./weblate/examples/celery start ``` 5. To run tests (see [Local testing of Weblate](https://docs.weblate.org/en/latest/contributing/tests.md#local-tests) for more details): ```sh . scripts/test-database.sh uv run pytest ``` #### SEE ALSO [Installing from sources](https://docs.weblate.org/en/latest/admin/install/source.md) ## Development container for tests and lint The development container prepares Python dependencies, PostgreSQL, Valkey, compiled translations, and static files for running tests and lint checks. It supports ordinary clones and linked Git worktrees. Each checkout has its own containers, network, database, virtual environment, and caches, with no published host ports in the default test profile. The optional application profile runs [Weblate and workers for local QA](https://docs.weblate.org/en/latest/contributing/start.md#dev-docker) with separate storage and dynamically allocated localhost ports. Install Docker with the Compose plugin, Git, and Python 3.12 or newer on the host. For the command-line workflow, also install Node.js 20 or newer and the Dev Container CLI: ```sh npm install --global @devcontainers/cli@0.89.0 ./scripts/devcontainer up ./scripts/devcontainer doctor ./scripts/devcontainer exec -- uv run pytest weblate/lang/tests.py ./scripts/devcontainer exec -- uv run prek run --all-files ``` Alternatively, open the checkout in Visual Studio Code with its Dev Containers extension and select Dev Containers: Reopen in Container. Both workflows use `.devcontainer/devcontainer.json` and wait for bootstrap to finish. The CLI must be installed separately for the default backend of `scripts/devcontainer`. To use Docker Compose directly without Node.js or the Dev Container CLI, pass `--backend compose` before the command: ```sh ./scripts/devcontainer --backend compose up ./scripts/devcontainer --backend compose exec -- uv run pytest weblate/lang/tests.py ``` Both backends share the same test environment for a checkout. The Compose backend runs bootstrap on each `up` invocation. CI checks both backends on ARM Linux runners, including concurrent application QA in separate worktrees. Bootstrap uses the frozen dependency lock and builds `lxml` and `xmlsec` from source, matching CI. Initial setup requires network access to download images and dependencies; lint hooks download their environments on first use. After changing dependencies, rerun: ```sh ./scripts/devcontainer bootstrap ``` Pytest creates and migrates its test database on first use and reuses it on subsequent runs. To recreate it after incompatible migration changes, pass `--create-db` to pytest. Existing host virtual environments and local `weblate/settings.py` are not used by the container. For a separate task, create a worktree and start its environment: ```sh git worktree add ../weblate-task -b task/example cd ../weblate-task ./scripts/devcontainer up ``` The environment identifier is derived from the checkout’s absolute path, so changing branches preserves the environment. Stop or destroy the environment before moving or deleting its checkout. Linked worktrees also mount the shared Git metadata directory at its original path; Git operations therefore affect the same repository as host Git operations. Other worktrees’ sources are not mounted. Unset `COMPOSE_PROJECT_NAME` when using this workflow, and remove its assignments from `.env` files in the checkout, `.devcontainer`, and the directory from which you launch the tools. Initialization rejects these assignments because they can override the checkout-specific project name. To stop containers while retaining their data, or explicitly delete their containers and volumes: ```sh ./scripts/devcontainer stop ./scripts/devcontainer destroy --yes ``` These commands only manage the current checkout’s test environment. They do not remove its source files or the application environment started by `rundev.sh`. Tests run through `./rundev.sh test` share this test environment, so stopping it affects both test launchers. Closing the IDE stops the entire checkout’s Compose project, including application QA, while retaining its data. Launcher stop commands affect only their selected profile. Use `--all` before `stop`, `logs`, or `destroy` to manage both profiles in the checkout. If setup fails, use `./scripts/devcontainer doctor` to inspect the source paths, service connections, dependency consistency, and test assets. Service readiness checks have a timeout. Containers remain available for inspection; their logs can be read with **docker compose**: ```sh docker compose -f .devcontainer/compose.yaml -f .devcontainer/compose.local.json logs ``` The generated `.devcontainer/compose.local.json` is ignored by Git and contains checkout-specific paths. Keep credentials and host configuration out of this file. The shared development image includes native Chromium and its matching driver from the XtraDeb Ubuntu repository on ARM and amd64. These system packages are not version-pinned. To fetch browser updates, rebuild without the Docker build cache and recreate the test container: ```sh ./scripts/devcontainer --backend compose compose -- build --no-cache developer ./scripts/devcontainer --backend compose restart ``` To verify browser startup, page loading, and JavaScript execution, or run the existing Selenium suite with a required browser: ```sh ./scripts/devcontainer doctor --browser ./scripts/devcontainer browser-test ./rundev.sh browser-test -k test_login_form_accessibility ./rundev.sh browser-test --target weblate/trans/tests/test_selenium.py::SeleniumTests::test_js_unit_tests ``` `browser-test` prepares the isolated test environment, runs browser diagnostics, and sets `CI_SELENIUM=1` so unavailable WebDriver fails instead of skipping. It prints pytest’s test totals and skip reasons, preserving legitimate skips and pytest’s exit status. Additional arguments are passed to pytest; repeat `--target` to select specific test paths or node IDs instead of the default Selenium module. `doctor --browser` checks the test profile through either launcher and reports installed browser and driver versions. The image sets `WEBLATE_TEST_CHROME_BINARY` and `WEBLATE_TEST_CHROMEDRIVER` to the installed executable paths. These developer-only variables are shared by the diagnostic and Selenium tests, avoiding automatic browser downloads. Outside the image, leaving them unset preserves Selenium’s default browser discovery. Use your own browser with the application profile’s URL for exploratory QA. Linux and WSL2 with a checkout in the Linux filesystem are the primary targets. macOS Docker Desktop and Codespaces use the same configuration, but are not covered by the Linux CI smoke test. Native Windows paths and remote Docker daemons are not supported by the host-path mounts. ## Running Weblate locally in Docker Install Docker with the Compose plugin, Git, and Python 3.12 or newer on the host. Start the development application with: ```sh ./rundev.sh ``` This is equivalent to `./scripts/devcontainer --profile app up`. Both commands use the same launcher and Compose project as the test environment, without requiring Node.js or the Dev Container CLI for the application profile. The launcher builds the development image, starts Weblate with supervised web and Celery workers, and prints the application and Maildev mailbox URLs when Weblate is ready. Sign in as `admin` with password `admin`. The installation starts empty; continue with [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects). Docker assigns free HTTP ports bound to `127.0.0.1`. Each worktree has its own application database, Valkey instance, data, virtual environment, home, and caches, separate from the test profile. SMTP, PostgreSQL, and Valkey ports are not published. Weblate uses the discovered application URL for generated links and authentication origins. To display the current URLs again: ```sh ./rundev.sh urls ./rundev.sh urls --json ``` To exercise real background workers through complete application journeys: ```sh ./rundev.sh application-test ``` This is also available as `./scripts/devcontainer application-test`. It starts the application profile and uses its administrator API token to import a small component archive, save a translation, request a background commit, and inspect the committed Git file. It then checks the exported ZIP, eventual translation statistics in the API and rendered application page, translation memory, and a translation notification delivered to Maildev. Export generation itself is synchronous; its contents must reflect the completed background work. A separate transaction check queues a real task before its fixture row is committed, waits for a retry, and verifies successful redelivery after commit. The suite requires non-eager Celery and the application’s Valkey broker and Maildev. Polls have deadlines, worker task failures include their tracebacks, and failures print the application service logs. CI runs these journeys in both the Docker development job and concurrent isolated worktrees. Each invocation creates a uniquely named `celery-qa-` project and notification recipient with an unusable password. These fixtures remain available for inspection, including after failure; the suite does not reset existing data. Remove these projects and users through the application when finished, or **destroy --yes** the disposable application environment. Ports can change after containers are recreated or restarted. Use `./rundev.sh restart` to restart and rediscover them; direct Docker restarts cannot initialize the application domain. Ordinary startup reuses unchanged containers. Application containers do not restart automatically after Docker restarts. When the image changes Python minor versions, startup recreates the application virtual environment and reinstalls dependencies. Application data is retained. To access the application database from inside its container: ```sh ./rundev.sh exec -- weblate dbshell ``` The application service definitions are in `dev-docker/docker-compose.yml` and are included by the shared Compose configuration. Use the launchers to initialize paths and ports. For other Compose operations, use `./rundev.sh compose -- COMMAND` (or existing shortcuts such as `./rundev.sh ps`). Project-wide Compose commands can affect both profiles. Existing development environments are not migrated automatically. Before updating from the old launcher, stop its containers with its `./rundev.sh stop` command. If already updated, identify the old containers using `docker ps` and stop them explicitly. The new launcher leaves their databases, volumes, and `dev-docker/data/` untouched and starts with fresh application data. To execute tests, run the script with the `test` parameter and pytest arguments, for example running only tests in the `weblate.machine` module: ```sh ./rundev.sh test --exitfirst weblate/machine ``` The command automatically starts and bootstraps the [development container](https://docs.weblate.org/en/latest/contributing/start.md#devcontainer) using Docker Compose, without requiring the Dev Container CLI. It runs independently of the application and workers, with separate databases, virtual environments, and caches. Each invocation refreshes dependencies and test assets before running pytest. To display application logs: ```sh ./rundev.sh logs ``` To stop only the application profile, retaining its data: ```sh ./rundev.sh stop ``` Use `./scripts/devcontainer stop` to stop only tests. To stop or destroy both profiles, including their volumes when destroying: ```sh ./rundev.sh --all stop ./rundev.sh --all destroy --yes ``` Without `--all`, `destroy --yes` removes only the selected profile’s containers and volumes. Other worktrees remain running. #### WARNING This container is not suitable for production use. Security is sacrificed to make the development easier. ## Bootstrapping your devel instance You might want to use [`import_demo`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_demo) to create demo translations and [`createadmin`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-createadmin) to make an admin user. If you have [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing) installed as well, you can use [`billing_demo`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-billing_demo) to create a demo billing project. ## Coding Weblate with PyCharm PyCharm is a known IDE for Python, here are some guidelines to help you set up your Weblate project in it. Considering you have just cloned the GitHub repository to a folder, just open it with PyCharm. Once the IDE is open, the first step is to specify the interpreter you want to use: ![image](images/pycharm-1.png) Select the `.venv` environment created by `uv sync --all-extras --dev` to match the command-line development setup. You can also let PyCharm create a Python environment for you, but the uv-managed environment is preferred: ![image](images/pycharm-2.png) Don’t forget to install the dependencies once the interpreter is set. When using the preferred uv-managed environment, run `uv sync --all-extras --dev` from the console. The second step is to set the right info to use Django natively inside PyCharm: The idea is to be able to immediately trigger the unit tests in the IDE. For that you need to specify the root path of the Django project and the path to its settings: ![image](images/pycharm-3.png) Be careful, the Django project root is the actual root of the repository, not the Weblate sub-directory. About the settings, you could use the `weblate/settings_test.py` from the repository, but you could create your own setting and set it there. The last step is to run the server and to put breakpoints in the code to be able to debug it. This is done by creating a new Django Server configuration: ![image](images/pycharm-4.png)![image](images/pycharm-5.png) #### HINT Be careful with the property called No reload: It prevents the server from being reloaded live if you modify files. This allows the existing debugger breakpoints to persist, when they normally would be discarded upon reloading the server. # contributing/submodules.md # Subprojects and embedded code Weblate would not be possible without other projects it depends on. This document describes how other code is used in Weblate. ## Vendored frontend code Weblate vendors several JavaScript libraries. The process is described in [Weblate frontend](https://docs.weblate.org/en/latest/contributing/frontend.md) and licensing of each vendored library is documented via REUSE as described in [Weblate license](https://docs.weblate.org/en/latest/contributing/license.md). The up-to-date list of dependencies can be reviewed in [Software Bill of Material](https://docs.weblate.org/en/latest/security/release-artifacts.md#sbom). ## SPDX license data The SPDX license data is included as a Git submodule in the source code and `weblate/utils/licensedata.py` is generated using `scripts/generate-license-data.py`. The submodule tracks tagged SPDX releases. Renovate updates the release recorded in `.gitmodules`, and the license update workflow updates the submodule and generated license data. ## Test data The test repositories in `weblate/trans/tests/data/test-base-repo.*.tar` are generated from [https://github.com/WeblateOrg/test](https://github.com/WeblateOrg/test), see [Testing repository](https://docs.weblate.org/en/latest/contributing/tests.md#test-data). ## Python dependencies Weblate would not be possible without many third-party dependencies. The current dependencies are in `pyproject.toml` and can be reviewed in [Software Bill of Material](https://docs.weblate.org/en/latest/security/release-artifacts.md#sbom). The most important dependencies are also described in [Python dependencies](https://docs.weblate.org/en/latest/admin/install.md#python-deps). # contributing/tests.md # Weblate testsuite and continuous integration Testsuites exist for most of the current code, increase coverage by adding testcases for any new functionality, and verify that it works. ## Continuous integration Weblate relies on [GitHub Actions](https://github.com/WeblateOrg/weblate/actions) to run tests, build documentation, code linting, and other tasks to ensure code quality. [Codecov](https://app.codecov.io/gh/WeblateOrg/weblate/) collects the code coverage information from the tests that were run. There are several jobs to verify different aspects: * Unit and functional tests using [pytest](https://pytest.org/). * Documentation build and external links using [Sphinx](https://www.sphinx-doc.org/). * Code linting and quality assurance using [ruff](https://docs.astral.sh/ruff/) and [pylint](https://www.pylint.org/). * Code security scanning using [CodeQL](https://codeql.github.com/). * Visual changes testing is utilizing [Argos CI](https://argos-ci.com). * Code formatting using [prek](https://pypi.org/project/prek/), a faster third-party reimplementation of the [pre-commit](https://pre-commit.com/) framework. * Migration testing from all supported releases * Setup verification (ensures that generated dist files do not miss anything and can be tested) The configuration for the CI is in `.github/workflows` directory. It heavily uses helper scripts stored in `ci` directory. The scripts can be also executed manually, but they require several environment variables, mostly defining Django settings file to use and test database connection. The example definition of that is in `scripts/test-database.sh`: The Selenium screenshot tests in `weblate/trans/tests/test_selenium.py` serve two purposes. They generate images for visual change testing in CI, and the same images are converted into documentation screenshots by **make -C docs update-screenshots**. Keep screenshot fixtures close to real rendered pages so CI catches UI regressions. When a screenshot includes volatile runtime data, prefer deterministic server-side test inputs over post-render DOM changes. ```sh # Copyright © Michal Čihař # # SPDX-License-Identifier: GPL-3.0-or-later # Simple way to configure test database from environment # shellcheck shell=sh # Database server configuration export CI_DB_USER=weblate export CI_DB_PASSWORD=weblate export CI_DB_HOST=127.0.0.1 # Django settings module to use export DJANGO_SETTINGS_MODULE=weblate.settings_test ``` The simple execution can look like: ```sh source scripts/test-database.sh ./ci/run-migrate ./ci/run-test ./ci/run-docs ``` ## Local testing of Weblate For an isolated environment with dependencies and test services already configured, use the [development container](https://docs.weblate.org/en/latest/contributing/start.md#devcontainer). Its CLI can run the same pytest and lint commands documented below in each Git worktree. Before running tests, please ensure development dependencies are installed: ```sh uv sync --all-extras --dev ``` ### Testing using pytest Prior to running tests you should collect static files as some tests rely on them being present: ```sh DJANGO_SETTINGS_MODULE=weblate.settings_test uv run ./manage.py collectstatic --noinput ``` You can use pytest to run the test suite locally: ```sh uv run pytest ``` Running an individual test file: ```sh uv run pytest weblate/utils/tests/test_search.py ``` #### HINT You will need a database (PostgreSQL) server to be used for tests. By default Django creates separate database to run tests with `test_` prefix, so in case your settings is configured to use `weblate`, the tests will use `test_weblate` database. See [Database setup for Weblate](https://docs.weblate.org/en/latest/admin/install.md#database-setup) for setup instructions. The `weblate/settings_test.py` is used in CI environment as well (see [Continuous integration](https://docs.weblate.org/en/latest/contributing/tests.md#ci-tests)) and can be tuned using environment variables: ```sh export CI_DB_USER=weblate export CI_DB_PASSWORD=weblate export CI_DB_HOST=127.0.0.1 export CI_DB_PORT=60000 export DJANGO_SETTINGS_MODULE=weblate.settings_test ``` #### HINT The tests can also be executed inside developer docker container, see [Running Weblate locally in Docker](https://docs.weblate.org/en/latest/contributing/start.md#dev-docker). #### SEE ALSO See [Testing in Django](https://docs.djangoproject.com/en/stable/topics/testing/) for more info on running and writing tests for Django. # Local testing of Weblate modules The tests are executed using **pytest**. First you need to install development dependencies: ```sh uv sync --all-extras --dev ``` You can then execute the testsuite in the repository checkout: ```sh uv run pytest ``` # Testing repository Many of the tests in the Weblate test suite use the test repository. The test suite repository is maintained at [https://github.com/WeblateOrg/test](https://github.com/WeblateOrg/test). The script `scripts/pack-test-data.sh` is then used to generate a tarball with a repository for each of the supported version control systems. These are stored as `weblate/trans/tests/data/test-base-repo.git.tar`, `weblate/trans/tests/data/test-base-repo.hg.tar`, and `weblate/trans/tests/data/test-base-repo.svn.tar` in the Weblate repository. The [https://github.com/WeblateOrg/test](https://github.com/WeblateOrg/test) repository is tagged at the release time, which ensures that the release tags can be used to access test data used at the release time. The script tries to create reproducible tarballs as much as possible. # contributing/trademark.md # Weblate Trademark Guidelines Weblate is an open-source organization. Because we make privacy-respecting localization tools and provide it as copylefted libre software, proper use of our trademarks is essential to inform users whether Weblate stands behind a product or service so that we can continue to develop. The Weblate name is not only a trademark used to identify our technology, components and services, it also serves as our company name. When using Weblate trademarks (including some product names that are part of our organization) you must comply with these Weblate Trademark Guidelines. Some of our trademarks include: ![image](images/logo-text.svg) However, this is not a complete list of our names, logos, and brand features, all of which are subject to these guidelines. ## When do I need specific permission to use a Weblate trademark? Since Weblate is a provider of a software that can be used in many versions – hosted, dedicated cloud and self-hosted (both paid and free), it is important to distinguish between these cases. Each version has a specific way of using the Weblate trademark. However, in all cases it is not necessary to receive permission directly from Weblate (or its affiliates) to: * Use Weblate wordmarks and/or logos in unmodified versions of Weblate programs, products, services and technologies. * Use Weblate wordmarks in text to truthfully refer to and/or link to unmodified Weblate programs, products, services and technologies. * Use Weblate logos in visuals to truthfully refer to and/or to link to the applicable programs, products, services and technologies hosted on Weblate servers. * Use Weblate wordmarks to explain that your software is based on Weblate’s open-source code or is compatible with Weblate’s software. * Describe a social media account, page, or community in accordance with the Social Media Guidelines. All other uses of a Weblate trademark require our prior written permission. This includes any use of a Weblate trademark in a domain name. ## When allowed, how should I use a Weblate trademark? ### General Guidelines **Do:** * Use the Weblate trademark exactly as shown in the list above. * Use Weblate wordmarks only as a noun. Avoid Adjectives and Verbs. Do not use them in plural. **Don’t:** * Don’t use Weblate trademarks in the name of your business, product, service, app, domain name, publication, or other offering. * Don’t use marks, logos, company names, slogans, domain names, or designs that are confusingly like Weblate trademarks. * Don’t use Weblate trademarks in a way that incorrectly implies affiliation with, or sponsorship, endorsement, or approval by Weblate of your products or services. * Don’t display Weblate trademarks more prominently than your product, service, or company name. * Don’t use Weblate trademarks on merchandise for sale (e.g., selling t-shirts, mugs, etc.). * Don’t use Weblate trademarks for any other form of commercial use (e.g. offering technical support services). * Don’t modify Weblate’s trademarks, abbreviate them, or combine them with any other symbols, words, or images, or incorporate them into a tagline or slogan. ### Social Media Guidelines In addition to the General Guidelines above, the name and handle of your social media account and all pages cannot begin with a Weblate trademark. In addition, Weblate logos cannot be used in a way that might suggest affiliation with Weblate, including, but not limited to, the account, profile, or header images. The only exception to these requirements is if you’ve received prior permission from Weblate. For example, you cannot name your account, page, or community “Weblate Representatives” or “Weblate Software”. However, it would be acceptable to name your account, page, or community “Fans of Weblate” or “Information about Weblate Software” if you do not use the Weblate trademarks or Weblate logos or otherwise suggest any affiliation with Weblate. ### Open-Source Project Guidelines The specific license for each of Weblate’s software products and code says what you can and cannot do with the code itself but does not give permission to use Weblate’s trademarks. If you choose to build on or modify Weblate’s open-source code for your own project, **You Must:** * Follow the terms of the Open-Source Licenses for Weblate software products and code (mainly GPLv3). * Choose branding, logos, and trademarks that denotes your own unique identity to clearly signal to users that there is no affiliation with or endorsement by Weblate. * Follow the General Guidelines, above. **You Must NOT:** * Use any Weblate trademark in connection with the user-facing name or branding of your project. * Use any Weblate trademark or any part of any Weblate trademark to incorrectly suggest or give the impression your software is published by, affiliated with, or endorsed by Weblate. For example, please do not name your project, [Something]-Weblate, or Weblate-[Something] **You May:** * State in words (not using logos or images) that your product “works with” or “is compatible” with certain Weblate products, if that is true. * State in words (not using logos or images) that your project is based on Weblate open-source technology, if that is true, if you also include a statement that your project is not officially associated with Weblate or its products. For instance, you may state that your project: “is proudly built from Weblate’s open-source software” as long as you also include the statement equally prominently: “[Brand Name] and [Product Name] are not officially associated with Weblate or its products.” ### Weblate Community Guidelines Various permissions to use Weblate Trademarks have been provided to various members of the Weblate Community, and these Weblate Trademark Guidelines do not alter any such previously granted permissions. # devel/alerts.md # Translation component diagnostics Shows errors in the Weblate configuration or the translation project for any given translation component. Guidance on how to address found issues is also offered. Currently the following is covered: * Duplicated source strings in translation files * Duplicated languages within translations * Merge, update, or push failures in the repository * Parse errors in the translation files * Billing limits (see [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing)) * Repository containing too many outgoing or missing commits * Missing licenses * Errors when running add-on (see [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md)) * Misconfigured monolingual or bilingual translation. * Broken [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) * Broken URLs * Unused screenshots * Ambiguous language code * Unused new base in component settings * Duplicate file mask used for linked components * Conflicting merge request repository setup * Component seems unused (configurable by [`UNUSED_ALERT_DAYS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-UNUSED_ALERT_DAYS)) * Unused glossary languages * Disabled string management in local glossaries or glossaries containing terminology The alerts are updated daily, or on related change (for example when [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) is changed or when repository is updated). Project website availability checks can be disabled using [`WEBSITE_ALERTS_ENABLED`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBSITE_ALERTS_ENABLED), in which case Weblate will no longer generate alerts for unreachable project websites. Alerts are listed on each respective component page as Diagnostics. ## Project and workspace diagnostics overviews Signed-in users can open the Diagnostics tab on project and workspace pages. The overview is loaded when opened and groups alerts of the same type instead of repeating them for every component. The project overview shows project-wide findings once and lists the components affected by component-specific findings: ![Project diagnostics overview with grouped findings and filters](screenshots/project-diagnostics.webp) The workspace overview groups project-wide findings by project and identifies components using both the project and component name: ![Workspace diagnostics overview with grouped findings and filters](screenshots/workspace-diagnostics.webp) Each finding lists up to 20 affected projects or components. Additional affected objects are shown as a count. Follow a component link to see the complete diagnostic details or dismiss a diagnostic on the component page. The summary can be filtered by active or dismissed state, severity, category, or whether the signed-in user can act on the diagnostic. Components shared into a project are listed only in the diagnostics of their owning project. If it is missing, the component clears all current checks. Problem alerts cannot be ignored, but will disappear once the underlying problem has been fixed. Information and warning alerts are used for guidance on improving community localization. These can be dismissed and make the Diagnostics tab visible, but they do not indicate a component problem in listings. Dismissed diagnostics record who dismissed them, when they were dismissed, and an optional reason. A dismissal is automatically reopened when the diagnostic details or the configuration relevant to that diagnostic changes. Dismissal and reopening are both recorded in the component change history. Warning and error notifications are sent only to subscribed project maintainers who have permission to act on the diagnostic. Informational recommendations do not send unsolicited notifications. Custom alerts can override `BaseAlert.get_dismissal_context(component, details)` to include stable, JSON-serializable configuration or diagnostic inputs. Changing the returned context reopens a dismissed alert. Incidental values such as evaluation time should not be included. A component with both duplicated strings and languages looks like this: ![image](screenshots/alerts.webp) ## Conflicting repository setup This alert is shown when multiple Git components are configured to push to the same repository and push branch without all of them pulling from that branch. This includes pull or merge request workflows, and direct pushes to a separate push branch. Such a setup can overwrite the shared branch. To resolve this, either configure a different Push branch for each component or share the repository between components using a `weblate://project/component` repository URL. #### SEE ALSO [Using custom certificate authority](https://docs.weblate.org/en/latest/admin/install.md#production-certs) # devel/community.md # Building a translators community Following these recommendations supports the creation of a full, multilingual post-editing tool. Good translations are defined through the systemic-functional model of House which aims at a contextual correct translation. Write your own [post-editing guide](https://en.wikipedia.org/wiki/Postediting) and alter these recommendations to fit your own definitions. In most cases the [browser-plugin of languageTool](https://languagetool.org/#firefox_chrome) is useful as a proof-reading tool. Many times translators will find problems with the source strings. Make sure it is easy for them to report such problems. To gather this feedback, you can set up the [Repository browser](https://docs.weblate.org/en/latest/admin/projects.md#component-repoweb) field on your Weblate component, for translators to propose their changes to the upstream repository. You can also receive translator comments if you set up [Source string bug reporting address](https://docs.weblate.org/en/latest/admin/projects.md#component-report-source-bugs). ## Component diagnostics Guidance is shown in the Diagnostics tab on each component. These alerts are dismissible and point to the configuration or documentation needed to make your localization process easier for community translators. ![image](screenshots/component-diagnostics.webp) ## Terminology management Post-editing of MT with terminology assignment influences each level of the translation process. The machine translation system can be adapted to the specific vocabulary and style with a continued training or [neural fuzzy repair](https://aclanthology.org/P19-1175.pdf). [Import](https://docs.weblate.org/en/latest/admin/memory.html#imported-translation-memory) your existing translation memory into weblate or create an initial scope with your basic terminology. In the end the lector should be instructed with additional terminology documents to guarantee a good knowledge and output in the field. ## Machine translation The quality of the automatic translation (often measured with the BLEU-score) correlates with editing time [1]. Choose a machine backend which supports the needed languages and domains. Make clear how the translation backend functions and which quality the post-editor has to expect. ## Review translations The translations should be reviewed by a second person after the post-editing. With an impartial and competent reviewer, the two people rule reduces the errors and improves the quality and consistency of the content. Providing reviewers with previews or alpha translations will make for the best review. Screenshots, explanations also help to review the strings in context. ## Structured feedback There are many [Checks and fixups](https://docs.weblate.org/en/latest/user/checks.md) in Weblate that provide structured feedback on the quality of the translations. They also give visual feedback during translation. This prevents recurring mistakes, and helps translators to understand how the code works. ## Translation definition In addition to the mentalistic and impact-based definitions which make a strong reduction, the text-based linguistic approach fits best with the implemented translation methods. A well-formulated theory for translation evaluation is House’s systemic-functional model, which focuses on the relation between original and translation. The model assumes that translation is an attempt to keep the semantic, pragmatic, and textual meaning of a text equivalent when crossing from one linguistic code to another. The degree of quality of a translation is based on the degree of equivalence, the correspondence between the text profile and the text function. Because it cannot be calculated automatically, sufficient information should be collected to enable a uniform human evaluation. The two main parameters of agreement in a corresponding model are the macro-context – i.e. embedding in a larger social and literary context – and the micro-context consisting of field, tenor and mode. ## Sources 1. Marina Sanchez-Torron and Philipp Koehn in Machine Translation Quality and Post-Editor Productivity, Figure 1: [https://www.cs.jhu.edu/~phi/publications/machine-translation-quality.pdf](https://www.cs.jhu.edu/~phi/publications/machine-translation-quality.pdf) 2. Joanna Best und Sylvia Kalina. Übersetzen und Dolmetschen: eine Orientierungshilfe. A. Francke Verlag Tübingen und Base, 2002. Möglichkeiten der Übersetzungskritik starting on page number 101 3. neural fuzzy repair, Bram Bulté and Arda Tezcan in Neural Fuzzy Repair: Integrating Fuzzy Matches into Neural Machine Translation, 2019 [https://aclanthology.org/P19-1175.pdf](https://aclanthology.org/P19-1175.pdf) # devel/gettext.md # Translating software using GNU gettext [GNU gettext](https://www.gnu.org/software/gettext/) is one of the most widely used tool for internationalization of free software. It provides a simple yet flexible way to localize the software. It has great support for plurals, it can add further context to the translated string and there are quite a lot of tools built around it. Of course it has great support in Weblate (see [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) file format description). #### NOTE If you are about to use it in proprietary software, please consult licensing first, it might not be suitable for you. GNU gettext can be used from a variety of languages (C, Python, PHP, Ruby, JavaScript and many more) and usually the UI frameworks already come with some support for it. The standard usage is through the gettext() function call, which is often aliased to \_() to make the code simpler and easier to read. Additionally it provides pgettext() call to provide additional context to translators and ngettext() which can handle plural types as defined for target language. As a widely spread tool, it has many wrappers which make its usage really simple, instead of manual invoking of gettext described below, you might want to try one of them, for example [intltool](https://www.freedesktop.org/wiki/Software/intltool/). ## Workflow overview The GNU gettext uses several files to manage the localization: * `PACKAGE.pot` contains strings extracted from your source code, typically using [xgettext](https://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html) or some high level wrappers such as [intltool](https://www.freedesktop.org/wiki/Software/intltool/). * `LANGUAGE.po` contains strings with a translation to single language. It has to be updated by [msgmerge](https://www.gnu.org/software/gettext/manual/html_node/msgmerge-Invocation.html) once the `PACKAGE.pot` is updated. You can create new language files using [msginit](https://www.gnu.org/software/gettext/manual/html_node/msginit-Invocation.html) or within Weblate. * `LANGUAGE.mo` contains binary representation of `LANGUAGE.po` and is used at application runtime. Typically it is not kept under version control, but generated at compilation time using [msgfmt](https://www.gnu.org/software/gettext/manual/html_node/msgfmt-Invocation.html). In case you want to have it in the version control, you can generate it in Weblate using [Generate MO files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-mo) add-on. Overall the GNU gettext workflow looks like this: #### SEE ALSO [Overview of GNU gettext](https://www.gnu.org/software/gettext/manual/html_node/Overview.html) ## Sample program The simple program in C using gettext might look like following: ```c #include #include #include #include int main(void) { int count = 1; setlocale(LC_ALL, ""); bindtextdomain("hello", "/usr/share/locale"); textdomain("hello"); printf( ngettext( "Orangutan has %d banana.\n", "Orangutan has %d bananas.\n", count ), count ); printf("%s\n", gettext("Thank you for using Weblate.")); exit(0); } ``` ## Extracting translatable strings Once you have code using the gettext calls, you can use [xgettext](https://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html) to extract messages from it and store them into a [.pot](https://www.gnu.org/software/gettext/manual/gettext.html#index-files_002c-_002epot): ```console $ xgettext main.c -o po/hello.pot ``` #### NOTE There are alternative programs to extract strings from the code, for example [pybabel](https://babel.pocoo.org/). This creates a template file, which you can use for starting new translations (using [msginit](https://www.gnu.org/software/gettext/manual/html_node/msginit-Invocation.html)) or updating existing ones after code change (you would use [msgmerge](https://www.gnu.org/software/gettext/manual/html_node/msgmerge-Invocation.html) for that). The resulting file is simply a structured text file: ```po # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-10-23 11:02+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: main.c:14 #, c-format msgid "Orangutan has %d banana.\n" msgid_plural "Orangutan has %d bananas.\n" msgstr[0] "" msgstr[1] "" #: main.c:20 msgid "Thank you for using Weblate." msgstr "" ``` Each `msgid` line defines a string to translate, the special empty string in the beginning is the file header containing metadata about the translation. ## Starting new translation With the template in place, we can start our first translation: ```console $ msginit -i po/hello.pot -l cs --no-translator -o po/cs.po Created cs.po. ``` The just created `cs.po` already has some information filled in. Most importantly it got the proper plural forms definition for chosen language and you can see number of plurals have changed according to that: ```po # Czech translations for PACKAGE package. # Copyright (C) 2015 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2015. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-10-23 11:02+0200\n" "PO-Revision-Date: 2015-10-23 11:02+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: main.c:14 #, c-format msgid "Orangutan has %d banana.\n" msgid_plural "Orangutan has %d bananas.\n" msgstr[0] "" msgstr[1] "" msgstr[2] "" #: main.c:20 msgid "Thank you for using Weblate." msgstr "" ``` This file is compiled into an optimized binary form, the [.mo](https://www.gnu.org/software/gettext/manual/gettext.html#MO-Files) file used by the [GNU gettext](https://www.gnu.org/software/gettext/) functions at runtime. ## Updating strings Once you add more strings or change some strings in your program, you execute again [xgettext](https://www.gnu.org/software/gettext/manual/html_node/xgettext-Invocation.html) which regenerates the template file: ```console $ xgettext main.c -o po/hello.pot ``` Then you can update individual translation files to match newly created templates (this includes reordering the strings to match new template): ```console $ msgmerge --previous --update po/cs.po po/hello.pot ``` #### NOTE When using Weblate, you typically don’t need to run msgmerge manually. Weblate can handle this automatically through the [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) add-on, or you can upload the updated POT file using the Update source strings upload method. See [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) for details. ## Importing to Weblate To import such translation into Weblate, all you need to define are the following fields when creating component (see [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for detailed description of the fields): | Field | Value | |-------------------------------|---------------------------------------------| | Source code repository | URL of the VCS repository with your project | | File mask | `po/*.po` | | Template for new translations | `po/hello.pot` | | File format | Choose gettext PO file | | New language | Choose Create new language file | And that’s it, you’re now ready to start translating your software! #### SEE ALSO You can find a gettext example with many languages in the Weblate Hello project on GitHub: <[https://github.com/WeblateOrg/hello](https://github.com/WeblateOrg/hello)>. # devel/html.md # Translating HTML and JavaScript using Weblate CDN Starting with Weblate 4.2 it is possible to export JavaScript and HTML localization to a CDN using [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) add-on. To publish translation files without the JavaScript loader, use [Translation files CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-files). #### NOTE This feature is configured on Hosted Weblate. It requires additional configuration on your installation, see [`LOCALIZE_CDN_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_URL) and [`LOCALIZE_CDN_PATH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LOCALIZE_CDN_PATH). See also [Localization CDN](https://docs.weblate.org/en/latest/admin/optionals.md#cdn-server-security). Upon installation into your component the JavaScript localization add-on will push committed translations (see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit)) to the CDN and these can be used in your web pages to localize them. ## Creating component First, you need to create a monolingual component which will hold your strings, see [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects) for generic instructions on that. In case you have existing repository to start with (for example the one containing HTML files), create an empty JSON file in the repository for the source language (see [Source language](https://docs.weblate.org/en/latest/admin/projects.md#component-source-language)), for example `locales/en.json`. The content should be `{}` to indicate an empty object. Once you have that, the repository can be imported into Weblate and you can start with an add-on configuration. #### HINT In case you have existing translations, you can place them into the language JSON files and those will be used in Weblate. For those who do not want to use existing repository (or do not have one), choose Start from scratch when creating component and choose JSON file as a file format (it is okay to choose any monolingual format at this point). ## Configuring Weblate CDN add-on The [JavaScript localization CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-cdnjs) add-on provides few configuration options. Translation threshold : Translations translated above this threshold will be included in the CDN. CSS selector : Configures which strings from the HTML documents are translatable, see [String extraction for Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#cdn-addon-extract) and [HTML localization using Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#cdn-addon-html). Language cookie name : Name of cookie which contains user selected language. Used in the JavaScript snippet for [HTML localization using Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#cdn-addon-html). Extract strings from HTML files : List of files in the repository or URLs where Weblate will look for translatable strings and offer them for a translation, see [String extraction for Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md#cdn-addon-extract). ## String extraction for Weblate CDN The translation strings have to be present in Weblate. You can either manage these manually, use API to create them or list files or URLs using Extract strings from HTML files and Weblate will extract them automatically. The files have to present in the repository or contain remote URLs which will be download and parsed regularly by Weblate. Remote URLs are restricted by [`ALLOWED_ASSET_DOMAINS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ALLOWED_ASSET_DOMAINS), including any redirect targets. The default configuration for CSS selector extracts elements with CSS class `l10n`, for example it would extract two strings from following snippets: ```html

Maintenance in progress

We're sorry, but this site is currently down for maintenance.

``` In case you don’t want to modify existing code, you can also use `*` as a selector to process all elements. #### NOTE Right now, only text of the elements is extracted. This add-on doesn’t support localization of element attributes or elements with children. ## HTML localization using Weblate CDN To localize an HTML document, you need to load the `weblate.js` script: ```html ``` Upon loading, this will automatically find all matching translatable elements (based on CSS selector configuration) and replace their text with a translation. The user language is detected from the configured cookie and falls back to user preferred languages configured in the browser. The Language cookie name can be useful for integration with other applications (for example choose `django_language` when using Django). ## JavaScript localization The individual translations are exposed as bilingual JSON files under the CDN. To fetch one you can use following code: ```javascript fetch(("https://weblate-cdn.com/a5ba5dc29f39498aa734528a54b50d0a/cs.json") .then(response => response.json()) .then(data => console.log(data)); ``` The actual localization logic needs to be implemented in this case. ## Publishing translation files The [Translation files CDN](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cdn-files) add-on publishes translation files directly to the CDN. It does not generate a JavaScript loader or convert translations into bilingual JSON. Single-file translations are named using the language code and original file extension, for example `cs.json` or `de.po`. Multi-file translations are served below the language code using paths relative to the translation directory. Monolingual components include the source language file, while bilingual components publish only target-language files. See [Localization CDN](https://docs.weblate.org/en/latest/admin/optionals.md#cdn-server-security) for secure server setup. # devel/integration.md # Integrating with Weblate ## Weblate basics ### Project and component structure In Weblate translations are organized into projects and components. Each project can contain number of components and those contain translations into individual languages. The component corresponds to one translatable file (for example [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) or [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource)). The projects are there to help you organize component into logical sets (for example to group all translations used within one application). Additionally, components within projects can be structured using categories. Components can belong to a category, and categories can be nested. Internally, each project has translations to common strings propagated across other components within it by default. This lightens the burden of repetitive and multi version translation. The translation propagation can be disabled per [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) using [Allow translation propagation](https://docs.weblate.org/en/latest/admin/projects.md#component-allow-translation-propagation) in case the translations should diverge. ### Repository integration Weblate is built to integrate with upstream version control repository, [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md) describes building blocks and how the changes flow between them. #### SEE ALSO [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture) describes how Weblate works internally. ### User attribution Weblate keeps the translations properly authored by translators in the version control repository by using name and e-mail. Having a real e-mail attached to the commit follows the distributed version control spirits and allows services like GitHub to associate your contributions done in Weblate with your GitHub profile. This feature also brings in risk of misusing e-mail published in the version control commits. Moreover, once such a commit is published on public hosting (such as GitHub), there is effectively no way to redact it. Weblate allows choosing a private commit e-mail in [Account](https://docs.weblate.org/en/latest/user/profile.md#profile-account) to avoid this. Therefore, admins should consider this while configuring Weblate: * Such a usage of e-mail should be clearly described in service terms in case such document is needed. [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) can help with that. * [`PRIVATE_COMMIT_EMAIL_OPT_IN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_OPT_IN) can make e-mails private by default. ## Importing a localization project into Weblate Weblate has been developed with VCS integration in mind as it’s core feature, so the easiest way is to grant Weblate the access to your repository. The import process will guide you through configuring your translations into Weblate components. Alternatively, you can let Weblate set up a local-only repository containing all the translations without integration. #### SEE ALSO * [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects) * [How can I limit Weblate access to only translations, without exposing source code to it?](https://docs.weblate.org/en/latest/faq.md#faq-submodule) ## Fetching updated translations from Weblate Weblate stores updated strings in a database and commits them to a local version-control repository. You can add a Weblate repository (when [Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter) is turned on) as an additional remote repository and fetch translation updates from it. Prior to this, you might want to commit any pending local changes made in Weblate (see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit)). This can be done from the user interface (in the Repository maintenance), or from the command-line using [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc). Pushing changes can be automated if you grant Weblate push access to your repository and configure [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) in the [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component), see [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options). Alternatively, use [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md) to update translations so that they match the latest version from the upstream in your remote VCS repository. #### SEE ALSO * [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md#continuous-translation) * [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options) * [Accessing repositories](https://docs.weblate.org/en/latest/vcs.md#vcs-repos) ## Fetching remote changes into Weblate To fetch any strings recently updated in your remote VCS repository into Weblate, allow Weblate to pull from the upstream repository. This can be achieved in the user interface (in the Repository maintenance), or from the command-line using [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc). This can be automated by setting a webhook in your repository to trigger Weblate whenever there is a new commit. See [Updating repositories](https://docs.weblate.org/en/latest/admin/continuous.md#update-vcs) for more details. If not using VCS integration, you can use the UI or [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md) to update the translations so that they match your codebase. #### SEE ALSO * [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md#continuous-translation) * [Accessing repositories](https://docs.weblate.org/en/latest/vcs.md#vcs-repos) ## Monitoring translation progress Use the project metrics endpoint to track translation progress from external integrations. It returns statistics for all visible components and languages in a single request and supports JSON, CSV, and OpenMetrics formats. The OpenMetrics representation can be scraped by Prometheus-compatible monitoring systems without polling the statistics endpoint for each translation. #### SEE ALSO * [`GET /api/projects/(string:project)/metrics/`](https://docs.weblate.org/en/latest/api.md#get--api-projects-(string-project)-metrics-) * [Statistics](https://docs.weblate.org/en/latest/api.md#api-statistics) ## Adding new strings If your translation files are stored in a remote VCS together with the code, you most likely have an existing workflow for developers to introduce new strings. Any way of adding strings will be picked up, but consider using [Quality gateway for the source strings](https://docs.weblate.org/en/latest/workflows.md#source-quality-gateway) to avoid introducing errors. When translation files are separated from the code, the following ways can introduce new strings into Weblate. * Manually, using Add new translation string from Operations menu in the source language. You can choose between the radio buttons Singular and Plural inside the form. Select the appropriate form of the new translation string to be added. * Programmatically, using the API [`POST /api/translations/(string:project)/(string:component)/(string:language)/units/`](https://docs.weblate.org/en/latest/api.md#post--api-translations-(string-project)-(string-component)-(string-language)-units-). * By uploading source file as Replace existing translation file (this overwrites existing strings, so please ensure the file includes both old and new strings) or Add new strings, see [Import methods](https://docs.weblate.org/en/latest/user/files.md#upload-method). #### NOTE The ability to add strings in Weblate requires [Manage strings](https://docs.weblate.org/en/latest/admin/projects.md#component-manage-units). ## Updating target-language files For monolingual files (see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats)), Weblate might add new translation strings present in the [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template), and not in actual translations. It does not however perform any automatic cleanup of stale strings, as that might have unexpected results. If you still want to do this, please install the [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) add-on, which handles cleanup according to your requirements. Weblate will also not try to update bilingual files when the source changes, so if you need `po` files to be updated from `pot`, you have two options: * **Automatically with an add-on** (recommended for continuous updates): Install the [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) add-on, which automatically runs **msgmerge** to update all PO files whenever the POT file changes. * **Manually via upload**: Use the Update source strings [Import methods](https://docs.weblate.org/en/latest/user/files.md#upload-method) to upload your POT file, which will merge it with existing translations. #### HINT Source string extraction tools, such as **xgettext** or **lupdate**, need to be executed outside of Weblate. #### SEE ALSO * [Processing repository with scripts](https://docs.weblate.org/en/latest/admin/continuous.md#processing) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) * [Remove blank strings](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-blank) * [Update RESX files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-resx-update) * [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) ## Introducing new strings You can add new strings in Weblate with [Manage strings](https://docs.weblate.org/en/latest/admin/projects.md#component-manage-units) turned on, but it is usually better to introduce new strings together with the code changes that introduced them. Monolingual formats need to be configured so that new strings are added to [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template). This is typically done by developers, as they write the code. You might want to use a review process of those strings using [Quality gateway for the source strings](https://docs.weblate.org/en/latest/workflows.md#source-quality-gateway). Bilingual formats typically extract strings from the source code using some tooling (like **xgettext** or **intltool-update**). Follow your localization framework documentation for instructions how to do that. Once the strings are extracted, there might be an additional step needed to update existing translations, see [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files). #### HINT Automating string extraction is presently out of scope for Weblate. It typically involves executing untrusted code what makes it more suitable for a generic continuous integration than localization-specific platform. You might want to integrate this into your continuous integration pipelines to make new strings automatically appear for translation. Such pipeline should also cover [Avoiding merge conflicts](https://docs.weblate.org/en/latest/admin/continuous.md#avoid-merge-conflicts). #### SEE ALSO * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Translating software using GNU gettext](https://docs.weblate.org/en/latest/devel/gettext.md) * [Translating documentation using Sphinx](https://docs.weblate.org/en/latest/devel/sphinx.md) ## Managing the local VCS repository Weblate stores all translations in its underlying version control repository. It is suggested to be connected to a remote one, but internal-only setup is also possible. The Repository maintenance allows controlling this repository. For a detailed description of the available actions, see [Repository maintenance](https://docs.weblate.org/en/latest/admin/continuous.md#repository-maintenance). #### HINT With [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md), any changes are automatically pushed from the repository, so there is usually no need to manage it manually. ![image](screenshots/component-repository.webp) #### SEE ALSO * [Repository maintenance](https://docs.weblate.org/en/latest/admin/continuous.md#repository-maintenance) * [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md) * [Version control integration](https://docs.weblate.org/en/latest/vcs.md) # devel/migration.md # Migrating to Weblate Are you using a different localization platform and considering switching to Weblate? This guide provides a quick, step-by-step process to help you migrate your translation project from platforms like Transifex, Crowdin, Lokalise, or similar services. Weblate is designed around continuous localization with Git integration at its core, making it ideal for teams that want to keep translations close to their development workflow. #### SEE ALSO * [Starting with internationalization](https://docs.weblate.org/en/latest/devel/starting.md) for choosing the right internationalization framework * [Integrating with Weblate](https://docs.weblate.org/en/latest/devel/integration.md) for detailed integration options * [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md) for setting up automated workflows ## Prerequisites Before starting your migration, ensure you have: **On your localization platform:** * Access to export your translation files * List of translators and their roles/permissions * Understanding of your current workflow (review process, automation, etc.) **For Weblate:** * A Weblate instance (either [Hosted Weblate](https://hosted.weblate.org/) or [self-hosted](https://docs.weblate.org/en/latest/admin/install.md)) * Admin or project creation permissions on your Weblate instance ## Prepare your translation files ### Export translations from your current platform Most localization platforms allow you to export all translations at once: * **Transifex**: Use their CLI tool or download translations from the web interface * **Crowdin**: Export all translations as a ZIP file from project settings * **Lokalise**: Use the bulk export feature * **Phrase**: Download all locales from the project dashboard #### HINT Keep your translation files in the format native to your internationalization framework (PO, XLIFF, JSON, etc.) rather than converting them. Weblate supports [many formats](https://docs.weblate.org/en/latest/formats.md#formats). ### Commit translations to your Git repository #### HINT If you would rather not store translations in an external Git repository, you can skip this step and use the Upload translation files option when creating a component. If your translations aren’t already in Git: 1. Create a Git repository or use your existing project repository 2. Organize translation files following your project structure 3. Commit and push the files to your Git hosting service (GitHub, GitLab, Bitbucket, etc.) ```shell git add locales/ git commit -m "Add translation files for Weblate migration" git push origin main ``` #### SEE ALSO * [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md#continuous-translation) for optimal repository structure * [Version control integration](https://docs.weblate.org/en/latest/vcs.md) for supported version control systems ## Import your project into Weblate ### Create a new project 1. Navigate to your Weblate instance. 2. Click Add new translation project in the **+** menu. 3. Fill in your project details: * **Project name**: Your application or project name * **URL slug**: Short identifier (e.g., `myapp`) * **Project website**: Your project homepage (optional) ![image](screenshots/user-add-project.webp) #### SEE ALSO [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects) for detailed project creation instructions ### Add a component from your Git repository 1. After creating the project, click Add new translation component 2. Select From version control 3. Configure your component: * **Component name**: e.g., “Application strings”, “Website”, “Documentation” * **Repository URL**: Your Git repository URL (HTTPS or SSH) * **Repository branch**: Optional: Specify repository branch (Weblate automatically detects the default branch if not specified) 4. Weblate will automatically detect: * Translation file format * Available languages * Source language 5. Review and confirm the detected settings #### NOTE If your repository contains a Transifex `.tx/config`, Weblate parses it using translation-finder and offers matching component configurations during discovery. This only covers file-related configuration, such as file masks and source files. Other project settings from the previous platform, including workflows, permissions, and language aliases, still need to be configured manually in Weblate. Language aliases are usually not needed because Weblate already recognizes and normalizes common language-code variants while parsing translation files. See [Parsing language codes](https://docs.weblate.org/en/latest/admin/languages.md#language-parsing-codes); configure [Language aliases](https://docs.weblate.org/en/latest/admin/projects.md#project-language-aliases) only if your repository uses codes Weblate cannot map as intended. ![image](screenshots/user-add-component-discovery.webp) #### HINT For repositories with multiple translation components (e.g., separate files for backend, frontend, documentation), create a separate Weblate component for each. You can speed this up using From existing component for shared repositories or [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) to automatically create them. #### SEE ALSO * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for all configuration options * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) for understanding monolingual vs. bilingual formats * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) ## Configure your workflow ### Set up access control Choose your project’s visibility and access level: 1. Go to your project settings: Operations → Settings → Access tab 2. Select the appropriate [access control](https://docs.weblate.org/en/latest/admin/access.md#acl): * **Public**: Open-source projects, anyone can contribute * **Protected**: Visible to all, but only invited users can translate * **Private**: Only invited users can view and translate ![image](screenshots/project-access.webp) #### SEE ALSO [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl) for detailed access control configuration ### Set up continuous localization Enable automatic updates and commits: 1. Configure repository integration: * **Pull changes**: Set up a [webhook](https://docs.weblate.org/en/latest/admin/continuous.md#update-vcs) so Weblate updates when your source code changes * **Push changes**: Configure [Pushing changes from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-push-options) so translations are committed back to your repository 2. Enable automatic actions in component settings: * **Push on commit**: Automatically push translations to your repository * **Commit interval**: Set how often pending translations are committed (e.g., every 24 hours) #### SEE ALSO [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md#continuous-translation) for complete workflow automation ### Configure quality checks and workflows Customize translation quality controls: 1. **Enable checks**: Review [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks) and enable any opt-in quality checks you need. 2. **Set up review workflow**: Enable [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) if you want an approval process. 3. **Add enforced checks**: Configure which quality checks should block translations. ### Optional: Enable add-ons Weblate offers [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md#addons) to automate common tasks: * [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge): Automatically update PO files from POT templates * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic): Remove unused translation strings * [Squash Git commits](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-git-squash): Squash commits before pushing to your repository * [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery): Automatically discover new translation files #### SEE ALSO [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md) for all available add-ons ## Test and verify Before announcing the migration to your translators: 1. **Test the workflow**: * Make a test translation * Verify it appears in your Git repository * Test pulling changes from your repository into Weblate 2. **Import any existing translation memory** (optional): * Use [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) to import previous translations * This helps with consistency and speeds up translation 3. **Configure notifications**: * Set up [Notifications](https://docs.weblate.org/en/latest/user/profile.md#notifications) for translation events * Configure repository [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks) for your Git hosting service #### SEE ALSO [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md) for translation memory management ## Invite and manage users ### Invite translators For **Protected** and **Private** projects: 1. Navigate to Operations → Users in your project 2. Use Add user to invite translators 3. Assign them to appropriate teams: * **Translators**: Can translate strings * **Reviewers**: Can review and approve translations * **Managers**: Can manage project settings For **Public** projects, users can start contributing immediately after signing up. #### TIP Send your translators a welcome message with: * Link to your project on Weblate * Overview of any project-specific terminology or style guides * Information about your review process #### SEE ALSO * [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl) for team management * [Access control](https://docs.weblate.org/en/latest/admin/access.md) for advanced permission configuration ## Next steps After completing the migration: * **Announce to translators**: Let your translation team know about the migration with clear instructions * **Monitor initial usage**: Watch for any issues during the first few days * **Gather feedback**: Ask translators about their experience compared to the previous platform * **Optimize workflow**: Adjust settings based on your team’s needs * **Remove previous platform**: Once the migration is completed, remember to revoke access granted to the previous platform. #### TIP During migration, you can run both platforms in parallel for a transition period to ensure everything works as expected before fully switching over. ## Additional resources * [Integrating with Weblate](https://docs.weblate.org/en/latest/devel/integration.md) - Detailed integration patterns * [Translation workflows](https://docs.weblate.org/en/latest/workflows.md) - Different workflow configurations * [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md) - Automated continuous localization * [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md) - API for automation and integrations * [Translation progress reporting](https://docs.weblate.org/en/latest/devel/reporting.md) - Setting up translation progress reports * [Frequently Asked Questions](https://docs.weblate.org/en/latest/faq.md) - Frequently asked questions #### HINT Join the [Weblate community](https://weblate.org/support/) if you need help during your migration. The community is active and helpful! # devel/mobile.md # Multi-platform localization When translating apps for multiple platforms (e.g., Android and iOS), configure separate components for each platform. The [Translation propagation](https://docs.weblate.org/en/latest/admin/continuous.md#translation-propagation) will help you to keep the strings in sync. Best practices: - Create one component per platform (e.g., MyApp Android, MyApp iOS). - Ensure identical source strings and keys are used across platforms where possible. - Enable [Allow translation propagation](https://docs.weblate.org/en/latest/admin/projects.md#component-allow-translation-propagation) to automatically reuse translations for matching strings. This setup avoids duplicate work and keeps translations consistent across platforms. Translation propagation only reuses matching strings. The source text and context have to be identical. For monolingual formats, the key has to match as well. Propagation does not convert message syntax or semantics, so strings using different placeholder syntaxes, such as `Hello {name}` and `Hello %s`, do not match. When consumers use the same messages but require different runtime representations, consider keeping one canonical localization format and generating consumer-specific resources in the build pipeline. This also allows the generated resources to contain only the strings and languages needed by each consumer. Use separate components when translators need to maintain genuinely different messages. Disable translation propagation for these components, or assign distinct keys or contexts to platform-specific messages, so later edits do not overwrite intentional differences. #### SEE ALSO * [Keeping translations same across components](https://docs.weblate.org/en/latest/admin/continuous.md#translation-consistency) * [Translating special text safely](https://docs.weblate.org/en/latest/user/translating.md#translating-special-text) # devel/reporting.md # Translation progress reporting Reporting features give insight into translation progress over a given period. A summary of contributions to any given component over time is provided. The reporting tool is found in the Insights menu of the dashboard, workspace, project, category, or translation component: ![image](screenshots/reporting.webp) Reports are generated in the background. Weblate shows the generation progress and opens the stored report when it is ready. Previously generated reports remain available on the same page according to [`REPORT_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-REPORT_EXPIRY). #### WARNING The Manage reports permission applies to the complete selected report scope. Reports for a project or category include restricted components, and reports for a workspace include private projects, even when the user can not otherwise access those descendants. Grant this permission only to users trusted with all report data in that scope. Complete workspace reports require two-factor authentication for regular users when any project in the workspace enforces it. Superusers and bot accounts are exempt. ![image](screenshots/report-view.webp) Several reporting tools are available on this page, all of which can produce output in HTML, reStructuredText or JSON. The first two formats are suitable for embedding statistics into existing documentation, while JSON is useful for further processing of the data. You can choose predefined periods or enter a custom date range. In that case, the contributions are counted at midnight – that means that it includes the starting date and excludes the ending date. You can sort the contributors in the output by their join date or the number of strings they have translated, in either ascending or descending order. ## Number of words #### HINT Number of words is a metric widely used in Indo-European languages, but might not have a well-defined behavior for some Asian languages. A word is any sequence of characters (letters, numerics, special characters) between whitespace (spaces, tabs, newlines). In the example string below, the word count is 9. ```text I've just realized that they have 5 %(color)s cats. ``` For plural strings, the number of words is counted as the sum of words for all plural forms. For Chinese, Japanese, or Korean languages, the number of words is the number of CJK characters plus the number of words in non-CJK characters. ## Translator credits Generates a document usable for crediting translators — sorted by language and lists all contributors for a given language: ```rst * Czech * John Doe (5) * Jane Doe (1) * Dutch * Jane Doe (42) ``` #### HINT The number in parenthesis indicates the number of contributions in given period. ## Contributor stats Generates the number of translated words and strings by translator name: ```rst ======================================== ======================================== ======================================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== Name Email Date joined Count total Edits total Source words total Source chars total Target words total Target chars total Count new Edits new Source words new Source chars new Target words new Target chars new Count approved Edits approved Source words approved Source chars approved Target words approved Target chars approved Count edited Edits edited Source words edited Source chars edited Target words edited Target chars edited ======================================== ======================================== ======================================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== John Done john@example.com 2025-03-13T14:08:02.681269+00:00 1 3 24 3 21 1 3 24 3 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Jane Done jane@example.com 2025-03-01T11:00:00.000000+00:00 2 5 25 4 28 2 3 24 3 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ======================================== ======================================== ======================================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ======================== ``` This can be useful if you pay your translators based on the amount of work done; it gives you various stats of translators’ work. By default, repeated changes by the same translator on the same string are counted once for each stats variant in the selected report period. Choose All changes in the counting mode if you need every edit or approval to be counted separately. All stats are available in four variants: Total : Overall number of all edited strings. New : Amount of newly translated strings which didn’t have a translation before. Approved : Amount of strings approved in the review workflow (see [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews)). Edited : Amount of edited strings which had a translation before. The following metrics are available for each: Count : Amount of strings. Edits : Amount of edited characters in the string, measured in Damerau–Levenshtein distance. Source words : Amount of words in the source string. Source characters : Amount of characters in the source string. Target words : Amount of words in the translated string. Target characters : Amount of characters in the translated string. The translator’s join date is also included in the report. Use source-word metrics when comparing work across target languages, because the source text is shared while translated word counts differ by language. ## Cost estimate Estimates translation costs for the selected scope from source-word counts. It classifies strings as repetitions, exact translation memory matches, fuzzy translation memory matches, strings needing editing, or new strings, and then applies the configured rate percentage for each category. The estimate uses Weblate translation memory matches and does not contact external machine translation services. The base rate is the price per source word. Category rates are percentages of that base rate; for example, `50` charges half of the base rate and `0` excludes that category from the total. ## Translator work analysis Estimates realistic daily translator throughput from change history. It reports the median, average, 75th percentile, and 90th percentile for translated strings and source words. Minimum and maximum daily changes and maximum source words can be used to exclude incomplete work days, automated changes, and obvious outliers. # devel/review.md # Reviewing strings ## Activity reports Activity reports check changes of translations, for projects, components or individual users. The activity reports for a project or component are accessible from its dashboard, on the Info tab. ![image](screenshots/activity.webp) More reports are accessible on the Insights tab, selecting Translation reports. The activity of the currently signed in user can be seen by clicking on the user name from the user menu on the top right. ## Source strings checks There are many [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks), some of them focus on improving the quality of source strings. Many failing checks suggest a hint to make source strings easier to translate. All types of failing source checks are displayed on the source language of every component. ## Translation string checks Erroneous failing translation string checks indicate the problem is with the source string. Translators sometimes fix mistakes in the translation instead of reporting it - a typical example is a missing full stop at the end of a sentence. Reviewing all failing checks can provide valuable feedback to improve its source strings. To make source strings review easier, Weblate automatically creates a translation for the source language and shows you source level checks there: ![image](screenshots/source-review.webp) One of the most interesting checks here is the [Multiple failing checks](https://docs.weblate.org/en/latest/user/checks.md#check-multiple-failures) - it is triggered whenever there is failure on multiple translations of a given string. Usually this is something to look for, as this is a string which translators have problems translating properly. The detailed listing is a per language overview: ![image](screenshots/source-review-detail.webp) ## Receiving source string feedback Translators can comment on both translation and source strings. Each [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) can be configured to receive such comments to an e-mail address (see [Source string bug reporting address](https://docs.weblate.org/en/latest/admin/projects.md#component-report-source-bugs)), and using the developers mailing list is usually the best approach. This way you can keep an eye on when problems arise in translation, take care of them, and fix them quickly. #### SEE ALSO [Comments](https://docs.weblate.org/en/latest/user/translating.md#user-comments) # devel/share.md # Building the translation community Weblate provides you content to share on your website or other channels to promote your translation project. A nice welcome page called Engage is available to attract new contributors and provide them basic information about the translation. Additionally, you can share information about the efforts using social networks. All these possibilities can be found on the Community tab: ![image](screenshots/promote.webp) All these badges are provided with a link to simple page which explains users how to translate using Weblate: ![image](screenshots/engage.webp) Status widgets also support categories, including nested categories. Use `/widget///svg-badge.svg` for a category’s overall progress, or `/widget///-//svg-badge.svg` for its progress in one language. For nested categories, include each parent category in the path. Widgets follow the project’s [public sharing setting](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing). Workspace widgets use `/widget/-/workspace//svg-badge.svg` and follow the workspace’s access checks. They show the same aggregate statistics as the workspace page. A project’s public sharing setting does not grant access to its workspace widgets. #### SEE ALSO [`ENABLE_SHARING`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_SHARING) # devel/sphinx.md # Translating documentation using Sphinx [Sphinx](https://www.sphinx-doc.org/) is a tool for creating beautiful documentation. It uses simple reStructuredText syntax and can generate output in many formats. If you’re looking for an example, this documentation is also built using it. The very useful companion for using Sphinx is the [Read the Docs](https://about.readthedocs.com/) service, which will build and publish your documentation for free. I will not focus on writing documentation itself, if you need guidance with that, just follow instructions on the [Sphinx](https://www.sphinx-doc.org/) website. Once you have documentation ready, translating it is quite easy as Sphinx comes with support for this and it is quite nicely covered in their [Internationalization](https://www.sphinx-doc.org/en/master/usage/advanced/intl.html#intl). It’s matter of a few configuration directives and invoking the `sphinx-intl` tool. If you are using Read the Docs service, you can start building translated documentation on Read the Docs. Their [Localization and Internationalization](https://docs.readthedocs.com/platform/latest/localization.html) covers pretty much everything you need - creating another project, setting its language, and linking it from the main project as a translation. Now all you need is translating the documentation content. Sphinx generates PO file for each directory or top-level file, which can lead to quite a lot of files to translate (depending on [`gettext_compact`](https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-gettext_compact) settings). You can import the `index.po` into Weblate as an initial component and then configure [Component discovery](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-discovery-discovery) add-on to automatically discover all others. #### Component configuration | [Component name](https://docs.weblate.org/en/latest/admin/projects.md#component-name) | `Documentation` | |-------------------------------------------------------------------------------------------------|---------------------------------------| | [File mask](https://docs.weblate.org/en/latest/admin/projects.md#component-filemask) | `docs/locales/*/LC_MESSAGES/index.po` | | [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base) | `docs/locales/index.pot` | | [File format](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format) | gettext PO file | | [Translation flags](https://docs.weblate.org/en/latest/admin/projects.md#component-check-flags) | `rst-text` | #### Component discovery configuration | Regular expression to match translation files against | `docs/locales/(?P[^/.]*)/LC_MESSAGES/(?P[^/]*)\.po` | |---------------------------------------------------------|----------------------------------------------------------------------------| | Customize the component name | `Documentation: {{ component|title }}` | | Define the base file for new translations | `docs/locales/{{ component }}.pot` | #### HINT Would you prefer Sphinx to generate just single PO file? Since Sphinx 3.3.0 you can achieve this using: ```python gettext_compact = "docs" ``` You can find several documentation projects being translated using this approach: * [Weblate documentation](https://docs.weblate.org/) (you are reading that now) * [Godot engine documentation](https://docs.godotengine.org/en/stable/) * [Gallette documentation](https://doc.galette.eu/) * [phpMyAdmin documentation](https://docs.phpmyadmin.net/) # devel/starting.md # Starting with internationalization Have a project and want to translate it into several languages? This guide will help you do so. Several typical situations are showcased, but most of the examples are generic and can be applied to other scenarios as well. Before translating any software, you should realize that languages around the world are really different and you should not make any assumption based on your experience. For most of languages it will look weird if you try to concatenate a sentence out of translated segments. You also should properly handle plural forms because many languages have complex rules for that and the internationalization framework you end up using should support this. Last but not least, sometimes it might be necessary to add some context to the translated string. Imagine a translator would get string `Sun` to translate. Without context most people would translate that as our closest star, but it might be actually used as an abbreviation for Sunday. ## Choosing internationalization framework Choose whatever is standard on your platform, try to avoid reinventing the wheel by creating your own framework to handle localizations. Weblate supports most of the widely used frameworks, see [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) for more information (especially [Translation types capabilities](https://docs.weblate.org/en/latest/formats.md#fmt-capabs)). Our personal recommendation for some platforms is in the following table. This is based on our experience, but that can not cover all use cases, so always consider your environment when doing the choice. | Platform | Recommended format | |----------------|--------------------------------------------------------------------------------------------------------------| | Android | [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource) | | iOS | [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md#apple) | | Qt | [Qt Linguist .ts](https://docs.weblate.org/en/latest/formats/qt.md#qtling) | | Python | [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) | | PHP | [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) [1](#php) | | C/C++ | [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) | | C# | [.NET resource files (RESX, RESW)](https://docs.weblate.org/en/latest/formats/resx.md#dotnet) | | Perl | [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) | | Ruby | [Ruby YAML files](https://docs.weblate.org/en/latest/formats/ruby.md#ryaml) | | Web extensions | [WebExtension JSON](https://docs.weblate.org/en/latest/formats/webextension.md#webex) | | Java | [XLIFF 1.1 and 1.2](https://docs.weblate.org/en/latest/formats/xliff.md#xliff) [2](#java) | | JavaScript | [i18next JSON files](https://docs.weblate.org/en/latest/formats/i18next.md#js-i18next) [3](#js) | * **[1]** The native Gettext support in PHP is buggy and often missing on Windows builds, it is recommended to use third party library [motranslator](https://github.com/phpmyadmin/motranslator) instead. * **[2]** You can also use [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop) if plurals are not needed. * **[3]** You can also use plain [JSON files](https://docs.weblate.org/en/latest/formats/json.md#json) if plurals are not needed. The more detailed workflow for some formats is described in following chapters: * [Translating software using GNU gettext](https://docs.weblate.org/en/latest/devel/gettext.md) * [Translating documentation using Sphinx](https://docs.weblate.org/en/latest/devel/sphinx.md) * [Translating HTML and JavaScript using Weblate CDN](https://docs.weblate.org/en/latest/devel/html.md) #### SEE ALSO * [Integrating with Weblate](https://docs.weblate.org/en/latest/devel/integration.md) * [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md#continuous-translation) ## Educating developers for proper internationalization Software internationalization is not just about being able to translate strings but about making the whole software look native to a user from another country. This also includes things like date or number formatting, currency display, or inputting text in the right direction. Most software frameworks have good support for this, so please follow their instructions for all these areas. The string translation might not be a straightforward task as well. This is especially true for short strings like captions or button labels. Different languages have different rules, and it is not reasonable to expect that the same string will always be translated the same. In many situations it also might not be clear how to translate, and it is even challenging to distinguish whether the word is a verb or a noun. All developers should understand this and uniquely identify strings used in different scopes. For example, `None` meaning “no users” might be translated differently from `None` meaning “no items”. Use different keys or contexts to distinguish these terms for translators. You can provide additional context in Weblate, such as [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots) or [Explanation](https://docs.weblate.org/en/latest/admin/translating.md#additional-explanation). The technical side is only part of the work. Translators also notice the project workflow around strings, releases, and communication. A few practices make collaboration much easier: * Respond to translator questions and comments, and make sure the advertised contact channel is actually monitored. * Avoid unnecessary churn in source strings. Rewording or replacing existing strings without a user-visible reason creates avoidable translation work. * Add enough context for translators to understand short or ambiguous strings. Avoid concatenating sentences from fragments, use placeholders that can be reordered, and rely on built-in plural handling. * Ship translations regularly so completed work does not stay unused in Weblate for long periods. * Communicate workflow or policy changes, and keep contribution requirements realistic for smaller language teams. * If a project is no longer maintained, reflect that in the translation workflow instead of leaving components open indefinitely. Weblate can help with some of these issues. In particular, regular automatic commits from Weblate make translation progress visible in the source code history and reduce the risk that finished work is forgotten before a release. See [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md#continuous-translation) for automation options. #### SEE ALSO * [Translation context](https://docs.weblate.org/en/latest/user/translating.md#source-context) # devel/success-stories.md # Success stories #### TIP Have you written about your experience with Weblate — a blog post, case study, or article about your translation journey? We’d love to feature it here! Add a link to your story and help others discover how Weblate is used in real projects around the world. * [Global Grist: How ANCT and the open-source community helped translate Grist into 20+ languages](https://www.getgrist.com/blog/how-anct-and-the-open-source-community-helped-translate-grist-into-20-languages/) * [Translating Open Source Software with Weblate: A GRASS GIS Case Study](https://neteler.org/blog/translating-with-weblate/) # devel/third-party.md # Localization libraries and packages Weblate can be integrated into your framework using [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md). This page lists third-party libraries which integrate Weblate. * [Weblate Translation Provider for Symfony Translation](https://github.com/m2mtech/weblate-translation-provider/) * [Weblate plugin for Figma](https://www.figma.com/community/plugin/1053050985172660071/weblate-integration) * [WeblateFX, a JavaFX-based Weblate desktop client](https://github.com/javierllorente/weblatefx) * [JWeblate, a Java-based Weblate library](https://github.com/javierllorente/jweblate) * [Spring MessageSource backed by a Weblate server](https://github.com/porscheinformatik/weblate-spring) * [GoLang API library for weblate](https://gitlab.com/gajdusek/goweblate) * [Perceval backends for Weblate](https://github.com/chaoss/grimoirelab-perceval-weblate) * [Visual Studio Code Extension for Weblate](https://github.com/ianFar96/vscode-weblate-extension) * [Unofficial Weblate SDK for Flutter](https://pub.dev/packages/weblate_sdk) #### HINT Are you building a Weblate integration for your framework? Get listed here! Either submit a pull request with the changes directly or write us at [care@weblate.org](mailto:care@weblate.org) to get listed. # devel/translations.md # Managing translations ## Adding new strings New strings can be made available for translation when they appear in the base file, called [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base) (see [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component)). If your file format doesn’t require such a file, as is the case with most monolingual translation flows, you can start with empty files. Weblate can add new strings to existing files for most of the file formats. You can also specify Context for bilingual formats to distinguish same strings used in different context. Auto-adjust context when an identical string already exists. can be used to automatically adjust Context by adding a numeric suffix in case such a string already exist in the translation. #### SEE ALSO [Context](https://docs.weblate.org/en/latest/formats.md#format-context) ## Adding new translations New languages can be added right away when requested by a user in Weblate, or a notification will be sent to project admins for approval and manual addition. This can be done using [Adding new translation](https://docs.weblate.org/en/latest/admin/projects.md#component-new-lang) in [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component). Some formats expect to start with an empty file and only translated strings to be included (for example [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource)), while others expect to have all keys present (for example [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext)). The document-based formats (for example [OpenDocument Format](https://docs.weblate.org/en/latest/formats/odf.md#odf)) start with a copy of the source document and all strings marked as needing editing. In some situations this really doesn’t depend on the format, but rather on the framework you use to handle the translation (for example with [JSON files](https://docs.weblate.org/en/latest/formats/json.md#json)). When you specify [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base) in [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component), Weblate uses this file to start new translations. Any existing translations is removed from the file when doing so. When [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base) is empty and the file format supports it, an empty file is created where new strings are added once they are translated. The [Language code style](https://docs.weblate.org/en/latest/admin/projects.md#component-language-code-style) allows you to customize language code used in generated filenames. Additionally, any mappings defined in [Language aliases](https://docs.weblate.org/en/latest/admin/projects.md#project-language-aliases) are applied in reverse. #### SEE ALSO * [Adding new translation](https://docs.weblate.org/en/latest/admin/projects.md#component-new-lang) * [Template for new translations](https://docs.weblate.org/en/latest/admin/projects.md#component-new-base) * [Language code style](https://docs.weblate.org/en/latest/admin/projects.md#component-language-code-style) * [Language code](https://docs.weblate.org/en/latest/admin/languages.md#language-code) * [Language aliases](https://docs.weblate.org/en/latest/admin/projects.md#project-language-aliases) * [Parsing language codes](https://docs.weblate.org/en/latest/admin/languages.md#language-parsing-codes) #### NOTE If you add a language file in connected remote repository, respective translation is added to the component when Weblate updates local repository. More info on the repository update settings can be found on the [Updating repositories](https://docs.weblate.org/en/latest/admin/continuous.md#update-vcs). ## Removing existing translations Languages, components, or the projects they are in, can be removed (deleted from Weblate and remote repository if used) from the menu Operations ↓ Removal of each project, component, or language. Initiating the Removal action shows the list of components to be removed. You have to enter the object’s slug to confirm the removal. The slug is the project’s, language’s, or component’s pathname as it can be seen in the URL. If you want to remove just some specific strings, there are following ways: - Manually in the source file. They will be removed from the translation project as well upon Weblate’s repository update. #### Versionadded Added in version 4.5. - In Weblate’s UI via button Operations ↓ Remove while editing the string. This has differences between file formats, see: [Manage strings](https://docs.weblate.org/en/latest/admin/projects.md#component-manage-units) #### NOTE If you delete a language file in connected remote repository, respective translation will be removed from the component when Weblate updates local repository. More info on the repository update settings can be found on the [Updating repositories](https://docs.weblate.org/en/latest/admin/continuous.md#update-vcs). ## String variants Variants are useful to group several strings together so that translators can see all variants of the string at one place. #### HINT Abbreviations (shortened forms, contractions) are a good example of variants. ### Automated key based variants You can define regular expression to group the strings based on the key of monolingual translations in the [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component): ![image](screenshots/variants-settings.webp) In case the Key matches the expression, the matching part is removed to generate root key of the variant. Then all the strings with the same root key become part of a single variant group, also including the string with the key exactly matching the root key. The following table lists some usage examples: | Use case | Regular expression variant | Matched translation keys | |-----------------------|------------------------------|----------------------------------------| | Suffix identification | `(Short|Min)$` | `monthShort`, `monthMin`, `month` | | Inline identification | `#[SML]` | `dial#S.key`, `dial#M.key`, `dial.key` | ### Manual variants #### Versionadded Added in version 4.5. You can manually link specific strings using `variant:SOURCE` flag. This can be useful for bilingual translations which do not have keys to group strings automatically, or to group strings which keys are not matching, but should be considered together when translating. The additional variant for a string can also be added using the Tools while translating (when [Manage strings](https://docs.weblate.org/en/latest/admin/projects.md#component-manage-units) is turned on): ![image](screenshots/glossary-tools.webp) #### NOTE The variant source string has to be at most 768 characters long. #### SEE ALSO * [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) * [Variants](https://docs.weblate.org/en/latest/user/glossary.md#glossary-variants) ### Variants while translating The variant is later grouped when translating: ![image](screenshots/variants-translate.webp) ## String labels Split component translation strings into categories by text and colour in the project configuration. ![image](screenshots/labels.webp) #### HINT Labels can be assigned to units in [Additional info on source strings](https://docs.weblate.org/en/latest/admin/translating.md#additional) by bulk editing, or using the [Bulk edit](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-flags-bulk) add-on. # faq.md # Frequently Asked Questions ## Configuration ### How do I restrict which languages can be translated? To prevent users from starting new translations across a project, open the project settings, select Workflow, and set Adding new translation to Disable adding new translations. Ensure that the project’s categories and components inherit this setting; see [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings). Project admins can still add translations when Weblate can create the files. To allow only selected language codes, configure [Language filter](https://docs.weblate.org/en/latest/admin/projects.md#component-language-regex) on each component. This filters translation files rather than controlling who can edit existing translations. See [Limiting translation languages](https://docs.weblate.org/en/latest/workflows.md#workflow-language-restrictions) for the available controls. If unexpected languages appear in a glossary, check [Language files and synchronization](https://docs.weblate.org/en/latest/user/glossary.md#glossary-language-sync): Weblate automatically adds glossary languages for languages used in the project. ### How to create an automated workflow? Weblate can handle all the translation things semi-automatically for you. If you give it push access to your repository, the translations can happen without interaction, unless some merge conflict occurs. 1. Set up your Git repository to tell Weblate when there is any change, see [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks) for info on how to do it. 2. Set a push URL at your [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) in Weblate, this allows Weblate to push changes to your repository. 3. Turn on [Push on commit](https://docs.weblate.org/en/latest/admin/projects.md#component-push-on-commit) on your [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) in Weblate, this will make Weblate push changes to your repository whenever they happen at Weblate. #### SEE ALSO * [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md#continuous-translation) * [Avoiding merge conflicts](https://docs.weblate.org/en/latest/admin/continuous.md#avoid-merge-conflicts) ### How to access repositories over SSH? Please see [Accessing repositories](https://docs.weblate.org/en/latest/vcs.md#vcs-repos) for info on setting up SSH keys. ### How to fix merge conflicts in translations? Merge conflicts happen from time to time when the translation file is changed in both Weblate and the upstream repository concurrently. You can usually avoid this by merging Weblate translations prior to making changes in the translation files (e.g. before running msgmerge). Just tell Weblate to commit all pending translations (you can do it in Repository maintenance in the Operations menu) and merge the repository (if automatic push is not on). If you’ve already encountered a merge conflict, the easiest way to solve all conflicts locally on your machine, is to add Weblate as a remote repository, merge it into upstream and fix any conflicts. Once you push changes back, Weblate will be able to use the merged version without any other special actions. #### NOTE If you resolve the conflict in a pull request, merge it with a regular merge commit. Do not squash merge it. Squash merging creates a new commit instead of preserving the Weblate commits, so Weblate might not recognize that its local commits are already included upstream and might need a repository reset to recover. #### NOTE Weblate uses shallow clones by default to reduce cloning time and disk usage. Because of this, the workflow below works best when you start from an up-to-date checkout of the upstream repository. If you clone directly from the exported Weblate repository, or if your upstream checkout is missing recent commits, `git remote update weblate` can fail with errors such as `warning: no common commits`, `bad revision`, or missing objects. This does not necessarily mean that Weblate and the upstream repository have conflicting changes. Administrators who want to make this workflow more reliable can adjust [`VCS_CLONE_DEPTH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_CLONE_DEPTH). #### NOTE Depending on your setup, access to the Weblate repository might require authentication. When using the built-in [Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter) in Weblate, you authenticate with your username and the API key. #### NOTE Weblate serves the Git repository itself, but it does not serve Git LFS objects. See [Git LFS](https://docs.weblate.org/en/latest/vcs.md#git-lfs) for supported behavior. Clone repositories using Git LFS from the upstream repository and add Weblate as another remote. If you only need Git-tracked files, you can clone from Weblate with `GIT_LFS_SKIP_SMUDGE=1` to skip downloading Git LFS objects. The workflow usually looks like this when you start from an up-to-date checkout of the upstream repository: ```sh # Open an existing up-to-date checkout of the upstream repository or perform # a fresh one: git clone UPSTREAM_REPOSITORY_URL cd REPO # Commit all pending changes in Weblate, you can do this in the UI as well: wlc commit # Lock the translation in Weblate, again this can be done in the UI as well: wlc lock # Add Weblate as remote: git remote add weblate https://hosted.weblate.org/git/project/component/ # You might need to include credentials in some cases: git remote add weblate https://username:APIKEY@hosted.weblate.org/git/project/component/ # Update weblate remote: git remote update weblate # Merge Weblate changes: git merge weblate/main # Resolve conflicts: edit … git add … … git commit # Rebase changes (if Weblate is configured to do rebases) git rebase origin/main # Push changes to upstream repository, Weblate will fetch merge from there: git push # Open Weblate for translation: wlc unlock ``` If you’re using multiple branches in Weblate, you can do the same to all of them: ```sh # Add and update Weblate remotes git remote add weblate-one https://hosted.weblate.org/git/project/one/ git remote add weblate-second https://hosted.weblate.org/git/project/second/ git remote update weblate-one weblate-second # Merge QA_4_7 branch: git checkout QA_4_7 git merge weblate-one/QA_4_7 ... # Resolve conflicts git commit # Merge main branch: git checkout main git merge weblates-second/main ... # Resolve conflicts git commit # Push changes to the upstream repository, Weblate will fetch the merge from there: git push ``` In case of gettext PO files, there is a way to merge conflicts in a semi-automatic way: Fetch and keep a local clone of the Weblate Git repository. Also get a second fresh local clone of the upstream Git repository (i. e. you need two copies of the upstream Git repository: An intact and a working copy): ```sh # Add remote: git remote add weblate /path/to/weblate/snapshot/ # Update Weblate remote: git remote update weblate # Merge Weblate changes: git merge weblate/main # Resolve conflicts in the PO files: for PO in `find . -name '*.po'` ; do msgcat --use-first /path/to/weblate/snapshot/$PO\ /path/to/upstream/snapshot/$PO -o $PO.merge msgmerge --previous --lang=${PO%.po} $PO.merge domain.pot -o $PO rm $PO.merge git add $PO done git commit # Push changes to the upstream repository, Weblate will fetch merge from there: git push ``` #### SEE ALSO * [How to export the Git repository that Weblate uses?](https://docs.weblate.org/en/latest/faq.md#git-export) * [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md#continuous-translation) * [Avoiding merge conflicts](https://docs.weblate.org/en/latest/admin/continuous.md#avoid-merge-conflicts) * [Weblate Client](https://docs.weblate.org/en/latest/wlc.md#wlc) ### How do I translate several branches at once? Weblate supports pushing translation changes within one [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project). For every [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) which has it turned on (the default behavior), the change made is automatically propagated to others. This way translations are kept synchronized even if the branches themselves have already diverged quite a lot, and it is not possible to simply merge translation changes between them. Once you merge changes from Weblate, you might have to merge these branches (depending on your development workflow) discarding differences: ```sh git merge -s ours origin/maintenance ``` #### SEE ALSO [Keeping translations same across components](https://docs.weblate.org/en/latest/admin/continuous.md#translation-consistency) ### How to translate multi-platform projects? Weblate supports a wide range of file formats (see [Localization file formats](https://docs.weblate.org/en/latest/formats.md)) and the easiest approach is to use the native format for each platform. Once you have added all platform translation files as components in one project (see [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects)), you can utilize the translation propagation feature (turned on by default, and can be turned off in the [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component)) to translate strings for all platforms at once. #### SEE ALSO [Keeping translations same across components](https://docs.weblate.org/en/latest/admin/continuous.md#translation-consistency) ### How to export the Git repository that Weblate uses? There is nothing special about the repository, it lives under the [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) directory and is named `vcs///`. If you have SSH access to this machine, you can use the repository directly. For anonymous access, you might want to run a Git server and let it serve the repository to the outside world. Alternatively, you can use [Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter) inside Weblate to automate this. ### What are the options for pushing changes back upstream? This heavily depends on your setup, Weblate is quite flexible in this area. Here are examples of some workflows used with Weblate: - Weblate automatically pushes and merges changes (see [How to create an automated workflow?](https://docs.weblate.org/en/latest/faq.md#auto-workflow)). - You manually tell Weblate to push (it needs push access to the upstream repository). - Somebody manually merges changes from the Weblate git repository into the upstream repository. - Somebody rewrites history produced by Weblate (e.g. by eliminating merge commits), merges changes, and tells Weblate to reset the content in the upstream repository. Of course you are free to mix all of these as you wish. ### How can I limit Weblate access to only translations, without exposing source code to it? You can use [git submodule](https://git-scm.com/docs/git-submodule) for separating translations from source code while still having them under version control. 1. Create a repository with your translation files. 2. Add this as a submodule to your code: ```sh git submodule add git@example.com:project-translations.git path/to/translations ``` 3. Link Weblate to this repository, it no longer needs access to the repository containing your source code. 4. You can update the main repository with translations from Weblate by: ```sh git submodule update --remote path/to/translations ``` Weblate should be linked to the translation repository directly. It does not populate submodules when cloning a parent repository, so translation files inside a submodule are not available through the parent repository. See [Git submodules](https://docs.weblate.org/en/latest/vcs.md#git-submodules). Please consult the [git submodule](https://git-scm.com/docs/git-submodule) documentation for more details. ### How can I check whether my Weblate is set up properly? Weblate includes a set of configuration checks which you can see in the admin interface, just follow the Performance report link in the admin interface, or open the `/manage/performance/` URL directly. #### SEE ALSO * [Monitoring Weblate](https://docs.weblate.org/en/latest/admin/install.md#monitoring) * [Monitoring Celery status](https://docs.weblate.org/en/latest/admin/install.md#monitoring-celery) ### Why are all commits committed by Weblate <[noreply@weblate.org](mailto:noreply@weblate.org)>? Weblate uses `Weblate ` as the default **committer** for all commits, which is configured by [`DEFAULT_COMMITER_EMAIL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_COMMITER_EMAIL) and [`DEFAULT_COMMITER_NAME`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_COMMITER_NAME). This is a technical identifier showing that the commit was processed through Weblate. However, the **author** of each commit is correctly recorded as the individual user who made the translation (when using Git). This means you can see who actually translated each string by examining the commit author field. The same applies to Mercurial; only Subversion does not have this capability. #### NOTE In Git, there is a distinction between the committer (who created the commit object) and the author (who made the changes). Weblate acts as the committer while preserving individual translator attribution as authors. For commits where authorship cannot be determined (such as automated changes from anonymous suggestions or machine translation results), the author is set to the anonymous user. You can configure the anonymous user’s name and e-mail in [`ANONYMOUS_USER_NAME`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ANONYMOUS_USER_NAME). #### SEE ALSO [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) ### How to move files in the repository without losing history in Weblate? To keep the history, comments, or screenshots linked to strings after changing the files location you need to ensure that these strings are never deleted in Weblate. These removals can happen in case the Weblate repository is updated, but the component configuration still points to the old files. This makes Weblate assume that it should delete all the translations. The solution to this is to perform the operation in sync with Weblate: 1. Lock the affected component in Weblate. 2. Commit any pending changes and merge them into the upstream repository. 3. Disable receiving webhooks the [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project); this prevents Weblate from immediately seeing changes in the repository. 4. Do any needed changes in the repo (for example using **git mv**), push them to the upstream repository. 5. Change the [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) to match the new setup; upon changing configuration, Weblate will fetch the updated repository and notice the changed locations while keeping existing strings. 6. Unlock the component and re-enable hooks in the project configuration. #### HINT [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) might be useful to perform prior to such disrupting changes. ## Usage ### How do I review the translations of others? - There are several review based workflows available in Weblate, see [Translation workflows](https://docs.weblate.org/en/latest/workflows.md#workflows). - You can subscribe to any changes made in [Notifications](https://docs.weblate.org/en/latest/user/profile.md#notifications) and then check others contributions as they come in by e-mail. - There is a review tool available at the bottom of the translation view, where you can choose to browse translations made by others since a given date. #### SEE ALSO [Translation workflows](https://docs.weblate.org/en/latest/workflows.md#workflows) ### How do I provide feedback on a source string? On context tabs below translation, you can use the Comments tab to provide feedback on a source string, or discuss it with other translators. #### SEE ALSO * [Receiving source string feedback](https://docs.weblate.org/en/latest/devel/review.md#report-source) * [Comments](https://docs.weblate.org/en/latest/user/translating.md#user-comments) ### How can I use existing translations while translating? - All translations within Weblate can be used thanks to shared translation memory. - You can import existing translation memory files into Weblate. - Use the import functionality to load compendium as translations, suggestions or translations needing review. This is the best approach for a one-time translation using a compendium or a similar translation database. - You can set up [tmserver](https://docs.weblate.org/en/latest/admin/machine.md#mt-tmserver) with all databases you have and let Weblate use it. This is good when you want to use it several times during translation. - Another option is to translate all related projects in a single Weblate instance, which will make it automatically pick up translations from other projects as well. #### SEE ALSO * [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup) * [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) * [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#memory) ### Does Weblate update translation files besides translations? Weblate tries to limit changes in translation files to a minimum. For some file formats it might unfortunately lead to reformatting the file. If you want to keep the file formatted your way, please use a pre-commit hook for that. #### SEE ALSO [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) ### How do I merge updated POT file with PO translations? See [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) for information on updating PO files when the POT template changes. ### Where do language definitions come from and how can I add my own? The basic set of language definitions is included within Weblate and Translate-toolkit. This covers more than 150 languages and includes info about plural forms or text direction. You are free to define your own languages in the administrative interface, you just need to provide info about it. #### SEE ALSO [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) ### Can Weblate highlight changes in a fuzzy string? Weblate supports this, however it needs the data to show the difference. For Gettext PO files, you have to pass the parameter `--previous` to **msgmerge** when updating PO files, for example: ```sh msgmerge --previous -U po/cs.po po/phpmyadmin.pot ``` For monolingual translations, Weblate can find the previous string by ID, so it shows the differences automatically. ### Why does Weblate still show old translation strings when I’ve updated the template? Weblate does not try to manipulate the translation files in any way other than allowing translators to translate. So it also does not update the translatable files when the template or source code have been changed. You simply have to do this manually and push changes to the repository, Weblate will then pick up the changes automatically. #### NOTE It is usually a good idea to merge changes done in Weblate before updating translation files, as otherwise you will usually end up with some conflicts to merge. #### SEE ALSO * [Introducing new strings](https://docs.weblate.org/en/latest/devel/integration.md#translations-update) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Translating software using GNU gettext](https://docs.weblate.org/en/latest/devel/gettext.md) * [Translating documentation using Sphinx](https://docs.weblate.org/en/latest/devel/sphinx.md) ### How to handle renaming translation files? When renaming files in the repository, it can happen that Weblate sees this as removal and adding of the files. This can lead to losing strings history, comments and suggestions. To avoid that, perform renaming in following steps: 1. Lock the translation component in [Managing the local VCS repository](https://docs.weblate.org/en/latest/devel/integration.md#manage-vcs). 2. Commit pending changes in [Managing the local VCS repository](https://docs.weblate.org/en/latest/devel/integration.md#manage-vcs). 3. Merge Weblate changes to the upstream repository. 4. Disable receiving updates via hooks using [Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks). 5. Perform the renaming of the files in the repository. 6. Update the component configuration to match new file names. 7. Enable update hooks and unlock the component. #### HINT [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup) might be useful to perform prior to such disrupting changes. ## Troubleshooting ### Requests sometimes fail with “too many open files” error This happens sometimes when your Git repository grows too much and you have many of them. Compressing the Git repositories will improve this situation. The easiest way to do this is to run: ```sh # Go to DATA_DIR directory cd data/vcs # Compress all Git repositories for d in */* ; do pushd $d git gc popd done ``` #### SEE ALSO [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) ### When accessing the site I get a “Bad Request (400)” error This is most likely caused by an improperly configured [`ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ALLOWED_HOSTS). It needs to contain all hostnames you want to access on your Weblate. For example: ```python ALLOWED_HOSTS = ["weblate.example.com", "weblate", "localhost"] ``` #### SEE ALSO [Allowed hosts setup](https://docs.weblate.org/en/latest/admin/install.md#production-hosts) ### What does mean “There are more files for the single language (en)”? This typically happens when you have translation file for source language. Weblate keeps track of source strings and reserves source language for this. The additional file for same language is not processed. * In case the translation to the source language is desired, please change the [Source language](https://docs.weblate.org/en/latest/admin/projects.md#component-source-language) in the component settings. You might want to use English (Developer) as a source language, or utilize [Quality gateway for the source strings](https://docs.weblate.org/en/latest/workflows.md#source-quality-gateway). * In case the translation file for the source language is not needed, please remove it from the repository. * In case the translation file for the source language is needed, but should be ignored by Weblate, please adjust the [Language filter](https://docs.weblate.org/en/latest/admin/projects.md#component-language-regex) to exclude it. #### HINT You might get similar error message for other languages as well. In that case the most likely reason is that several files map to single language in Weblate. This can be caused by using obsolete language codes together with new one (`ja` and `jp` for Japanese) or including both country specific and generic codes (`fr` and `fr_FR`). See [Parsing language codes](https://docs.weblate.org/en/latest/admin/languages.md#language-parsing-codes) for more details. ## Features ### Does Weblate support other VCSes than Git and Mercurial? Weblate currently does not have native support for anything other than [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) (with extended support for [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests), [Gerrit review requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gerrit), and [Subversion](https://docs.weblate.org/en/latest/vcs.md#vcs-git-svn)) and [Mercurial](https://docs.weblate.org/en/latest/vcs.md#vcs-mercurial), but it is possible to write backends for other VCSes. Weblate also supports VCS-less operation, see [Local files](https://docs.weblate.org/en/latest/vcs.md#vcs-local). #### NOTE For native support of other VCSes, Weblate requires using distributed VCS, and could probably be adjusted to work with anything other than Git and Mercurial, but somebody has to implement this support. #### SEE ALSO [Version control integration](https://docs.weblate.org/en/latest/vcs.md#vcs) ### How does Weblate credit translators? Every change made in Weblate is committed into VCS under the translators name. This way every single change has proper authorship, and you can track it down using the standard VCS tools you use for code. Additionally, when the translation file format supports it, the file headers are updated to include the translator’s name. #### SEE ALSO * [`list_translators`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-list_translators) * [Translation progress reporting](https://docs.weblate.org/en/latest/devel/reporting.md) ### Why does Weblate force showing all PO files in a single tree? Weblate was designed in a way that every PO file is represented as a single component. This is beneficial for translators, so they know what they are actually translating. #### Versionchanged Changed in version 4.2: Translators can translate all the components of a project into a specific language as a whole. ### Why does Weblate use language codes such sr_Latn or zh_Hant? These are language codes defined by [**RFC 5646**](https://datatracker.ietf.org/doc/html/rfc5646.html) to better indicate that they are really different languages instead previously wrongly used modifiers (for `@latin` variants) or country codes (for Chinese). Weblate still understands legacy language codes and will map them to current one - for example `sr@latin` will be handled as `sr_Latn` or `zh@CN` as `zh_Hans`. #### NOTE Weblate defaults to POSIX style language codes with underscore, see [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) for more details. #### SEE ALSO * [Language definitions](https://docs.weblate.org/en/latest/admin/languages.md#languages) * [Language code style](https://docs.weblate.org/en/latest/admin/projects.md#component-language-code-style) * [Adding new translations](https://docs.weblate.org/en/latest/devel/translations.md#adding-translation) # formats.md # Localization file formats Weblate supports a wide range of translation formats. Each format is slightly different and provides a different set of capabilities. #### HINT When choosing a file format for your application, it’s better to stick to some well-established format in the toolkit/platform you use. This way your translators can additionally use whatever tools they are used to, and will more likely contribute to your project. #### SEE ALSO [Translation Related File Formats](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/index.html) ## Automatic detection Weblate tries to detect file format during [Adding translation projects and components](https://docs.weblate.org/en/latest/admin/projects.md#adding-projects). The detection might be wrong for different variants of the same serialization format (JSON, YAML, properties) or file encoding, so please verify that [File format](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format) is correct before creating the component. ## Translation types capabilities Please refer to the documentation page of each individual file format for information about which features are supported in that format. ### Bilingual and monolingual formats Both monolingual and bilingual formats are supported. Bilingual formats store two languages in single file—source and translation (typical examples are [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext), [XLIFF 1.1 and 1.2](https://docs.weblate.org/en/latest/formats/xliff.md#xliff) or [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md#apple)). On the other side, monolingual formats identify the string by ID, and each language file contains only the mapping of those to any given language (typically [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource)). Some file formats are used in both variants, see the detailed description below. For correct use of monolingual files, Weblate requires access to a file containing complete list of strings to translate with their source—this file is called [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template) within Weblate, though the naming might vary in your paradigm. Additionally this workflow can be extended by utilizing [Intermediate language file](https://docs.weblate.org/en/latest/admin/projects.md#component-intermediate) to include strings provided by developers, but not to be used as is in the final strings. ### String states Many file formats only differentiate “Untranslated” and “Translated” strings. With some formats it is possible to store more fine-grained state information, such as “Needs editing” or “Approved”. ### Source string description Source string descriptions can be used to pass additional info about the string to translate. Several formats have native support for providing additional info to translators (for example [XLIFF 1.1 and 1.2](https://docs.weblate.org/en/latest/formats/xliff.md#xliff), [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext), [WebExtension JSON](https://docs.weblate.org/en/latest/formats/webextension.md#webex), [CSV files](https://docs.weblate.org/en/latest/formats/csv.md#csv), [Excel Open XML](https://docs.weblate.org/en/latest/formats/excel.md#xlsx), [Qt Linguist .ts](https://docs.weblate.org/en/latest/formats/qt.md#qtling), [go-i18n JSON files](https://docs.weblate.org/en/latest/formats/go-i18n.md#go-i18n-json), [gotext JSON files](https://docs.weblate.org/en/latest/formats/gotext.md#gotext-json), [ARB File](https://docs.weblate.org/en/latest/formats/arb.md#arb), [.NET resource files (RESX, RESW)](https://docs.weblate.org/en/latest/formats/resx.md#dotnet)). Many other formats extract closest comment as source string description. ### Explanation The [Explanation](https://docs.weblate.org/en/latest/admin/translating.md#additional-explanation) on strings can be stored and parsed from a few file formats. Currently supported only in [TermBase eXchange format](https://docs.weblate.org/en/latest/formats/tbx.md#tbx). ### Source string location Location of a string in source code might help proficient translators figure out how the string is used. This information is typically available in bilingual formats where strings are extracted from the source code using tools. For example [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) and [Qt Linguist .ts](https://docs.weblate.org/en/latest/formats/qt.md#qtling). ### Translation flags Translation flags allow customizing Weblate behavior. Some formats support defining those in the translation file (you can always define them in the Weblate interface, see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks)). This feature is modelled on flags in [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext). Additionally, XML-based formats that support flags extract them from the non-standard attribute `weblate-flags`. The `max-length:N` flag is also supported through the `maxwidth` [attribute](https://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html#maxwidth) as defined in the XLIFF standard, see [Specifying translation flags](https://docs.weblate.org/en/latest/formats/xliff.md#xliff-flags). #### SEE ALSO * [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) * [PO files documentation](https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html) ### Context Context is used to differentiate identical strings in a bilingual format used in different scopes (for example Sun can be used as an abbreviated name of the day “Sunday” or as the name of our closest star). For monolingual formats the string identifier (often called key) can serve the same purpose and additional context is not necessary. ### Pluralized strings Plurals are necessary to properly localize strings with variable count. The rules depend on a target language and many formats follow CLDR specification for that. Plural support in the supported features table means Weblate can represent plural strings for the format. Some formats need existing plural metadata or a specific variant, and cannot create new plural strings unless that is natively supported by the format. #### HINT Pluralizing strings need proper support from the application framework as well. Choose native format of your platform such as [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext), [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource) or [Stringsdict format](https://docs.weblate.org/en/latest/formats/stringsdict.md#stringsdict). ### Multivalue formats Multivalue formats, such as [Multivalue CSV file](https://docs.weblate.org/en/latest/formats/csv.md#multivalue-csv) and [TermBase eXchange format](https://docs.weblate.org/en/latest/formats/tbx.md#tbx), store independent source and target alternatives within one string. These alternatives have no one-to-one pairing, and their counts do not follow grammatical plural rules. Source checks inspect every source alternative. Target checks compare each target alternative with the source alternatives. A target passes when it matches any source alternative, independently of their order or the languages’ grammatical plural forms. The Unchanged translation check instead reports targets identical to any source alternative, subject to its usual exemptions. Automatic fixes are applied only when all source alternatives produce the same correction. [Machine translation suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) translate each source alternative independently. Automatic machine translation supports strings with one source alternative and at most one target alternative; it skips strings with multiple alternatives to preserve them. Machinery glossaries can use all alternatives. Automatic [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) contributions skip strings with multiple alternatives. LLM translation services use only strings with one source alternative and one target alternative as examples of previous translations. They omit existing translation context for strings with multiple alternatives. ### Read-only strings Read-only strings from translation files will be included, but can not be edited in Weblate. This feature is natively supported by few formats ([XLIFF 1.1 and 1.2](https://docs.weblate.org/en/latest/formats/xliff.md#xliff) and [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource)), but can be emulated in others by adding a `read-only` flag, see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks). ### Removing obsolete strings Some file formats can store obsolete strings. Weblate can remove these obsolete strings from formats that support this operation. ## Supporting other formats Most formats supported by [translate-toolkit](https://toolkit.translatehouse.org/) which support serializing can be easily supported, but they did not (yet) receive any testing. In most cases, an additional thin layer is needed in Weblate to hide differences in behavior of different storages. To add support for a new format, the preferred approach is to first implement support for it in the [translate-toolkit](https://toolkit.translatehouse.org/). #### SEE ALSO [Translation Related File Formats](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/index.html) ## File format parameters File format parameters provide a way to configure settings related to the file format. They are configured at component level and allow you to customize how file parsing and serialization are handled. ### List of file format parameters | Parameter name | File formats | Label | Help text | |---------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | csv_encoding | * `csv`
* `csv-multi` | File encoding | Encoding used for CSV files

Available choices:

`auto`
: Auto-detect

`utf-8`
: UTF-8 | | csv_escape_formulas | * `csv`
* `csv-multi`
* `csv-simple` | Escape spreadsheet formulas | Prefix values that look like spreadsheet formulas with an apostrophe when saving CSV files. | | csv_simple_encoding | * `csv-simple` | File encoding | Encoding used for simple CSV files

Available choices:

`auto`
: Auto-detect

`utf-8`
: UTF-8

`iso-8859-1`
: ISO-8859-1 | | dos_eol | All file formats | DOS line endings | Use DOS line endings (rn) instead of UNIX line endings (n) in strings. | | flatxml_key_name | * `flatxml` | FlatXML key name | | | flatxml_root_name | * `flatxml` | FlatXML Root name | | | flatxml_value_name | * `flatxml` | FlatXML value name | | | gwt_encoding | * `gwt` | File encoding | Encoding used for GWT Properties files

Available choices:

`utf-8`
: UTF-8

`iso-8859-1`
: ISO-8859-1 | | json_indent | * `json`
* `json-nested`
* `webextension`
* `i18next`
* `i18nextv4`
* `arb`
* `go-i18n-json`
* `go-i18n-json-v2`
* `formatjs`
* `gotext` | JSON indentation | | | json_indent_style | * `json`
* `json-nested`
* `webextension`
* `i18next`
* `i18nextv4`
* `arb`
* `go-i18n-json`
* `go-i18n-json-v2`
* `formatjs`
* `gotext` | JSON indentation style | Available choices:

`spaces`
: Spaces

`tabs`
: Tabs | | json_sort_keys | * `json`
* `json-nested`
* `webextension`
* `i18next`
* `i18nextv4`
* `arb`
* `go-i18n-json`
* `go-i18n-json-v2`
* `formatjs`
* `gotext` | Sort JSON keys | Available choices:

`none`
: Do not sort

`case_sensitive`
: Case-sensitive sort

`case_insensitive`
: Case-insensitive sort | | json_use_compact_separators | * `json`
* `json-nested`
* `webextension`
* `i18next`
* `i18nextv4`
* `arb`
* `go-i18n-json`
* `go-i18n-json-v2`
* `formatjs`
* `gotext` | Avoid spaces after separators | | | line_max_length | * `markdown`
* `mdx` | Maximum line length | The maximum number of characters for each line in the output file. | | md_extract_code_blocks | * `markdown`
* `mdx` | Extract code blocks | Whether to extract translatable content from code blocks in Markdown and MDX files. | | md_extract_frontmatter | * `markdown`
* `mdx` | Extract front matter | Whether to extract and translate YAML front matter blocks in Markdown and MDX files. | | md_frontmatter_translate_values | * `markdown`
* `mdx` | Translate front matter values | Parse YAML front matter and translate only scalar string values. Keys, structure, comments, and formatting are preserved when possible. | | md_no_placeholders | * `markdown`
* `mdx` | Disable placeholders | Disables detection and processing of placeholders in Markdown and MDX files. | | merge_duplicates | * `markdown`
* `mdx`
* `html`
* `txt`
* `dokuwiki`
* `mediawiki`
* `asciidoc` | Deduplicate identical strings | Consolidates identical source strings into a single translation unit. Prevents translation loss during file restructuring or table reordering by removing position-dependent context. | | po_contributor_comments | * `po`
* `po-mono` | Contributor comments | Add contributor names and years to header comments. SPDX also converts existing recognized contributor comments to SPDX-FileCopyrightText entries.

Available choices:

`none`
: Disabled

`gettext`
: Gettext

`spdx`
: SPDX | | po_fuzzy_matching | * `po` | Use fuzzy matching | | | po_keep_previous | * `po` | Keep previous msgids of translated strings | Controls previous msgid comments for fuzzy strings. | | po_line_wrap | * `po`
* `po-mono` | Long lines wrapping | By default, gettext wraps lines at 77 characters and at newlines. With the `--no-wrap` parameter, wrapping is only done at newlines.

Available choices:

`77`
: Wrap lines at 77 characters and at newlines (xgettext default)

`65535`
: Only wrap lines at newlines (like `xgettext --no-wrap`)

`-1`
: No line wrapping | | po_no_location | * `po` | Do not include location information in the file | | | po_remove_obsolete | * `po`
* `po-mono` | Remove obsolete strings | Remove obsolete entries from PO files when saving translation changes or updating from a POT file. | | po_report_msgid_bugs_to | * `po`
* `po-mono` | Report msgid bugs to | Lets Weblate update the “Report-Msgid-Bugs-To” file header if Source string bug reporting address is set. | | po_set_language_team | * `po`
* `po-mono` | Update language team header | Lets Weblate update the “Language-Team” file header. | | po_set_last_translator | * `po`
* `po-mono` | Update last translator header | Lets Weblate update the “Last-Translator” file header. | | po_set_x_generator | * `po`
* `po-mono` | Update X-Generator header | Lets Weblate update the “X-Generator” file header. | | properties_encoding | * `properties` | File encoding | Encoding used for Java Properties files

Available choices:

`iso-8859-1`
: ISO-8859-1

`utf-8`
: UTF-8

`utf-16`
: UTF-16 | | strings_encoding | * `strings` | File encoding | Encoding used for iOS strings files

Available choices:

`utf-8`
: UTF-8

`utf-16`
: UTF-16 | | xml_closing_tags | * `ts`
* `plainxliff`
* `xliff`
* `xliff2`
* `xliff2-placeables`
* `poxliff`
* `apple-xliff`
* `resx`
* `aresource`
* `moko-resource`
* `cmp-resource`
* `tbx` | Include closing tag for blank XML tags | | | yaml_indent | * `yaml`
* `ruby-yaml` | YAML indentation | | | yaml_line_break | * `yaml`
* `ruby-yaml` | Line breaks | Available choices:

`dos`
: DOS (\\r\\n)

`unix`
: UNIX (\\n)

`mac`
: MAC (\\r) | | yaml_line_wrap | * `yaml`
* `ruby-yaml` | Long lines wrapping | Available choices:

`80`
: Wrap lines at 80 chars

`100`
: Wrap lines at 100 chars

`120`
: Wrap lines at 120 chars

`180`
: Wrap lines at 180 chars

`65535`
: No line wrapping | # formats/android.md # Android string resources Android specific file format for translating applications. #### HINT A very similar formats are [Compose Multiplatform resources](https://docs.weblate.org/en/latest/formats/compose-multiplatform-resources.md) and [Mobile Kotlin resources](https://docs.weblate.org/en/latest/formats/moko-resources.md). Android string resources are monolingual, the [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template) is stored in a different location from the other files – `res/values/strings.xml`. Weblate does following escaping of strings: * If a strings is valid XML, it is inserted as XML to translation. * `?` and `@` are escaped with a `\\` at the beginning of the string to avoid interpreting them as style or resource references. * In case string contains multiple spaces, it is quoted with double quotes (`"`). * Newlines are escaped as `\\n`, but the actual newline is kept for readability as well. #### NOTE Android string-array structures are not currently supported. To work around this, you can break your string arrays apart: ```xml First string Second string ``` become: ```xml @string/several_strings_0 @string/several_strings_1 First string Second string ``` The string-array that points to the string elements should be stored in a different file, and not be made available for translation. This script may help pre-process your existing strings.xml files and translations: [https://gist.github.com/paour/11291062](https://gist.github.com/paour/11291062) #### HINT To avoid translating some strings, these can be marked as non-translatable. This can be especially useful for string references: ```xml @string/foo ``` #### SEE ALSO * [Android string resources documentation](https://developer.android.com/guide/topics/resources/string-resource) * [Compose Multiplatform resources](https://docs.weblate.org/en/latest/formats/compose-multiplatform-resources.md) * [Mobile Kotlin resources](https://docs.weblate.org/en/latest/formats/moko-resources.md) * [Android string resources](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/android.html) #### Supported features | File extensions | `.xml` | |------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | API identifier | `aresource` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `Yes` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [Java format](https://docs.weblate.org/en/latest/user/checks.md#check-java-printf-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `res/values-*/strings.xml` | | Monolingual base language file | `res/values/strings.xml` | | Template for new translations | Empty | | File format | Android String Resource | # formats/apple.md # Apple iOS strings File format typically used for translating Apple iOS applications, but also standardized by PWG 5100.13 and used on NeXTSTEP/OpenSTEP. Apple iOS strings are usually used as monolingual. #### SEE ALSO * [Stringsdict format](https://docs.weblate.org/en/latest/formats/stringsdict.md#stringsdict) * [Apple “strings files” documentation](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPInternational/MaintaingYourOwnStringsFiles/MaintaingYourOwnStringsFiles.html) * [Message Catalog File Format in PWG 5100.13](https://ftp.pwg.org/pub/pwg/candidates/cs-ippjobprinterext3v10-20120727-5100.13.pdf#page=66) * [Mac OSX strings](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/strings.html) #### Supported features | File extensions | `.strings` | |------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `strings` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [Objective-C format](https://docs.weblate.org/en/latest/user/checks.md#check-objc-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `Resources/*.lproj/Localizable.strings` | | Monolingual base language file | `Resources/en.lproj/Localizable.strings` or
`Resources/Base.lproj/Localizable.strings` | | Template for new translations | Empty | | File format | iOS Strings | | File encoding | UTF-8 | # formats/appstore.md # App store metadata files Metadata used for publishing apps in various app stores can be translated. Currently the following tools are compatible: * [Triple-T gradle-play-publisher](https://github.com/Triple-T/gradle-play-publisher) * [Fastlane](https://docs.fastlane.tools/getting-started/android/setup/#fetch-your-app-metadata) * [F-Droid](https://f-droid.org/docs/All_About_Descriptions_Graphics_and_Screenshots/) The metadata consists of several textfiles, which Weblate will present as separate strings to translate. #### HINT In case you don’t want to translate certain strings (for example changelogs), you can hide them using [Key filter](https://docs.weblate.org/en/latest/admin/projects.md#component-key-filter) or mark them read-only (see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks)). This can be automated by the [Bulk edit](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-flags-bulk). #### Supported features | File extensions | `.txt` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `appstore` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `fastlane/metadata/android/*` | | Monolingual base language file | `fastlane/metadata/android/en-US` | | Template for new translations | `fastlane/metadata/android/en-US` | | File format | App store metadata files | # formats/arb.md # ARB File #### Versionadded Added in version 4.1. ARB translations are monolingual, so it is recommended to specify a base file with (what is most often the) English strings. #### SEE ALSO * [JSON](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/json.html) * [Application Resource Bundle Specification](https://github.com/google/app-resource-bundle/wiki/ApplicationResourceBundleSpecification) * [Internationalization of Flutter apps](https://docs.flutter.dev/ui/internationalization) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Customize JSON output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-json-customize) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) #### Supported features | File extensions | `.arb` | |------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `arb` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [ICU MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `lib/l10n/intl_*.arb` | | Monolingual base language file | `lib/l10n/intl_en.arb` | | Template for new translations | Empty | | File format | ARB file | # formats/asciidoc.md # AsciiDoc files #### Versionadded Added in version 5.16.1. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. The translatable content is extracted from the AsciiDoc files and offered for the translation. #### NOTE Unlike most other formats, the changes in the translation files will not be imported to Weblate because it can not be done reliably. The source of truth for the translations is Weblate not the translated file. #### SEE ALSO [AsciiDoc](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/asciidoc.html) Example file: ```default == Ahoj světe! Orangutan has five bananas. Try Weblate at https://demo.weblate.org/[weblate.org]! _Thank you for using Weblate._ ``` #### Supported features | File extensions | `.ad`, `.adoc`, `.asciidoc` | |------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `asciidoc` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html), `strict-same`, `asciidoc-text` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `path/*.adoc` | | Monolingual base language file | `path/en.adoc` | | Template for new translations | `path/en.adoc` | | File format | AsciiDoc file | | File format parameters | `merge_duplicates=True` | ## Handling duplicate strings By default, Weblate treats each occurrence of a string as a separate translation unit to provide line-based context. This can be problematic in AsciiDoc tables, where reordering rows changes the context and can lead to translation loss. To consolidate identical strings into a single translation unit, enable Deduplicate identical strings in the [File format parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format-params). #### NOTE Enabling this option disables line-based context for the merged units, ensuring that translations remain stable even if rows or sections are moved within the document. # formats/catkeys.md # Catkeys file #### Versionadded Added in version 5.13. File format used for Haiku operating system translations. #### SEE ALSO [Haiku catkeys](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/catkeys.html) Example file: ```text 1 english application 12345678 source1 context1 remarks1 target1 source2 context2 remarks2 target2 ``` #### Supported features | File extensions | `.catkeys` | |------------------------------------------------------------------------------------------------------|--------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `catkeys` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `locale/*.catkeys` | | Monolingual base language file | `locale/en.catkeys` | | Template for new translations | Empty | | File format | Catkeys file | # formats/compose-multiplatform-resources.md # Compose Multiplatform resources #### Versionadded Added in version 5.12. A variant of [Android string resources](https://docs.weblate.org/en/latest/formats/android.md). It differs in escaping. #### SEE ALSO * [Kotlin Compose Multiplatform Resources](https://kotlinlang.org/docs/multiplatform/compose-multiplatform-resources.html) * [Android string resources](https://docs.weblate.org/en/latest/formats/android.md) * [Android string resources](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/android.html) #### Supported features | File extensions | `.xml` | |------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | API identifier | `cmp-resource` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `Yes` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [Java format](https://docs.weblate.org/en/latest/user/checks.md#check-java-printf-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `commonMain/composeResources/values-*/strings.xml` | | Monolingual base language file | `commonMain/composeResources/values/strings.xml` | | Template for new translations | Empty | | File format | Compose Multiplatform Resource | # formats/csv.md # CSV files CSV files can contain a simple list of source and translation. Weblate supports the following files: * Files with header defining fields (`location`, `source`, `target`, `ID`, `fuzzy`, `context`, `translator_comments`, `developer_comments`). This is the recommended approach, as it is the least error prone. Choose CSV file as a file format. * Files with two fields—source and translation (in this order). Choose Simple CSV file as a file format. * Headerless files with fields in order defined by the [translate-toolkit](https://toolkit.translatehouse.org/): `location`, `source`, `target`, `ID`, `fuzzy`, `context`, `translator_comments`, `developer_comments`. Choose CSV file as a file format. * Remember to define [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template) when your files are monolingual (see [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono)). #### HINT By default, the CSV format does autodetection of file encoding. This can be unreliable in some corner cases and causes performance penalty. Please choose a file format encoding to avoid this (for example UTF-8). #### WARNING The CSV format currently automatically detects the dialect of the CSV file. In some cases the automatic detection might fail and you will get mixed results. This is especially true for CSV files with newlines in the values. As a workaround it is recommended to omit quoting characters. #### SEE ALSO [CSV](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/csv.html) ## Multivalue CSV file #### Versionadded Added in version 4.13. This variant of the CSV files allows storing multiple translations per string. See [Multivalue formats](https://docs.weblate.org/en/latest/formats.md#format-multivalue) for how alternatives are handled by quality checks, automatic fixes, and machine translation. ## Example files Example file: ```text Thank you for using Weblate.,Děkujeme za použití Weblate. ``` #### Supported features | File extensions | `.csv`, `.txt` | |------------------------------------------------------------------------------------------------------|----------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `Yes` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | Additional states [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-states) | `Needs editing` | | API identifier | `csv`, `csv-multi`, `csv-simple` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for bilingual CSV | |--------------------------------|----------------------------------------------------------------------------------------------------------------------| | File mask | `locale/*.csv` | | Monolingual base language file | Empty | | Template for new translations | `locale/en.csv` | | File format | CSV file | | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for monolingual CSV | |--------------------------------|------------------------------------------------------------------------------------------------------------------------| | File mask | `locale/*.csv` | | Monolingual base language file | `locale/en.csv` | | Template for new translations | `locale/en.csv` | | File format | Simple CSV file | # formats/dtd.md # DTD files #### SEE ALSO [Mozilla DTD format](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/dtd.html) Example DTD file: ```yaml ``` #### Supported features | File extensions | `.dtd` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `dtd` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `locale/*.dtd` | | Monolingual base language file | `locale/en.dtd` | | Template for new translations | Empty | | File format | DTD file | # formats/excel.md # Excel Open XML Excel Open XML (.xlsx) files can be imported and exported. When uploading XLSX files for translation, be aware that only the active worksheet is considered, and there must be at least a column called `source` (which contains the source string) and a column called `target` (which contains the translation). Additionally there should be the column called `context` (which contains the context path of the translation string). If you use the XLSX download for exporting the translations into an Excel workbook, you already get a file with the correct file format. #### Supported features | File extensions | `.xlsx` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `Yes` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | Additional states [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-states) | `Needs editing` | | API identifier | `xlsx` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `path/*.xlsx` | | Monolingual base language file | `path/en.xlsx` | | Template for new translations | `path/en.xlsx` | | File format | Excel Open XML | # formats/flatxml.md # Flat XML files #### SEE ALSO [Flat XML](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/flatxml.html) #### Versionchanged Changed in version 5.13: The tag and attribute names can now be customized using [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). Example of flat XML files: ```xml Hello World! Translated value. ``` ```xml Hello World! Translated value. ``` #### Supported features | File extensions | `.xml` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | API identifier | `flatxml` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `locale/*.xml` | | Monolingual base language file | `locale/en.xml` | | Template for new translations | Empty | | File format | Flat XML file | # formats/fluent.md # Fluent format #### Versionadded Added in version 4.8. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. Fluent is a monolingual text format that focuses on asymmetric localization: a simple string in one language can map to a complex multi-variant translation in another language. #### SEE ALSO [Project Fluent website](https://projectfluent.org/) Example file: ```default hello = Ahoj "světe"!\n orangutan = Orangutan má %d banán.\n try = Zkus Weblate na !\n thanks = Děkujeme za použití Weblate. ``` #### Supported features | File extensions | `.ftl` | |------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `fluent` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [Fluent source syntax](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-source-syntax), [Fluent translation syntax](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-target-syntax), [Fluent parts](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-parts), [Fluent references](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-references), [Fluent source inner HTML](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-source-inner-html), [Fluent translation inner HTML](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-target-inner-html), `ignore-xml-tags`, `ignore-xml-invalid` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `locales/*/messages.ftl` | | Monolingual base language file | `locales/en/messages.ftl` | | Template for new translations | Empty | | File format | Fluent file | # formats/formatjs.md # Format.JS JSON file #### Versionadded Added in version 5.4. File format used when translating Format.JS and React-Intl applications. #### SEE ALSO * [JSON](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/json.html) * [Format.JS Message Extraction](https://formatjs.github.io/docs/getting-started/message-extraction) Example file: ```json { "hak27d": { "defaultMessage": "Control Panel", "description": "title of control panel section" }, "haqsd": { "defaultMessage": "Delete user {name}", "description": "delete button" }, "19hjs": { "defaultMessage": "New Password", "description": "placeholder text" }, "explicit-id": { "defaultMessage": "Confirm Password", "description": "placeholder text" } } ``` #### Supported features | File extensions | `.json` | |------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `formatjs` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [ICU MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `src/lang/*.json` | | Monolingual base language file | `src/extracted/en.json` | | Template for new translations | Empty | | File format | Format.JS JSON file | # formats/gettext.md # GNU gettext PO (Portable Object) Most widely used format for translating libre software. Contextual info stored in the file is supported by adjusting its headers or linking to corresponding source files. #### SEE ALSO * [Translating software using GNU gettext](https://docs.weblate.org/en/latest/devel/gettext.md) * [Translating documentation using Sphinx](https://docs.weblate.org/en/latest/devel/sphinx.md) * [Gettext on Wikipedia](https://en.wikipedia.org/wiki/Gettext) * [PO Files](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/po.html) * [Update ALL_LINGUAS variable in the “configure” file](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-configure) * [Customize gettext output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-customize) * [Update LINGUAS file](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-linguas) * [Generate MO files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-mo) * [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) ## Showing source string change Weblate can extract previous source strings from the PO files if present and show the string difference for strings needing editing based on that. To include these, **msgmerge** has to be executed with `--previous` and the resulting PO file then contains lines such as: ```po #, fuzzy #| msgid "previous-untranslated-string" msgid "untranslated-string" msgstr "translated-string" ``` This is controlled by the `po_keep_previous` [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) parameter. It does not affect obsolete entries marked with `#~`. ## Obsolete strings **msgmerge** keeps strings removed from the POT file as obsolete `#~` entries by default. Enable the `po_remove_obsolete` [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) parameter to remove obsolete entries when Weblate saves PO files. ## PO file header The header of the PO file is automatically maintained by Weblate. It can be configured to include the `Language-Team`, `Last-Translator`, `X-Generator` and `Report-Msgid-Bugs-To` headers using the [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). ### Contributor comments Use the `po_contributor_comments` [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) parameter to add contributor names and years to PO header comments. Choose `gettext` for traditional comments or `spdx` for SPDX copyright entries. The default, `none`, disables contributor updates without removing existing comments. This setting works independently of the `Last-Translator` header setting. With `gettext`, contributor comments look like this: ```po # Jane Doe , 2024, 2026. ``` With `spdx`, the same entry becomes: ```po # SPDX-FileCopyrightText: 2024, 2026 Jane Doe ``` On the next commit by an eligible contributor, SPDX mode converts all recognized contributor comments, preserves historical contribution years, and adds the current year for that contributor. Anonymous Weblate authors are skipped. Unrelated comments and copyright notices are preserved. Weblate does not infer copyright claims from translated credit strings or add project-specific notices or license identifiers; handle these in custom tooling. ## Line wrapping The line wrapping mostly matches GNU gettext behavior. Both the wrapping algorithm in the GNU gettext and the Unicode data the wrapping is based on evolve which might cause differences in some corner cases. The wrapping width can be configured using the `po_line_wrap` parameter, see [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params). ## Generating matching MO files In case MO files are kept in the repository together with PO files, [Generate MO files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-mo) can be used to keep them up-to-date with PO files. ## Updating PO files from the POT file [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) can be used to update PO files from the POT file, see [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files). ## Monolingual gettext Some projects decide to use gettext as monolingual formats—they code just the IDs in their source code and the string then needs to be translated to all languages, including English. This is supported, though you have to choose this file format explicitly when importing components into Weblate. ## Example files The bilingual gettext PO file typically looks like this: ```po #: weblate/media/js/bootstrap-datepicker.js:1421 msgid "Monday" msgstr "Pondělí" #: weblate/media/js/bootstrap-datepicker.js:1421 msgid "Tuesday" msgstr "Úterý" #: weblate/accounts/avatar.py:163 msgctxt "No known user" msgid "None" msgstr "Žádný" ``` The monolingual gettext PO file typically looks like this: ```po #: weblate/media/js/bootstrap-datepicker.js:1421 msgid "day-monday" msgstr "Pondělí" #: weblate/media/js/bootstrap-datepicker.js:1421 msgid "day-tuesday" msgstr "Úterý" #: weblate/accounts/avatar.py:163 msgid "none-user" msgstr "Žádný" ``` While the base language file will be: ```po #: weblate/media/js/bootstrap-datepicker.js:1421 msgid "day-monday" msgstr "Monday" #: weblate/media/js/bootstrap-datepicker.js:1421 msgid "day-tuesday" msgstr "Tuesday" #: weblate/accounts/avatar.py:163 msgid "none-user" msgstr "None" ``` #### Supported features | File extensions | `.po`, `.pot` | |------------------------------------------------------------------------------------------------------|-----------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `Yes` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | Additional states [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-states) | `Needs editing` | | API identifier | `po-mono` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `Yes` | #### Supported features | File extensions | `.po`, `.pot` | |------------------------------------------------------------------------------------------------------|-----------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `Yes` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | Additional states [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-states) | `Needs editing` | | API identifier | `po` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `Yes` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for bilingual gettext | |--------------------------------|--------------------------------------------------------------------------------------------------------------------------| | File mask | `po/*.po` | | Monolingual base language file | Empty | | Template for new translations | `po/messages.pot` | | File format | Gettext PO file | | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for monolingual gettext | |--------------------------------|----------------------------------------------------------------------------------------------------------------------------| | File mask | `po/*.po` | | Monolingual base language file | `po/en.po` | | Template for new translations | `po/messages.pot` | | File format | Gettext PO file (monolingual) | ## File format parameters [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) with the pattern po_\* can be used to configure the behavior of the gettext format. # formats/go-i18n.md # go-i18n JSON files #### Versionadded Added in version 4.1. #### Versionchanged Changed in version 4.16: Support for v2 variant of this format was added. go-i18n translations are monolingual, so it is recommended to specify a base file with (what is most often the) English strings. #### NOTE Weblate supports the go-i18n JSON v1 and v2 variants. Please choose correct file format matching your environment. #### SEE ALSO * [JSON](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/json.html) * [go-i18n](https://github.com/nicksnyder/go-i18n) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Customize JSON output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-json-customize) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) ## Example files Example file v1: ```json [ { "id": "hello", "description": "Description", "translation": "Ahoj světe!\n" }, { "id": "orangutan", "description": "Description", "translation": { "one": "Orangutan has {{.Count}} banana.\n", "other": "Orangutan has {{.Count}} bananas.\n" } }, { "id": "try", "description": "Description", "translation": "" }, { "id": "thanks", "description": "Description", "translation": "" } ] ``` Example file v2: ```json { "hello": "Ahoj světe!\n", "orangutan": { "description": "Description", "one": "Orangutan has {{.Count}} banana.\n", "other": "Orangutan has {{.Count}} bananas.\n" }, "try": { "description": "Description", "other": "" }, "thanks": { "description": "Description", "other": "" } } ``` #### Supported features | File extensions | `.toml` | |------------------------------------------------------------------------------------------------------|----------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `go-i18n-toml` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | #### Supported features | File extensions | `.json` | |------------------------------------------------------------------------------------------------------|-----------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `go-i18n-json`, `go-i18n-json-v2` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for v1 | |--------------------------------|-----------------------------------------------------------------------------------------------------------| | File mask | `langs/*.json` | | Monolingual base language file | `langs/en.json` | | Template for new translations | Empty | | File format | go-i18n v1 JSON file | | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for v2 | |--------------------------------|-----------------------------------------------------------------------------------------------------------| | File mask | `langs/*.json` | | Monolingual base language file | `langs/en.json` | | Template for new translations | Empty | | File format | go-i18n v2 JSON file | # formats/gotext.md # gotext JSON files #### Versionadded Added in version 4.15.1. gotext translations are monolingual, so it is recommended to specify a base file with (what is most often the) English strings. #### SEE ALSO * [JSON](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/json.html) * [I18n in Go: Managing Translations](https://www.alexedwards.net/blog/i18n-managing-translations) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Customize JSON output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-json-customize) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) #### Supported features | File extensions | `.json` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `gotext` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `internal/translations/locales/*/messages.gotext.json` | | Monolingual base language file | `internal/translations/locales/en-GB/messages.gotext.json` | | Template for new translations | Empty | | File format | gotext JSON file | # formats/gwt.md # GWT properties Native GWT format for translations. GWT properties are usually used as monolingual translations. #### SEE ALSO * [GWT localization guide](https://www.gwtproject.org/doc/latest/DevGuideI18n.html) * [GWT Internationalization Tutorial](https://www.gwtproject.org/doc/latest/tutorial/i18n.html) * [Mozilla and Java properties files](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/properties.html) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Format the Java properties file](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-properties-sort) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) #### Supported features | File extensions | `.properties` | |------------------------------------------------------------------------------------------------------|---------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `gwt` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | `auto-java-messageformat` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `src/app/Bundle_*.properties` | | Monolingual base language file | `src/app/Bundle.properties` | | Template for new translations | Empty | | File format | GWT Properties | # formats/html.md # HTML files #### Versionadded Added in version 4.1. The translatable content is extracted from the HTML files and offered for the translation. #### NOTE Unlike most other formats, the changes in the translation files will not be imported to Weblate because it can not be done reliably. The source of truth for the translations is Weblate not the translated file. #### SEE ALSO [HTML](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/html.html) Example file: ```html

Ahoj světe!

Orangutan has five bananas.

Try Weblate at weblate.org!

Thank you for using Weblate.

``` #### Supported features | File extensions | `.htm`, `.html` | |------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `html` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html), `strict-same` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `path/*.html` | | Monolingual base language file | `path/en.html` | | Template for new translations | `path/en.html` | | File format | HTML file | | File format parameters | `html_merge_duplicates=True` | ## Handling duplicate strings By default, Weblate treats each occurrence of a string as a separate translation unit to provide line-based context. This can be problematic in HTML files, where moving elements changes the context and can lead to translation loss. To consolidate identical strings into a single translation unit, enable Deduplicate identical strings in the [File format parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format-params). #### NOTE Enabling this option disables line-based context for the merged units, ensuring that translations remain stable even if elements are moved within the document. # formats/i18next.md # i18next JSON files #### Versionchanged Changed in version 4.15.1: Support for v4 variant of this format was added. #### HINT In case you use plurals, it is recommended to use v4 as that aligned plural handling with CLDR. Older versions have different plural rules for some languages which are not correct. i18next is an internationalization framework written in and for JavaScript. Weblate supports its localization files with features such as plurals. i18next translations are monolingual, so it is recommended to specify a base file with (what is most often the) English strings. ## i18next JSON file v4 Choose this format if unsure. It stores plurals using standard CLDR suffixes. ## i18next JSON file v3 Use for legacy projects which are using numeric suffixes for plurals. #### NOTE The v2 and v1 variants are mostly compatible with v3, with exception of how plurals are handled. #### SEE ALSO * [JSON](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/json.html) * [https://www.i18next.com/](https://www.i18next.com/) * [i18next JSON Format](https://www.i18next.com/misc/json-format) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Customize JSON output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-json-customize) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) Example file: ```json { "hello": "Hello", "apple": "I have an apple", "apple_plural": "I have {{count}} apples", "apple_negative": "I have no apples" } ``` #### Supported features | File extensions | `.json` | |------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `i18nextv4` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [i18next interpolation](https://docs.weblate.org/en/latest/user/checks.md#check-i18next-interpolation) | #### Supported features | File extensions | `.json` | |------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `i18next` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [i18next interpolation](https://docs.weblate.org/en/latest/user/checks.md#check-i18next-interpolation) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `langs/*.json` | | Monolingual base language file | `langs/en.json` | | Template for new translations | Empty | | File format | i18next JSON file v3 | # formats/idml.md # IDML Format #### Versionadded Added in version 4.1. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. The translatable content is extracted from the Adobe InDesign Markup Language files and offered for the translation. #### Supported features | File extensions | `.idml`, `.idms` | |------------------------------------------------------------------------------------------------------|--------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `idml` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | `strict-same` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `path/*.idml` | | Monolingual base language file | `path/en.idml` | | Template for new translations | `path/en.idml` | | File format | IDML file | # formats/ini.md # INI translations #### Versionadded Added in version 4.1. INI file format for translations. Weblate currently supports several variants of JSON translations: * Monolingual INI files * [Joomla translations](https://docs.weblate.org/en/latest/formats/joomla.md#joomla) * [Inno Setup INI translations](https://docs.weblate.org/en/latest/formats/innosetup.md#islu) INI translations are usually used as monolingual translations. #### NOTE Weblate only extracts keys from sections within an INI file. In case your INI file lacks sections, you might want to use [Joomla translations](https://docs.weblate.org/en/latest/formats/joomla.md#joomla) or [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop) instead. #### SEE ALSO * [INI Files](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/ini.html) * [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop) * [Joomla translations](https://docs.weblate.org/en/latest/formats/joomla.md#joomla) * [Inno Setup INI translations](https://docs.weblate.org/en/latest/formats/innosetup.md#islu) Example file: ```ini [weblate] hello=Ahoj "světe"!\n orangutan=Orangutan má %d banán.\n try=Zkus Weblate na !\n thanks=Děkujeme za použití Weblate. ``` #### Supported features | File extensions | `.ini` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `ini` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `language/*.ini` | | Monolingual base language file | `language/en.ini` | | Template for new translations | Empty | | File format | INI File | # formats/innosetup.md # Inno Setup INI translations #### Versionadded Added in version 4.1. Inno Setup INI file format for translations. Inno Setup INI translations are usually used as monolingual translations. #### NOTE The only notable difference to [INI translations](https://docs.weblate.org/en/latest/formats/ini.md#ini) is in supporting `%n` and `%t` placeholders for line break and tab. #### NOTE Only Unicode files (`.islu`) are currently supported, ANSI variant (`.isl`) is currently not supported. #### SEE ALSO * [INI Files](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/ini.html) * [Joomla translations](https://docs.weblate.org/en/latest/formats/joomla.md#joomla) * [INI translations](https://docs.weblate.org/en/latest/formats/ini.md#ini) #### Supported features | File extensions | `.islu` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `islu` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `language/*.islu` | | Monolingual base language file | `language/en.islu` | | Template for new translations | Empty | | File format | Inno Setup INI File | # formats/java.md # Java properties Native Java format for translations. Java properties are usually used as monolingual translations. Weblate supports ISO-8859-1, UTF-8 and UTF-16 variants of this format. All of them support storing all Unicode characters, it is just differently encoded. In the ISO-8859-1, the Unicode escape sequences are used (for example `zkou\u0161ka`), all others encode characters directly either in UTF-8 or UTF-16. #### NOTE Loading escape sequences works in UTF-8 mode as well, so please be careful choosing the correct encoding set to match your application needs. #### SEE ALSO * [Java properties on Wikipedia](https://en.wikipedia.org/wiki/.properties) * [Mozilla and Java properties files](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/properties.html) * [draggable/i18n lang files](https://docs.weblate.org/en/latest/formats/mi18n.md#mi18n-lang) * [GWT properties](https://docs.weblate.org/en/latest/formats/gwt.md#gwt) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Format the Java properties file](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-properties-sort) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) #### Supported features | File extensions | `.properties` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `properties` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | `auto-java-messageformat` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `src/app/Bundle_*.properties` | | Monolingual base language file | `src/app/Bundle.properties` | | Template for new translations | Empty | | File format | Java Properties | | File encoding | ISO-8859-1 | # formats/joomla.md # Joomla translations Native Joomla format for translations. Joomla translations are usually used as monolingual translations. #### SEE ALSO * [Mozilla and Java properties files](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/properties.html) * [INI translations](https://docs.weblate.org/en/latest/formats/ini.md#ini) * [Inno Setup INI translations](https://docs.weblate.org/en/latest/formats/innosetup.md#islu) Example file: ```ini HELLO="Ahoj "_QQ_"světe"_QQ_"!\n" ORANGUTAN="Orangutan má %d banán.\n" TRY="Zkus Weblate na !\n" THANKS="Děkujeme za použití Weblate." ``` #### Supported features | File extensions | `.ini` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `joomla` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `language/*/com_foobar.ini` | | Monolingual base language file | `language/en-GB/com_foobar.ini` | | Template for new translations | Empty | | File format | Joomla Language File | # formats/json.md # JSON files #### Versionchanged Changed in version 4.3: The structure of JSON file is properly preserved even for complex situations which were broken in prior releases. JSON format is used mostly for translating applications implemented in JavaScript. Weblate currently supports several variants of JSON translations: * Simple key / value files, used for example by vue-i18n or react-intl. * Files with nested keys. * [i18next JSON files](https://docs.weblate.org/en/latest/formats/i18next.md#js-i18next) * [go-i18n JSON files](https://docs.weblate.org/en/latest/formats/go-i18n.md#go-i18n-json) * [gotext JSON files](https://docs.weblate.org/en/latest/formats/gotext.md#gotext-json) * [WebExtension JSON](https://docs.weblate.org/en/latest/formats/webextension.md#webex) * [ARB File](https://docs.weblate.org/en/latest/formats/arb.md#arb) * [JavaScript Resource Files (RESJSON)](https://docs.weblate.org/en/latest/formats/resjson.md) * [Nextcloud Apps JSON files](https://docs.weblate.org/en/latest/formats/nextcloud-json.md) JSON translations are usually monolingual, so it is recommended to specify a base file with (what is most often the) English strings. #### HINT The JSON file and JSON nested structure file can both handle same type of files. Both preserve existing JSON structure when translating. The only difference between them is when adding new strings using Weblate. The nested structure format parses the newly added key and inserts the new string into the matching structure. For example `app.name` key is inserted as: ```json { "app": { "name": "Weblate" } } ``` #### SEE ALSO * [JSON](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/json.html) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) ## Example files Example file: ```json { "Hello, world!\n": "Ahoj světe!\n", "Orangutan has %d banana.\n": "", "Try Weblate at https://demo.weblate.org/!\n": "", "Thank you for using Weblate.": "" } ``` Nested files are supported as well (see above for requirements), such a file can look like: ```json { "weblate": { "hello": "Ahoj světe!\n", "orangutan": "", "try": "", "thanks": "" } } ``` #### Supported features | File extensions | `.json` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `json`, `json-nested` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `langs/translation-*.json` | | Monolingual base language file | `langs/translation-en.json` | | Template for new translations | Empty | | File format | JSON nested structure file | ## File format parameters [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) with the pattern json_\* can be used to configure the behavior of the JSON format. # formats/laravel.md # Laravel PHP strings #### Versionchanged Changed in version 4.1. The Laravel PHP localization files are supported as well with plurals: #### Versionchanged Changed in version 5.15: The translation keys no longer include PHP structure and only contain the actual key. ```php 'Welcome to our application', 'apples' => 'There is one apple|There are many apples', ]; ``` #### SEE ALSO * [PHP](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/php.html) * [Localization in Laravel](https://laravel.com/framework/docs/localization) #### Supported features | File extensions | `.php` | |------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `laravel` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [Laravel format](https://docs.weblate.org/en/latest/user/checks.md#check-laravel-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `lang/*/texts.php` | | Monolingual base language file | `lang/en/texts.php` | | Template for new translations | `lang/en/texts.php` | | File format | Laravel PHP strings | # formats/markdown.md # Markdown files #### Versionadded Added in version 5.0. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. The translatable content is extracted from the Markdown files and offered for the translation. For Markdown files with JSX syntax, use [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx). Markdown units automatically get the `md-text`, `auto-safe-html` and `strict-same` flags. This keeps the unsafe HTML check active for plain text, standard HTML, and custom elements while avoiding HTML cleanup on non-HTML angle-bracket syntax such as MDX or JSX-like components. Use the explicit `safe-html` flag for strings that are known to contain HTML and should always be sanitized, including SVG or MathML snippets. #### NOTE Unlike most other formats, the changes in the translation files will not be imported to Weblate because it can not be done reliably. The source of truth for the translations is Weblate not the translated file. #### SEE ALSO [Markdown](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/md.html) Example file: ```md # Ahoj světe! Orangutan has five bananas. Try Weblate at [weblate.org](https://demo.weblate.org/)! *Thank you for using Weblate.* ``` #### Supported features | File extensions | `.markdown`, `.md` | |------------------------------------------------------------------------------------------------------|--------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `markdown` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | `auto-safe-html`, `strict-same`, `md-text` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `path/*.md` | | Monolingual base language file | `path/en.md` | | Template for new translations | `path/en.md` | | File format | Markdown file | | File format parameters | `markdown_merge_duplicates=True` | ## Handling duplicate strings By default, Weblate treats each occurrence of a string as a separate translation unit to provide line-based context. This can be problematic in Markdown tables, where reordering rows changes the context and can lead to translation loss. To consolidate identical strings into a single translation unit, enable Deduplicate identical strings in the [File format parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format-params). #### NOTE Enabling this option disables line-based context for the merged units, ensuring that translations remain stable even if rows or sections are moved within the document. ## Translating front matter values By default, YAML front matter is extracted as a single translatable block. Enable Translate front matter values in [File format parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format-params) to parse YAML front matter and translate only scalar string values while preserving keys, structure, comments, and formatting when possible. The same setting is available for [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) files. # formats/mdx.md # MDX files #### Versionadded Added in version 2026.5. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. MDX files are Markdown files with JSX syntax. Weblate extracts translatable Markdown text and preserves imports, exports, JSX components, and expressions. MDX units automatically get the `md-text`, `auto-safe-html`, `strict-same` and `safe-mdx` flags. This keeps the unsafe HTML check active for plain text, standard HTML, and custom elements while avoiding HTML cleanup on MDX and JSX-like syntax. Use the explicit `safe-html` flag for strings that are known to contain HTML and should always be sanitized, including SVG or MathML snippets. #### NOTE Unlike most other formats, the changes in the translation files will not be imported to Weblate because it can not be done reliably. The source of truth for the translations is Weblate not the translated file. #### SEE ALSO [MDX](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/mdx.html) Example file: ```md --- title: Ahoj světe! description: Learn with Weblate --- import LessonCard from "./LessonCard" export const metadata = { slug: "intro" } # Ahoj světe! Do not translate this JSX body. Orangutan has five bananas. Try Weblate at [weblate.org](https://demo.weblate.org/)! *Thank you for using Weblate.* ``` #### Supported features | File extensions | `.mdx` | |------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `mdx` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | `auto-safe-html`, `strict-same`, `md-text`, [Safe MDX](https://docs.weblate.org/en/latest/user/checks.md#check-safe-mdx) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `path/*.mdx` | | Monolingual base language file | `path/en.mdx` | | Template for new translations | `path/en.mdx` | | File format | MDX file | | File format parameters | `mdx_merge_duplicates=True` | ## Handling duplicate strings By default, Weblate treats each occurrence of a string as a separate translation unit to provide line-based context. This can be problematic in MDX tables or repeated component content, where reordering changes the context and can lead to translation loss. To consolidate identical strings into a single translation unit, enable Deduplicate identical strings in the [File format parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format-params). #### NOTE Enabling this option disables line-based context for the merged units, ensuring that translations remain stable even if rows or sections are moved within the document. # formats/mi18n.md # draggable/i18n lang files #### Versionadded Added in version 4.7. #### NOTE The library was former published as mi18n. File format used for JavaScript localization by [draggable/i18n](https://github.com/Draggable/i18n). Syntactically it matches [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop). #### SEE ALSO * [draggable/i18n](https://github.com/Draggable/i18n) * [Mozilla and Java properties files](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/properties.html) * [Java properties](https://docs.weblate.org/en/latest/formats/java.md#javaprop) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Format the Java properties file](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-properties-sort) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) #### Supported features | File extensions | `.properties` | |------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `mi18n-lang` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [ECMAScript template literals](https://docs.weblate.org/en/latest/user/checks.md#check-es-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `*.lang` | | Monolingual base language file | `en-US.lang` | | Template for new translations | Empty | | File format | draggabble/i18n lang file | # formats/moko-resources.md # Mobile Kotlin resources #### Versionadded Added in version 5.4. A variant of [Android string resources](https://docs.weblate.org/en/latest/formats/android.md). It differs in plural tag (`plural` is used instead of `plurals`) and escaping. #### SEE ALSO * [Mobile Kotlin resources](https://github.com/icerockdev/moko-resources) * [Android string resources](https://docs.weblate.org/en/latest/formats/android.md) * [Android string resources](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/android.html) #### Supported features | File extensions | `.xml` | |------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | API identifier | `moko-resource` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `Yes` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [Java format](https://docs.weblate.org/en/latest/user/checks.md#check-java-printf-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `commonMain/composeResources/values-*/strings.xml` | | Monolingual base language file | `commonMain/composeResources/values/strings.xml` | | Template for new translations | Empty | | File format | Mobile Kotlin Resource | # formats/nextcloud-json.md # Nextcloud Apps JSON files #### Versionadded Added in version 5.15. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. JSON-based format used in Nextcloud Apps that use JavaScript and HTML. #### SEE ALSO * [JSON](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/json.html) * [JSON files](https://docs.weblate.org/en/latest/formats/json.md) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Customize JSON output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-json-customize) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) Example file: ```json { "translations": { "Hello, world!\n": "Ahoj světe!\n", "Orangutan has %d banana.\n": null, "Try Weblate at !\n": null, "Thank you for using Weblate.": null } } ``` #### Supported features | File extensions | `.json` | |------------------------------------------------------------------------------------------------------|------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `nextcloud-json` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `langs/*.json` | | Monolingual base language file | `langs/en.json` | | Template for new translations | Empty | | File format | Nextcloud JSON file | # formats/odf.md # OpenDocument Format #### Versionadded Added in version 4.1. The translatable content is extracted from the OpenDocument files and offered for the translation. #### SEE ALSO [OpenDocument Format](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/odf.html) #### Supported features | File extensions | `.odc`, `.odf`, `.odg`, `.odi`, `.odm`, `.odp`, `.ods`, `.odt`, `.otc`, `.otf`, `.otg`, `.oth`, `.oti`, `.otp`, `.ots`, `.ott`, `.sxw` | |------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `odf` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | `strict-same` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `path/*.odt` | | Monolingual base language file | `path/en.odt` | | Template for new translations | `path/en.odt` | | File format | OpenDocument file | # formats/php.md # PHP strings PHP translations are usually monolingual, so it is recommended to specify a base file with (what is most often the) English strings. Weblate currently supports several variants of PHP translations: * Monolingual PHP strings in various syntax * [Laravel PHP strings](https://docs.weblate.org/en/latest/formats/laravel.md#laravel-php) Example file: ```php #### Supported features | File extensions | `.php` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `php` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `lang/*/texts.php` | | Monolingual base language file | `lang/en/texts.php` | | Template for new translations | `lang/en/texts.php` | | File format | PHP strings | # formats/qt.md # Qt Linguist .ts Translation format used in Qt based applications. Qt Linguist files are used as both bilingual and monolingual translations. Weblate supports both the current version 2 format and the legacy version 1 format. Select the file format matching the version produced by your application. #### SEE ALSO * [Qt Linguist manual](https://doc.qt.io/qt-6/qtlinguist-index.html) * [Qt .ts](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/ts.html) * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) ## Version 2 This is the default format for `.ts` files and supports the full set of Qt Linguist features available in Weblate. Example file: ```xml UTF-8 Hello, world! Ahoj svete! Orangutan has %d banana(s). Second Try Weblate at <https://demo.weblate.org/>! Thank you for using Weblate. Thanks Obsolete Thanks ``` #### Supported features | File extensions | `.ts` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `Yes` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | Additional states [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-states) | `Needs editing` | | API identifier | `ts` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Version 1 The legacy format supports messages, contexts and the unfinished state. It does not support plurals, locations, descriptions or Weblate flags. #### Supported features | File extensions | `.ts` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | Additional states [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-states) | `Needs editing` | | API identifier | `ts1` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) when using as bilingual | |--------------------------------|----------------------------------------------------------------------------------------------------------------------------| | File mask | `i18n/app.*.ts` | | Monolingual base language file | Empty | | Template for new translations | `i18n/app.de.ts` | | File format | Qt Linguist translation file
(version 2) | | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) when using as monolingual | |--------------------------------|------------------------------------------------------------------------------------------------------------------------------| | File mask | `i18n/app.*.ts` | | Monolingual base language file | `i18n/app.en.ts` | | Template for new translations | `i18n/app.en.ts` | | File format | Qt Linguist translation file
(version 2) | For version 1 files, use the same configuration and select Qt Linguist translation file (version 1) as the file format. # formats/resjson.md # JavaScript Resource Files (RESJSON) #### Versionadded Added in version 5.15. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. JSON-based format used in Windows Store apps that use JavaScript and HTML. Sometimes it is also referred as Windows JSON. #### SEE ALSO * [JSON](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/json.html) * [JSON files](https://docs.weblate.org/en/latest/formats/json.md) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Customize JSON output](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-json-customize) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) Example file: ```json { "hello": "Ahoj světe!\n", "_hello.source": "Hello, world!\n", "orangutan": "", "_orangutan.source": "Orangutan has %d banana.\n", "weblate": "", "_weblate.source": "Try Weblate at !\n", "thanks": "", "_thanks.source": "Thank you for using Weblate." } ``` #### Supported features | File extensions | `.json` | |------------------------------------------------------------------------------------------------------|-----------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `resjson` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `langs/*.json` | | Monolingual base language file | `langs/en.json` | | Template for new translations | Empty | | File format | RESJSON file | # formats/resourcedict.md # ResourceDictionary files #### Versionadded Added in version 4.13. ResourceDictionary is a monolingual XML file format used to package localizable string resources for Windows Presentation Foundation (WPF) applications. #### SEE ALSO * [Flat XML](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/flatxml.html) * [Flat XML files](https://docs.weblate.org/en/latest/formats/flatxml.md#flatxml) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) Example file: ```xml Hello World! Translated value. ``` #### Supported features | File extensions | `.xaml` | |------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | API identifier | `resourcedictionary` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [C# format](https://docs.weblate.org/en/latest/user/checks.md#check-c-sharp-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `Languages/*.xaml` | | Monolingual base language file | `Language/en.xaml` | | Template for new translations | Empty | | File format | ResourceDictionary file | # formats/resx.md # .NET resource files (RESX, RESW) A .NET XML resource file employs a monolingual XML file format used in Microsoft .NET applications. It can use `.resx` or `.resw` extension. Despite the difference of file extension, the `.resw` file format is identical to the `.resx` file format, except that `.resw` files may contain only strings and file paths. #### SEE ALSO * [.NET Resource files (.resx)](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/resx.html) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) * [Cleanup translation files](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-cleanup-generic) Example file: ```xml text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 Hello, world! Orangutan has %d banana. Try Weblate at https://demo.weblate.org/! Thank you for using Weblate. ``` #### Supported features | File extensions | `.resx` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | API identifier | `resx` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `Resources/Language.*.resx` | | Monolingual base language file | `Resources/Language.resx` | | Template for new translations | Empty | | File format | .NET resource file | # formats/ruby.md # Ruby YAML files Ruby i18n YAML files with language as root node. #### SEE ALSO * [YAML](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/yaml.html) * [YAML files](https://docs.weblate.org/en/latest/formats/yaml.md#yaml) Example Ruby i18n YAML file: ```yaml cs: weblate: hello: "" orangutan: one: "Orangutan má %d banán.\n" few: "Orangutan má %d banány.\n" other: "Orangutan má %d banánů.\n" try: "" thanks: "" ``` #### Supported features | File extensions | `.ryml`, `.yaml`, `.yml` | |------------------------------------------------------------------------------------------------------|----------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `ruby-yaml` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `translations/messages.*.yml` | | Monolingual base language file | `translations/messages.en.yml` | | Template for new translations | Empty | | File format | Ruby YAML file | # formats/stringsdict.md # Stringsdict format #### Versionadded Added in version 4.8. XML based format used by Apple which is able to store plural forms of a string. #### SEE ALSO * [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md#apple) * [Stringsdict File Format](https://developer.apple.com/documentation/xcode/localizing-strings-that-contain-plurals) Example file: ```xml hello NSStringLocalizedFormatKey Hello, world! ``` #### Supported features | File extensions | `.stringsdict` | |------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `stringsdict` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | | Check flags added by this format [ⓘ](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) | [Objective-C format](https://docs.weblate.org/en/latest/user/checks.md#check-objc-format) | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `Resources/*.lproj/Localizable.stringsdict` | | Monolingual base language file | `Resources/en.lproj/Localizable.stringsdict` or
`Resources/Base.lproj/Localizable.stringsdict` | | Template for new translations | Empty | | File format | Stringsdict file | # formats/subtitles.md # Subtitle files Weblate can translate various subtitle files: * SubRip subtitle file (`*.srt`) * MicroDVD subtitle file (`*.sub`) * Advanced Substation Alpha subtitles file (`*.ass`) * Substation Alpha subtitle file (`*.ssa`) #### SEE ALSO [Subtitles](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/subtitles.html) #### Supported features | File extensions | `.ass`, `.srt`, `.ssa`, `.sub` | |------------------------------------------------------------------------------------------------------|----------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `Yes` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `ass`, `srt`, `ssa`, `sub` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `path/*.srt` | | Monolingual base language file | `path/en.srt` | | Template for new translations | `path/en.srt` | | File format | SubRip subtitle file | # formats/tbx.md # TermBase eXchange format #### Versionadded Added in version 4.5. #### Versionchanged Changed in version 5.12. TBX is an XML format for the exchange of terminology data. #### SEE ALSO * [TBX on Wikipedia](https://en.wikipedia.org/wiki/TermBase_eXchange) * [TBX](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/tbx.html) * [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) #### Supported features | File extensions | `.tbx` | |------------------------------------------------------------------------------------------------------|-----------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `Yes` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | API identifier | `tbx` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Term alternatives Each TBX concept is one string with independent lists of source and target alternatives. Weblate reads every direct `` in the selected languages; IDs are optional and do not pair alternatives across languages. All source alternatives can match in the glossary, and each permitted target can be copied separately. Term statuses and notes are displayed with their alternatives. See [Multivalue formats](https://docs.weblate.org/en/latest/formats.md#format-multivalue) for how alternatives are handled by quality checks, automatic fixes, and machine translation. When editing alternatives, unchanged text is matched first, including duplicate occurrences. Remaining alternatives reuse unmatched terms in their original order, retaining IDs and metadata. Renaming and deleting alternatives together can therefore associate a renamed term with the first unmatched term’s metadata. New alternatives are created without IDs. Term metadata is read-only in Weblate. A missing target language does not remove a concept whose source exists. DNT terms can use the matching source alternative without creating a translation. Language codes still need to match the component configuration. ## Explanations Weblate loads and saves explanation from TBX files to be displayed in [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary). * Translation explanation is stored as `` tag. * Source string explanation is stored as `` tag. * Source string description is stored as `` tag. Concept notes are shared. Language notes are read only for the selected language, and term notes belong to their own alternative. Editing a target explanation does not overwrite notes in other languages. TBX components offer native and generated TBX downloads. Conversion to formats that use grammatical plurals is unavailable because those formats cannot preserve independent source and target alternatives. Generated TBX downloads preserve represented flags, explanations, alternative IDs, statuses, and note scopes. Weblate flags use the same `weblate-flags` attribute as native TBX storage. Native file editing also preserves unrecognized XML and unselected languages; generated exports contain the selected language pair. ## Glossary flags and read-only metadata Weblate imports terms with `forbidden` or `obsolete` administrative status in `` as [Forbidden translations](https://docs.weblate.org/en/latest/user/glossary.md#glossary-forbidden). Terms with `No` are imported as read-only strings, see [Untranslatable terms](https://docs.weblate.org/en/latest/user/glossary.md#glossary-untranslatable). ## Importing glossary files TBX can store multiple languages in one XML file, but Weblate still maps each component file to a translation language using the component file mask. For a TBX glossary component, the component source language is used for source terms and the language parsed from the file name is used as the target glossary language. Avoid naming a TBX translation file with the same language code as the component source language, because the source language already exists in Weblate and the file can be detected as a duplicate language. The Add upload method preserves alternative IDs, statuses, and scoped notes when importing TBX into a TBX glossary. #### SEE ALSO * [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) * [Language aliases](https://docs.weblate.org/en/latest/admin/projects.md#project-language-aliases) * [Language filter](https://docs.weblate.org/en/latest/admin/projects.md#component-language-regex) ## Example files Example file: ```xml

Translate Toolkit

address bar adresní řádek administrator správce Example source string explanation text Example source string description text administrate spravovat Example translation string explanation text No Weblate example forbidden term forbidden příklad zakázaného výrazu
``` ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `tbx/*.tbx` | | Monolingual base language file | Empty | | Template for new translations | Empty | | File format | TermBase eXchange file | # formats/toml.md # TOML #### Versionadded Added in version 5.15. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. TOML is a generic format like [YAML files](https://docs.weblate.org/en/latest/formats/yaml.md) or [JSON files](https://docs.weblate.org/en/latest/formats/json.md) and can be used to localize applications. Weblate supports TOML in several variants: TOML file : Plain TOML file without support for plurals. go-i18n TOML file : go-i18n variant with plurals support. #### SEE ALSO * [TOML](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/toml.html) * [Updating target-language files](https://docs.weblate.org/en/latest/devel/integration.md#updating-target-files) Example file: ```toml hello = "Ahoj světe!\n" orangutan = "Orangutan má %d banán.\n" thanks = "Děkujeme za použití Weblate." try = "Zkus Weblate na !\n" ``` ```toml [hello] other = "Ahoj světe!\n" [orangutan] one = "Orangutan má %d banán.\n" other = "Orangutan má %d banány.\n" [thanks] other = "Děkujeme za použití Weblate." [try] other = "Zkus Weblate na !\n" ``` #### Supported features | File extensions | `.toml` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `toml` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `langs/*.toml` | | Monolingual base language file | `langs/en.toml` | | Template for new translations | Empty | | File format | TOML file | # formats/txt.md # Text files #### Versionadded Added in version 4.6. The translatable content is extracted from the plain text files and offered for the translation. Each paragraph is translated as a separate string. There are several flavors of this format: * Plain text file * DokuWiki text file * MediaWiki text file * [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md#markdown) * [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) #### NOTE Unlike most other formats, the changes in the translation files will not be imported to Weblate because it can not be done reliably. The source of truth for the translations is Weblate not the translated file. #### SEE ALSO [Simple Text Documents](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/text.html) Example file: ```default Hello, world! Orangutan has %d banana. Try Weblate at http://demo.weblate.org/! Thank you for using Weblate. ``` #### Supported features | File extensions | `.dw`, `.mw`, `.txt` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `dokuwiki`, `mediawiki`, `txt` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `path/*.txt` | | Monolingual base language file | `path/en.txt` | | Template for new translations | `path/en.txt` | | File format | Plain text file | | File format parameters | `txt_merge_duplicates=True` | ## Handling duplicate strings By default, Weblate treats each paragraph as a separate translation unit to provide line-based context. This can be problematic in text files where paragraphs are frequently reordered, as it changes the context and can lead to translation loss. To consolidate identical strings into a single translation unit, enable Deduplicate identical strings in the [File format parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-file-format-params). #### NOTE This parameter is shared with **DokuWiki** and **MediaWiki** formats. Enabling this option disables line-based context for the merged units. # formats/webextension.md # WebExtension JSON File format used when translating extensions for Mozilla Firefox or Google Chromium. #### NOTE While this format is called JSON, its specification allows including “//”-style comments. Weblate does strip these comments while parsing the files and discards them when saving. #### SEE ALSO * [JSON](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/json.html) * [Google chrome.i18n](https://developer.chrome.com/docs/extensions/reference/api/i18n) * [Mozilla Extensions Internationalization](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Internationalization) Example file: ```json { "hello": { "message": "Ahoj světe!\n", "description": "Description", "placeholders": { "url": { "content": "$1", "example": "https://developer.mozilla.org" } } }, "orangutan": { "message": "Orangutan has $coUnT$ bananas", "description": "Description", "placeholders": { "count": { "content": "$1", "example": "5" } } }, "try": { "message": "", "description": "Description" }, "thanks": { "message": "", "description": "Description" } } ``` #### Supported features | File extensions | `.json` | |------------------------------------------------------------------------------------------------------|----------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `webextension` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `_locales/*/messages.json` | | Monolingual base language file | `_locales/en/messages.json` | | Template for new translations | Empty | | File format | WebExtension JSON file | # formats/winrc.md # Windows RC files #### Versionchanged Changed in version 4.1: Support for Windows RC files has been rewritten. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. RC files are language files used to localize translatable text, dialogs, menus, for Windows applications. #### SEE ALSO [Windows RC files](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/rc.html) ## Example files Example Windows RC file: ```c LANGUAGE LANG_CZECH, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_MSG1 "Hello, world!\n" IDS_MSG2 "Orangutan has %d banana.\n" IDS_MSG3 "Try Weblate at http://demo.weblate.org/!\n" IDS_MSG4 "Thank you for using Weblate." END ``` #### Supported features | File extensions | `.rc` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `rc` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `lang/*.rc` | | Monolingual base language file | `lang/en-US.rc` | | Template for new translations | `lang/en-US.rc` | | File format | RC file | # formats/wxl.md # WixLocalization file #### Versionadded Added in version 5.16.1. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. WixLocalization (WXL) files are language files used to localize translatable text, dialogs, menus, for WiX Toolset. #### SEE ALSO [WiX Localization files (.wxl)](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/wxl.html) ## Example files Example WXL file: ```xml ``` #### Supported features | File extensions | `.wxl` | |------------------------------------------------------------------------------------------------------|-------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Monolingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `wxl` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `lang/*.wxl` | | Monolingual base language file | `lang/en-us.wxl` | | Template for new translations | `lang/en-us.wxl` | | File format | WixLocalization file | # formats/xliff.md # XLIFF 1.1 and 1.2 #### NOTE [XLIFF 2.0](https://docs.weblate.org/en/latest/formats/xliff2.md) is a different format and is not backwards compatible with XLIFF 1.2. XML-based format created to standardize translation files, but in the end it is one of [many standards](https://xkcd.com/927/), in this area. XML Localization Interchange File Format (XLIFF) is usually used as bilingual, but Weblate supports it as monolingual as well. Weblate supports XLIFF in several variants: XLIFF 1.2 translation file : Simple XLIFF file where content of the elements is stored as plain text (all XML elements being escaped). XLIFF 1.2 with placeables support : Standard XLIFF supporting placeables and other XML elements. XLIFF 1.2 with gettext extensions : XLIFF enriched by [XLIFF 1.2 Representation Guide for Gettext PO](https://docs.oasis-open.org/xliff/v1.2/xliff-profile-po/xliff-profile-po-1.2-cd02.html) to support plurals. XLIFF 1.2 with Apple extensions : XLIFF enriched by Apple to support plurals. #### SEE ALSO * [XML Localization Interchange File Format (XLIFF)](https://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html) specification * [XLIFF 1.2 Representation Guide for Gettext PO](https://docs.oasis-open.org/xliff/v1.2/xliff-profile-po/xliff-profile-po-1.2-cd02.html) * [XLIFF on Wikipedia](https://en.wikipedia.org/wiki/XLIFF) * [XLIFF](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/xliff.html) ## Translation states The `state` attribute in the file is partially processed and mapped to the “Needs edit” state in Weblate (the following states are used to flag the string as needing edit if there is a target present: `new`, `needs-translation`, `needs-adaptation`, `needs-l10n`). Should the `state` attribute be missing, a string is considered translated as soon as a `` element exists. If the translation string has `approved="yes"`, it will also be imported into Weblate as “Approved”, anything else will be imported as “Waiting for review” (which matches the XLIFF specification). While saving, Weblate doesn’t add those attributes unless necessary: * The `state` attribute is only added in case string is marked as needing edit. * The `approved` attribute is only added in case string has been reviewed. * In other cases the attributes are not added, but they are updated in case they are present. That means that when using the XLIFF format, it is strongly recommended to turn on the Weblate review process, in order to see and change the approved state of strings. Similarly upon importing such files (in the upload form), you should choose Import as translated under Processing of strings needing edit. #### SEE ALSO [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews) ## Whitespace and newlines in XLIFF Generally types or amounts of whitespace is not differentiated between in XML formats. If you want to keep it, you have to add the `xml:space="preserve"` flag to the string. For example: ```xml hello Hello, world! ``` ## Specifying translation flags You can specify additional translation flags (see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks)) by using the `weblate-flags` attribute. Weblate also understands `maxwidth` and `font` attributes from the XLIFF specification: ```xml Hello %s Hello %s ``` The `font` attribute is parsed for font family, size and weight, the above example shows all of that, though only font family is required. Any whitespace in the font family is converted to underscore, so `Source Sans Pro` becomes `Source_Sans_Pro`, please keep that in mind when naming the font group (see [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts)). #### SEE ALSO * [font attribute in XLIFF 1.2](https://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html#font) * [maxwidth attribute in XLIFF 1.2](https://docs.oasis-open.org/xliff/v1.2/os/xliff-core.html#maxwidth) ## String keys Weblate identifies the units in the XLIFF file by `resname` attribute in case it is present and falls back to `id` (together with `file` tag if present). The `resname` attribute is supposed to be human friendly identifier of the unit making it more suitable for Weblate to display instead of `id`. The `resname` has to be unique in the whole XLIFF file. This is required by Weblate and is not covered by the XLIFF standard - it does not put any uniqueness restrictions on this attribute. ## Example files Example XLIFF file: ```xml Hello, world! Orangutan has %d banana. Try Weblate at <https://demo.weblate.org/>! Thank you for using Weblate. ``` #### Supported features | File extensions | `.mxliff`, `.poxliff`, `.sdlxliff`, `.xlf`, `.xliff` | |------------------------------------------------------------------------------------------------------|--------------------------------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `Yes` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | Additional states [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-states) | `Approved`, `Needs editing` | | API identifier | `apple-xliff`, `plainxliff`, `poxliff`, `xliff` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `Yes` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for bilingual XLIFF | |--------------------------------|------------------------------------------------------------------------------------------------------------------------| | File mask | `localizations/*.xliff` | | Monolingual base language file | Empty | | Template for new translations | `localizations/en-US.xliff` | | File format | XLIFF Translation File | | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) for monolingual XLIFF | |--------------------------------|--------------------------------------------------------------------------------------------------------------------------| | File mask | `localizations/*.xliff` | | Monolingual base language file | `localizations/en-US.xliff` | | Template for new translations | `localizations/en-US.xliff` | | File format | XLIFF Translation File | # formats/xliff2.md # XLIFF 2.0 #### Versionadded Added in version 5.15. #### NOTE Support for this format is under development. Some features might not yet be available and the behavior can change between releases. Feedback from testing is welcome. #### NOTE [XLIFF 1.1 and 1.2](https://docs.weblate.org/en/latest/formats/xliff.md) is a different format and is not compatible with XLIFF 2.0. XML-based format created to standardize translation files, but in the end it is one of [many standards](https://xkcd.com/927/), in this area. XML Localization Interchange File Format (XLIFF) 2.0 is currently only supported as bilingual. Weblate supports XLIFF in several variants: XLIFF 2.0 translation file : Simple XLIFF file where content of the elements is stored as plain text (all XML elements being escaped). XLIFF 2.0 with placeables support : Standard XLIFF supporting placeables and other XML elements. #### SEE ALSO * [XML Localization Interchange File Format (XLIFF) 2.0](https://docs.oasis-open.org/xliff/xliff-core/v2.0/xliff-core-v2.0.html) specification * [XLIFF on Wikipedia](https://en.wikipedia.org/wiki/XLIFF) * [XLIFF](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/xliff.html) ## Example files Example XLIFF file: ```xml Hello, world! Ahoj světe! Orangutan has %d banana. Try Weblate at <https://demo.weblate.org/>! Thank you for using Weblate. ``` #### Supported features | File extensions | `.xlf`, `.xliff` | |------------------------------------------------------------------------------------------------------|-------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `Yes` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `Yes` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `Yes` | | Additional states [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-states) | `Approved`, `Needs editing` | | API identifier | `xliff2`, `xliff2-placeables` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `Yes` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `localizations/*.xliff` | | Monolingual base language file | Empty | | Template for new translations | `localizations/en-US.xliff` | | File format | XLIFF 2.0 Translation File | # formats/xwiki.md # XWiki formats Weblate supports several translation formats used by XWiki. ## XWiki Java properties #### Supported features | File extensions | `.properties` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `xwiki-java-properties` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## XWiki page properties #### Supported features | File extensions | `.xml` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `Yes` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `xwiki-page-properties` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## XWiki full page #### Supported features | File extensions | `.xml` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `Yes` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `xwiki-fullpage` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | # formats/yaml.md # YAML files The plain YAML files with string keys and values. Weblate also extract strings from lists or dictionaries. Weblate currently supports several variants of YAML translations: * Files with nested keys. * [Ruby YAML files](https://docs.weblate.org/en/latest/formats/ruby.md#ryaml) #### SEE ALSO * [YAML](https://docs.translatehouse.org/projects/translate-toolkit/en/latest/formats/yaml.html) * [Ruby YAML files](https://docs.weblate.org/en/latest/formats/ruby.md#ryaml) Example of a YAML file: ```yaml weblate: hello: "" orangutan: "" try: "" thanks: "" ``` #### Supported features | File extensions | `.pyml`, `.yaml`, `.yml` | |------------------------------------------------------------------------------------------------------|--------------------------------| | Linguality [ⓘ](https://docs.weblate.org/en/latest/formats.md#bimono) | Both monolingual and bilingual | | Supports plural [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-plurals) | `No` | | Supports descriptions [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-description) | `No` | | Supports explanation [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-explanation) | `No` | | Supports context [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-context) | `No` | | Supports location [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-location) | `No` | | Supports flags [ⓘ](https://docs.weblate.org/en/latest/formats.md#format-flags) | `No` | | API identifier | `yaml` | | Supports read-only strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#read-only-strings) | `No` | | Supports removing obsolete strings [ⓘ](https://docs.weblate.org/en/latest/formats.md#obsolete-strings) | `No` | ## Weblate configuration | | Typical Weblate [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) | |--------------------------------|----------------------------------------------------------------------------------------------------| | File mask | `translations/messages.*.yml` | | Monolingual base language file | `translations/messages.en.yml` | | Template for new translations | Empty | | File format | YAML file | ## File format parameters [File format parameters](https://docs.weblate.org/en/latest/formats.md#file-format-params) with the pattern yaml_\* can be used to configure the behavior of the YAML format. # python.md # Weblate’s Python API ## Installation The Python API is shipped separately as the [Weblate Client](https://pypi.org/project/wlc/) package: ```sh pip install wlc ``` ## [`wlc`](https://docs.weblate.org/en/latest/python.md#module-wlc) The [`wlc`](https://docs.weblate.org/en/latest/python.md#module-wlc) module exposes the Weblate API client, API objects returned by the client, and exceptions raised for common API failures. ### [`Weblate`](https://docs.weblate.org/en/latest/python.md#wlc.Weblate) The [`Weblate`](https://docs.weblate.org/en/latest/python.md#wlc.Weblate) class is the main API entry point. Constructing it directly does not load Weblate Client configuration files or `WLC_*` environment variables; its connection settings come from the supplied arguments: ```python from wlc import Weblate client = Weblate( url="https://hosted.weblate.org/api/", key="APIKEY", ) projects = list(client.list_projects()) ``` To use configuration-file and environment discovery, explicitly load [`WeblateConfig`](https://docs.weblate.org/en/latest/python.md#wlc.config.WeblateConfig) and pass it to the client: ```python from wlc import Weblate from wlc.config import WeblateConfig config = WeblateConfig() config.load() client = Weblate(config=config) ``` The Python client follows the same URL, credential, and transport policy as the command-line client, see [Security model](https://docs.weblate.org/en/latest/wlc.md#wlc-security). Direct API consumers remain responsible for safely rendering and storing returned values. ### *class* wlc.Weblate(key: str = '', url: str = 'http://127.0.0.1:8000/api/', config: [WeblateConfig](https://docs.weblate.org/en/latest/python.md#wlc.config.WeblateConfig) | None = None, , retries: int = 0, status_forcelist: Collection[int] | None = None, allowed_methods: Collection[str] | None = None, backoff_factor: float = 0, timeout: int = 300, allow_insecure_http: bool = False, allow_insecure_ssl: bool = False) Weblate API wrapper object. * **Parameters:** * **key** – API key used for authenticated requests. * **url** – API server URL. The URL should point to the Weblate API root. * **config** – Configuration object. When supplied, it overrides the other connection and request options. * **retries** – Total number of HTTP retries. * **status_forcelist** – HTTP status codes that should trigger retries. * **allowed_methods** – HTTP methods that may be retried. * **backoff_factor** – Retry backoff factor passed to urllib3. * **timeout** – HTTP request timeout in seconds. * **allow_insecure_http** – Allow API keys over non-local `http://` URLs. * **allow_insecure_ssl** – Disable TLS certificate verification. When an API key is configured, non-local `http://` URLs are rejected by default. Use HTTPS, loopback HTTP for local development, or set `allow_insecure_http` only for legacy deployments where HTTPS is not available. Credentials embedded in API URLs are not supported; configure an API key instead. #### add_source_string(project: str, component: str, msgid: str, msgstr: str | list[str], source_language: str | None = None) → dict[str, Any] Adds a source string to a monolingual base file. #### create_component(project: str, \*\*kwargs: Any) → dict[str, Any] Create a new component for project in the instance. #### create_language(code: str, name: str, direction: str = 'ltr', plural: dict[str, Any] | None = None) → dict[str, Any] Create a new language. #### create_project(name: str, slug: str, website: str, source_language_name: str | None = None, source_language_code: str | None = None) → dict[str, Any] Create a new project in the instance. #### get(path: str, params: Mapping[str, Any] | None = None) → Any Perform GET request on the API. #### get_component(path: str) → [Component](https://docs.weblate.org/en/latest/python.md#wlc.Component) Return component of given path. #### get_object(path: str) → [Project](https://docs.weblate.org/en/latest/python.md#wlc.Project) | [Component](https://docs.weblate.org/en/latest/python.md#wlc.Component) | [Translation](https://docs.weblate.org/en/latest/python.md#wlc.Translation) | [Unit](https://docs.weblate.org/en/latest/python.md#wlc.Unit) Return object based on path. Operates on (project, component or translation objects. #### get_project(path: str) → [Project](https://docs.weblate.org/en/latest/python.md#wlc.Project) Return project of given path. #### get_translation(path: str) → [Translation](https://docs.weblate.org/en/latest/python.md#wlc.Translation) Return translation of given path. #### get_unit(path: str) → [Unit](https://docs.weblate.org/en/latest/python.md#wlc.Unit) Return unit of given path. #### invoke_request(method: str, path: str, data: Mapping[str, Any] | None = None, files: Mapping[str, Any] | None = None, params: Mapping[str, Any] | None = None) → Response Construct request object. #### list_categories(path: str = 'categories/') → Iterator[[Category](https://docs.weblate.org/en/latest/python.md#wlc.Category)] List categories in the instance. #### list_changes(path: str = 'changes/') → Iterator[[Change](https://docs.weblate.org/en/latest/python.md#wlc.Change)] List changes in the instance. #### list_components(path: str = 'components/') → Iterator[[Component](https://docs.weblate.org/en/latest/python.md#wlc.Component)] List components in the instance. #### list_languages() → Iterator[[Language](https://docs.weblate.org/en/latest/python.md#wlc.Language)] List languages in the instance. #### list_projects(path: str = 'projects/') → Iterator[[Project](https://docs.weblate.org/en/latest/python.md#wlc.Project)] List projects in the instance. #### list_translations(path: str = 'translations/') → Iterator[[Translation](https://docs.weblate.org/en/latest/python.md#wlc.Translation)] List translations in the instance. #### list_units(path: str, params: Mapping[str, Any] | None = None) → Iterator[[Unit](https://docs.weblate.org/en/latest/python.md#wlc.Unit)] List units in the instance. #### post(path: str, files: Mapping[str, Any] | None = None, params: Mapping[str, Any] | None = None, \*\*kwargs: Any) → dict[str, Any] Perform POST request on the API. #### raw_request(method: str, path: str, data: Mapping[str, Any] | None = None, files: Mapping[str, Any] | None = None, params: Mapping[str, Any] | None = None) → bytes Construct request object and returns raw content. #### request(method: str, path: str, data: Mapping[str, Any] | None = None, files: Mapping[str, Any] | None = None, params: Mapping[str, Any] | None = None) → Any Construct request object and returns json response. ### Exceptions ### *exception* wlc.WeblateException(message: str | None = None) Generic error. ### *exception* wlc.WeblatePermissionError(message: str | None = None) You don’t have permission to access this object. ### *exception* wlc.WeblateDeniedError(message: str | None = None) Access denied, API key is wrong or missing. ### *exception* wlc.WeblateThrottlingError(limit: str, retry_after: str) Throttling on the server. ### API objects API objects support attribute and keyed access to their fields, together with `keys()` and `items()`. Accessing a known field that is not loaded yet fetches the object from the API. `get_data()` returns a copy of only the data currently loaded without fetching missing fields. Projects, components, and translations share repository operations: `repository()`, `commit()`, `push()`, `pull()`, `reset()`, and `cleanup()`. ### *class* wlc.Project(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str, \*\*kwargs: Any) Project object returned by the Weblate API. #### categories() → Iterator[[Category](https://docs.weblate.org/en/latest/python.md#wlc.Category)] List categories in the project. #### changes() → Iterator[[Change](https://docs.weblate.org/en/latest/python.md#wlc.Change)] List changes in the project. #### cleanup() → dict[str, Any] Cleanup Weblate repository from untracked files. #### commit() → dict[str, Any] Commit Weblate changes. #### create_component(\*\*kwargs: Any) → dict[str, Any] Create a new component in the project. #### delete() → None Delete the project. #### full_slug() → str Return the project slug. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. #### languages() → builtins.list[[LanguageStats](https://docs.weblate.org/en/latest/python.md#wlc.LanguageStats)] Return language statistics for the project. #### list() → Iterator[[Component](https://docs.weblate.org/en/latest/python.md#wlc.Component)] List components in the project. #### pull() → dict[str, Any] Pull upstream changes into Weblate. #### push() → dict[str, Any] Push Weblate changes upstream. #### repository() → LazyObject Return repository object. #### reset() → dict[str, Any] Reset Weblate repository to upstream. #### statistics() → [Statistics](https://docs.weblate.org/en/latest/python.md#wlc.Statistics) Return statistics for the project. ### *class* wlc.Component(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str, \*\*kwargs: Any) Component object returned by the Weblate API. #### add_source_string(msgid: str, msgstr: str | builtins.list[str]) → dict[str, Any] Adds a source string to a monolingual base file. #### add_translation(language: str) → dict[str, Any] Creates a new translation in the component. #### changes() → Iterator[[Change](https://docs.weblate.org/en/latest/python.md#wlc.Change)] List changes in the component. #### cleanup() → dict[str, Any] Cleanup Weblate repository from untracked files. #### commit() → dict[str, Any] Commit Weblate changes. #### delete() → None Delete the component. #### download(convert: str | None = None) → bytes Download translation file from server. #### full_slug() → str Return the component slug including project and category path. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. #### list() → Iterator[[Translation](https://docs.weblate.org/en/latest/python.md#wlc.Translation)] List translations in the component. #### lock() → dict[str, Any] Lock component from translations. #### lock_status() → dict[str, Any] Return component lock status. #### patch(\*\*kwargs: Any) → bytes Update component fields. #### pull() → dict[str, Any] Pull upstream changes into Weblate. #### push() → dict[str, Any] Push Weblate changes upstream. #### repository() → LazyObject Return repository object. #### reset() → dict[str, Any] Reset Weblate repository to upstream. #### statistics() → Iterator[[TranslationStatistics](https://docs.weblate.org/en/latest/python.md#wlc.TranslationStatistics)] Return statistics for component. #### unlock() → dict[str, Any] Unlock component from translations. ### *class* wlc.Translation(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str, \*\*kwargs: Any) Translation object returned by the Weblate API. #### changes() → Iterator[[Change](https://docs.weblate.org/en/latest/python.md#wlc.Change)] List changes in the translation. #### cleanup() → dict[str, Any] Cleanup Weblate repository from untracked files. #### commit() → dict[str, Any] Commit Weblate changes. #### delete() → None Delete the translation. #### download(convert: str | None = None) → bytes Download translation file from server. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. #### list() → [Translation](https://docs.weblate.org/en/latest/python.md#wlc.Translation) API compatibility method, returns self. #### pull() → dict[str, Any] Pull upstream changes into Weblate. #### push() → dict[str, Any] Push Weblate changes upstream. #### repository() → LazyObject Return repository object. #### reset() → dict[str, Any] Reset Weblate repository to upstream. #### statistics() → [TranslationStatistics](https://docs.weblate.org/en/latest/python.md#wlc.TranslationStatistics) Return statistics for translation. #### units(\*\*kwargs: Any) → Iterator[[Unit](https://docs.weblate.org/en/latest/python.md#wlc.Unit)] List units in the translation. #### upload(file: Any, overwrite: bool | None = None, format: str | None = None, \*\*kwargs: Any) → dict[str, Any] Upload a translation file to server. ### *class* wlc.Unit(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str, \*\*kwargs: Any) Translation unit object returned by the Weblate API. #### delete() → bytes Delete the unit. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. #### list() → [Unit](https://docs.weblate.org/en/latest/python.md#wlc.Unit) API compatibility method, returns self. #### patch(\*\*kwargs: Any) → bytes Update unit fields using HTTP PATCH. #### put(\*\*kwargs: Any) → bytes Update unit fields using HTTP PUT. ### *class* wlc.Category(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str, \*\*kwargs: Any) Category object returned by the Weblate API. #### full_slug() → str Return the category slug including the project and parent categories. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. ### *class* wlc.Language(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str, \*\*kwargs: Any) Language object returned by the Weblate API. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. ### *class* wlc.Change(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str, \*\*kwargs: Any) Change object returned by the Weblate API. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. ### *class* wlc.Statistics(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str = '', \*\*kwargs: Any) Statistics object returned by the Weblate API. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. #### keys() → Any Return present statistics fields without fetching URL-less objects. #### refresh() → None Refresh statistics when a backing API URL is available. ### *class* wlc.LanguageStats(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str = '', \*\*kwargs: Any) Language statistics object returned by the Weblate API. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. #### keys() → Any Return present statistics fields without fetching URL-less objects. #### refresh() → None Refresh statistics when a backing API URL is available. ### *class* wlc.TranslationStatistics(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str = '', \*\*kwargs: Any) Translation statistics object returned by the Weblate API. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. #### keys() → Any Return present statistics fields without fetching URL-less objects. #### refresh() → None Refresh statistics when a backing API URL is available. ### *class* wlc.ProjectRepository(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str, \*\*kwargs: Any) Project repository status object. #### cleanup() → dict[str, Any] Cleanup Weblate repository from untracked files. #### commit() → dict[str, Any] Commit Weblate changes. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. #### pull() → dict[str, Any] Pull upstream changes into Weblate. #### push() → dict[str, Any] Push Weblate changes upstream. #### reset() → dict[str, Any] Reset Weblate repository to upstream. ### *class* wlc.Repository(weblate: [Weblate](https://docs.weblate.org/en/latest/python.md#wlc.Weblate), url: str, \*\*kwargs: Any) Component or translation repository status object. #### cleanup() → dict[str, Any] Cleanup Weblate repository from untracked files. #### commit() → dict[str, Any] Commit Weblate changes. #### get_data() → dict[str, Any] Return a copy of the currently loaded object data. #### pull() → dict[str, Any] Pull upstream changes into Weblate. #### push() → dict[str, Any] Push Weblate changes upstream. #### reset() → dict[str, Any] Reset Weblate repository to upstream. ## [`wlc.config`](https://docs.weblate.org/en/latest/python.md#module-wlc.config) ### *exception* wlc.config.WLCConfigurationError Configuration could not be loaded or combines unsafe option sources. ### *class* wlc.config.WeblateConfig(section: str = 'weblate') Configuration parser wrapper with defaults. * **Parameters:** **section** – Configuration section to use. The parser loads user configuration, optional project configuration, and command-line or environment overrides. API keys in project configuration are constrained so unscoped secrets can not be paired with a project-provided API URL. #### *static* find_config() → str | None Find the first user configuration file. #### *static* find_project_config() → str | None Find the nearest project configuration file. #### get_allow_insecure_http() → bool Return whether authenticated non-local HTTP URLs are allowed. The insecure HTTP opt-in is enable-only. Persistent configuration is scoped to the selected network origin. #### get_allow_insecure_ssl() → bool Return whether TLS verification is disabled for the selected origin. #### get_request_options() → tuple[int, list[int] | None, list[str], float, int] Get request retry and timeout options. #### get_url_key() → tuple[str, str] Get the resolved API URL and API key. #### load(path: Path | str | None = None) → None Load configuration from an explicit path or discovered locations. When `path` is specified, only that file is loaded. Otherwise the user configuration is loaded first, followed by the nearest project configuration file from the current directory or its parents. #### validate_url_key() → None Validate URL and key source combination. When the API URL comes from automatically discovered project configuration, unscoped keys must pin the destination explicitly: `WLC_KEY` requires `WLC_URL`, and a command-line key requires a command-line URL. # security/data-residency.md # Data residency and EU cloud sovereignty This page describes data-residency and cloud-sovereignty properties of Weblate services operated by Weblate s.r.o., including **Hosted Weblate** and **Weblate Cloud**. It does not describe arbitrary self-hosted Weblate deployments, where the deploying organization controls hosting, backups, integrations, legal basis, and retention. Weblate-operated services are designed for European data residency and customer control. The service operator is Weblate s.r.o., a company established in the European Union, and the primary hosting infrastructure is provided by Hetzner Online GmbH and Hetzner Finland Oy. ## Where data lives - Customer data, including translations, user information, operational data, and backups, is stored and processed within the European Union. - Primary service locations are in Germany. - No operational data leaves the EU unless explicitly requested or configured by the customer, for example by enabling external backups, repository hosting, authentication, e-mail, analytics, error reporting, or machine-translation integrations outside the EU. ## Infrastructure provider Weblate-operated services use Hetzner infrastructure. Hetzner Online GmbH and Hetzner Finland Oy are certified according to DIN ISO/IEC 27001:2022 for an information security management system covering infrastructure, operation, and customer support for their data center parks in Nuremberg, Falkenstein, and Helsinki. Hetzner states that its data centers use electricity from renewable sources. Its German data centers use hydropower, and its Finnish data center park has used hydropower since opening. #### SEE ALSO * [Hetzner ISMS and data protection](https://www.hetzner.com/unternehmen/zertifizierung/) * [Hetzner sustainability](https://www.hetzner.com/unternehmen/nachhaltigkeit/) ## EU cloud sovereignty Weblate-operated services are intended to support common European cloud sovereignty requirements: - **Data sovereignty:** Weblate stores and processes customer data in the EU. - **Operational sovereignty:** Weblate s.r.o. operates the application service from within the EU using EU infrastructure providers. - **Legal sovereignty:** The service is provided by an EU company and uses EU hosting infrastructure. This reduces exposure to non-EU cloud operators, but does not remove every possible cross-border legal or integration dependency. - **Technical sovereignty:** Weblate is libre software and can be self-hosted, migrated, or run as a dedicated deployment when an organization needs stronger isolation or deployment-specific controls. - **Customer control:** Projects, translations, and user data can be exported or deleted. External integrations are optional and configurable. The operational controls around security incidents and service continuity are documented in [Incident response plan for Weblate](https://docs.weblate.org/en/latest/security/incident-response-plan.md) and [Disaster recovery plan](https://docs.weblate.org/en/latest/security/disaster-recovery-plan.md). ## Cloud Sovereignty Framework The EU Cloud Sovereignty Framework and similar procurement frameworks are often described using Sovereignty Effectiveness Assurance Levels (SEAL). Weblate’s target direction for operated services is alignment with the expectations of **SEAL-4 / Full Digital Sovereignty**, especially EU locality, EU operation, data portability, open-source software, and customer control. Weblate does not currently claim formal SEAL-4 certification, third-party attestation, or equivalent public-sector framework approval. Such a claim would depend on a formal assessment route and on provider-level evidence from subprocessors such as Hetzner. For procurement reviews, the current evidence points are: - Weblate s.r.o. is the EU service operator. - Customer data for Weblate-operated services is hosted and processed in the EU. - The application is libre software and can be independently deployed. - Customer projects and translations can be exported. - External integrations are optional and configurable. - Hetzner publishes ISO/IEC 27001:2022 certification for the relevant data center parks. ## Cloud and AI Development Act The EU Cloud and AI Development Act is still an emerging legislative and policy initiative. Until final legal text and implementation guidance are available, Weblate treats Cloud and AI Development Act questions as procurement and readiness questions rather than as a formal compliance certification. The current Weblate service design supports likely cloud and AI sovereignty questions in these areas: - **European cloud infrastructure:** Weblate-operated services use EU hosting for customer data and operational data. - **Open-source stack:** Weblate is libre software, reducing dependency on proprietary cloud application code. - **Portability:** Translation files, project data, and user data can be exported. - **No mandatory external AI provider:** Core Weblate workflows do not require external AI or machine-translation services. - **Configurable AI and machine translation:** Automatic suggestions can use third-party machine translation or LLM providers only when configured by an administrator or project owner. These services can receive source strings, translations, and related context, so their use should be reviewed against the customer’s sovereignty and data-transfer requirements. Organizations that require AI processing to stay within a chosen jurisdiction can disable external machine-translation services or use a self-hosted provider such as LibreTranslate. #### SEE ALSO * [Privacy regulations compliance](https://docs.weblate.org/en/latest/security/privacy-compliance.md) * [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup) * [LibreTranslate Docker container integration](https://docs.weblate.org/en/latest/admin/install/docker.md#docker-libretranslate) ## Customer control Customers retain control over their Weblate data: - Project translation files can be downloaded from Weblate or synchronized back to the customer’s repository. - User data can be exported and account removal can be requested as described in [Privacy regulations compliance](https://docs.weblate.org/en/latest/security/privacy-compliance.md). - External integrations, including code hosting, authentication, e-mail, backups, analytics, error reporting, and machine translation, are optional and should be configured according to the customer’s transfer and processor requirements. - Dedicated Weblate instances are available for organizations needing stronger isolation or customized operational controls. ## Service legal documents #### NOTE These documents apply to Weblate deployments operated by Weblate s.r.o., such as Hosted Weblate and Weblate Cloud. * [General terms and conditions](https://weblate.org/terms/) * [Privacy policy](https://weblate.org/privacy/) * The data processing agreement can be obtained in the [Customer area](https://weblate.org/user/). # security/dependencies.md # Dependencies This page describes dependency inventory, vulnerability monitoring, dependency triage, and container vulnerability scanning. For published release artifacts, SBOMs, signatures, and provenance attestations, see [Release artifacts and verification](https://docs.weblate.org/en/latest/security/release-artifacts.md). ## Dependency inventory Weblate dependency information is maintained in several repository files: * Python dependencies are declared in `pyproject.toml` and resolved in `uv.lock`. * Frontend dependencies are declared in `client/package.json` and resolved in `client/yarn.lock`. * Vendored frontend libraries and generated license data are documented in [Subprojects and embedded code](https://docs.weblate.org/en/latest/contributing/submodules.md). * Release SBOMs are published for Weblate releases as described in [Software Bill of Material](https://docs.weblate.org/en/latest/security/release-artifacts.md#sbom). * Docker image and Helm chart dependencies are maintained in the Weblate-owned Docker and Helm repositories listed in [Release artifact inventory](https://docs.weblate.org/en/latest/security/release-artifacts.md#release-artifact-inventory). The dependency ranges in `pyproject.toml` describe the supported runtime requirements. The lock files describe the tested dependency set used by CI and release automation. ## Tracking dependencies for vulnerabilities Security issues in Weblate dependencies are monitored using [Renovate](https://www.mend.io/renovate/), GitHub dependency review, [FOSSA](https://fossa.com/), release SBOMs, and container vulnerability scans. The Weblate repositories extend the shared Renovate preset from [WeblateOrg/meta](https://github.com/WeblateOrg/meta). That preset enables the dependency dashboard, OSV vulnerability alerts, platform vulnerability alerts, semantic dependency commits, and Renovate custom managers for GitHub Actions, Dockerfiles, Helm chart application versions, and other pinned tool versions. It also configures selected package grouping, schedules, and automerge behavior. This repository adds `main` and `stable` as Renovate base branches. General dependency updates and lockfile maintenance are disabled on `stable`; security update coverage for Weblate releases is described in [Security updates](https://docs.weblate.org/en/latest/security/releases.md#security-updates). GitHub dependency review runs on pull requests to show dependency changes before they are merged. FOSSA runs on pushes to `main` and records scan and policy-test results in the FOSSA service. ## Dependency vulnerability triage When a dependency vulnerability is reported by Renovate, GitHub dependency review, FOSSA, a release SBOM review, a container scan, or a vulnerability report, maintainers evaluate whether it affects Weblate. The triage checks include: * whether the affected dependency and version are used by Weblate, a published release artifact, or a maintained deployment artifact; * whether the vulnerable code path is reachable through supported Weblate functionality or supported deployment modes; * whether the issue is in Weblate’s use of the dependency or should be reported to the upstream project; * whether a dependency update, configuration change, mitigation, advisory, or Weblate security update is needed. #### HINT There might be vulnerabilities in third-party libraries which do not affect Weblate, so those are not addressed by releasing bugfix versions of Weblate. ## Dependency and lockfile maintenance The Python lock file is maintained by the `uv lock update` workflow. The frontend dependency lock file and vendored frontend files are maintained by the `yarn update` workflow. Generated maintenance changes are passed through the `Apply maintenance patch` workflow. That workflow applies only validated patch artifacts and limits the paths that each maintenance workflow is allowed to update. ## Docker container security The Weblate and Weblate Client Docker containers are scanned for security vulnerabilities in CI. This allows us to detect vulnerabilities early and release improvements quickly. The inspected Weblate Docker and Weblate Client workflows scan built container images with [Anchore](https://anchore.com/) and [Trivy](https://github.com/aquasecurity/trivy). Results are uploaded to GitHub code scanning as data. The inspected workflows also store Trivy SARIF artifacts, and the Weblate Client workflow stores Anchore SARIF artifacts. ## Known external policy details Some dependency and vulnerability-management details are maintained outside this documentation: * complete Renovate behavior is defined in the shared [WeblateOrg/meta](https://github.com/WeblateOrg/meta) preset and repository platform settings; * GitHub dependency graph, Dependabot alert, and branch-protection state are GitHub platform configuration; * FOSSA result history and policy thresholds are stored in FOSSA; * scanner output is stored in GitHub code scanning and workflow artifacts. #### SEE ALSO * [Continuous integration](https://docs.weblate.org/en/latest/contributing/tests.md#ci-tests) * [Renovate](https://www.mend.io/renovate/) * [GitHub dependency review](https://github.com/actions/dependency-review-action) * [FOSSA](https://fossa.com/) * [Anchore](https://anchore.com/) * [Trivy](https://github.com/aquasecurity/trivy) # security/disaster-recovery-plan.md # Disaster recovery plan ## Scope and objectives This plan addresses recovery from catastrophic events impacting Weblate service availability, data integrity, or operational continuity. #### NOTE The plan is specifically designed for deployments of Weblate by Weblate s.r.o., but it can be applied to other deployments similarly. ## Definitions - **Disaster:** Any unplanned event causing complete or significant loss of service, data, or system functionality. Examples include hardware failure, data corruption, infrastructure outage, or malicious attack. - **Recovery Point Objective (RPO):** Maximum acceptable data loss interval: **24 hours**. - **Recovery Time Objective (RTO):** Maximum acceptable time to restore full service: **8 hours**. ## Critical components - **Application Layer:** Weblate Python/Django application, background workers (Celery), and scheduled tasks. - **Data Layer:** PostgreSQL database, translation repositories (Git), and logs. - **Infrastructure:** Web server (NGINX/Apache), reverse proxy, storage volumes, SSL/TLS configuration, and optional SIEM logging system. ## Backup policy [Automated backup using BorgBackup](https://docs.weblate.org/en/latest/admin/backup.md#automated-backup) process guarantees that all essential components (database, data, and configuration) are backed up daily. The backups are stored in two geographically different locations. The backup retention policy ensures that recent backups are available daily and keeps six months of backups. ## Recovery Procedures ### Failure scenario: full host/system loss 1. Provision new host. 2. Bootstrap Weblate using provisioning software. 3. Restore Weblate backup following [Restoring from BorgBackup](https://docs.weblate.org/en/latest/admin/backup.md#restore-borg). 4. Restart Weblate container. 5. Verify functionality and perform consistency checks. ### Failure scenario: database corruption or data volume loss 1. Stop Weblate to prevent further write operations. 2. Restore Weblate backup following [Restoring from BorgBackup](https://docs.weblate.org/en/latest/admin/backup.md#restore-borg). 3. Restart services and verify translation and user data consistency. ### Failure scenario: malicious tampering or ransomware 1. Isolate affected host from the network. 2. Identify last known-good backup (pre-infection). 3. Follow steps from [Failure scenario: full host/system loss](https://docs.weblate.org/en/latest/security/disaster-recovery-plan.md#drp-host) to deploy the system on a new host. ## Validation and testing - **Backup Verification:** Monthly restore test of Weblate backups. - **Disaster Recovery Drill:** Conduct at least annually, involving full restoration to a staging environment. - **Automated Integrity Checks:** BorgBackup ensures integrity of backup archives. ## Post-recovery steps - Confirm all services are operational and accessible. - Notify users and stakeholders of the recovery status. - Document timeline, root cause, and lessons learned. - Apply updates or infrastructure changes to prevent recurrence. - Follow [Vulnerability disclosure policy](https://docs.weblate.org/en/latest/security/issues.md#vulnerability-disclosure-policy) in case vulnerability was involved. # security/governance.md # Security governance and assessment status This page summarizes where Weblate publishes security governance information and records the current formal assessment status. It is a factual documentation index and does not claim certification, audit completion, or regulatory compliance. For product identity, contact, support, release, and SBOM identity, see [Product and contact information](https://docs.weblate.org/en/latest/security/product-information.md). ## Governance documentation Weblate publishes security governance information in these documentation areas: * Contribution rules, code review expectations, and project participation are documented in [Contributing to Weblate](https://docs.weblate.org/en/latest/contributing/index.md), [Weblate source code](https://docs.weblate.org/en/latest/contributing/code.md), and [Code of Conduct](https://docs.weblate.org/en/latest/contributing/code_of_conduct.md). * Release lifecycle, security update coverage, and upgrade support are documented in [Releases and supported versions](https://docs.weblate.org/en/latest/security/releases.md). * Vulnerability reporting, disclosure handling, and service incident reporting are documented in [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md). * Dependency inventory, vulnerability triage, update automation, and container scanning are documented in [Dependencies](https://docs.weblate.org/en/latest/security/dependencies.md). * Security assumptions and boundaries are documented in [Weblate threat model](https://docs.weblate.org/en/latest/security/threat-model.md). * Release artifact inventory, SBOMs, signatures, attestations, and verification are documented in [Release artifacts and verification](https://docs.weblate.org/en/latest/security/release-artifacts.md). ## Formal assessment status This repository does not currently record a formal third-party security assessment, certification, audit report, penetration-test report, or formal self-assessment for Weblate. Automated security checks and compliance tools such as CodeQL, GitHub dependency review, FOSSA, OpenSSF Scorecard, and container vulnerability scans are security evidence and automation signals. They are not formal assessments, certifications, or audit reports. If Weblate publishes formal assessment evidence in the future, this page and the repository security metadata should be updated with the assessment reference and date. # security/incident-reporting.md # Incident reporting This runbook helps the Weblate team handle product-security reports and security incidents affecting Weblate-operated services. The reporting policy and deadlines are in [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md). For service containment and recovery, use [Incident response plan for Weblate](https://docs.weblate.org/en/latest/security/incident-response-plan.md). One person handles the incident, with an available teammate as backup. The same people investigate, report, and communicate as needed. Contact assignments, access details, and completed incident notes belong in private team records. ## Pick up the incident Whoever sees a credible report of active exploitation or a severe security incident alerts teammates through Signal. An available teammate takes responsibility and names a backup; responding does not require management approval. The backup takes over if the handler becomes unavailable. Record handover in the incident note so deadlines and promised updates remain visible. Start one private incident note immediately. Record when the team became aware of the relevant facts, using timestamps with a timezone, preferably UTC. Distinguish receipt of an initial report from awareness of active exploitation or a severe incident, recording the evidence for each. Do not wait for a fix, formal declaration, or complete investigation to start reporting preparation. ## Assess the report * Active exploitation means reliable evidence that a malicious actor has exploited a vulnerability without the system owner’s permission. A theoretical vulnerability, a proof of concept, or lack of permission alone does not establish malicious exploitation. Investigate suspected exploitation promptly and record what is known and uncertain. See [CRA Article 3(42)](https://eur-lex.europa.eu/eli/reg/2024/2847/oj/eng#art_3). * Assess a product-security incident as severe when it harms, or could harm, protection of important or sensitive data or functions, or leads, or could lead, to the introduction or execution of malicious code in the product or users’ systems. This includes execution of malicious code already present. See [CRA Article 14(5)](https://eur-lex.europa.eu/eli/reg/2024/2847/oj/eng#art_14). Consider availability, authenticity, integrity, and confidentiality. Operational outage severity alone does not determine this classification. * Check affected versions, release artifacts, and shipped dependencies, including incidents reported by self-hosted operators. Local containment remains the operator’s responsibility; product reporting is assessed here. A runtime finding’s disposition under [Weblate threat model](https://docs.weblate.org/en/latest/security/threat-model.md) does not by itself decide whether an incident needs reporting. * Assess both reporting tracks when active exploitation also causes a severe incident. Record separate awareness times where appropriate and track both final-report deadlines. * Check early for a personal-data breach, including accidental or unlawful destruction, loss, or alteration, as well as unauthorized disclosure or access. Assess [privacy notifications](https://docs.weblate.org/en/latest/security/incident-response-plan.md#incident-gdpr-notification) even when no data was disclosed. Ask for outside advice when necessary while continuing investigation and reporting preparation. Record whether reporting is mandatory or voluntary for the event and why. Uncertainty requires prompt consultation, not a pause in preparation or applicable deadlines. The policy baseline does not decide Weblate’s regulatory role; see [Product and contact information](https://docs.weblate.org/en/latest/security/product-information.md). Assess the affected hosted service or downloadable distribution separately rather than assuming they have the same regulatory scope. ## Keep one private incident note Copy these fields into the team’s private incident record: * Case ID, summary, handler, backup, and handovers. * Product, affected versions or artifact digests, deployments, and known Member States where the affected product was made available, with the source and limitations of this information. Record incident-impact locations separately when already known and relevant. * Awareness timestamps, supporting evidence, unknowns, and classification rationale, including the mandatory or voluntary reporting decision. * Reporting deadlines, reminders, and any separate privacy-notification tasks. * Investigation timeline, impact, mitigations, and when each corrective or mitigating measure became available. * Copies of submitted reports, submission timestamps, platform references, receipts, failures, and requested follow-up reports. * User warnings, recipients or public advisory links, promised updates, and any delayed technical disclosure with its reason and review date. * Remaining actions and the outcome of the short team review. Keep sensitive evidence and attachments with the private record, with access limited to people handling the incident. Store credentials in the team’s credential store. Signal is for coordination; copy decisions and relevant timestamps into the durable note. Do not use public issues for these records. ## Submit and follow up Use the current [ENISA Single Reporting Platform guidance](https://www.enisa.europa.eu/topics/product-security/single-reporting-platform-srp) to verify the coordinating CSIRT, access arrangements, and mandatory or voluntary submission route. A national incident-reporting portal is not necessarily the CRA endpoint. Consult the coordinator if the route is unclear. The handler submits reports; the backup takes over when needed. Ask a teammate to review when practical, but do not miss a deadline waiting for review. Use the deadlines in [Authority reporting](https://docs.weblate.org/en/latest/security/issues.md#incident-authority-reporting) and the current platform forms. Submit available information on time, identify unknowns, and supplement it as the investigation progresses. * In either early-warning track, identify the event and, where known, the Member States where the affected product was made available. This is distribution information, not the location of individual users or only the places where exploitation was observed. For a severe incident, also include whether unlawful or malicious acts are suspected. Both tracks request distribution Member States under [CRA Article 14(2)(a) and (4)(a)](https://eur-lex.europa.eu/eli/reg/2024/2847/oj/eng#art_14). * In an exploited-vulnerability main notification, identify the affected product and describe the general nature of both the exploit and the vulnerability. Include corrective or mitigating measures already taken, measures users can take, and the sensitivity of the information where applicable, as required by CRA Article 14(2)(b). * In a severe-incident main notification, describe the nature of the incident and provide an initial assessment, including known impact. Include corrective or mitigating measures already taken, measures users can take, and the sensitivity of the information where applicable, as required by CRA Article 14(4)(b). * In an exploited-vulnerability final report, describe the vulnerability, including its severity and impact. Include any available information about malicious actors that have exploited or are exploiting it, and details of the security update or other corrective measures made available to remedy it, as required by CRA Article 14(2)(c). Availability of a mitigation can start this deadline before a final patch is ready. * In a severe-incident final report, provide a detailed description of the incident, including its severity and impact, the type of threat or root cause likely to have triggered it, and both applied and ongoing mitigation measures, as required by CRA Article 14(4)(c). State explicitly when there are no ongoing mitigations. For distribution information, use existing customer or distribution records, such as the countries of known paying customers. State the limits of these records: other users’ locations may be unknown. Do not infer distribution in every Member State from general EU availability. This procedure does not require tracking individual users’ locations or collecting new location data. Report what is known, without delaying submission to discover other locations, and update the information as needed. See the product-availability field in the [ENISA SRP glossary](https://www.enisa.europa.eu/topics/product-security/single-reporting-platform-srp/cra-srp-glossary). Save receipts and report references. Track requests for intermediate reports and update earlier submissions when facts change. For an event triggering both tracks, link the records and ensure both sets of reporting requirements are covered; one final report must not silently replace the other. If the platform is unavailable, record failed attempts and timestamps, contact the coordinator through its published contingency channels, and follow its instructions. Complete platform submission when access returns. Alternative contact is not automatically evidence that a legal reporting obligation has been fulfilled. ## Warn users and follow up Send protective advice without waiting for a fix or full technical disclosure, using the e-mail and public advisory channels in [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md). State affected versions, known impact, available actions, and remaining uncertainty. Record what was communicated and follow through on promised updates. Authority reporting, user warnings, and detailed disclosure can proceed at different times. Record security reasons for delaying technical details and revisit the decision on the recorded review date. After recovery, check remaining report deadlines, requested updates, and disclosure decisions. Hold a short team review, record improvements, and close the incident note once outstanding actions are completed or explicitly handed over with an owner and due date. ## Preparation checklist These are setup tasks to complete and record privately. Publishing this runbook does not establish that access or exercises are already in place. * Choose the usual reporting contact and backup, and agree how teammates alert each other when either is unavailable. * Verify reporting access, recovery arrangements, the coordinating CSIRT, and published contingency contacts using [ENISA Single Reporting Platform guidance](https://www.enisa.europa.eu/topics/product-security/single-reporting-platform-srp). Keep account details private. * Choose a private location accessible to the handler and backup for incident notes, and use existing team tools for deadline reminders and handovers. * Check access to customer contact lists and GitHub security advisories. * Run a short offline tabletop exercise covering a Friday-night exploitation report, a severe incident without a known vulnerability, a self-hosted or shipped-dependency report, and an event triggering both reporting tracks. Include an unavailable handler, a platform outage, incomplete information, and a mitigation available before the final patch. Check elapsed-hour deadlines and calendar-month deadlines across February. Record gaps and follow-up actions without sending exercise reports to real recipients. # security/incident-response-plan.md # Incident response plan for Weblate ## Scope and objectives This IRP covers incidents impacting the confidentiality, integrity, or availability of Weblate-operated deployments. #### NOTE This plan is specifically designed for deployments operated by Weblate s.r.o. Other deployments need to adapt provider-specific and organizational steps to their own environment. ## Handling an incident One team member handles the incident and names an available teammate as a backup. They coordinate investigation, containment, recovery, reporting, and user communication, asking other teammates or outside specialists for help when needed. The backup takes over when the handler is unavailable. Use [Incident reporting](https://docs.weblate.org/en/latest/security/incident-reporting.md) for reporting decisions, deadlines, and a private incident note. No separate management approval is needed to begin responding. ## Communication logistics - **Internal Communication:** : - Primary channel is **Signal** for human-to-human coordination. - Technical alerts remain outside of Signal to avoid noise. - **External Communication:** : - **E-mail** is used to reach customers. - Customer contact lists are maintained in several locations to ensure access during service outages. - **Public Disclosure:** : - If an incident includes a Weblate product vulnerability, follow the product vulnerability reporting process and [Vulnerability disclosure policy](https://docs.weblate.org/en/latest/security/issues.md#vulnerability-disclosure-policy) in [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md). ## Incident categories and severity ### Incident activation - Declare an incident when an event is confirmed or strongly suspected to affect the confidentiality, integrity, or availability of the service beyond routine operational noise. - Whoever identifies the incident alerts teammates through Signal. An available teammate takes responsibility, records the initial severity, and names a backup. - Reclassify the incident if the scope or impact changes during investigation. ### Incident categories - Category 1 – Unauthorized Access - Category 2 – Data Integrity Violation - Category 3 – Service Outage or Degradation - Category 4 – Misconfiguration or Deployment Error ### Severity levels and SLAs These are operational response targets, not a statement of continuous staffing. Assess product-security reporting separately using [Incident reporting](https://docs.weblate.org/en/latest/security/incident-reporting.md); these targets do not extend reporting deadlines. | Severity | Definition | Target Acknowledge | Target Initial Action | |------------|-----------------------------------------------------------------------------------------|----------------------|-------------------------| | Critical | Total outage; Admin compromise; Active data breach;
requires immediate containment. | < 30 Minutes | < 4 Hours | | High | Core feature failure; PII leak of single user. | < 2 Hours | 12 Hours | | Medium | Performance degradation; Minor security issue. | 1 Business Day | 3 Business Days | | Low | UI bugs; Staging issues; Non-security errors. | Best Effort | Best Effort | ## Incident response lifecycle ### Preparation - Ensure regular daily backups of the PostgreSQL database and the data directory using Weblate’s built-in backup with rotation, see [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md#backup). - Ensure Weblate uses a properly configured reverse proxy (e.g., NGINX) with HTTPS (TLS 1.2+). - Enable 2FA for all admin-level accounts. - Keep the Weblate instance and its dependencies (Python, Django, Celery, database, etc.) up to date. - Integrate with SIEM systems using the GELF protocol for audit and application log forwarding. - Complete the preparation checklist in [Incident reporting](https://docs.weblate.org/en/latest/security/incident-reporting.md) and keep private contact and access details current. ### Identification - Monitor system and application logs (`journalctl`, reverse proxy logs, Weblate application and audit logs). - Analyze login events, webhook executions, and push/pull failures. - Configure alerting (via Prometheus, Zabbix, or SIEM) for multiple login failures, unexpected restarts, or irregular VCS actions. - Record awareness times and assess authority and user notifications using [Incident reporting](https://docs.weblate.org/en/latest/security/incident-reporting.md), without waiting for a complete investigation. - Assess whether a security incident caused accidental or unlawful destruction, loss, or alteration of personal data, or unauthorized disclosure or access, and follow [Personal-data breach notifications](https://docs.weblate.org/en/latest/security/incident-response-plan.md#incident-gdpr-notification). This includes availability or integrity breaches without disclosure, such as accidental deletion or ransomware destruction. Seek privacy advice where needed while continuing investigation and reporting preparation. #### Personal-data breach notifications The incident handler determines whether Weblate acts as controller or processor for the affected processing and records the assessment in the private incident note. Under [GDPR Article 33](https://eur-lex.europa.eu/eli/reg/2016/679/oj/eng#art_33): * As controller, notify the competent supervisory authority without undue delay and, where feasible, within 72 hours of becoming aware of the personal-data breach, unless the breach is unlikely to result in a risk to individuals’ rights and freedoms. Record the reason for a decision not to notify. * If notification takes longer than 72 hours, include the reasons for the delay. Where information cannot be supplied together, provide it in stages without undue further delay. * As processor, notify the controller without undue delay after becoming aware of a personal-data breach; do not wait for the controller’s 72-hour deadline. The controller’s supervisory-authority notification must include the following information under Article 33(3): * The nature of the breach, including, where possible, the categories and approximate numbers of affected individuals and personal-data records. * The name and contact details of the person who can provide further information, such as the incident handler or a data protection officer if one is appointed. * The likely consequences of the breach. * Measures taken or proposed to address the breach, including measures to reduce its adverse effects where appropriate. Identify information that is not yet available and provide it in follow-up notifications without undue further delay. Do not wait for exact counts before notifying the authority. As controller, separately assess communication to affected individuals under [GDPR Article 34](https://eur-lex.europa.eu/eli/reg/2016/679/oj/eng#art_34). If the breach is likely to create a high risk to their rights and freedoms, inform them without undue delay unless an Article 34(3) exception applies. This applies even without active exploitation or a severe product-security incident. Notification to the supervisory authority does not replace this communication. Explain the breach in clear language, giving a contact for further information, likely consequences, measures taken or proposed, and actions individuals can take. Record the assessment and any exception relied on: effective protection of the affected data, such as encryption making it unreadable to unauthorized people, or subsequent measures ensuring the high risk is no longer likely. If individual communication would involve disproportionate effort, use public communication or a similar measure that informs individuals equally effectively. See the [EDPB data-breach guidance](https://www.edpb.europa.eu/system/files/2023-04/edpb_guidelines_202209_personal_data_breach_notification_v2.0_en.pdf). Record breach-awareness timestamps, recipients, and deadlines separately from CRA reporting. A CRA submission does not replace a GDPR notification, and the two reporting clocks may start at different times. ### Containment - Maintain the private incident note from [Incident reporting](https://docs.weblate.org/en/latest/security/incident-reporting.md), including timeline updates, reporting deadlines, and submission receipts. - Coordinate human response in **Signal** and keep technical alerting in the existing monitoring systems. - For Category 1 or 2 incidents, create a manual **Hetzner Cloud Snapshot** before taking disruptive action when it is safe to do so. - Name format: `IRP-[CaseID]-[YYYYMMDD]-Evidence`. - These are separate from standard rotating backups and must be preserved for analysis. - Isolate the affected host or service as needed (for example by firewall rules or service isolation). - Disable external integrations (Git/webhooks) if they are part of the attack vector. - Suspend affected user accounts immediately. - Revoke or rotate affected administrative, API, VCS, and webhook credentials as applicable. - Preserve relevant evidence, including system logs, reverse proxy logs, Weblate application and audit logs, affected configuration state, and the list of impacted credentials or integrations. ### Eradication - Remove any unauthorized code or data. - Patch known vulnerabilities by upgrading Weblate or server components. - Validate binary and repository integrity using SHA-256 checksums or Git logs. ### Recovery - Restore affected services or data from the latest known-good Weblate backups. - Reintroduce services in a phased approach. - Confirm the root cause has been removed or a compensating control is in place before restoring normal traffic. - Rotate affected credentials and verify integrity of the restored system, repositories, and configuration. - The handler records the decision to return to normal operations, checking recovery with the backup or another teammate where practical. - Monitor logs and system behavior continuously for at least 72 hours post-recovery. ### Post-incident review - **Timeline:** Hold a short team review within **5 business days** of incident closure. - Compile a full incident timeline and actions taken. - Perform Root Cause Analysis (RCA) and document it within **10 business days**. - Update security policies and IRP documentation based on findings. - Review the effectiveness of detection and containment mechanisms. - Verify whether escalation, alerting, and external communication followed [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md) as expected. - Check for outstanding reports, promised updates, and delayed disclosures before closing the incident note. # security/index.md # Security, privacy and compliance #### TIP At Weblate, security maintains an environment that values the privacy of our users. Development of Weblate adheres to the [Best Practices of the Open Source Security Foundation](https://www.bestpractices.dev/en/projects/552). #### SEE ALSO Discovered a security issue in Weblate? Please read [Product vulnerability reports](https://docs.weblate.org/en/latest/security/issues.md#security). ## Security updates and releases Only the latest Weblate release is guaranteed to receive security updates. Learn more about [Weblate releases and supported versions](https://docs.weblate.org/en/latest/security/releases.md). Release artifacts can be checked using published signatures, attestations, and SBOMs. See [Release artifacts and verification](https://docs.weblate.org/en/latest/security/release-artifacts.md). ## Security policies * [Product and contact information](https://docs.weblate.org/en/latest/security/product-information.md) - product identity, contact, support, release, and SBOM metadata. * [Security governance and assessment status](https://docs.weblate.org/en/latest/security/governance.md) - security governance documentation and assessment status. * [Releases and supported versions](https://docs.weblate.org/en/latest/security/releases.md) - release cycle, security update coverage, and upgrade support. * [Release artifacts and verification](https://docs.weblate.org/en/latest/security/release-artifacts.md) - release artifact inventory, SBOMs, signatures, attestations, and verification. * [Dependencies](https://docs.weblate.org/en/latest/security/dependencies.md) - dependency inventory, vulnerability triage, update automation, and container scanning. * [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md) - vulnerability reporting and disclosure. * [Incident reporting](https://docs.weblate.org/en/latest/security/incident-reporting.md) - reporting steps and a private incident note template. * [Disaster recovery plan](https://docs.weblate.org/en/latest/security/disaster-recovery-plan.md) * [Incident response plan for Weblate](https://docs.weblate.org/en/latest/security/incident-response-plan.md) * [Password security](https://docs.weblate.org/en/latest/security/passwords.md) * [Weblate threat model](https://docs.weblate.org/en/latest/security/threat-model.md) ## Compliance #### NOTE Herein you will find various legal information you might need to operate Weblate in certain legal jurisdictions. It is provided as a means of guidance, without any warranty of accuracy or correctness. It is ultimately your responsibility to ensure that your use of Weblate complies with all applicable laws and regulations. * [Privacy regulations compliance](https://docs.weblate.org/en/latest/security/privacy-compliance.md) * [Data residency and EU cloud sovereignty](https://docs.weblate.org/en/latest/security/data-residency.md) * [US controls compliance](https://docs.weblate.org/en/latest/security/us-compliance.md) * [Weblate license](https://docs.weblate.org/en/latest/contributing/license.md) ## Terms of service and privacy policy #### NOTE These documents apply to Weblate deployments operated by Weblate s.r.o., such as Hosted Weblate and Weblate Cloud. * [General terms and conditions](https://weblate.org/terms/) * [Privacy policy](https://weblate.org/privacy/) * The data processing agreement can be obtained in the [Customer area](https://weblate.org/user/). ## Guidelines * [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md) # security/issues.md # Vulnerability and incident handling ## Product vulnerability reports #### SEE ALSO Please read [Using AI to create issues](https://docs.weblate.org/en/latest/contributing/issues.md#ai-issues) in case you have used AI to discover a security issue in Weblate. Weblate’s development team is strongly committed to responsible reporting and disclosure of security-related issues. We have adopted and follow policies that are geared toward delivering timely security updates to Weblate. Product vulnerability reports cover security issues in Weblate source code, release artifacts, and documented Weblate security properties. They do not replace operational incident response for a particular deployment. Reports concerning the separately distributed Weblate Client (`wlc`) are evaluated against the [wlc threat model](https://github.com/WeblateOrg/wlc/blob/main/THREAT_MODEL.md), which documents its intended trust boundaries, supported security properties, and explicit non-goals. Most normal bugs in Weblate are reported to our public [GitHub issues tracker](https://github.com/WeblateOrg/weblate/issues), but due to the sensitive nature of security issues, we ask them not to be publicly reported in this fashion. Instead, if you believe you’ve found something in Weblate that has security implications, please submit a description of the issue to [security@weblate.org](mailto:security@weblate.org), [GitHub](https://github.com/WeblateOrg/weblate/security/advisories/new), or using [HackerOne](https://hackerone.com/weblate). Self-hosted operators should use this process when they believe an incident in their own deployment is caused by a Weblate product vulnerability. Local containment, recovery, customer notification, provider escalation, and other deployment-specific incident response remain the operator’s responsibility. A member of the security team will respond to you within 48 hours, and depending on what action is taken, you may get more follow-up emails. Suspected active exploitation and severe security incidents receive immediate internal attention under [Incident reporting](https://docs.weblate.org/en/latest/security/incident-reporting.md). Acknowledging a report or completing an investigation does not postpone reporting deadlines. #### NOTE **Sending encrypted reports** If you want to send an encrypted email (*optional*), please use the public key for [security@weblate.org](mailto:security@weblate.org) with ID `8EA7 6E43 0976 3323 C2E3 D5A0 C472 9F23 8A80 EA93`. This public key is available on the most commonly used key servers, using WKD or [directly from weblate.org](https://weblate.org/.well-known/openpgpkey/hu/t5s8ztdbon8yzntexy6oz5y48etqsnbb?l=security). #### HINT Weblate depends on third-party components for many things. In case you find a vulnerability affecting one of those components in general, please report it directly to the respective project. If it also affects a shipped Weblate artifact or a Weblate deployment, report that impact to Weblate through the private channels above. Some of these are: * [Django](https://docs.djangoproject.com/en/stable/internals/security/) * [Django REST framework](https://www.django-rest-framework.org/#security) * [Python Social Auth](https://github.com/python-social-auth) #### SEE ALSO * [Reporting issues in Weblate](https://docs.weblate.org/en/latest/contributing/issues.md) ## Weblate-operated service incidents Operational incidents affecting Hosted Weblate, Dedicated Weblate, or other deployments operated by Weblate s.r.o. are handled using [Incident response plan for Weblate](https://docs.weblate.org/en/latest/security/incident-response-plan.md). When such an incident also involves a Weblate product vulnerability, the vulnerability report and public advisory follow the product vulnerability reporting process and [Vulnerability disclosure policy](https://docs.weblate.org/en/latest/security/issues.md#vulnerability-disclosure-policy) on this page. ## Self-hosted deployment incidents Operators of self-hosted Weblate deployments are responsible for their local incident response process, including containment, recovery, notification, and provider-specific escalation. The Weblate-operated [Incident response plan for Weblate](https://docs.weblate.org/en/latest/security/incident-response-plan.md) can be used as a reference, but it is not a maintained incident response plan for third-party deployments. If a self-hosted incident appears to be caused by a Weblate product vulnerability, report it using the product vulnerability reporting process above. ## Vulnerability disclosure policy Weblate publishes a security advisory alongside a release containing a vulnerability fix at [https://github.com/WeblateOrg/weblate/security/advisories](https://github.com/WeblateOrg/weblate/security/advisories). Advisories identify affected versions, impact, severity, and steps users can take to remediate the vulnerability. Technical details may be delayed when publishing them would create greater security risks than benefits while users apply the fix. The incident handler records the reason and a review date in the private incident note. This does not delay authority reports or protective advice users need. ## Authority reporting Weblate adopts the following reporting timelines as a voluntary policy baseline for actively exploited Weblate product vulnerabilities and severe product-security incidents. This includes affected shipped dependencies and incidents learned about through self-hosted deployments. Severe security incidents affecting Weblate-operated services also follow this baseline. | Report | Deadline | |------------------------------------------------------|--------------------------------------------------------------------------------| | Early warning | Without undue delay, within 24 hours of awareness. | | Main notification | Without undue delay, within 72 hours of awareness. | | Final report for an actively exploited vulnerability | Within 14 days after a corrective or mitigating measure becomes
available. | | Final report for a severe incident | Within one calendar month after the main incident notification. | Hours include weekends and holidays. Acknowledgment, incident declaration, handover, or completion of an investigation does not restart these clocks. When an event involves both active exploitation and a severe incident, track both reporting obligations and final-report deadlines. These timelines follow the [European Commission reporting guidance](https://digital-strategy.ec.europa.eu/en/policies/cra-reporting). The incident handler records whether mandatory or voluntary reporting applies and uses the corresponding route. For CRA reporting, the Single Reporting Platform routes notifications to the coordinating CSIRT and ENISA. This policy does not determine Weblate’s regulatory role or claim compliance; see [Product and contact information](https://docs.weblate.org/en/latest/security/product-information.md). For classification, submission steps, and private incident records, see [Incident reporting](https://docs.weblate.org/en/latest/security/incident-reporting.md). ## User notifications Weblate informs impacted users of active exploitation or severe security incidents without undue delay, including available mitigations and corrective actions. Where appropriate, warnings address all users. Known affected contacts, including Hosted and Dedicated Weblate customers, receive e-mail notifications. Public GitHub security advisories provide warnings and updates for self-hosted users whose contact details are not known. Initial warnings can provide protective advice before a fix or detailed vulnerability disclosure is ready. Authority reporting, user warnings, and publication of technical details proceed separately as needed. Personal-data breaches also require a separate assessment of [notifications to affected individuals](https://docs.weblate.org/en/latest/security/incident-response-plan.md#incident-gdpr-notification), even when there is no active exploitation or severe product-security incident. # security/localization-threat.md # Localization Threat Model Outsourcing or crowdsourcing translation tasks to third parties introduces additional security and privacy risks. Unlike internal development teams, translators may have limited trust relationships with the organization and may operate from various jurisdictions. This model identifies and classifies threats associated with external translation contributors. ## Key Assumptions - Translators may be contractors, volunteers, or agencies with varying levels of vetting. - Translators require access to Weblate. - Translation strings may contain sensitive content such as unreleased features, legal terms, or security messages. - The organization has limited control over translators’ local environments. ## Threat Categories (STRIDE) ### 1. Spoofing - **S1. Fake translator accounts impersonating legitimate contributors.** - Risk: Unauthorized access to projects or injection of malicious strings. - Mitigations: - Enforce strong authentication (2FA); see [Enforced two-factor authentication](https://docs.weblate.org/en/latest/admin/projects.md#project-enforced-2fa). - Verify identities of contracted translators. - Use role-based access to limit project scope; see [Project access control](https://docs.weblate.org/en/latest/admin/access.md#acl). ### 2. Tampering - **T1. Malicious translations embedding harmful payloads.** - Risk: Injection of JavaScript, HTML, or format-string attacks if translations are not properly escaped. - Mitigations: - Apply strict input validation in Weblate. Enforcing quality checks like [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html) might help. See [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks) and [Enforced checks](https://docs.weblate.org/en/latest/admin/projects.md#component-enforced-checks). - Use automated security scanning for translation files in your CI. - Limit usage of dangerous markup from translation files. Depending on the used localization framework, this might be implicit, opt-in, or require a third-party library. - **T2. Insertion of misleading translations.** - Risk: Users misled about application behavior (e.g., consent dialogs mistranslated). - Mitigations: - Perform peer review of critical strings; see [Peer review](https://docs.weblate.org/en/latest/workflows.md#peer-review) or [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews). - Maintain style guides and [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) to prevent manipulation. ### 3. Repudiation - **R1. Disputes over malicious or poor-quality translations.** - Risk: Translators deny responsibility for injected issues. - Mitigations: - All changes in Weblate are logged. - Use Weblate with version control for immutable history. ### 4. Information Disclosure - **I1. Leakage of unreleased product details.** - Risk: Translators gain early access to unreleased features or confidential terminology. - Mitigations: - Segment projects to limit access to sensitive strings. - Apply non-disclosure agreements with external agencies. - Delay translation of highly confidential strings until public release. - **I2. Exposure of personal data within strings.** - Risk: Translators might access or misuse embedded user data. - Mitigations: - Avoid exposing real user data in source strings. - Use placeholders for sensitive fields. ### 5. Denial of Service - **D1. Bulk submission of junk translations.** - Risk: Review queues overwhelmed; release timelines disrupted. - Mitigations: - Choose an appropriate workflow to match your team capacity. [Workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) can allow you to tweak this on a language basis. - Configure automated translation quality checks; see [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks). ### 6. Elevation of Privilege - **E1. The translator gains unauthorized project-wide or administrative rights.** - Risk: Escalation leading to tampering or data exposure. - Mitigations: - Apply the principle of least privilege. - Regularly review access rights and group memberships. ## Asset Inventory - **Source Strings:** May contain unreleased product features or legal text. - **Translated Strings:** Output presented directly to end users. - **User Data Placeholders:** Names, emails, or IDs referenced in strings. - **Access Credentials:** Accounts for translators, agencies, or bots. ## Trust Boundaries - **Organization ↔ Translators:** Authentication and role-based access must be enforced. - **Translation Platform ↔ Source Control:** Synchronization requires secured tokens/keys. - **Translators ↔ Translation Platform:** All input must be sanitized before integration into builds. - **Platform ↔ End Users:** Translations must be validated to prevent code injection. ## Mitigation Summary - Enforce 2FA and RBAC for translator accounts; see [Enforced two-factor authentication](https://docs.weblate.org/en/latest/admin/projects.md#project-enforced-2fa). - Require non-disclosure agreements or contracts for professional translators. - Use automated quality/security scanning for translations; see [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks). - Perform peer review of critical strings; see [Peer review](https://docs.weblate.org/en/latest/workflows.md#peer-review) or [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews). - Limit project visibility to reduce exposure of sensitive content; see [Project access control](https://docs.weblate.org/en/latest/admin/access.md#acl). - Regularly patch and harden your Weblate server. You might also consider [Getting support for Weblate](https://docs.weblate.org/en/latest/admin/support.md). - Retain immutable version history for all translation changes in the version control system. ## Conclusion Third-party translators introduce unique risks compared to internal contributors. With proper technical, organizational, and contractual controls, organizations can mitigate these risks and safely integrate external translation services while maintaining product integrity and compliance. # security/passwords.md # Password security ## How Weblate stores passwords Weblate uses a Django implementation to store hashed passwords; see [How Django stores passwords](https://docs.djangoproject.com/en/stable/topics/auth/passwords/#auth-password-storage). The recommended Weblate configuration uses Argon2 with time_cost = 2, memory_cost = 102400, and parallelism = 8. #### HINT The password hashing can be customized using [`PASSWORD_HASHERS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-PASSWORD_HASHERS). ## Password validation When a user is configuring a password, it is validated to reduce the risk of using weak passwords. The recommended Weblate configuration verifies: * The password has to be at least 10 characters long, and at most 72 characters long. * Password similar to username and other attributes is rejected. * A common or overly simple password is rejected. * Any password user used recently is rejected. * Password strength is optionally checked using the zxcvbn algorithm. #### HINT The password validation can be customized using [`AUTH_PASSWORD_VALIDATORS`](https://docs.djangoproject.com/en/stable/ref/settings/#std-setting-AUTH_PASSWORD_VALIDATORS). ## Social or third-party authentication Weblate does not store any passwords or enforce any password policy when social or third-party authentication is configured. The passwords are, in such a case, fully managed externally. #### SEE ALSO [Authentication](https://docs.weblate.org/en/latest/admin/auth.md) # security/privacy-compliance.md # Privacy regulations compliance #### NOTE Herein you will find various legal information you might need to operate Weblate in certain legal jurisdictions. It is provided as a means of guidance, without any warranty of accuracy or correctness. It is ultimately your responsibility to ensure that your use of Weblate complies with all applicable laws and regulations. #### TIP Weblate provides features that help organizations operate within privacy frameworks such as GDPR, DPDPA, PIPL, and others. Hosting, legal basis, retention, notices, and compliance responsibilities remain under the deploying organization’s control. This document outlines Weblate features that can support compliance with: - EU General Data Protection Regulation (GDPR) - California Consumer Privacy Act (CCPA) - Brazilian Lei Geral de Proteção de Dados (LGPD) - Swiss Federal Act on Data Protection (nFADP) - Canadian Personal Information Protection and Electronic Documents Act (PIPEDA) - Indian Digital Personal Data Protection Act (DPDPA) - China’s Personal Information Protection Law (PIPL) ## Privacy principles ### Data minimization Weblate processes account and activity data needed to provide translation workflows, authentication, notifications, access control, and auditability. Depending on enabled features, the following personal data can be stored or processed: - Account identifiers such as username, full name, primary e-mail address, verified e-mail addresses, and social-authentication associations. - Optional profile fields such as public e-mail, website, profile links, location, company, language preferences, and dashboard preferences. - Translation activity, suggestions, comments, watched projects, notification settings, and contribution statistics. - Operational records such as audit-log entries, IP addresses, user agents, timestamps, and security-related events. External analytics, crash reporting, remote logging, and avatar providers are optional integrations controlled by the site operator. ### User consent and transparency - Users can review and update their account and profile data in [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile). - Administrators can publish privacy policy, terms, cookie information, and subcontractor information using [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal), or link externally using [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL) and [`PRIVACY_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVACY_URL). - Legal document confirmation can be enforced using the legal app, and [`LEGAL_TOS_DATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_TOS_DATE) can require users to accept updated terms and, when linked, the privacy policy. - Data processing depends on user interaction and on integrations enabled by the site operator. ### Data access and portability - Users can download a JSON export of their user data from the Account tab in [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile); the export format is documented in [Weblate user data export](https://docs.weblate.org/en/latest/contributing/schemas.md#schema-userdata). - Administrators can export active non-bot user data with [`dumpuserdata`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-dumpuserdata). - Project translations and translation files can be exported separately using Weblate’s project and file export features. ### Right to erasure and correction - Users can correct account and profile information from the profile interface. - Users can request account removal from the Account tab. The removal flow requires confirmation and then deactivates and anonymizes the account. - Account removal clears private profile fields, API tokens, social-auth associations, group memberships, notification subscriptions, watched projects, and user translation memory. - Historical project records can remain associated with an anonymized deleted account where needed to preserve translation history and auditability. ### Data retention and deletion - Audit-log retention is configured using [`AUDITLOG_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUDITLOG_EXPIRY). - To help administrators diagnose removed accounts, the account removal audit entry retains the former e-mail address until that entry expires. - Backups, reverse-proxy logs, mail server logs, and database retention are controlled by the site operator. - Third-party services receive data only when configured or used by the operator, for example external authentication providers, avatar providers, Matomo, Sentry, OpenTelemetry, remote logging, machine translation services, or repository integrations. ### Security and confidentiality - Weblate supports HTTPS deployments and secure cookie settings; operators should configure TLS and trusted proxy headers correctly. - Failed sign-ins, permission changes, two-factor changes, account removal requests, and other security events are recorded in the audit log. - Optional GELF logging can forward logs to systems such as Graylog. - Access control is enforced through users, teams, roles, project access settings, and component permissions. - Commit identity privacy can be improved with [`PRIVATE_COMMIT_EMAIL_OPT_IN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_OPT_IN), [`PRIVATE_COMMIT_EMAIL_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_TEMPLATE), [`PRIVATE_COMMIT_NAME_OPT_IN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_NAME_OPT_IN), and [`PRIVATE_COMMIT_NAME_TEMPLATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_NAME_TEMPLATE). - Avatar fetching can be disabled with [`ENABLE_AVATARS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_AVATARS); when enabled, avatars are downloaded and cached server-side as described in [Avatars](https://docs.weblate.org/en/latest/admin/optionals.md#avatars). ### International transfers - Weblate itself does not require a specific hosting region. - Hosting location, backups, e-mail delivery, repository hosting, external authentication, analytics, error reporting, and machine translation services determine where data is processed. - Organizations can self-host Weblate in the required jurisdiction, or use a dedicated deployment with suitable infrastructure controls. ## Regulatory mapping | Framework | Supporting Weblate features | |---------------------|-----------------------------------------------------------------------------------------------------------------| | GDPR (EU) | Data export, correction, account removal, audit logs, privacy notices,
configurable retention, self-hosting | | CCPA (California) | Data access, deletion workflow, user control, no built-in sale of
personal data | | LGPD (Brazil) | Transparency, access, correction, deletion workflow, operator-defined
legal basis | | nFADP (Switzerland) | Transparency, purpose limitation by configuration, account controls,
auditability | | PIPEDA (Canada) | Notice, consent workflow, access, correction, deletion | | DPDPA (India) | Notice, consent workflow, user rights handling, hosting locality
controlled by operator | | PIPL (China) | Purpose limitation by configuration, data minimization, self-hosted
locality controls | ## Recommendations for compliance - **Notices and consent:** Provide privacy, cookie, subcontractor, and terms information through [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal), and update [`LEGAL_TOS_DATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_TOS_DATE) when users must accept changed terms or privacy policy. - **Policy links:** Link external privacy and legal documents with [`PRIVACY_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVACY_URL) and [`LEGAL_URL`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LEGAL_URL) when the documents are hosted outside Weblate. - **Data subject requests:** Define an operational process for user-data export, correction, account removal, backup handling, and historical contribution review. - **Retention:** Configure [`AUDITLOG_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUDITLOG_EXPIRY) and document retention periods for database backups, log aggregation, mail systems, repositories, and external integrations. - **External services:** Review configured authentication providers, avatar providers, analytics, Sentry, OpenTelemetry, GELF logging, machine translation, e-mail, and repository integrations for transfer and processor obligations. - **Locality:** Ensure application hosting, backups, logs, repositories, and external processors are located in permitted jurisdictions. # security/product-information.md # Product and contact information This page identifies Weblate and the main places to find support, security, and release information. It is informational and is not a regulatory declaration. ## Product Weblate is a web-based continuous localization system with tight version control integration. * Website: [https://weblate.org/](https://weblate.org/) * Documentation: [https://docs.weblate.org/](https://docs.weblate.org/) * Source code: [https://github.com/WeblateOrg/weblate](https://github.com/WeblateOrg/weblate) * License: GPL-3.0-or-later ## Support Weblate s.r.o. provides professional support for Weblate. For support options, see [Getting support for Weblate](https://docs.weblate.org/en/latest/admin/support.md). Subscribers can contact Weblate Care at [care@weblate.org](mailto:care@weblate.org) as documented in [Contacting customer care](https://docs.weblate.org/en/latest/admin/support.md#support-contact). Community issue reporting is described in [Reporting issues in Weblate](https://docs.weblate.org/en/latest/contributing/issues.md). ## Security Report security issues using private channels documented in [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md). The primary security contact is [security@weblate.org](mailto:security@weblate.org). ## Releases and distribution The maintained release and distribution channels are listed in [Release artifact inventory](https://docs.weblate.org/en/latest/security/release-artifacts.md#release-artifact-inventory). That inventory covers source releases, GitHub release assets, the Python package, Docker images, the Helm chart, documentation publication, Weblate Client package releases, and Weblate Client Docker images. Release SBOMs identify Weblate s.r.o. as the SBOM author, manufacturer, and supplier for released Weblate components. See [Software Bill of Material](https://docs.weblate.org/en/latest/security/release-artifacts.md#sbom). ## Regulatory declarations This documentation records no current EU declaration of conformity, CE marking statement, or Cyber Resilience Act applicability decision for Weblate. This status note is only a documentation record. It does not create, replace, or imply an EU declaration of conformity, CE marking statement, Cyber Resilience Act applicability decision, or any other regulatory conclusion. # security/release-artifacts.md # Release artifacts and verification This page lists Weblate release artifacts and maintained distribution channels and explains how to verify the artifacts that include published signatures, attestations, and SBOMs. For supported versions and security update coverage, see [Releases and supported versions](https://docs.weblate.org/en/latest/security/releases.md). For dependency monitoring and container vulnerability scanning, see [Dependencies](https://docs.weblate.org/en/latest/security/dependencies.md). ## Release artifact inventory Weblate releases and maintained distribution channels are published through several channels. This inventory lists the artifacts described by this repository and where their publishing evidence is maintained. For artifacts maintained in Weblate-owned sibling repositories, the table cites the repository where the build and release automation lives. | Artifact or channel | Owning repository or location | Publishing target | Repository evidence | Notes | |-------------------------------------------|-------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Source releases and GitHub release assets | `WeblateOrg/weblate` | [GitHub releases](https://github.com/WeblateOrg/weblate/releases) | `.github/workflows/setup.yml`, `scripts/create-release`,
`scripts/prepare-release`, and [Releasing Weblate](https://docs.weblate.org/en/latest/contributing/release.md) | Release assets include Python distribution archives, release notes, and
the release SBOM. | | Python package | `pyproject.toml`, `setup.py`, and `MANIFEST.in` | [weblate](https://pypi.org/project/weblate/) | The distribution workflow builds, validates, signs, and publishes the
package using PyPI trusted publishing. | The package metadata and dependencies are maintained in this repository. | | Docker images | [Weblate Docker repository](https://github.com/WeblateOrg/docker) | [Docker Hub](https://hub.docker.com/r/weblate/weblate) and [GitHub Packages Docker registry](https://github.com/WeblateOrg/docker/pkgs/container/weblate) | [Weblate Dockerfile](https://github.com/WeblateOrg/docker/blob/main/Dockerfile), [Weblate Docker image workflow](https://github.com/WeblateOrg/docker/blob/main/.github/workflows/dockerimage.yml),
[Weblate Docker container CI workflow](https://github.com/WeblateOrg/docker/blob/main/.github/workflows/container-ci.yml), [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md),
[Releasing Weblate](https://docs.weblate.org/en/latest/contributing/release.md), and `security.yaml` | The workflow builds multi-architecture images, runs container tests,
scans with Anchore and Trivy, and publishes to Docker Hub and GitHub
Packages. Published image digests are signed with Cosign, and the
build publishes BuildKit SBOM and provenance attestations. | | Kubernetes Helm chart | [Weblate Helm repository](https://github.com/WeblateOrg/helm) | [Weblate Helm repository endpoint](https://helm.weblate.org) and [Artifact Hub](https://artifacthub.io/packages/helm/weblate/weblate) | [Weblate Helm chart](https://github.com/WeblateOrg/helm/blob/main/charts/weblate/Chart.yaml), [Weblate Helm release workflow](https://github.com/WeblateOrg/helm/blob/main/.github/workflows/helm-release.yaml),
[Weblate Helm test workflow](https://github.com/WeblateOrg/helm/blob/main/.github/workflows/helm-test.yaml),
[Weblate Helm dependency review workflow](https://github.com/WeblateOrg/helm/blob/main/.github/workflows/dependency-review.yml), and
[Installing on Kubernetes](https://docs.weblate.org/en/latest/admin/install/kubernetes.md) | The chart release workflow uses Helm chart-releaser on changes under
`charts/**`. Chart testing lints and installs the chart. Chart
signing, chart provenance, and chart SBOM evidence were not found in the
inspected Helm workflows. | | Documentation | `docs/`, `docs/conf.py`, and `.readthedocs.yml` | [Weblate documentation](https://docs.weblate.org/) | `.github/workflows/docs.yml` and `.readthedocs.yml` | Read the Docs project settings are not stored in this repository. | | Weblate Client package and releases | [Weblate Client repository](https://github.com/WeblateOrg/wlc) | [wlc](https://pypi.org/project/wlc/) and [Weblate Client GitHub releases](https://github.com/WeblateOrg/wlc/releases) | [Weblate Client distribution workflow](https://github.com/WeblateOrg/wlc/blob/main/.github/workflows/setup.yml),
[Weblate Client metadata](https://github.com/WeblateOrg/wlc/blob/main/pyproject.toml), and [Weblate Client](https://docs.weblate.org/en/latest/wlc.md) | The workflow builds and validates source and wheel artifacts, publishes
to PyPI using trusted publishing, creates GitHub releases for tags,
attaches package SBOM files to GitHub releases, and creates package
provenance and SBOM attestations. | | Weblate Client Docker image | [Weblate Client repository](https://github.com/WeblateOrg/wlc) | [Weblate Client Docker image](https://hub.docker.com/r/weblate/wlc) and [Weblate Client GHCR registry](https://github.com/WeblateOrg/wlc/pkgs/container/wlc) | [Weblate Client Dockerfile](https://github.com/WeblateOrg/wlc/blob/main/Dockerfile), [Weblate Client Docker workflow](https://github.com/WeblateOrg/wlc/blob/main/.github/workflows/dockerimage.yml), and
[Weblate Client](https://docs.weblate.org/en/latest/wlc.md) | The workflow builds multi-architecture images, tests the command-line
client image, scans with Anchore and Trivy, and publishes to Docker Hub
and GitHub Packages. Published image digests are signed with Cosign,
CycloneDX image SBOMs are generated with Syft, and image provenance and
SBOM attestations are pushed to the registries. | The development Docker files in `dev-docker/` and the fuzzing container definitions in `.clusterfuzzlite/` are development and testing infrastructure, not production release artifacts. Docker Compose files, including the [Weblate Docker Compose repository](https://github.com/WeblateOrg/docker-compose) and local override examples, are example deployment configurations rather than release artifacts. Operators typically adapt them for their own deployments and update Weblate primarily by selecting or pulling Docker image tags. They are not covered by the release signatures, SBOMs, or provenance statements on this page. ## Software Bill of Material Weblate publishes a Software Bill of Material (SBOM) using the CycloneDX format for released versions. The SBOM is available as a versioned `weblate--sbom.cdx.json` file in the [GitHub release assets](https://github.com/WeblateOrg/weblate/releases/latest) and is also attached to the release provenance using GitHub artifact attestations. This can be used to review the dependencies for security issues or license compliance. The release SBOM records document-level metadata for the CISA 2025 minimum elements, including the SBOM author, software producer, generation tools, timestamp, generation context, and Weblate release component identity. Dependency component details are emitted by the ecosystem SBOM generators used during the release. Python component license and hash completeness therefore depends on CycloneDX export support in **uv**. ## Verifying release artifacts The Weblate release workflow publishes verification material for the Weblate Python source distribution and wheel in [GitHub release assets](https://github.com/WeblateOrg/weblate/releases/latest). Release assets include the package archives, Sigstore signature bundles, release notes, and the release SBOM. The same package archives are uploaded to PyPI using trusted publishing, but the Sigstore bundle files are not uploaded to PyPI because the release workflow removes files not accepted by PyPI before publishing. Verify the files downloaded from GitHub release assets when you need the published signatures, attestations, and SBOM. PyPI package files can be compared to the matching GitHub release assets by filename and digest. ### Release signatures Weblate package archives are cryptographically signed using Sigstore signatures. The signature bundles are attached to the GitHub release next to the signed `.tar.gz` and `.whl` files. The verification can be performed using the [sigstore package](https://pypi.org/project/sigstore/). The following example verifies the wheel from the 5.4 release; adjust the version and filenames for the release you are checking: ```sh sigstore verify github \ --cert-identity https://github.com/WeblateOrg/weblate/.github/workflows/setup.yml@refs/tags/weblate-5.4 \ --bundle Weblate-5.4-py3-none-any.whl.sigstore \ Weblate-5.4-py3-none-any.whl ``` ### Release attestations The release workflow creates two kinds of [GitHub artifact attestations](https://docs.github.com/en/actions/security-for-github-actions/using-artifact-attestations) for the package archives: * Build provenance attestations generated by `.github/workflows/setup.yml` using **actions/attest-build-provenance**. * SBOM attestations generated by `.github/workflows/setup.yml` using **actions/attest** with the CycloneDX release SBOM. The attestations can be verified using **gh**. The following example checks the build provenance attestation for the 5.4 wheel: ```sh gh attestation verify Weblate-5.4-py3-none-any.whl \ --repo WeblateOrg/weblate \ --source-ref refs/tags/weblate-5.4 \ --signer-workflow WeblateOrg/weblate/.github/workflows/setup.yml ``` Use the CycloneDX predicate type to verify the SBOM attestation attached to the same package artifact: ```sh gh attestation verify Weblate-5.4-py3-none-any.whl \ --repo WeblateOrg/weblate \ --source-ref refs/tags/weblate-5.4 \ --signer-workflow WeblateOrg/weblate/.github/workflows/setup.yml \ --predicate-type https://cyclonedx.org/bom ``` ### SBOM and checksums The release SBOM is a CycloneDX JSON file named `weblate--sbom.cdx.json` and is attached to GitHub release assets. The SBOM attestation is attached to the package archives, not to the SBOM file as a separate release artifact. Weblate does not currently publish a separate checksum manifest such as `SHA256SUMS` for release artifacts. ### Other release channels The release artifact inventory does not currently identify signatures, SBOMs, or provenance attestations for Helm charts. The verification instructions in this section apply to the Weblate Python release artifacts published by this repository. Docker image and Weblate Client supply-chain metadata is published by their owning repositories. # security/releases.md # Releases and supported versions This page summarizes the public release, security-update, and upgrade support policies for Weblate. For maintainer release steps, see [Releasing Weblate](https://docs.weblate.org/en/latest/contributing/release.md). For upgrade commands, see [Upgrading Weblate](https://docs.weblate.org/en/latest/admin/upgrade.md). For published release artifacts, SBOMs, signatures, and provenance attestations, see [Release artifacts and verification](https://docs.weblate.org/en/latest/security/release-artifacts.md). ## Release cycle Weblate uses calendar versioning with monthly releases. The version format is `..` with a numeric, non-zero-padded month. The `` part is omitted for the first release in a month when it would be `0`, for example `2026.5`. Patch releases use the full version number, for example `2026.5.1`. Monthly releases are usually published at the beginning of the month. Patch releases include bug fixes, security fixes, and dependency updates which should not wait for the next monthly release. The Docker container includes an additional version component to track changes in the container itself, such as dependencies. Fixed Docker image tags include the patch component together with this build component, even when the Weblate version omits a `0` patch component. These updates may include security updates. ## Security updates Weblate provides security updates to address vulnerabilities and enhance the application’s security posture. Only the latest release is guaranteed to receive security updates. Users are encouraged to keep Weblate up to date to benefit from the latest security improvements. Security update coverage and direct upgrade support are separate policies. | Version | Security update coverage | End of guaranteed security updates | Direct upgrade support | |-----------------------------------------------------------|-------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Latest Weblate release | Guaranteed. | When the next Weblate release is published, normally the following
month. | Supported. | | Older releases from the current or previous calendar year | Not guaranteed. Upgrade to the latest release to receive guaranteed
security updates. | Ended when a newer Weblate release was published. | Direct upgrades are supported. | | Older releases | Not guaranteed. | Ended when a newer Weblate release was published. | Upgrade through the intermediate versions listed in
[Version-specific instructions](https://docs.weblate.org/en/latest/admin/upgrade.md#version-specific-instructions). | Direct upgrades are supported from releases in the current or previous calendar year. The first release in a new year drops direct upgrade support for releases from the year before the previous year. # security/threat-model.md # Weblate threat model Project: Weblate Last reviewed for Weblate 2026.10 at commit `8283fcad69f`. Date: 2026-09-01. Status: Accepted, 2026-09-01. Version binding: This model is versioned with Weblate releases. A report against Weblate version N is triaged against the model published for version N, not against the latest development branch. *(maintainer)* Reporting cross-reference: Reports that violate a property Weblate claims in [Security properties Weblate provides]() are reported through `SECURITY.md` and [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md). Reports that fall under [Out of scope]() or [Security properties Weblate does not provide]() can be closed by citing this document unless this model routes them to `VALID-HARDENING`. *(documented)* (source: [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md)) Provenance legend: `*(documented)*` means the claim is stated in Weblate documentation; `*(maintainer)*` means it was stated by a maintainer during this threat-model process; `*(inferred)*` means it was reasoned from the current project shape and needs maintainer confirmation. Weblate is a Django-based web localization platform. It accepts work from browser users, API clients, project-scoped tokens, repository webhooks, VCS repositories, backup archives, background workers, and configured external services, then stores and synchronizes translation projects through a database, datastore, local filesystem repositories, and external code-hosting systems. *(documented)* (source: [Weblate Documentation](https://docs.weblate.org/en/latest/index.md), [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md)) ## Scope and intended use This model describes shared trust boundaries and security properties. Features within a component family follow its general guidance unless an explicit exception applies; the representative surfaces below are not an exhaustive feature inventory. *(maintainer)* | Component family | Representative surface | Outside-process effects | Model status | |----------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Web UI and REST API | Browser views, forms, session endpoints, [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md) | Database, datastore, e-mail, logs, uploaded files | In scope. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md)) | | Authentication, sessions, and authorization | Login, 2FA, SSO, teams, permissions, project access, API tokens | Database, identity providers, browser cookies | In scope. *(documented)* (source: [Authentication](https://docs.weblate.org/en/latest/admin/auth.md), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | | Project-scoped API tokens | Tokens created in project API access | Same application effects as the token permissions allow | In scope as authenticated actors with delegated project scope.
*(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | | Webhooks | [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks), project [Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks),
[App webhook URL](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-webhook) | Background task scheduling and VCS repository updates | In scope as a public, deployment-hardened interface. *(documented)* (source: [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks), [Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks), [App webhook URL](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-webhook)) | | VCS integration | Repository URLs, branches, pushes, pulls, merge requests, local clones,
and GitHub App registration, connections, component migration, and
removal | Filesystem, child VCS commands, SSH/HTTPS network connections, and
provider repository or installation state | In scope when reachable through Weblate configuration or project
content. *(documented)* (source: [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md),
[Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md)) | | Background tasks | Celery queues for repository updates, project deletion, notifications,
translation memory, translation, and backups | Database, datastore, filesystem, outbound network | In scope as Weblate-controlled execution of user or operator actions.
*(documented)* (source: [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md), [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md)) | | Project backup import/export | [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup), [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md) project backup endpoints,
[`import_projectbackup`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_projectbackup) | Uploaded ZIP archives, generated backup archives, filesystem restore,
repository state | In scope. *(documented)* (source: [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md), [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md),
[Management commands](https://docs.weblate.org/en/latest/admin/management.md)) | | Service backup | BorgBackup configuration and [`backup`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-backup) | Local or remote backup storage over filesystem or SSH | In scope for Weblate’s handling of configured backup jobs; Borg itself
is out of scope. *(documented)* (source: [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md),
[Management commands](https://docs.weblate.org/en/latest/admin/management.md)) | | Machine translation and outbound integrations | Machine translation, avatars, status reporting, telemetry, error
reporting, VCS hosts, GitHub App connections, CDN add-on, Fedora
Messaging add-on, e-mail delivery (SMTP or AWS SES) | Outbound HTTP(S), AMQP(S), provider APIs, logs | In scope for Weblate’s enforcement of configured access and network
restrictions. Provider behavior is out of scope. *(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md), [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md), [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md)) | | Add-ons | Built-in add-ons and administrator-configured add-on execution | Varies by add-on; can mutate project or repository state or contact
services | Built-in add-ons are in scope when enabled. Third-party add-ons are out
of scope except for Weblate’s permission and installation gates.
*(maintainer)* | | Management commands | **weblate** commands run by an operator | Database, filesystem, VCS, backup storage | In scope when processing untrusted Weblate data; the local operator
shell is trusted. *(maintainer)* | | Tests, generated docs, screenshots, development fixtures | `docs/_build/`, `docs/screenshots/`, tests, local fixtures | Development-only files and generated artifacts | Out of scope for product security claims. *(maintainer)* | Development environments are not supported production deployments and do not provide security isolation from a malicious checkout or local user. *(maintainer)* The intended deployment is a server-side Weblate installation behind a web server or reverse proxy, with a WSGI or ASGI application server, PostgreSQL database, datastore, Celery workers, a writable data directory, and optional outbound VCS, backup, identity-provider, and machine-translation integrations. *(documented)* (source: [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md)) The relevant actors are split by trust level: unauthenticated clients, authenticated users, reviewers, project managers, administrators, project-scoped API tokens, webhook senders, external VCS providers, configured external services, and local operators. *(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md), [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md)) Weblate is not intended to be embedded as an in-process security library, used as a sandbox for untrusted code, or exposed without the deployment controls documented for production use. *(maintainer)* ## Out of scope The following are explicit non-goals for this model: * A compromised operating system account, container runtime, database server, datastore, reverse proxy, or administrator shell. Weblate runs inside those boundaries and does not claim to protect itself from an already-compromised host. *(maintainer)* * A malicious Weblate site administrator or local operator with unrestricted server access. Such an actor can change settings, credentials, data, or code. *(maintainer)* * Vulnerabilities in third-party dependencies as independent projects. General Django, Django REST framework, Python Social Auth, BorgBackup, VCS, database, and provider vulnerabilities are reported upstream unless the issue is in Weblate’s use of them. *(documented)* (source: [Vulnerability and incident handling](https://docs.weblate.org/en/latest/security/issues.md)) * Build and release hygiene, including action pinning, artifact signing, dependency freshness, and repository branch protection. These affect project operations but are not threat-model claims about Weblate runtime behavior. *(maintainer)* * General security of external VCS providers, identity providers, mail servers, machine-translation services, avatar services, CDN storage, or backup storage. Weblate models only its configured interactions with them. *(maintainer)* * User organizations’ translation-supply-chain choices outside Weblate. Outsourced or crowdsourced translator risks are described separately in [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md). *(documented)* (source: [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md)) * Third-party add-on code, local customization code, development fixtures, generated documentation output, test-only code, and demo or example data. *(maintainer)* ## Trust boundaries and data flow Weblate’s primary trust boundary is the network-facing application surface: browser views, API endpoints, webhook endpoints, and upload endpoints accept data from less-trusted actors and translate it into database rows, local repository state, background tasks, outbound requests, and rendered UI. *(maintainer)* | Boundary | Trust transition | |-----------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Client browser/API client to Weblate | Untrusted or authenticated requests become permission-checked
application actions. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | | Weblate request process to repository Celery worker | Permission-checked browser and API repository actions become queued work
carrying the initiating user and affected repository scope. The worker
reacquires the datastore reservation and rechecks the user’s current VCS
permission on the current repository owner before mutation.
The broker, datastore, and workers are trusted parts of the same Weblate
instance. *(maintainer)* | | Webhook sender to Weblate | Public forge notifications can schedule repository synchronization
where hooks are enabled, matching components by exact repository URL
rather than host or path suffix fallback. Generic hook responses expose
match counts and, for updated components, project/component slugs and API
URLs, including for private projects and restricted components.
Components managed through an authenticated integration are excluded
from generic matching and diagnostics; currently this applies to the
GitHub App VCS backend. Registered GitHub App webhooks authenticate with
a per-app URL token and GitHub signature verification. Opt-in legacy
GitHub App deliveries to the generic GitHub webhook URL authenticate
with a separately configured secret. *(documented)* (source: [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks),
[Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks), [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching),
[App webhook URL](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-webhook),
[`GITHUB_LEGACY_APP_WEBHOOK_SECRET`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-GITHUB_LEGACY_APP_WEBHOOK_SECRET)) | | Weblate to database/datastore | Permission-checked application state becomes persistent data and queued
work. *(documented)* (source: [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md)) | | Weblate to local VCS repositories | Project configuration and repository content drive filesystem and VCS
operations. *(documented)* (source: [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md)) | | Weblate to external services | Configured URLs, credentials, and provider settings drive outbound
network connections. *(documented)* (source: [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md),
[Configuration](https://docs.weblate.org/en/latest/admin/config.md)) | | Project backup archives and Weblate filesystem | Uploaded ZIP members and metadata become restored project state;
generated project backups are written to and read from local backup
storage. *(documented)* (source: [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md), [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md),
[Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup)) | Reachability preconditions: * A web UI or API finding is in model only when reachable by an unauthenticated client, authenticated user, or project-scoped token through documented routes, forms, or API endpoints. *(maintainer)* * An authorization finding is in model only when it crosses a documented permission, team, project, component, language, glossary, token, or site-wide boundary. *(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md)) * A webhook finding is in model only when a request can reach an enabled hook endpoint and affect repository update scheduling, task volume, or information returned to the caller beyond the documented matching diagnostics. *(documented)* (source: [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks), [Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks), [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching)) * A VCS finding is in model only when attacker-controlled or less-trusted repository data, branch names, URLs, file names, commit metadata, or project configuration can influence Weblate’s VCS operations. *(maintainer)* * A backup import finding is in model only when reachable from a project backup uploaded through Weblate or supplied to [`import_projectbackup`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_projectbackup). *(documented)* (source: [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup), [`import_projectbackup`](https://docs.weblate.org/en/latest/admin/management.md#weblate-admin-import_projectbackup)) * A backup export finding is in model only when reachable from documented project backup creation or download routes, including the REST API for users or project-scoped tokens with project edit permission. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) * A background-task finding is in model only when the task can be queued from an in-scope Weblate surface or scheduled Weblate maintenance path. *(documented)* (source: [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md)) * A management-command finding is in model only when untrusted Weblate data is processed by the command; arbitrary local shell access is not an attacker capability. *(maintainer)* ## Environment assumptions Weblate assumes a supported Python and Django runtime, a correctly configured database, a datastore, a writable data directory, and running workers for features that require background processing. *(documented)* (source: [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md)) Production deployments are expected to configure the external web server or reverse proxy consistently with Weblate’s HTTPS, host header, body-size, and proxy-header settings. *(documented)* (source: [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md), [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS), [`ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ALLOWED_HOSTS)) The database, datastore, and internal service ports are assumed not to be directly exposed to untrusted networks. *(maintainer)* Filesystem permissions are assumed to prevent unrelated local users from modifying Weblate’s data directory, configuration, VCS repositories, generated SSH wrappers, backups, and secret material. *(documented)* (source: [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md), [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md)) Celery workers are trusted components of the same Weblate instance. A malicious or compromised worker is equivalent to a compromised application process. *(maintainer)* Worker process and queue separation do not create security isolation; workers retain the same trusted application authority. *(maintainer)* VCS command execution, SSH, and HTTPS clients are assumed to execute as the Weblate service user with the credentials configured for the relevant project or integration, including database-stored GitHub App credentials used for installation tokens and webhook signature verification. *(documented)* (source: [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md), [`SSH_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SSH_EXTRA_ARGS)) What Weblate does to its host: * It opens outbound network connections for configured VCS, identity-provider, avatar, machine-translation, backup, status-reporting, telemetry, error-reporting, and add-on features such as outbound webhooks and Fedora Messaging AMQP delivery. *(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md), [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md), [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md)) * It runs VCS and backup-related helper commands as part of repository and backup workflows. *(documented)* (source: [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md), [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md)) * It writes to the configured data directory, repository storage, media/fonts, backup dumps, logs, and cache locations. *(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md), [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md)) * It sends e-mail and notifications through configured providers. Operator-controlled service endpoints and credentials are trusted infrastructure, outside user-configurable private-target restrictions. *(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md), [Installing using Docker](https://docs.weblate.org/en/latest/admin/install/docker.md)) * It does not claim to be free of process-wide side effects such as logging, cache writes, subprocess execution, or outbound network access. *(maintainer)* ## Build-time and configuration variants | Knob | Default or documented posture | Effect on the model | Maintainer stance | |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [`ENABLE_HOOKS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HOOKS) and [Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks) | Anonymous remote hooks are configurable and must also be enabled for a
project. *(documented)* | Exposes webhook endpoints as a public scheduling interface. Abuse
resistance depends on deployment controls. *(documented)* (source: [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks), [Enable hooks](https://docs.weblate.org/en/latest/admin/projects.md#project-enable-hooks)) | Production deployments exposing hooks use reverse-proxy rate limits,
body-size limits, monitoring, and minimal public exposure. *(maintainer)* | | [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS), proxy SSL headers, and HSTS settings | HTTPS affects secure cookies, redirects, HSTS, WebAuthn, and generated
URLs. *(documented)* (source: [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS)) | Disabling or misconfiguring HTTPS removes transport and cookie
protections that Weblate relies on for browser security. *(documented)* (source: [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS)) | The documented production posture is HTTPS with correct proxy headers.
*(documented)* | | [`ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ALLOWED_HOSTS) | Configures accepted HTTP hostnames. *(documented)* (source: [`ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ALLOWED_HOSTS)) | Broad host acceptance can weaken host-header based protections and URL
generation assumptions. *(maintainer)* | Production deployments restrict this to instance hostnames. *(maintainer)* | | [`WEBLATE_API_RATELIMIT_ANON`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_ANON),
[`WEBLATE_API_RATELIMIT_USER`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_API_RATELIMIT_USER),
[`API_RATELIMIT_USER_OVERRIDES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_USER_OVERRIDES),
[`API_RATELIMIT_IP_OVERRIDES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-API_RATELIMIT_IP_OVERRIDES), [`RATELIMIT_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-RATELIMIT_ATTEMPTS),
and `RATELIMIT_GITHUB_SETUP_ATTEMPTS` | Rate limits are configurable. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md),
[Configuration](https://docs.weblate.org/en/latest/admin/config.md)) | Availability claims assume rate limits appropriate to deployment size
and exposure. *(maintainer)* | Operators can override or exempt users and IP networks, including
anonymous clients. IP exemptions rely on trusted proxy configuration;
they do not grant authentication or permissions. *(documented)*
(source: [API rate limiting](https://docs.weblate.org/en/latest/api.md#api-rate), [`IP_BEHIND_REVERSE_PROXY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-IP_BEHIND_REVERSE_PROXY)).
Disabling rate limits changes DoS triage from Weblate bug to deployment
posture unless a single request violates a claimed property.
*(maintainer)* | | [`CSP_SCRIPT_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_SCRIPT_SRC), [`CSP_IMG_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_IMG_SRC),
[`CSP_CONNECT_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_CONNECT_SRC), [`CSP_STYLE_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_STYLE_SRC),
[`CSP_FONT_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_FONT_SRC), [`CSP_FORM_SRC`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CSP_FORM_SRC) | Content Security Policy sources are configurable. *(documented)*
(source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md)) The default script policy permits inline
execution only on explicitly scoped compatibility paths. *(maintainer)* | Broadening sources can reduce browser-side containment for XSS or
third-party content. *(maintainer)* | Deployments adding third-party sources accept that expanded browser
trust. *(maintainer)* | | [`PROJECT_BACKUP_UPLOAD_MAX_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_UPLOAD_MAX_SIZE),
[`PROJECT_BACKUP_IMPORT_MAX_MEMBERS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_MEMBERS),
[`PROJECT_BACKUP_IMPORT_MAX_TOTAL_UNCOMPRESSED_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_TOTAL_UNCOMPRESSED_SIZE),
[`PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_SIZE),
[`PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MIN_RATIO_SIZE),
[`PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_RATIO`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_IMPORT_MAX_COMPRESSED_ENTRY_RATIO) | Defaults bound project backup upload and import size, member count, and
suspicious compression ratios. *(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md)) | Raising or disabling these limits expands restore-time resource exposure.
*(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md)) | The defaults documented above are part of backup-import resource guarantees.
*(documented)* | | Private-target restrictions and allowlists for outbound URLs | User-configurable outbound URL surfaces documented with private-target
restriction settings reject internal or non-public targets by default.
*(documented)*
(source: [`ASSET_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_RESTRICT_PRIVATE),
[`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE),
[`WEBHOOK_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_RESTRICT_PRIVATE), [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE))
Protected direct HTTP requests are bound to addresses approved by
runtime validation; configured per-protocol HTTP proxies are trusted
infrastructure and resolve their destination hosts.
Protected Git HTTPS and SSH operations are bound to addresses approved
by runtime validation. Protected SSH operations validate the effective
`HostName` and `Port`. Trusted administrator SSH configuration can
alter routing, and [`SSH_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SSH_EXTRA_ARGS) can override connection
binding. Permanent same-host Git HTTP redirects are probed without
automatic redirect following. Every direct destination is independently
validated and bound before use; configured per-protocol HTTP proxies use
the shared trusted outbound routing. Git LFS object transfers are
disabled and outside the supported VCS integration surface. VCS clients
without connection binding require an explicit trusted-host exemption.
*(maintainer)* | Allowlist settings and privileged configuration can intentionally expand
reachability. A non-empty [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS) also restricts all
configured VCS hosts, while [`VCS_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_PRIVATE_ALLOWLIST) only exempts
matching hosts from private-target checks and does not bypass that host
filter. Fedora Messaging broker URLs are site-administrator configuration
and are trusted by this model. *(documented)* (source:
[`ASSET_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_PRIVATE_ALLOWLIST),
[`PROJECT_WEB_RESTRICT_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_ALLOWLIST),
[`WEBHOOK_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_PRIVATE_ALLOWLIST), [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS),
[`VCS_PRIVATE_ALLOWLIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_PRIVATE_ALLOWLIST)) | Default private-target rejection is an application-level security
property for the documented user-configurable URL surfaces.
*(maintainer)* | | [`SSH_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SSH_EXTRA_ARGS) | Allows custom SSH options. *(documented)* (source: [`SSH_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SSH_EXTRA_ARGS)) | Weakening SSH algorithms or host verification changes VCS transport
assumptions. Routing options can override protected repository address
pinning. *(maintainer)* | Operators own the security impact of custom SSH options. *(maintainer)* | | Third-party add-ons and local customization | Administrators can extend behavior. *(documented)* (source: [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md)) | Custom code can add new trust boundaries and security properties outside
this model. *(maintainer)* | Third-party code is modeled separately. *(maintainer)* | ## Input assumptions | Surface | Input | Attacker-controllable? | Caller or operator must enforce | |--------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Browser forms and REST API | Request bodies, query strings, uploaded files, headers, cookies | Yes, within the actor’s authentication state. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md)) | HTTPS, correct host/proxy configuration, rate limits, and permission
assignment. *(documented)* (source: [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md),
[Access control](https://docs.weblate.org/en/latest/admin/access.md)) | | Authentication endpoints | Passwords, WebAuthn data, SSO callbacks, reset tokens | Yes. *(documented)* (source: [Authentication](https://docs.weblate.org/en/latest/admin/auth.md)) | Correct identity-provider configuration and HTTPS. *(documented)* (source: [Authentication](https://docs.weblate.org/en/latest/admin/auth.md), [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS)) | | Project-scoped tokens | API requests authenticated by token | Yes, by whoever holds the token. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md)) | Token storage, rotation, and least-privilege team membership.
*(maintainer)* | | Translation content | Source strings, translations, comments, suggestions, glossary entries | Yes, from users with relevant permissions or imported repositories.
*(documented)* (source: [Translating using Weblate](https://docs.weblate.org/en/latest/user/translating.md), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | Review workflows and permission assignment for project-specific content
integrity. *(documented)* (source: [Translation workflows](https://docs.weblate.org/en/latest/workflows.md), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | | Webhook endpoints | Headers, event type, body, repository and branch metadata | Yes, where endpoint is reachable. *(documented)* (source: [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks)) | Hook enablement only where needed, request limits, and monitoring.
*(maintainer)* | | GitHub App lifecycle | Registration and installation callbacks, GitHub OAuth code, signed
Weblate state, installation ID, account metadata, component migration
selections, and connection-removal requests | Yes, from authenticated Weblate users and GitHub redirect query strings.
*(documented)* (source: [Registering the GitHub App from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-register),
[Migrating existing components](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-migrate)) | Registering App credentials requires the site-wide
`management.configure` permission. Connecting or removing an
installation requires management rights for its workspace, and Weblate
verifies GitHub administration of an installation before connecting it.
Component migration additionally requires edit permission for every
selected component. Removing the last workspace connection also attempts
to uninstall the App from GitHub. *(documented)*
(source: [Registering the GitHub App from Weblate](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-register),
[Migrating existing components](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-app-migrate)) | | Repository configuration | Repository URLs, branches, push URLs, credentials, Gerrit review push
options, add-on settings, and [Version control parameters](https://docs.weblate.org/en/latest/vcs.md#vcs-params) controlling force pushes
and pull-request behavior | Trusted to users with corresponding management permissions.
*(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md), [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md))
The automatic translation add-on can create approved strings when the
target language’s effective review settings allow it. Configuring this
behavior uses add-on management permissions rather than the configuring
user’s review permission. *(documented)* (source: [Add-ons](https://docs.weblate.org/en/latest/admin/addons.md)) | Assign VCS and project management permissions only to trusted users.
*(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | | External repository content | Translation files, paths, branch names, commit metadata | Yes, if the upstream repository is controlled by another actor.
*(maintainer)* | Trust the configured upstream repository or review imported changes.
*(maintainer)* | | Project backup import | ZIP archive members, metadata, translation files, repository state | Yes, for whoever can upload or provide the backup. *(documented)* (source: [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup)) | Keep import limits at values appropriate for the instance. *(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md)) | | Project backup export | Backup creation requests and requested backup file names | Yes, for users or project-scoped tokens with project edit permission.
*(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | Grant project edit permission only to trusted project administrators.
*(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | | Machine translation and external service configuration | Provider URLs, credentials, model or service settings | Trusted to administrators or users granted configuration permissions.
*(documented)* (source: [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | Treat configured providers as recipients of the data sent to them; the
submitted content varies by provider and enabled feature. *(maintainer)* | | Management commands | Command-line arguments and files supplied by the local operator | Trusted local input unless processing Weblate data or project backups.
*(maintainer)* | Restrict shell access to trusted operators. *(maintainer)* | Size and rate assumptions: * Weblate relies on application and reverse-proxy upload limits for large HTTP requests. *(documented)* (source: [`PROJECT_BACKUP_UPLOAD_MAX_SIZE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_BACKUP_UPLOAD_MAX_SIZE)) * Project backup imports are bounded by member count, aggregate uncompressed size, compressed entry size, minimum ratio size, and compression ratio settings. *(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md)) * Project backup metadata, object references, repository paths, outbound URLs, regular expressions, and screenshot content are validated before restore writes project state. Failed restores remove repository and media objects created by that attempt. *(documented)* (source: [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup)) * API and selected web actions are expected to be protected by configured rate limits. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Configuration](https://docs.weblate.org/en/latest/admin/config.md)) * Repository size, number of projects, number of components, and worker capacity are deployment-sizing concerns unless a single in-scope input bypasses documented limits or permissions. *(maintainer)* ## Adversary model | Actor | In-scope capabilities | Out-of-scope capabilities | |----------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Unauthenticated internet client | Send HTTP(S) requests to public pages, registration, login, API, and
reachable webhook endpoints. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md)) | Read server memory, bypass reverse proxy controls, or access internal
services directly. *(maintainer)* | | Authenticated user | Perform actions allowed by assigned teams, permissions, and workflow.
*(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | Act outside assigned permissions without exploiting a Weblate flaw.
*(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | | Reviewer or project manager | Exercise delegated project, component, language, review, VCS,
translation memory, screenshot, or access-management permissions.
*(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | Become a site administrator unless granted that role or exploiting a
Weblate flaw. *(maintainer)* | | Project-scoped API token holder | Use API permissions assigned to the token’s team memberships, including
project backup creation and download where project edit permission is
granted. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Access control](https://docs.weblate.org/en/latest/admin/access.md),
[Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup)) | Access projects, components, or site-wide functions outside its scope.
*(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | | Webhook sender | Send forged, replayed, malformed, or high-volume webhook requests to
enabled hook endpoints and observe documented matching diagnostics.
*(documented)* (source: [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks), [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching)) | Obtain forge-authenticated identity where Weblate does not verify it.
*(maintainer)* | | External VCS or service provider | Return repository data, API responses, redirects, or errors according
to the configured integration. *(documented)* (source: [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md)) | Compromise the Weblate host except through data or protocol behavior
Weblate processes. *(maintainer)* | | Translator or localization contributor | Submit translation content that downstream applications might consume.
*(documented)* (source: [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md)) | Control downstream application escaping, rendering, or review policy
outside Weblate. *(documented)* (source: [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md)) | | Local operator | Run management commands, change configuration, and access backups.
*(documented)* (source: [Management commands](https://docs.weblate.org/en/latest/admin/management.md), [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md)) | Local malicious operators are trusted for this model. *(maintainer)* | The modeled attacker tries to bypass authorization, modify translation or repository data without permission, disclose private project or user data, forge or abuse repository synchronization, trigger unsafe outbound requests, execute commands through Weblate-controlled workflows, or exhaust bounded application resources. *(maintainer)* ## Security properties Weblate provides | Property | Conditions | Violation symptom | Severity tier | |----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Web authorization separates site, project, component, language,
glossary, VCS, translation memory, screenshot, review, and access
management permissions. *(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md),
[Authentication](https://docs.weblate.org/en/latest/admin/auth.md), [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md)) | Permission assignments match the intended trust relationship.
Team-level enforced 2FA is satisfied by human users before
team-derived permissions apply. Pending authenticator app registrations
do not satisfy 2FA requirements. Registration requires a valid,
single-use TOTP code and cannot be completed more than once, including
under concurrent submissions. *(documented)* (source: [Two-factor authentication](https://docs.weblate.org/en/latest/admin/auth.md#fa))
Component administrators are trusted to
configure operations that can affect repository contents, for example by
selecting files through component settings, configuring add-ons, or
enabling force pushes and pull-request behavior through [Version control parameters](https://docs.weblate.org/en/latest/vcs.md#vcs-params).
Users with management rights for a workspace are trusted to connect and
remove its GitHub App installations; removing the final workspace
connection can uninstall the App from GitHub. GitHub App component
migration separately requires edit permission for every selected
component.
Linking a repository extends this trust to administrators of every
linked component for the complete shared checkout. Permissions for
explicit VCS actions are checked on the repository-owning component.
Linking accepts this owner’s authority over the complete shared checkout;
permissions on downstream linked components neither grant nor veto
explicit VCS authority. Project-wide
VCS actions omit repositories where this permission check fails; they do
not partially operate on an individual shared checkout. Explicit VCS
actions queued from the browser or API retain the initiating user,
serialize access to the affected repositories, and recheck that user’s
permission on the current repository owner in the worker
before mutation. Weblate’s normal background commit and push of
authorized translation changes does not require the editor to have
these VCS permissions. The `reports.view` permission authorizes all
report data in the selected scope, including private projects and
restricted components below it. Complete workspace-level report access
requires two-factor authentication for regular users if any project in
the workspace enforces it. Superusers and bot accounts are exempt.
Translation memory
attributed to an existing restricted component follows that component’s
access rules.
Unattributed automatic memory, including unmatched legacy entries and
memory retained after component removal, follows its remaining
translation-memory scope. Private and Custom project engage pages and
rendered status widgets follow project access control unless a trusted
access manager enables [Public sharing](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing). That explicit
opt-in publishes project and component names, including restricted
components, together with translation statistics, languages, and
progress, but does not grant access to project content or APIs. | User or token can read or mutate data outside assigned scope. | Security-critical when private data or privileged mutation is exposed. | | Project-scoped API tokens are limited by assigned project/team
permissions. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) | Token is created and stored by a trusted actor. | Token can act outside project or team scope. | Security-critical. | | Authentication and session controls protect browser sessions when HTTPS
and proxy settings are correct. Pending second-factor sessions are bound
to the current password authentication state, and repeated rejected
second-factor submissions lock password sign-in according to
[`AUTH_LOCK_ATTEMPTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTH_LOCK_ATTEMPTS). *(documented)* (source:
[Authentication](https://docs.weblate.org/en/latest/admin/auth.md), [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS)) | Production HTTPS and secure-cookie settings are enabled. | Session fixation, credential bypass, cross-user session confusion, or a
pending password sign-in remaining usable after a password change or
account lock. | Security-critical. | | User-supplied content rendered by Weblate is expected not to execute
script in other users’ browsers. *(maintainer)* | Content is displayed through Weblate UI templates and standard escaping. | Stored or reflected XSS in the Weblate origin. | Security-critical. | | Repository, branch, path, and VCS inputs processed by Weblate must not
become shell command execution. *(maintainer)* | VCS operations are invoked through Weblate-supported repository
workflows and configured credentials. Project backup restores allow only
non-executable Git, git-svn, and Mercurial repository state, and rebuild
repository-local configuration from validated component settings.
Weblate does not populate Git submodules (see [Git submodules](https://docs.weblate.org/en/latest/vcs.md#git-submodules)). | Command injection or arbitrary code execution as the Weblate user. | Security-critical. | | Private project data other than documented generic webhook matching
diagnostics and metadata published through [Public sharing](https://docs.weblate.org/en/latest/admin/projects.md#project-public-sharing),
user data, credentials, tokens, SSH keys, and 2FA secrets are not
disclosed to actors lacking permission. *(documented)* (source:
[Access control](https://docs.weblate.org/en/latest/admin/access.md), [Privacy regulations compliance](https://docs.weblate.org/en/latest/security/privacy-compliance.md), [Version control integration](https://docs.weblate.org/en/latest/vcs.md)) | Host, database, and storage permissions are intact. Generic webhook
responses expose only the match counts, project/component slugs, and API
URLs documented in [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching). Public sharing permits
unauthenticated access to engage pages and rendered status widgets,
exposing project and component names, including restricted components,
translation statistics, languages, and progress. It does not grant
access to project content or APIs. Repository content
deliberately shared through linked components follows the linked
repository trust boundary. Project repository permission diagnostics
identify accessible repository owners where an operation requires
permission, but do not expose inaccessible component identities or
blocked repository content or status. Custom add-ons list only
non-sensitive fields as public configuration; unlisted values are
redacted from public change history. | Cross-project data leak not covered by the documented generic webhook
diagnostics, public-sharing metadata, or linked-repository trust
boundary, credential exposure, or unauthorized export. | Security-critical. | | Backup import rejects archives exceeding documented upload, member,
aggregate size, and suspicious compression thresholds. *(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md), [Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup)) | Defaults or stricter limits remain configured. | Oversized or highly amplified archive is accepted past configured
thresholds. | Security-critical for single-request DoS; otherwise availability bug. | | Documented user-configurable outbound URL surfaces reject internal or
non-public targets by default. *(documented)* (source:
[`ASSET_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ASSET_RESTRICT_PRIVATE),
[`PROJECT_WEB_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PROJECT_WEB_RESTRICT_PRIVATE),
[`WEBHOOK_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBHOOK_RESTRICT_PRIVATE), [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE)) | Default private-target checks are enabled and no trusted allowlist
exemption applies. Direct protected HTTP requests and Git HTTPS and SSH
operations retain address binding, VCS restrictions remain enabled,
and VCS backends without binding use only explicitly trusted hosts.
Configured per-protocol HTTP proxies remain trusted routing
infrastructure. | A user-configurable screenshot URL, remote HTML URL, project website or
repository browser URL, outbound webhook URL, or VCS URL reaches an
internal or non-public target despite default controls. | Security-critical when it exposes internal services or metadata. | | Weblate records security-relevant account, permission, billing lifecycle,
authenticated web-action rate-limit lockouts, and project or component
setting changes in audit logs or history. Account-removal audit entries
retain the former e-mail address until [`AUDITLOG_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUDITLOG_EXPIRY).
*(documented)* (source: [Privacy regulations compliance](https://docs.weblate.org/en/latest/security/privacy-compliance.md),
[Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit), [Billing](https://docs.weblate.org/en/latest/admin/optionals.md#billing), [Weblate 2026.10](https://docs.weblate.org/en/latest/changes.md)) | Logging is configured, storage is available, and
[`AUDITLOG_EXPIRY`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUDITLOG_EXPIRY) reflects the operator’s intended retention. | Missing audit trail for an action Weblate claims to log, or personal data
retained beyond the configured audit-log expiry. | Security-critical when it blocks investigation of privileged changes or
discloses retained personal data; privacy-impacting when data exceeds the
configured retention; correctness-only for minor event gaps. | | Self-service trial creation grants only the designated commercial trial
plan or the Libre setup plan. *(maintainer)* | The deployment offers self-service hosting trials. | An authenticated user can select another public, private, or internal
billing plan when creating a trial. | Security-critical when this bypasses paid service limits. | | Rate-limited API and web actions enforce configured rate limits.
*(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md), [Configuration](https://docs.weblate.org/en/latest/admin/config.md)) | Rate limiting is enabled and backed by a working datastore. | Requests exceeding configured thresholds continue to be processed. | Availability/security hardening depending on endpoint sensitivity. | | Built-in translation quality checks must not permit user-controlled
content within configured size limits to monopolize synchronous request
workers through disproportionate resource consumption. *(maintainer)* | The check is enabled and runs during a supported browser or API
translation write. | A single accepted translation causes CPU or memory consumption
disproportionate to its size and stalls a request worker. | Security-critical for single-request DoS; otherwise availability bug. | | Generic webhooks schedule repository updates only for eligible components
whose repository URL exactly matches a repository URL from the payload,
including documented URL variants. Components managed through an
authenticated integration are excluded from generic matching and
diagnostics. Generic responses disclose only the documented matching
diagnostics for eligible components. *(documented)* (source:
[Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching)) | Hooks are enabled and the delivery reaches an in-scope hook endpoint. | A delivery updates a component whose repository URL does not exactly
match the payload, including through host or path suffix fallback, or a
generic delivery updates or discloses a component managed through an
authenticated integration, or a response discloses component information
beyond the documented fields. | Security-critical when it causes unauthorized repository synchronization
across unrelated components; otherwise correctness or hardening. | | Weblate does not intentionally expose database, datastore, backup
storage, or raw internal storage directly through the public web
interface; exported VCS repositories are intentionally exposed by
[Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter) when that optional module is enabled; authorized
project backup downloads are intentionally exposed through documented
project backup routes. *(documented)* (source: [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md),
[Project level backups](https://docs.weblate.org/en/latest/admin/backup.md#projectbackup)) *(maintainer)* | Deployment does not serve internal storage paths as static files except
for documented export features. | Public request retrieves raw internal storage, configuration, or
non-exported repository data. | Security-critical. | Resource thresholds in this model are the documented configuration defaults where they exist, especially backup import limits and rate limits. For repository size, project count, component count, and translation volume, Weblate does not claim a fixed universal resource ceiling independent of deployment capacity. *(maintainer)* Component discovery bounds repository traversal and file-mask matching work even when repository content controls the masks; see [component discovery limits](https://docs.weblate.org/en/latest/admin/addons.md#component-discovery-limits). *(maintainer)* ## Security properties Weblate does not provide Weblate does not authenticate every webhook delivery cryptographically for all supported forge integrations. Hook endpoints are compatibility-oriented and deployment-hardened rather than uniformly forge-authenticated. Reports that show only unauthenticated triggering within modeled effects are `VALID-HARDENING` rather than `BY-DESIGN`. *(maintainer)* Weblate does not make an unauthenticated webhook equivalent to a trusted forge identity. Hook processing can trigger update workflows, and generic responses can confirm repository registration and reveal match counts, project/component slugs, and API URLs, including for private projects and restricted components. Components managed through an authenticated integration are excluded from this generic behavior. Attribution and authenticity are weaker than for an authenticated user or token. *(maintainer)* User-requested background work is authorized when Weblate accepts and queues the request. Background tasks do not always verify the initiating user’s permissions again when they execute. Later changes to the user’s account, permissions, or team memberships therefore do not reliably prevent already-authorized work from completing. *(maintainer)* Weblate is not a sandbox for malicious administrators, malicious local operators, third-party add-ons, custom deployment code, VCS clients, or backup tools. *(maintainer)* Weblate does not guarantee that translation content is safe when copied into a downstream product without that product’s own escaping, validation, or review. Translation checks and review workflows help manage localization quality and risk; they are not a complete downstream application security boundary. *(documented)* (source: [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md), [Checks and fixups](https://docs.weblate.org/en/latest/user/checks.md)) False friends: * Weblate permissions are application authorization, not a host sandbox. A user granted VCS or project management permissions can intentionally configure integrations within that role’s power. *(maintainer)* * Webhook project matching and event parsing are not proof that the sender is the legitimate forge when the integration does not authenticate the delivery. *(maintainer)* * Translation checks detect common quality and format problems; they are not a guarantee that translated strings are safe for every downstream renderer. *(documented)* (source: [Checks and fixups](https://docs.weblate.org/en/latest/user/checks.md), [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md)) * BorgBackup encryption protects backup archives according to Borg’s design; Weblate does not add a separate cryptographic guarantee for Borg internals. *(documented)* (source: [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md)) * Rate limits reduce abuse of configured endpoints; they are not a guarantee of availability under volumetric network attacks. *(maintainer)* Well-known attack classes left partly or wholly to deployment or downstream systems: * Phishing and credential reuse are mitigated by authentication policy and 2FA, but Weblate cannot prevent users from disclosing credentials outside the service. *(maintainer)* * Malicious translations can become XSS, format-string, command, or policy problems in downstream applications that render them unsafely. *(documented)* (source: [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md)) * User-configurable outbound URL surfaces with documented private-target restrictions reject internal or non-public targets by default; privileged allowlists, proxies, and administrator-controlled configuration can intentionally expand reachability. *(maintainer)* * Large repository histories, project scale, and background task volume require deployment sizing and operational limits beyond Weblate’s single-input validation. *(maintainer)* ## Downstream responsibilities Operators must deploy Weblate behind production-grade HTTPS with correct proxy headers, hostnames, request-size limits, and secure-cookie behavior. *(documented)* (source: [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md), [`ENABLE_HTTPS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_HTTPS), [`ALLOWED_HOSTS`](https://docs.weblate.org/en/latest/admin/install.md#std-setting-ALLOWED_HOSTS)) Operators enabling forwarded client-IP handling must trust only reverse proxies under their control and prevent untrusted clients from bypassing those proxies to reach Weblate directly. *(documented)* (source: [`WEBLATE_TRUSTED_PROXY_ADDRESSES`](https://docs.weblate.org/en/latest/admin/install/docker.md#envvar-WEBLATE_TRUSTED_PROXY_ADDRESSES), [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy)) Operators must assign teams, roles, project-scoped tokens, VCS credentials, and project management permissions according to least privilege for their organization. *(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md), [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md)) Operators exposing [Notification hooks](https://docs.weblate.org/en/latest/api.md#hooks) must enable them only where needed and provide deployment controls such as reverse-proxy rate limits, body-size limits, monitoring, and optional source restrictions. They must accept the documented identifier disclosure or use authenticated integrations where available. *(maintainer)* Operators must treat private-target allowlists, proxies, and privileged outbound integration settings as intentional expansion of Weblate’s default network reachability limits. *(maintainer)* Operators must keep backup import limits, API rate limits, and web rate limits at values that match instance capacity and exposure. *(documented)* (source: [Configuration](https://docs.weblate.org/en/latest/admin/config.md)) Operators must protect the Weblate data directory, configuration, backup credentials, generated keys, database, datastore, and local shell access as trusted infrastructure. *(documented)* (source: [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md), [Configuration instructions](https://docs.weblate.org/en/latest/admin/install.md)) Downstream product teams must treat translated strings as untrusted content in their own applications unless they have separately reviewed, escaped, and validated them for the target renderer. *(documented)* (source: [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md)) ## Known misuse patterns * Exposing webhook endpoints broadly, enabling project hooks, and relying on webhook payloads as authenticated forge identity. This is unsafe because some supported hooks are compatibility-oriented and return matching diagnostics. Use deployment controls and prefer authenticated integrations where available. *(maintainer)* * Granting workspace, project, VCS, or access-management permissions to users who are trusted only as translators. This is unsafe because those permissions can affect code-hosting connections, repositories, credentials, or other users. Assign narrower roles. *(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md), [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md)) * Assigning site-wide permissions to roles intended for limited project or helpdesk delegation. Site-wide permissions apply across the instance and are not narrowed by the team’s project selection. In particular, `user.edit` permits changing team memberships and superuser status for editable accounts, including the caller’s own account. Delegate permissions through project or workspace teams for limited scopes. *(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md)) * Sending sensitive source strings or private customer content to machine translation providers without treating the provider as a data recipient. This is unsafe because Weblate must transmit content to the configured service, and the submitted content varies by provider and enabled feature. Configure providers according to the data policy for the project. *(maintainer)* * Importing project backups from untrusted sources as an administrative convenience. This is unsafe because backups carry project metadata, translation content, and repository state. Keep import limits enabled and import only backups appropriate for the target instance. *(documented)* (source: [Backing up and moving Weblate](https://docs.weblate.org/en/latest/admin/backup.md)) * Treating Weblate translation checks as proof that downstream applications cannot be attacked through translated strings. This is unsafe because the downstream renderer defines the final execution context. Review and escape translations in the consuming application. *(documented)* (source: [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md)) ## Known non-findings * A report that a reachable webhook can be called without forge authentication and only triggers modeled update scheduling or returns the documented matching diagnostics is not `VALID` by itself. It is routed to `VALID-HARDENING` unless it bypasses documented limits, matches unrelated repositories, leaks data beyond the documented fields, or causes effects beyond modeled scheduling. *(maintainer)* * A report that a webhook does not update a component whose repository URL only shares a host or path suffix with the payload is not a vulnerability; Weblate matches only exact repository URLs and documented variants. *(documented)* (source: [Matching webhook targets](https://docs.weblate.org/en/latest/admin/continuous.md#hooks-target-matching)) * A report that a project manager can change repository settings, VCS credentials, or project configuration is not a vulnerability when the actor has the documented permission for that action. *(documented)* (source: [Access control](https://docs.weblate.org/en/latest/admin/access.md)) * A report containing private-project or restricted-component data is not a vulnerability when the user has effective `reports.view` permission on the selected parent scope. That permission intentionally authorizes the complete report scope. *(documented)* (source: [Translation progress reporting](https://docs.weblate.org/en/latest/devel/reporting.md), [Access control](https://docs.weblate.org/en/latest/admin/access.md)) * A report against third-party add-on behavior is not a Weblate core vulnerability unless the report shows Weblate’s permission or installation boundaries are bypassed. *(maintainer)* * A report that a malicious local operator can read configuration, run management commands, or alter files is out of model because local operators are trusted infrastructure. *(maintainer)* * A report that a downstream application renders a dangerous translation is not a Weblate vulnerability unless Weblate itself violates a claimed property while storing, checking, reviewing, or displaying that translation. *(documented)* (source: [Localization Threat Model](https://docs.weblate.org/en/latest/security/localization-threat.md)) ## Conditions that change this model Review this model when changes affect public interfaces, authentication or authorization, deployment assumptions, untrusted input processing, external integrations, execution capabilities, or security-relevant defaults. Review whether the existing scope, actors, trust boundaries, assumptions, security properties, and triage dispositions still cover the change. *(maintainer)* Revise this model in the same change only when those elements change or leave a gap. This includes an unsupported component becoming supported product surface, a claimed security property changing, or an accepted vulnerability report that cannot be routed to an existing triage disposition. *(maintainer)* Features that follow existing boundaries and security properties do not need individual entries. Keep endpoint schemas, permission details, configuration instructions, implementation mechanics, and numeric limits in the relevant feature or administration documentation. Link to that documentation when a detail is needed to explain a distinct boundary, exception, or triage outcome. A review that confirms existing coverage requires no threat-model edit. *(maintainer)* ## Triage dispositions | Disposition | Meaning | Licensed by | |----------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------| | `VALID` | Violates a property Weblate claims, through an in-scope actor and input. | [Security properties Weblate provides](), [Input assumptions](),
[Adversary model]() | | `VALID-HARDENING` | No claimed property is violated, but Weblate chooses to reduce a known
misuse risk, such as compatibility webhook triggering that stays within
modeled effects. | [Known misuse patterns](), [Security properties Weblate does not provide]() | | `OUT-OF-MODEL: trusted-input` | Requires attacker control of input this model marks trusted. | [Input assumptions]() | | `OUT-OF-MODEL: adversary-not-in-scope` | Requires a capability this model excludes. | [Adversary model]() | | `OUT-OF-MODEL: unsupported-component` | Lands in third-party add-ons, generated docs, tests, local
customization, or another component marked out of scope. | [Out of scope]() | | `OUT-OF-MODEL: non-default-build` | Manifests only after deployment choices that knowingly remove a claimed
property. | [Build-time and configuration variants]() | | `BY-DESIGN: property-disclaimed` | Concerns a property Weblate explicitly does not provide. | [Security properties Weblate does not provide]() | | `KNOWN-NON-FINDING` | Matches a documented recurring false positive. | [Known non-findings]() | | `MODEL-GAP` | Cannot be cleanly routed to any disposition above. | [Conditions that change this model]() | # security/us-compliance.md # US controls compliance #### NOTE Herein you will find various legal information you might need to operate Weblate in certain legal jurisdictions. It is provided as a means of guidance, without any warranty of accuracy or correctness. It is ultimately your responsibility to ensure that your use of Weblate complies with all applicable laws and regulations. ## ITAR and other export controls Weblate can be run within your own datacenter or virtual private cloud. As such, it can be used to store ITAR or other export-controlled information, however, end users are responsible for ensuring such compliance. The Hosted Weblate service has not been audited for compliance with ITAR or other export controls, and does not currently offer the ability to restrict translations access by country. ## US encryption controls Weblate does not contain any cryptographic code, but might be subject to export controls as it uses third party components utilizing cryptography for authentication, data-integrity and -confidentiality. Weblate and all its dependencies have publicly available source code meaning it can usually be exported and reexported without restriction. ### Export control classification number Weblate has not received a Commodity Classification Automated Tracking System (CCATS) determination from the Bureau of Industry and Security (BIS). Based on the cryptographic functionality used through its dependencies, Weblate should generally be treated as encryption software under ECCN `5D002.c.1`. A mass-market distribution can instead be classified as ECCN `5D992.c` after the applicable BIS classification or self-classification process. Weblate source code and release artifacts are publicly available. Under BIS guidance and 15 CFR 742.15(b), publicly available encryption source code classified under ECCN `5D002` is not subject to the EAR when the applicable conditions are met, and corresponding object code can also be outside the EAR. Custom builds, hosted services, bundled distributions, and downstream deployments should be evaluated as a whole by the exporting party. #### SEE ALSO * [BIS encryption controls](https://www.bis.gov/learn-support/encryption-controls) * [Encryption items not subject to the EAR](https://www.bis.gov/learn-support/encryption-controls/encryption-items-not-subject-to-ear) * [BIS mass market guidance](https://www.bis.gov/learn-support/encryption-controls/mass-market) * [15 CFR 742.15](https://www.ecfr.gov/current/title-15/subtitle-B/chapter-VII/subchapter-C/part-742/section-742.15) ### Cryptographic functionality Software components used by Weblate (listing only components related to cryptographic function): * [Python](https://www.python.org/) * [Cryptography](https://cryptography.io/) * [GnuPG](https://www.gnupg.org/) * [Git](https://git-scm.com/) * [curl](https://curl.se/) * [OpenSSL](https://www.openssl.org/) The strength of encryption keys depends on the configuration of Weblate and the third party components it interacts with, but in any decent setup it will include all export restricted cryptographic functions: - In excess of 56 bits for a symmetric algorithm - Factorisation of integers in excess of 512 bits for an asymmetric algorithm - Computation of discrete logarithms in a multiplicative group of a finite field of size greater than 512 bits for an asymmetric algorithm - Discrete logarithms in a group different than above in excess of 112 bits for an asymmetric algorithm Weblate doesn’t have any cryptographic activation feature, but it can be configured in a way where no cryptography code would be involved. The cryptographic features include: - Accessing remote servers using secure protocols (HTTPS) - Generating signatures for code commits (PGP) # user/basic.md # Weblate basics ## Project and component structure In Weblate translations are organized into projects and components. Each project can contain number of components and those contain translations into individual languages. The component corresponds to one translatable file (for example [GNU gettext PO (Portable Object)](https://docs.weblate.org/en/latest/formats/gettext.md#gettext) or [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource)). The projects are there to help you organize component into logical sets (for example to group all translations used within one application). Additionally, components within projects can be structured using categories. Components can belong to a category, and categories can be nested. Internally, each project has translations to common strings propagated across other components within it by default. This lightens the burden of repetitive and multi version translation. The translation propagation can be disabled per [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) using [Allow translation propagation](https://docs.weblate.org/en/latest/admin/projects.md#component-allow-translation-propagation) in case the translations should diverge. ## Repository integration Weblate is built to integrate with upstream version control repository, [Continuous localization](https://docs.weblate.org/en/latest/admin/continuous.md) describes building blocks and how the changes flow between them. #### SEE ALSO [Architecture overview](https://docs.weblate.org/en/latest/admin/install.md#architecture) describes how Weblate works internally. ## User attribution Weblate keeps the translations properly authored by translators in the version control repository by using name and e-mail. Having a real e-mail attached to the commit follows the distributed version control spirits and allows services like GitHub to associate your contributions done in Weblate with your GitHub profile. This feature also brings in risk of misusing e-mail published in the version control commits. Moreover, once such a commit is published on public hosting (such as GitHub), there is effectively no way to redact it. Weblate allows choosing a private commit e-mail in [Account](https://docs.weblate.org/en/latest/user/profile.md#profile-account) to avoid this. Therefore, admins should consider this while configuring Weblate: * Such a usage of e-mail should be clearly described in service terms in case such document is needed. [Legal module](https://docs.weblate.org/en/latest/admin/optionals.md#legal) can help with that. * [`PRIVATE_COMMIT_EMAIL_OPT_IN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_OPT_IN) can make e-mails private by default. # user/checks.md # Checks and fixups The quality checks help catch common translator errors, ensuring the translation is in good shape. The checks can be ignored in case of false positives. For practical translation guidance around placeholders, markup, punctuation, and plural forms, see [Translating special text safely](https://docs.weblate.org/en/latest/user/translating.md#translating-special-text). Once submitting a translation with a failing check, this is immediately shown to the user: ![image](screenshots/checks.webp) ## Automatic fixups In addition to [Quality checks](https://docs.weblate.org/en/latest/user/checks.md#checks), Weblate can fix some common errors in translated strings automatically. Use it with caution to not have it add errors. #### SEE ALSO [`AUTOFIX_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-AUTOFIX_LIST) ### Trailing ellipsis replacer * **Class name:** `weblate.trans.autofixes.chars.ReplaceTrailingDotsWithEllipsis` Replace trailing dots (`...`) with an ellipsis (`…`) to make it consistent with the source string. ### Zero-width space removal * **Class name:** `weblate.trans.autofixes.chars.RemoveZeroSpace` Zero width space is typically not desired in the translation. This fix will remove it unless it is present in the source string as well. ### Control characters removal * **Class name:** `weblate.trans.autofixes.chars.RemoveControlChars` Removes control characters if the source does not contain any. ### Devanagari danda * **Class name:** `weblate.trans.autofixes.chars.DevanagariDanda` Replaces sentence full stop in Bangla by the Devanagari danda character (`।`). ### Punctuation spacing * **Class name:** `weblate.trans.autofixes.chars.PunctuationSpacing` #### Versionadded Added in version 5.3. Ensures French uses correct punctuation spacing. This fixup can be disabled via `ignore-punctuation-spacing` flag (which also disables [Punctuation spacing](https://docs.weblate.org/en/latest/user/checks.md#check-punctuation-spacing)). ### Unsafe HTML cleanup * **Class name:** `weblate.trans.autofixes.html.BleachHTML` Removes unsafe HTML markup from strings flagged as `safe-html`. #### SEE ALSO [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html) ### Trailing and leading whitespace fixer * **Class name:** `weblate.trans.autofixes.whitespace.SameBookendingWhitespace` Makes leading and trailing whitespace consistent with the source string. The behavior can be fine-tuned using `ignore-begin-space` and `ignore-end-space` flags to skip processing parts of the string. ## Quality checks Weblate employs a wide range of quality checks on strings. The following section describes them all in further detail. There are also language specific checks. Please file a bug if anything is reported in error. #### SEE ALSO * [`CHECK_LIST`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-CHECK_LIST) * [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) ## Translation checks Executed upon every translation change, helping translators maintain good quality translations. ### Accelerator key #### Versionadded Added in version 2026.7. * **Summary:** Source and translation contain inconsistent accelerator keys. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.AcceleratorKeyCheck` * **Check identifier:** `accelerator` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `accelerator` * **Flag to ignore:** `ignore-accelerator` Accelerator keys (also known as mnemonics) let users trigger a UI action from the keyboard. They are marked in the string by a single punctuation character, typically `&` (Qt, Windows), `_` (GTK), or `~`. Literal marker characters can usually be escaped by doubling them, and are ignored by this check. Enable this check with the `accelerator:` flag to explicitly choose the marker, for example `accelerator:&`, `accelerator:_`, or `accelerator:~`. This check verifies that the source and the translation contain the same number of accelerator keys, and that the translation does not contain more than one. #### NOTE A string such as `Walter & Sons` might be translated without the ampersand and trigger a false positive. Use the `ignore-accelerator` flag to skip the check for such strings. ### AsciiDoc markup #### Versionadded Added in version 2026.8. * **Summary:** AsciiDoc markup does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.AsciiDocMarkupCheck` * **Check identifier:** `asciidoc-markup` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [AsciiDoc files](https://docs.weblate.org/en/latest/formats/asciidoc.md#asciidoc) * **Flag to enable:** `asciidoc-text` * **Flag to ignore:** `ignore-asciidoc-markup` This check compares the markups found in the source with the markups found in the translation. It includes: - inline and block macros (e.g. `link:` and `image::`) - cross-references (`<>`) - passthroughs (e.g. `+++...+++`, `$$...$$`) Macro attribute text and cross-reference labels may be translated; the macro name, target, and reference identifier must stay the same in both the source and the translation. ### BBCode markup #### Versionchanged Changed in version 5.10: This checks no longer relies on unreliable automatic detection, it now needs to be turned on using the `bbcode-text` flag. * **Summary:** BBCode in translation does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.BBCodeCheck` * **Check identifier:** `bbcode` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `bbcode-text` * **Flag to ignore:** `ignore-bbcode` BBCode represents simple markup, like for example highlighting important parts of a message in bold font, or italics. This check ensures they are also found in translation. #### NOTE The method for detecting BBCode is currently quite simple so this check might produce false positives. ### Chars around XML tags * **Summary:** Characters surrounding XML tags in translation do not align with source. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.XMLCharsAroundTagsCheck` * **Check identifier:** `xml-chars-around-tags` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-xml-chars-around-tags` Checks that the characters surrounding an XML tag are consistent between both source and translation. Ensures letters are not replaced with non-letters, and vice versa. #### NOTE This check is disabled by the `safe-html` flag as the HTML cleanup done by it can produce HTML markup which is not valid XML. ### Consecutive duplicated words #### Versionadded Added in version 4.1. * **Summary:** Text contains the same word twice in a row. * **Scope:** translated strings * **Check class:** `weblate.checks.duplicate.DuplicateCheck` * **Check identifier:** `duplicate` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-duplicate` Checks that no consecutive duplicate words occur in a translation. This usually indicates a mistake in the translation. The check is skipped for Assamese, Bengali, Gujarati, Hindi, Kannada, Malayalam, Marathi, Nepali, Odia, Punjabi, Sindhi, Sinhala, Tamil, Telugu, Toki Pona, and Urdu, including their language variants, because word repetition carries grammatical meaning in these languages. #### HINT This check includes language specific rules to avoid false positives. In case it triggers falsely in your case, let us know. See [Reporting issues in Weblate](https://docs.weblate.org/en/latest/contributing/issues.md#report-issue). ### Does not follow glossary #### Versionadded Added in version 4.5. * **Summary:** The translation does not follow terms defined in a glossary. * **Scope:** translated strings * **Check class:** `weblate.checks.glossary.GlossaryCheck` * **Check identifier:** `check_glossary` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `check-glossary` * **Flag to ignore:** `ignore-check-glossary` This check has to be turned on using `check-glossary` flag (see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks)). Please consider following prior to enabling it: * It does exact string matching, the glossary is expected to contain terms in all variants. * Checking each string against glossary is expensive, it will slow down any operation in Weblate which involves running checks like importing strings or translating. * It also utilizes untranslatable glossary terms in [Unchanged translation](https://docs.weblate.org/en/latest/user/checks.md#check-same). #### SEE ALSO * [Glossary](https://docs.weblate.org/en/latest/user/glossary.md#glossary) * [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) * [Translation flags](https://docs.weblate.org/en/latest/admin/projects.md#component-check-flags) ### Double space * **Summary:** Translation contains double space. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.DoubleSpaceCheck` * **Check identifier:** `double_space` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-double-space` Checks that double space is present in translation to avoid false positives on other space-related checks. Check is false when double space is found in source meaning double space is intentional. ### Fluent parts #### Versionadded Added in version 5.0. * **Summary:** Fluent parts should match. * **Scope:** translated strings * **Check class:** `weblate.checks.fluent.parts.FluentPartsCheck` * **Check identifier:** `fluent-parts` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent) * **Flag to enable:** `fluent-parts` * **Flag to ignore:** `ignore-fluent-parts` Each Fluent Message can have an optional value (the main text content), and optional attributes, each of which is a “part” of the Message. In Weblate, all these parts appear within the same block, using Fluent-like syntax to specify the attributes. For example: ```text This is the Message value .title = This is the title attribute .alt = This is the alt attribute ``` This check ensures that the translated Message also has a value if the source Message has one, or no value if the source has none. This also checks that the same attributes used in the source Message also appear in the translation, with no additions. #### NOTE This check is not applied to Fluent Terms since Terms always have a value, and Term attributes tend to be locale-specific (used for grammar rules, etc.), and are not expected to appear in all translations. #### SEE ALSO [Fluent Attributes](https://projectfluent.org/fluent/guide/attributes.html) ### Fluent references #### Versionadded Added in version 5.0. * **Summary:** Fluent references should match. * **Scope:** translated strings * **Check class:** `weblate.checks.fluent.references.FluentReferencesCheck` * **Check identifier:** `fluent-references` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent) * **Flag to enable:** `fluent-references` * **Flag to ignore:** `ignore-fluent-references` A Fluent Message or Term can reference another Message, Term, Attribute, or a variable. For example: ```text Here is a { message }, a { message.attribute } a { -term } and a { $variable }. Within a function { NUMBER($num, minimumFractionDigits: 2) } ``` Generally, translated Messages or Terms are expected to contain the same references as the source, although not necessarily in the same order of appearance. So this check ensures that translations use the same references in their value as the source value, the same number of times, and with no additions. For Messages, this will also check that each Attribute in the translation uses the same references as the matching Attribute in the source. When the source or translation contains Fluent Select Expressions, then each possible variant in the source must be matched with at least one variant in the translation with the same references, and vice versa. Moreover, if a variable reference appears both in the Select Expression’s selector and within one of its variants, then all variants may also be considered as if they also contain that reference. The assumption being that the variant’s key may have made the reference redundant for that variant. For example: ```text { $num -> [one] an apple *[other] { $num } apples } ``` Here, for the purposes of this check, the `[one]` variant will also be considered to contain the `$num` reference. However, a reference within the Select Expression’s selector, which can only be a variable of a Term Attribute in Fluent’s syntax, will not by itself count as a required reference because they do not form the actual text content of the string that the end-user will see, and the presence of a Select Expression is considered locale-specific. For example: ```text { -term.starts-with-vowel -> [yes] an { -term } *[no] a { -term } } ``` Here a reference to `-term.starts-with-vowel` is not expected to appear in translations, but a reference to `-term` is. #### SEE ALSO [Fluent Variables](https://projectfluent.org/fluent/guide/variables.html) [Fluent Message and Term references](https://projectfluent.org/fluent/guide/references.html) [Fluent Select Expressions](https://projectfluent.org/fluent/guide/selectors.html) ### Fluent translation inner HTML #### Versionadded Added in version 5.0. * **Summary:** Fluent target should be valid inner HTML that matches. * **Scope:** translated strings * **Check class:** `weblate.checks.fluent.inner_html.FluentTargetInnerHTMLCheck` * **Check identifier:** `fluent-target-inner-html` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent) * **Flag to enable:** `fluent-target-inner-html` * **Flag to ignore:** `ignore-fluent-target-inner-html` This check will verify that the translated value of a Message or Term contains the same HTML elements as the source value. First, if the source value fails the [Fluent source inner HTML](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-source-inner-html) check, then this check will do nothing. Otherwise, the translated value will also be checked under the same conditions. Second, the HTML elements found in the translated value will be compared against the HTML elements found in the source value. Two elements will match if they share the exact same tag name, the exact same attributes and values, and all their ancestors match in the same way. This check will ensure that all the elements in the source appear somewhere in the translation, with the same *number* of appearances, and with no additional elements added. When there are multiple elements in the value, they need not appear in the same order in the translation value. When the source or translation contains Fluent Select Expressions, then each possible variant in the source must be matched with at least one variant in the translation with the same HTML elements, and vice versa. When using Fluent in combination with the Fluent DOM package, this check will ensure that the translation also includes any required `data-l10n-name` elements that appear in the source, or any of the allowed inline elements like `
`. For example, the following source: ```text Source message with icon ``` would match with: ```text Translated message with icon ``` but not: ```text Translated message with icon ``` nor ```text Translated message
with no icon ``` #### SEE ALSO * [Fluent source inner HTML](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-source-inner-html) * [Fluent DOM](https://projectfluent.org/dom-l10n-documentation/overview.html) ### Fluent translation syntax #### Versionadded Added in version 5.0. * **Summary:** Fluent syntax error in the translation. * **Scope:** translated strings * **Check class:** `weblate.checks.fluent.syntax.FluentTargetSyntaxCheck` * **Check identifier:** `fluent-target-syntax` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent) * **Flag to enable:** `fluent-target-syntax` * **Flag to ignore:** `ignore-fluent-target-syntax` In Weblate, Fluent strings use Fluent syntax for references and variables, but also for more complex features like defining attributes and selector variants, including plurals. This check ensures that the syntax used in the translation will be valid for Fluent. #### SEE ALSO * [Fluent source syntax](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-source-syntax) * [Fluent Syntax Guide](https://projectfluent.org/fluent/guide/) * [Mozilla Basic Syntax Guide](https://mozilla-l10n.github.io/localizer-documentation/tools/fluent/basic_syntax.html) ### Formatted strings Checks that the formatting in strings is replicated between both source and translation. Omitting format strings in translation usually causes severe problems, so the formatting in strings should usually match the source. Weblate supports checking format strings in several languages. The check is not enabled automatically, only if a string is flagged appropriately (e.g. c-format for C format). Gettext adds this automatically, but you will probably have to add it manually for other file formats or if your PO files are not generated by **xgettext**. Most of the format checks allow omitting format strings for plural forms having a single count. This allows translators to write nicer strings for these cases (One apple instead of %d apple). Turn this off by adding `strict-format` flag. The flags can be customized per string (see [Additional info on source strings](https://docs.weblate.org/en/latest/admin/translating.md#additional)) or in a [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component). Having it defined per component is simpler, but it can lead to false positives in case the string is not interpreted as a formatting string, but format string syntax happens to be used. #### HINT In case specific format check is not available in Weblate, you can use generic [Placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-placeholders). Besides checking, this will also highlight the formatting strings to easily insert them into translated strings: ![image](screenshots/format-highlight.webp) #### AngularJS interpolation string * **Summary:** AngularJS interpolation strings do not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.angularjs.AngularJSInterpolationCheck` * **Check identifier:** `angularjs_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `angularjs-format` * **Flag to ignore:** `ignore-angularjs-format` * **Named format string example:** `Your balance is {{amount}} {{ currency }}` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [AngularJS text interpolation](https://angular.io/guide/interpolation) #### Automattic components formatting * **Summary:** The Automattic components’ placeholders do not match the source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.AutomatticComponentsCheck` * **Check identifier:** `automattic_components_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `automattic-components-format` * **Flag to ignore:** `ignore-automattic-components-format` * **Simple format string example:** `They bought {{strong}}apples{{/strong}}.` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Interpolate Components](https://github.com/Automattic/wp-calypso/tree/trunk/packages/interpolate-components) #### C format * **Summary:** C format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.CFormatCheck` * **Check identifier:** `c_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `c-format` * **Flag to ignore:** `ignore-c-format` * **Simple format string example:** `There are %d apples` * **Position format string example:** `Your balance is %1$d %2$s` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [C format strings](https://www.gnu.org/software/gettext/manual/html_node/c_002dformat.html) * [C printf format](https://en.wikipedia.org/wiki/Printf_format_string) #### C# format * **Summary:** C# format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.CSharpFormatCheck` * **Check identifier:** `c_sharp_format` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [ResourceDictionary files](https://docs.weblate.org/en/latest/formats/resourcedict.md#resourcedictionary) * **Flag to enable:** `c-sharp-format`, `csharp-format` * **Flag to ignore:** `ignore-c-sharp-format` * **Position format string example:** `There are {0} apples` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [C# String Format](https://learn.microsoft.com/en-us/dotnet/api/system.string.format?view=netframework-4.7.2) #### ECMAScript template literals * **Summary:** ECMAScript template literals do not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.ESTemplateLiteralsCheck` * **Check identifier:** `es_format` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [draggable/i18n lang files](https://docs.weblate.org/en/latest/formats/mi18n.md#mi18n-lang) * **Flag to enable:** `es-format` * **Flag to ignore:** `ignore-es-format` * **Interpolation example:** `There are ${number} apples` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Template literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) #### i18next interpolation #### Versionadded Added in version 4.0. * **Summary:** The i18next interpolation does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.I18NextInterpolationCheck` * **Check identifier:** `i18next_interpolation` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [i18next JSON files](https://docs.weblate.org/en/latest/formats/i18next.md#i18next), [i18next JSON files](https://docs.weblate.org/en/latest/formats/i18next.md#i18nextv4) * **Flag to enable:** `i18next-interpolation` * **Flag to ignore:** `ignore-i18next-interpolation` * **Interpolation example:** `There are {{number}} apples` * **Nesting example:** `There are $t(number) apples` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [i18next interpolation](https://www.i18next.com/translation-function/interpolation) #### ICU MessageFormat #### Versionadded Added in version 4.9. * **Summary:** Syntax errors and/or placeholder mismatches in ICU MessageFormat strings. * **Scope:** translated strings * **Check class:** `weblate.checks.icu.ICUMessageFormatCheck` * **Check identifier:** `icu_message_format` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [ARB File](https://docs.weblate.org/en/latest/formats/arb.md#arb), [Format.JS JSON file](https://docs.weblate.org/en/latest/formats/formatjs.md#formatjs) * **Flag to enable:** `icu-message-format` * **Flag to ignore:** `ignore-icu-message-format` * **Interpolation example:** `There {number, plural, one {is one apple} other {are # apples}}.` This check has support for both pure ICU MessageFormat messages as well as ICU with simple XML tags. You can configure the behavior of this check by using `icu-flags:*`, either by opting into XML support or by disabling certain sub-checks. For example, the following flag enables XML support while disabling validation of plural sub-messages: ```text icu-message-format, icu-flags:xml:-plural_selectors ``` | `xml` | Enable support for simple XML tags. By default, XML tags
are parsed loosely. Stray `<` characters are ignored
if they are not reasonably part of a tag. | |-------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `strict-xml` | Enable support for strict XML tags. All `<` characters
must be escaped if they are not part of a tag. | | `-highlight` | Disable highlighting placeholders in the editor. | | `-require_other` | Disable requiring sub-messages to have an `other`
selector. | | `-submessage_selectors` | Skip checking that sub-message selectors match the source. | | `-types` | Skip checking that placeholder types match the source. | | `-extra` | Skip checking that no placeholders are present that were
not present in the source string. | | `-missing` | Skip checking that no placeholders are missing that were
present in the source string. | Additionally, when `strict-xml` is not enabled but `xml` is enabled, you can use the `icu-tag-prefix:PREFIX` flag to require that all XML tags start with a specific string. For example, the following flag will only allow XML tags to be matched if they start with `click here` but not `this`. #### SEE ALSO * [ICU MessageFormat syntax](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format-syntax) * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [ICU: Formatting Messages](https://unicode-org.github.io/icu/userguide/format_parse/messages/) * [Format.JS: Message Syntax](https://formatjs.github.io/docs/core-concepts/icu-syntax) #### Java format * **Summary:** Java format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.JavaFormatCheck` * **Check identifier:** `java_printf_format` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Android string resources](https://docs.weblate.org/en/latest/formats/android.md#aresource), [Mobile Kotlin resources](https://docs.weblate.org/en/latest/formats/moko-resources.md#moko-resource), [Compose Multiplatform resources](https://docs.weblate.org/en/latest/formats/compose-multiplatform-resources.md#cmp-resource) * **Flag to enable:** `java-printf-format` * **Flag to ignore:** `ignore-java-printf-format` * **Simple format string example:** `There are %d apples` * **Position format string example:** `Your balance is %1$d %2$s` #### Versionchanged Changed in version 4.14: This used to be toggled by the `java-format` flag, it was changed for consistency with GNU gettext. #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Java Format Strings](https://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html) #### Java MessageFormat * **Summary:** Java MessageFormat string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.JavaMessageFormatCheck` * **Check identifier:** `java_format` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Java properties](https://docs.weblate.org/en/latest/formats/java.md#properties), [GWT properties](https://docs.weblate.org/en/latest/formats/gwt.md#gwt) * **Flag to enable:** `auto-java-messageformat`, `java-format` * **Automatic flag behavior:** `auto-java-messageformat`: Treat a text as conditional Java MessageFormat, enabling [Java MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-java-format) only when the source contains Java MessageFormat placeholders. * **Flag to ignore:** `ignore-java-format` * **Position format string example:** `There are {0} apples` #### Versionchanged Changed in version 4.14: This used to be toggled by `java-messageformat` flag, it was changed for consistency with GNU gettext. This check validates that format string is valid for the Java MessageFormat class. Besides matching format strings in the curly braces, it also verifies single quotes as they have a special meaning. Whenever writing single quote, it should be written as `''`. When not paired, it is treated as beginning of quoting and will not be shown when rendering the string. #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Java MessageFormat](https://docs.oracle.com/javase/7/docs/api/java/text/MessageFormat.html) #### JavaScript format * **Summary:** JavaScript format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.JavaScriptFormatCheck` * **Check identifier:** `javascript_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `javascript-format` * **Flag to ignore:** `ignore-javascript-format` * **Simple format string example:** `There are %d apples` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [JavaScript formatting strings](https://www.gnu.org/software/gettext/manual/html_node/javascript_002dformat.html) #### Laravel format * **Summary:** Laravel format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.LaravelFormatCheck` * **Check identifier:** `laravel_format` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Laravel PHP strings](https://docs.weblate.org/en/latest/formats/laravel.md#laravel) * **Flag to enable:** `laravel-format` * **Flag to ignore:** `ignore-laravel-format` * **Named format string example:** `The :attribute must be :value` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Laravel translation formatting](https://laravel.com/framework/docs/localization#replacing-parameters-in-translation-strings) #### Lua format * **Summary:** Lua format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.LuaFormatCheck` * **Check identifier:** `lua_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `lua-format` * **Flag to ignore:** `ignore-lua-format` * **Simple format string example:** `There are %d apples` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Lua formatting strings](https://www.gnu.org/software/gettext/manual/html_node/lua_002dformat.html#lua_002dformat) #### Object Pascal format * **Summary:** Object Pascal format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.ObjectPascalFormatCheck` * **Check identifier:** `object_pascal_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `object-pascal-format` * **Flag to ignore:** `ignore-object-pascal-format` * **Simple format string example:** `There are %d apples` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Object Pascal formatting strings](https://www.gnu.org/software/gettext/manual/html_node/object_002dpascal_002dformat.html#object_002dpascal_002dformat) * [Free Pascal formatting strings](https://www.freepascal.org/docs-html/rtl/sysutils/format.html) * [Delphi formatting strings](https://docwiki.embarcadero.com/Libraries/Sydney/en/System.SysUtils.Format) #### Objective-C format #### Versionadded Added in version 5.17. * **Summary:** Objective-C format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.ObjCFormatCheck` * **Check identifier:** `objc_format` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Apple iOS strings](https://docs.weblate.org/en/latest/formats/apple.md#strings), [Stringsdict format](https://docs.weblate.org/en/latest/formats/stringsdict.md#stringsdict) * **Flag to enable:** `objc-format` * **Flag to ignore:** `ignore-objc-format` #### Percent placeholders #### Versionadded Added in version 4.0. * **Summary:** The percent placeholders do not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.PercentPlaceholdersCheck` * **Check identifier:** `percent_placeholders` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `percent-placeholders` * **Flag to ignore:** `ignore-percent-placeholders` * **Simple format string example:** `There are %number% apples` #### SEE ALSO [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) #### Perl brace format * **Summary:** Perl brace format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.PerlBraceFormatCheck` * **Check identifier:** `perl_brace_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `perl-brace-format` * **Flag to ignore:** `ignore-perl-brace-format` * **Named format string example:** `There are {number} apples` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Perl Format Strings](https://www.gnu.org/software/gettext/manual/html_node/perl_002dformat.html) #### Perl format * **Summary:** Perl format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.PerlFormatCheck` * **Check identifier:** `perl_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `perl-format` * **Flag to ignore:** `ignore-perl-format` * **Simple format string example:** `There are %d apples` * **Position format string example:** `Your balance is %1$d %2$s` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Perl sprintf](https://perldoc.perl.org/functions/sprintf) * [Perl Format Strings](https://www.gnu.org/software/gettext/manual/html_node/perl_002dformat.html) #### PHP format * **Summary:** PHP format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.PHPFormatCheck` * **Check identifier:** `php_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `php-format` * **Flag to ignore:** `ignore-php-format` * **Simple format string example:** `There are %d apples` * **Position format string example:** `Your balance is %1$d %2$s` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [PHP sprintf documentation](https://www.php.net/manual/en/function.sprintf.php) * [PHP Format Strings](https://www.gnu.org/software/gettext/manual/html_node/php_002dformat.html) #### Python brace format * **Summary:** Python brace format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.PythonBraceFormatCheck` * **Check identifier:** `python_brace_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `python-brace-format` * **Flag to ignore:** `ignore-python-brace-format` * **Simple format string:** `There are {} apples` * **Named format string example:** `Your balance is {amount} {currency}` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Python brace format](https://docs.python.org/3/library/string.html#formatstrings) * [Python Format Strings](https://www.gnu.org/software/gettext/manual/html_node/python_002dformat.html) #### Python format * **Summary:** Python format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.PythonFormatCheck` * **Check identifier:** `python_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `python-format` * **Flag to ignore:** `ignore-python-format` * **Simple format string:** `There are %d apples` * **Named format string example:** `Your balance is %(amount)d %(currency)s` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Python string formatting](https://docs.python.org/3/builtins/stdtypes.html#old-string-formatting) * [Python Format Strings](https://www.gnu.org/software/gettext/manual/html_node/python_002dformat.html) #### Qt format * **Summary:** Qt format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.qt.QtFormatCheck` * **Check identifier:** `qt_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `qt-format` * **Flag to ignore:** `ignore-qt-format` * **Position format string example:** `There are %1 apples` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Qt QString::arg()](https://doc.qt.io/qt-6/qstring.html#arg) #### Qt plural format * **Summary:** Qt plural format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.qt.QtPluralCheck` * **Check identifier:** `qt_plural_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `qt-plural-format` * **Flag to ignore:** `ignore-qt-plural-format` * **Plural format string example:** `There are %Ln apple(s)` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Qt i18n guide](https://doc.qt.io/qt-6/i18n-source-translation.html#handle-plural-forms) #### Ruby format * **Summary:** Ruby format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.ruby.RubyFormatCheck` * **Check identifier:** `ruby_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `ruby-format` * **Flag to ignore:** `ignore-ruby-format` * **Simple format string example:** `There are %d apples` * **Position format string example:** `Your balance is %1$f %2$s` * **Named format string example:** `Your balance is %+.2f %s` * **Named template string:** `Your balance is %{amount} %{currency}` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Ruby Kernel#sprintf](https://ruby-doc.org/current/Kernel.html#method-i-sprintf) #### Scheme format * **Summary:** Scheme format string does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.SchemeFormatCheck` * **Check identifier:** `scheme_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `scheme-format` * **Flag to ignore:** `ignore-scheme-format` * **Simple format string example:** `There are ~d apples` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Srfi 28](https://srfi.schemers.org/srfi-28/srfi-28.html) * [Chicken Scheme format](https://wiki.call-cc.org/eggref/5/format) * [Guile Scheme formatted output](https://www.gnu.org/software/guile/manual/html_node/Formatted-Output.html) #### Vue I18n formatting * **Summary:** The Vue I18n formatting does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.format.VueFormattingCheck` * **Check identifier:** `vue_format` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `vue-format` * **Flag to ignore:** `ignore-vue-format` * **Named formatting:** `There are {count} apples` * **Rails i18n formatting:** `There are %{count} apples` * **Linked locale messages:** `@:message.dio @:message.the_world!` #### SEE ALSO * [Formatted strings](https://docs.weblate.org/en/latest/user/checks.md#check-formats) * [Vue I18n Formatting](https://kazupon.github.io/vue-i18n/guide/formatting.html) * [Vue I18n Linked locale messages](https://kazupon.github.io/vue-i18n/guide/messages.html#linked-locale-messages) ### Has been translated * **Summary:** This string has been translated in the past. * **Scope:** all strings * **Check class:** `weblate.checks.consistency.TranslatedCheck` * **Check identifier:** `translated` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-translated` Means a string has been translated already. This can happen when the translations have been reverted in VCS or lost otherwise. ### Inconsistent * **Summary:** This string has more than one translation in this project or is untranslated in some components. * **Scope:** all strings * **Check class:** `weblate.checks.consistency.ConsistencyCheck` * **Check identifier:** `inconsistent` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-inconsistent` Weblate checks translations of the same string across all translation within a project to help you keep consistent translations. The check fails on differing translations of one string within a project. This can also lead to inconsistencies in displayed checks. You can find other translations of this string on the Other occurrences tab. This check applies to all components in a project that have [Allow translation propagation](https://docs.weblate.org/en/latest/admin/projects.md#component-allow-translation-propagation) turned on. #### HINT For performance reasons, the check might not find all inconsistencies, it limits number of matches. #### NOTE This check also fires in case the string is translated in one component and not in another. It can be used as a quick way to manually handle strings which are untranslated in some components just by clicking on the Use this translation button displayed on each line in the Other occurrences tab. You can use [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) add-on to automate translating of newly added strings which are already translated in another component. #### SEE ALSO [Keeping translations same across components](https://docs.weblate.org/en/latest/admin/continuous.md#translation-consistency) ### Inconsistent reStructuredText #### Versionadded Added in version 5.10. * **Summary:** Inconsistent reStructuredText markup in the translated message. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.RSTReferencesCheck` * **Check identifier:** `rst-references` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `rst-text` * **Flag to ignore:** `ignore-rst-references` reStructuredText term references or other markup do not match source, the typical causes for these errors are: * Mismatched or missing backticks. * Missing spaces or interpunction around the reference. The reStructuredText inline blocks need to be separated by non-word characters. * Space between inline tag and backticks. * The reference name is not being translated. * Using quotes instead of backticks. * Mismatched substitutions or footnote references. #### SEE ALSO * [reStructuredText Primer](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html) * [reStructuredText syntax error](https://docs.weblate.org/en/latest/user/checks.md#check-rst-syntax) ### Kashida letter used * **Summary:** The decorative kashida letters should not be used. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.KashidaCheck` * **Check identifier:** `kashida` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-kashida` The decorative Kashida letters should not be used in translation. These are also known as Tatweel. #### SEE ALSO [Kashida on Wikipedia](https://en.wikipedia.org/wiki/Kashida) ### Markdown links * **Summary:** Markdown links do not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.MarkdownLinkCheck` * **Check identifier:** `md-link` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md#markdown), [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) * **Flag to enable:** `md-text` * **Flag to ignore:** `ignore-md-link` Markdown links do not match source. #### SEE ALSO [Markdown links](https://spec.commonmark.org/0.31.2/#links) ### Markdown references * **Summary:** Markdown link references do not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.MarkdownRefLinkCheck` * **Check identifier:** `md-reflink` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md#markdown), [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) * **Flag to enable:** `md-text` * **Flag to ignore:** `ignore-md-reflink` Markdown link references do not match source. #### SEE ALSO [Markdown links](https://spec.commonmark.org/0.31.2/#links) ### Markdown syntax * **Summary:** Markdown syntax does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.MarkdownSyntaxCheck` * **Check identifier:** `md-syntax` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md#markdown), [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) * **Flag to enable:** `md-text` * **Flag to ignore:** `ignore-md-syntax` Markdown syntax does not match source #### SEE ALSO [Markdown inlines](https://spec.commonmark.org/0.31.2/#inlines) ### Maximum length of translation * **Summary:** Translation should not exceed given length. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.MaxLengthCheck` * **Check identifier:** `max-length` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `max-length` * **Flag to ignore:** `ignore-max-length` Checks that translations are of acceptable length to fit available space. This only checks the amount of translation characters. Unlike the other checks, the flag should be set as a `key:value` pair like `max-length:100`. The `max-length` flag also triggers [Source string length](https://docs.weblate.org/en/latest/user/checks.md#check-source-max-length) for source strings. For English source strings, including English variants, this check warns when the source uses more than 85% of the configured length to leave room for translation expansion. For other source languages, the configured `max-length` is used directly. #### HINT This check looks at number of characters, which might not be the best metric when using proportional fonts to render the text. The [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) check does check actual rendering of the text. The `replacements:` flag might be also useful to expand placeables before checking the string. When `xml-text` flag is also used, the length calculation ignores XML tags. ### Maximum number of lines * **Summary:** Translation should not exceed given number of lines. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.MaxLinesCheck` * **Check identifier:** `max-lines` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `max-lines` * **Flag to ignore:** `ignore-max-lines` Checks that translations do not exceed the configured maximum number of lines. This is useful for translations targeting fixed-height UI elements such as displays, terminals, or constrained containers where a specific number of visible lines is required. Unlike the other checks, the flag should be set as a `key:value` pair like `max-lines:3`. A translation with more lines than the configured value triggers a warning. Lines are counted by the number of newline characters plus one. #### HINT This check counts display lines (separated by `\\n`), not wrapped lines. If your UI wraps text automatically, use [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size) instead. ### Maximum size of translation * **Summary:** Rendered text should not exceed given size. * **Scope:** source and translated strings * **Check class:** `weblate.checks.render.MaxSizeCheck` * **Check identifier:** `max-size` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `max-size` * **Flag to ignore:** `ignore-max-size` Rendered source or translation text should not exceed given size. It renders the text and checks if it fits into given boundaries. Word wrapping is applied when more than one line is configured. This check needs one or two parameters - maximal width and maximal number of lines. In case the number of lines is not provided, one line text is considered. You can also configure used font by `font-*` directives (see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks)), for example following translation flags say that the text rendered with ubuntu font size 22 should fit into two lines and 500 pixels: ```text max-size:500:2, font-family:ubuntu, font-size:22 ``` #### HINT You might want to set `font-*` directives in [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) to have the same font configured for all strings within a component. You can override those values per string in case you need to customize it per string. The `replacements:` flag might be also useful to expand placeables before checking the string. When `xml-text` flag is also used, the length calculation ignores XML tags. #### SEE ALSO * [Managing fonts](https://docs.weblate.org/en/latest/admin/checks.md#fonts) * [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) * [Maximum length of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-length) ### Mismatched \\n * **Summary:** Number of `\n` literals in translation does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EscapedNewlineCountingCheck` * **Check identifier:** `escaped_newline` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-escaped-newline` Usually escaped newlines are important for formatting program output. Check fails if the number of `\n` literals in translation does not match the source. ### Mismatched colon * **Summary:** Source and translation do not both end with a colon. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EndColonCheck` * **Check identifier:** `end_colon` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-end-colon` Checks that colons are replicated between both source and translation. The presence of colons is also checked for various languages where they do not belong (Chinese or Japanese). #### SEE ALSO [Colon on Wikipedia](https://en.wikipedia.org/wiki/Colon_(punctuation)) ### Mismatched ellipsis * **Summary:** Source and translation do not both end with an ellipsis. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EndEllipsisCheck` * **Check identifier:** `end_ellipsis` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-end-ellipsis` Checks that trailing ellipses are replicated between both source and translation. This only checks for real ellipsis (`…`) not for three dots (`...`). An ellipsis is usually rendered nicer than three dots in print, and sounds better with text-to-speech. #### SEE ALSO [Ellipsis on Wikipedia](https://en.wikipedia.org/wiki/Ellipsis) ### Mismatched exclamation mark * **Summary:** Source and translation do not both end with an exclamation mark. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EndExclamationCheck` * **Check identifier:** `end_exclamation` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-end-exclamation` Checks that exclamations are replicated between both source and translation. The presence of exclamation marks is also checked for various languages where they do not belong (Chinese, Japanese, Korean, Armenian, Limbu, Myanmar or Nko). #### SEE ALSO [Exclamation mark on Wikipedia](https://en.wikipedia.org/wiki/Exclamation_mark) ### Mismatched full stop * **Summary:** Source and translation do not both end with a full stop. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EndStopCheck` * **Check identifier:** `end_stop` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-end-stop` Checks that full stops are replicated between both source and translation. The presence of full stops is checked for various languages where they do not belong (Chinese, Japanese, Devanagari or Urdu). #### SEE ALSO [Full stop on Wikipedia](https://en.wikipedia.org/wiki/Full_stop) ### Mismatched interrobang * **Summary:** Source and translation do not both end with an interrobang expression. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EndInterrobangCheck` * **Check identifier:** `end_interrobang` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-end-interrobang` Checks that interrobang marks are replicated between both source and translation. It allows the swap between “!?” and “?!”. #### SEE ALSO [Interrobang mark on Wikipedia](https://en.wikipedia.org/wiki/Interrobang) ### Mismatched question mark * **Summary:** Source and translation do not both end with a question mark. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EndQuestionCheck` * **Check identifier:** `end_question` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-end-question` Checks that question marks are replicated between both source and translation. The presence of question marks is also checked for various languages where they do not belong (Armenian, Arabic, Chinese, Korean, Japanese, Ethiopic, Vai or Coptic). #### SEE ALSO [Question mark on Wikipedia](https://en.wikipedia.org/wiki/Question_mark) ### Mismatched semicolon * **Summary:** Source and translation do not both end with a semicolon. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EndSemicolonCheck` * **Check identifier:** `end_semicolon` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-end-semicolon` Checks that semicolons at the end of sentences are replicated between both source and translation. #### SEE ALSO [Semicolon on Wikipedia](https://en.wikipedia.org/wiki/Semicolon) ### Mismatching line breaks * **Summary:** Number of new lines in translation does not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.NewLineCountCheck` * **Check identifier:** `newline-count` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-newline-count` Usually newlines are important for formatting program output. Check fails if the number of new lines in translation does not match the source. ### Missing plurals * **Summary:** Some plural forms are untranslated. * **Scope:** translated strings * **Check class:** `weblate.checks.consistency.PluralsCheck` * **Check identifier:** `plurals` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-plurals` Checks that all plural forms of a source string have been translated. Specifics on how each plural form is used can be found in the string definition. Failing to fill in plural forms will in some cases lead to displaying nothing when the plural form is in use. ### Multiple capitals #### Versionadded Added in version 5.16. * **Summary:** Translation contains words with multiple misplaced capital letters. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.MultipleCapitalCheck` * **Check identifier:** `multiple_capital` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-multiple-capital` Checks for misplaced capitalization by detecting words that contain consecutive uppercase letters in otherwise lowercase or normally capitalized text (for example, `HEllo` or `CAmelCase`). Strings that contain capitalization in the source string are allowed to contain capitalization in the translation. ### Non‑standard characters in Kabyle #### Versionadded Added in version 5.12. * **Summary:** Use standardized Latin Kabyle characters (e.g. `ɣ` instead of Greek `γ`; `ɛ` instead of `ε`). * **Scope:** translated strings * **Check class:** `weblate.checks.chars.KabyleCharactersCheck` * **Check identifier:** `kabyle-characters` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-kabyle-characters` Checks that Kabyle translations use correct Kabyle letters and not similar Greek ones, which were often used before Kabyle characters were standardized in Unicode. ### Placeholders #### Versionchanged Changed in version 4.3: You can use regular expression as placeholder. #### Versionchanged Changed in version 4.13: With the `case-insensitive` flag, the placeholders are not case-sensitive. * **Summary:** Translation is missing some placeholders. * **Scope:** translated strings * **Check class:** `weblate.checks.placeholders.PlaceholderCheck` * **Check identifier:** `placeholders` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `placeholders` * **Flag to ignore:** `ignore-placeholders` Translation is missing some placeholders. These are either extracted from the translation file or defined manually using `placeholders` flag, more can be separated with colon, strings with space can be quoted: ```text placeholders:$URL$:$TARGET$:"some long text" ``` In case you have some syntax for placeholders, you can use a regular expression: ```text placeholders:r"%[^% ]%" ``` You can also have case insensitive placeholders: ```text placeholders:$URL$:$TARGET$,case-insensitive ``` #### SEE ALSO [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) ### Prohibited initial character #### Versionadded Added in version 5.9. * **Summary:** The string starts with a prohibited character in CSV. * **Scope:** glossary strings * **Check class:** `weblate.checks.glossary.ProhibitedInitialCharacterCheck` * **Check identifier:** `prohibited_initial_character` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-prohibited-initial-character` The glossary is often shared as CSV and using some characters at the beginning is restricted by many applications as these can cause the text being evaluated as an expression. This also affects [Glossaries in automatic suggestion](https://docs.weblate.org/en/latest/user/glossary.md#glossary-mt) where many services use CSV for synchronizing glossaries and reject such strings. ### Punctuation spacing #### Versionchanged Changed in version 5.10: This check used to apply to Breton language as well, but it was limited to French only. * **Summary:** Missing non breakable space before double punctuation sign. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.PunctuationSpacingCheck` * **Check identifier:** `punctuation_spacing` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-punctuation-spacing` Checks that there is non breakable space before double punctuation sign (exclamation mark, question mark, semicolon and colon). This rule is used only in a few selected languages like French, where space before double punctuation sign is a typographic rule. #### SEE ALSO [French and English spacing on Wikipedia](https://en.wikipedia.org/wiki/History_of_sentence_spacing#French_and_English_spacing) ### Regular expression #### Versionchanged Changed in version 5.10: Extended support for advanced regular expressions including Unicode codepoint properties. * **Summary:** Translation does not match regular expression. * **Scope:** translated strings * **Check class:** `weblate.checks.placeholders.RegexCheck` * **Check identifier:** `regex` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `regex` * **Flag to ignore:** `ignore-regex` Translation does not match regular expression. The expression is either extracted from the translation file or defined manually using `regex` flag: ```text regex:^foo|bar$ ``` The matching also supports Unicode codepoint properties, including scripts and blocks: ```text regex:^[-_\p{L}\p{N}\p{sc=Deva}\p{sc=Thai}]{1,32}$ ``` #### HINT Use [Placeholders](https://docs.weblate.org/en/latest/user/checks.md#check-placeholders) for detecting missing placeholders in the string. #### SEE ALSO [regex documentation](https://github.com/mrabarnett/mrab-regex) ### reStructuredText syntax error #### Versionadded Added in version 5.10. * **Summary:** reStructuredText syntax error in the translation. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.RSTSyntaxCheck` * **Check identifier:** `rst-syntax` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `rst-text` * **Flag to ignore:** `ignore-rst-syntax` reStructuredText syntax error in the translation. Issues to look for: * Mismatched closing/opening tags. * Missing spaces or interpunction around the reference. The reStructuredText inline blocks need to be separated by non-word characters. * Using quotes instead of backticks. #### SEE ALSO * [reStructuredText Primer](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html) * [Inconsistent reStructuredText](https://docs.weblate.org/en/latest/user/checks.md#check-rst-references) ### Reused translation #### Versionadded Added in version 4.18. * **Summary:** Different strings are translated the same. * **Scope:** translated strings * **Check class:** `weblate.checks.consistency.ReusedCheck` * **Check identifier:** `reused` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-reused` Check that fails if the same translation is used on different source strings. Such translations can be intentional, but can also confuse users. ### Safe MDX #### Versionadded Added in version 2026.7. * **Summary:** JSX expressions in the translation do not match the source. * **Scope:** translated strings * **Check class:** `weblate.checks.mdx.SafeMDXCheck` * **Check identifier:** `safe-mdx` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx) * **Flag to enable:** `safe-mdx` * **Flag to ignore:** `ignore-safe-mdx` ### Same plurals * **Summary:** Some plural forms are translated in the same way. * **Scope:** translated strings * **Check class:** `weblate.checks.consistency.SamePluralsCheck` * **Check identifier:** `same-plurals` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-same-plurals` Check that fails if some plural forms are duplicated in the translation. In most languages they have to be different. ### Starting newline * **Summary:** Source and translation do not both start with a newline. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.BeginNewlineCheck` * **Check identifier:** `begin_newline` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-begin-newline` Newlines usually appear in source strings for good reason, omissions or additions can lead to formatting problems when the translated text is put to use. #### SEE ALSO [Trailing newline](https://docs.weblate.org/en/latest/user/checks.md#check-end-newline) ### Starting spaces * **Summary:** Source and translation do not both start with same number of spaces. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.BeginSpaceCheck` * **Check identifier:** `begin_space` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-begin-space` A space in the beginning of a string is usually used for indentation in the interface and thus important to keep. ### Trailing newline * **Summary:** Source and translation do not both end with a newline. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EndNewlineCheck` * **Check identifier:** `end_newline` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-end-newline` Newlines usually appear in source strings for good reason, omissions or additions can lead to formatting problems when the translated text is put to use. #### SEE ALSO [Starting newline](https://docs.weblate.org/en/latest/user/checks.md#check-begin-newline) ### Trailing space * **Summary:** Source and translation do not both end with a space. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.EndSpaceCheck` * **Check identifier:** `end_space` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-end-space` Checks that trailing spaces are replicated between both source and translation. Trailing space is usually utilized to space out neighbouring elements, so removing it might break layout. ### Unchanged translation * **Summary:** Source and translation are identical. * **Scope:** translated strings * **Check class:** `weblate.checks.same.SameCheck` * **Check identifier:** `same` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-same` Happens if the source and corresponding translation strings are identical, down to at least one of the plural forms. Some strings commonly found across all languages are ignored, and various markups are stripped. This reduces the number of false positives. This check can help find strings mistakenly untranslated. The default behavior of this check is to exclude words from the built-in terms list from the checking. These are words which are frequently not being translated. This is useful to avoid false positives on short strings, which consist only of a single word which is the same in several languages. This list can be disabled by adding `strict-same` flag to a string or component. #### Versionchanged Changed in version 4.17: With `check-glossary` flag (see [Does not follow glossary](https://docs.weblate.org/en/latest/user/checks.md#check-check-glossary)), the untranslatable glossary terms are excluded from the checking. #### SEE ALSO * [Does not follow glossary](https://docs.weblate.org/en/latest/user/checks.md#check-check-glossary) * [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) * [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) ### Unsafe HTML * **Summary:** The translation uses unsafe HTML markup. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.SafeHTMLCheck` * **Check identifier:** `safe-html` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [HTML files](https://docs.weblate.org/en/latest/formats/html.md#html), [Markdown files](https://docs.weblate.org/en/latest/formats/markdown.md#markdown), [MDX files](https://docs.weblate.org/en/latest/formats/mdx.md#mdx), [AsciiDoc files](https://docs.weblate.org/en/latest/formats/asciidoc.md#asciidoc) * **Flag to enable:** `auto-safe-html`, `safe-html` * **Automatic flag behavior:** `auto-safe-html`: Treat a text as conditional HTML, enabling [Unsafe HTML](https://docs.weblate.org/en/latest/user/checks.md#check-safe-html) only for plain text or source strings that contain standard HTML markup or valid custom elements. This is useful for extended Markdown variants such as MDX, where angle-bracket syntax may not be HTML. * **Flag to ignore:** `ignore-safe-html` The translation uses unsafe HTML markup. This check has to be enabled using `safe-html` flag (see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks)). There is also accompanied autofixer which can automatically sanitize the markup. #### HINT When `md-text` flag is also used, the Markdown style links are also allowed. #### SEE ALSO The HTML check is performed by the [Ammonia](https://github.com/rust-ammonia/ammonia) library. ### URL * **Summary:** The translation does not contain a URL. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.URLCheck` * **Check identifier:** `url` * **Trigger:** This check needs to be enabled using a flag. * **Flag to enable:** `url` * **Flag to ignore:** `ignore-url` The translation does not contain a URL. This is triggered only in case the unit is marked as containing URL. In that case the translation has to be a valid URL. ### XML markup * **Summary:** XML tags in translation do not match source. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.XMLTagsCheck` * **Check identifier:** `xml-tags` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-xml-tags` This usually means the resulting output will look different. In most cases this is not a desired result from changing the translation, but occasionally it is. Checks that XML tags are replicated between both source and translation. The check is automatically enabled for XML like strings. You might need to add `xml-text` flag in some cases to force turning it on. #### NOTE This check is disabled by the `safe-html` flag as the HTML cleanup done by it can produce HTML markup which is not valid XML. ### XML syntax * **Summary:** The translation is not valid XML. * **Scope:** translated strings * **Check class:** `weblate.checks.markup.XMLValidityCheck` * **Check identifier:** `xml-invalid` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-xml-invalid` The XML markup is not valid. The check is automatically enabled for XML like strings. You might need to add `xml-text` flag in some cases to force turning it on. #### NOTE This check is disabled by the `safe-html` flag as the HTML cleanup done by it can produce HTML markup which is not valid XML. ### Zero-width space * **Summary:** Translation contains extra zero-width space character. * **Scope:** translated strings * **Check class:** `weblate.checks.chars.ZeroWidthSpaceCheck` * **Check identifier:** `zero-width-space` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-zero-width-space` Zero-width space () characters are used to break messages within words (word wrapping). As they are usually inserted by mistake, this check is triggered once they are present in translation. Some programs might have problems when this character is used. #### SEE ALSO [Zero width space on Wikipedia](https://en.wikipedia.org/wiki/Zero-width_space) ## Source checks Source checks can help developers improve the quality of source strings. ### Ellipsis * **Summary:** The string uses three dots `...` instead of an ellipsis character `…`. * **Scope:** source strings * **Check class:** `weblate.checks.source.EllipsisCheck` * **Check identifier:** `ellipsis` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-ellipsis` This fails when the string uses three dots (`...`) when it should use an ellipsis character (`…`). Using the Unicode character is in most cases the better approach and looks better rendered, and may sound better with text-to-speech. #### SEE ALSO [Ellipsis on Wikipedia](https://en.wikipedia.org/wiki/Ellipsis) ### Fluent source inner HTML #### Versionadded Added in version 5.0. * **Summary:** Fluent source should be valid inner HTML. * **Scope:** source strings * **Check class:** `weblate.checks.fluent.inner_html.FluentSourceInnerHTMLCheck` * **Check identifier:** `fluent-source-inner-html` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent) * **Flag to enable:** `fluent-source-inner-html` * **Flag to ignore:** `ignore-fluent-source-inner-html` Fluent is often used in contexts where the value for a Message (or Term) is meant to be used directly as `.innerHTML` (rather than `.textContent`) for some HTML element. For example, when using the Fluent DOM package. The aim of this check is to predict how the value will be parsed as inner HTML, assuming an HTML5 conforming parser, to catch cases where there would be some “unintended” loss of the string, without being too strict about technical parsing errors that do *not* lead to a loss of the string. This check is applied to the value of Fluent Messages or Terms, but not their Attributes. For Messages, the Fluent Attributes are often just HTML attribute values, so can be arbitrary strings. For Terms, the Fluent Attributes are often language properties that can only be referenced in the selectors of Fluent Select Expressions. Generally, most Fluent values are not expected to contain any HTML markup. Therefore, this check does not expect or want translators and developers to have to care about strictly avoiding *any* technical HTML5 parsing errors (let alone XHTML parsing errors). Instead, this check will just want to warn them when they may have unintentionally opened an HTML tag or inserted a character reference. Moreover, for the Fluent values that intentionally contain HTML tags or character references, this check will verify some “good practices”, such as matching closing and ending tags, valid character references, and quoted attribute values. In addition, whilst the HTML5 specification technically allows for quite arbitrary tag and attribute names, this check will restrain them to some basic ASCII values that should cover the standard HTML5 element tags and attributes, as well as allow *some* custom element or attribute names. This is partially to ensure that the user is using HTML intentionally. Examples: #### Fluent inner HTML examples | Value | Warns? | Reason | |-------------------|----------|-----------------------------------------------------------------------| | `three` | yes | Missing a closing tag. | | `three ` | yes | `four` is not an HTML void element, so should not self-close. | | `text` | no | Custom element tag with a matching closing tag. | | `a b` | no | `img` is an HTML void element. Self-closing is allowed. | | `a
b` | no | `br` is an HTML void element. | | `` | yes | The attribute value is not quoted. | | `` | yes | Non-ASCII tag name. | | `kindðical` | yes | The `ð` part would be converted to `ð`. | | `kindðical` | no | The character reference seems to be intentional. | | `three<e;four` | yes | The `<e;` part would be converted to ` ### Fluent source syntax #### Versionadded Added in version 5.0. * **Summary:** Fluent syntax error in the source. * **Scope:** source strings * **Check class:** `weblate.checks.fluent.syntax.FluentSourceSyntaxCheck` * **Check identifier:** `fluent-source-syntax` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [Fluent format](https://docs.weblate.org/en/latest/formats/fluent.md#fluent) * **Flag to enable:** `fluent-source-syntax` * **Flag to ignore:** `ignore-fluent-source-syntax` In Weblate, Fluent strings use Fluent syntax for references and variables, but also for more complex features like defining attributes and selector variants, including plurals. This check ensures that the syntax used in source will be valid for Fluent. #### SEE ALSO * [Fluent translation syntax](https://docs.weblate.org/en/latest/user/checks.md#check-fluent-target-syntax) * [Fluent Syntax Guide](https://projectfluent.org/fluent/guide/) * [Mozilla Basic Syntax Guide](https://mozilla-l10n.github.io/localizer-documentation/tools/fluent/basic_syntax.html) ### ICU MessageFormat syntax #### Versionadded Added in version 4.9. * **Summary:** Syntax errors in ICU MessageFormat strings. * **Scope:** source strings * **Check class:** `weblate.checks.icu.ICUSourceCheck` * **Check identifier:** `icu_message_format_syntax` * **Trigger:** This check needs to be enabled using a flag. * **File formats automatically enabling this check:** [ARB File](https://docs.weblate.org/en/latest/formats/arb.md#arb), [Format.JS JSON file](https://docs.weblate.org/en/latest/formats/formatjs.md#formatjs) * **Flag to enable:** `icu-message-format` * **Flag to ignore:** `ignore-icu-message-format` #### SEE ALSO [ICU MessageFormat](https://docs.weblate.org/en/latest/user/checks.md#check-icu-message-format) ### Long untranslated #### Versionadded Added in version 4.1. * **Summary:** The string has not been translated for a long time. * **Scope:** source strings * **Check class:** `weblate.checks.source.LongUntranslatedCheck` * **Check identifier:** `long_untranslated` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-long-untranslated` When the string has not been translated for a long time, it can indicate a problem in a source string making it hard to translate. ### Multiple failing checks * **Summary:** The translations in several languages have failing checks. * **Scope:** source strings * **Check class:** `weblate.checks.source.MultipleFailingCheck` * **Check identifier:** `multiple_failures` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-multiple-failures` Numerous translations of this string have failing quality checks. This is usually an indication that something could be done to improve the source string. This check failing can quite often be caused by a missing full stop at the end of a sentence, or similar minor issues which translators tend to fix in translation, while it would be better to fix it in the source string. ### Multiple unnamed variables #### Versionadded Added in version 4.1. * **Summary:** There are multiple unnamed variables in the string, making it impossible for translators to reorder them. * **Scope:** source strings * **Check class:** `weblate.checks.format.MultipleUnnamedFormatsCheck` * **Check identifier:** `unnamed_format` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-unnamed-format` There are multiple unnamed variables in the string, making it impossible for translators to reorder them. Consider using named variables instead to allow translators to reorder them. ### Source string length * **Summary:** Source string is close to or exceeds the configured maximum length for translations. * **Scope:** source strings * **Check class:** `weblate.checks.source.SourceMaxLengthCheck` * **Check identifier:** `source-max-length` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-source-max-length` Translations often need more room than the source text, especially when the source language is English. This check helps maintainers find source strings that are already close to their configured `max-length` before translators have to shorten or omit meaning to fit the limit. For English source strings, including English variants, the check reports strings using more than 85% of the configured `max-length`. For other source languages, it reports source strings longer than the configured `max-length`. This catches source strings that are likely to make translations fail [Maximum length of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-length), and source strings that already do not fit the declared limit. ### Unpluralised * **Summary:** The string is used as plural, but not using plural forms. * **Scope:** source strings * **Check class:** `weblate.checks.source.OptionalPluralCheck` * **Check identifier:** `optional_plural` * **Trigger:** This check is always enabled but can be ignored using a flag. * **Flag to ignore:** `ignore-optional-plural` The string is used as a plural, but does not use plural forms. In case your translation system supports this, you should use the plural aware variant of it. For example with Gettext in Python it could be: ```python from gettext import ngettext print(ngettext("Selected %d file", "Selected %d files", files) % files) ``` ## Placeables in automatic suggestion Checks for placeables expose information on current placeables and this can be used to instruct automatic suggestion engines to keep them. The support for this varies in different services and in many cases there is no way to enforce keeping placeables intact. #### SEE ALSO [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md) # user/files.md # Downloading and uploading translations You can export files from a translation, make changes, and import them again. This allows working offline, and then merging changes back into the existing translation. This works even if it has been changed in the meantime. #### NOTE Available options might be limited by [access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) settings. ## Downloading translations From the project or component dashboard, translatable files can be downloaded in the Files menu. The first option is to download the file in the original format as it is stored in the repository. In this case, any pending changes in the translation are getting committed and the up-to-date file is yield without any conversions. You can also download the translation converted into one of the widely used localization formats. The converted files will be enriched with data provided in Weblate; such as additional context, comments or flags. #### NOTE Format conversion changes the localization file representation, but does not translate between runtime message syntaxes such as ICU MessageFormat and C `printf` formatting. Use application-specific tooling when consumers need different placeholder syntaxes or a compiled resource format not offered by Weblate. Several file formats are available via the Files ↓ Customize download menu: * gettext PO (`po`) * XLIFF 1.1 with gettext extensions (`xliff`) * XLIFF 1.1 (`xliff11`) * TermBase eXchange (`tbx`) * Translation Memory eXchange (`tmx`) * gettext MO (only available when translation is using gettext PO) (`mo`) * CSV (`csv`) * Excel Open XML (`xlsx`) * JSON (only available for monolingual translations) (`json`) * JSON nested structure file (only available for monolingual translations) (`json-nested`) * Android String Resource (only available for monolingual translations) (`aresource`) * iOS strings (only available for monolingual translations) (`strings`) #### HINT The content available in the converted files differs based on file format features, you can find overview in [Translation types capabilities](https://docs.weblate.org/en/latest/formats.md#fmt-capabs). ![image](screenshots/file-download.webp) #### SEE ALSO * [`GET /api/translations/(string:project)/(string:component)/(string:language)/file/`](https://docs.weblate.org/en/latest/api.md#get--api-translations-(string-project)-(string-component)-(string-language)-file-) * [`WEBLATE_EXPORTERS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-WEBLATE_EXPORTERS) ## Downloading components, categories or projects Translation files for a component, category or project can be downloaded at once via the Files menu. The download is always served as a ZIP file, and you can choose original or converted formats similarly as in [Downloading translations](https://docs.weblate.org/en/latest/user/files.md#download). #### SEE ALSO [`GET /api/components/(string:project)/(string:component)/file/`](https://docs.weblate.org/en/latest/api.md#get--api-components-(string-project)-(string-component)-file-) ## Uploading translations When you have made your changes, use Upload translation in the Files menu. ![image](screenshots/file-upload.webp) ### Supported file formats Any file in a supported file format can be uploaded, but it is still recommended to use the same file format as the one used for translation, otherwise some features might not be translated properly. #### SEE ALSO * [Localization file formats](https://docs.weblate.org/en/latest/formats.md#formats) * [Downloading and uploading translations](https://docs.weblate.org/en/latest/user/files.md) ### Import methods These are the choices presented when uploading translation files: ![image](screenshots/file-import-methods.webp) Add as translation (`translate`) : Imported strings are added as translations to existing strings. This is the most common usecase, and the default behavior.
Only translations are used from the uploaded file and no additional content.
This option is available only if the user has the [“Edit strings” permission](https://docs.weblate.org/en/latest/admin/access.md#privileges). Add as suggestion (`suggest`) : Imported strings are added as suggestions. Do this when you want to have your uploaded strings reviewed.
Only translations are used from the uploaded file and no additional content.
This option is available only if the user has the [“Add suggestion” permission](https://docs.weblate.org/en/latest/admin/access.md#privileges). Add as approved translation (`approve`) : Imported strings are added as approved translations. Do this when you already reviewed your translations before uploading them.
Only translations are used from the uploaded file and no additional content.
This option is available only if the user has the [“Review strings” permission](https://docs.weblate.org/en/latest/admin/access.md#privileges). Add as translation needing edit (`fuzzy`) : Imported strings are added as translations needing edit. This can be useful when you want translations to be used, but also reviewed.
Only translations are used from the uploaded file and no additional content.
This option is available only if the user has the [“Edit strings” permission](https://docs.weblate.org/en/latest/admin/access.md#privileges). Replace existing translation file (`replace`) : Existing file is replaced with new content. This can lead to loss of existing translations, use with caution.
This option is available only if the user has the [“Edit component settings” permission or “Add new string”, “Remove a string” and “Edit strings” permissions](https://docs.weblate.org/en/latest/admin/access.md#privileges). Update source strings (`source`) : Updates source strings in bilingual translation file. This is similar to what [Update PO files to match POT (msgmerge)](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-gettext-msgmerge) does.
This option is available only for some file formats and only if the user has the [“Upload translations” permission](https://docs.weblate.org/en/latest/admin/access.md#privileges). Add new strings (`add`) : Adds new strings to the translation. It skips the ones which already exist.
In case you want to both add new strings and update existing translations, upload the file second time with Add as translation.
Only source, translation and key (context) are used from the uploaded file.
This option is available only with [Manage strings](https://docs.weblate.org/en/latest/admin/projects.md#component-manage-units) turned on and only if the user has the [“Add new string” permission](https://docs.weblate.org/en/latest/admin/access.md#privileges). #### SEE ALSO [`POST /api/translations/(string:project)/(string:component)/(string:language)/file/`](https://docs.weblate.org/en/latest/api.md#post--api-translations-(string-project)-(string-component)-(string-language)-file-) ### Conflicts handling Defines how to deal with uploaded strings which are already translated: Change only untranslated strings (`ignore`) : Ignore uploaded translations which are already translated. Change translated strings (`replace-translated`) : Replace existing translations with uploaded ones, but keep approved ones. Change translated and approved strings (`replace-approved`) : Replace existing translations with uploaded ones, including approved ones. ### Strings needing edit There is also an option for how to handle strings needing edit in the imported file. Such strings can be handle in one of the three following ways: “Do not import”, “Import as string needing edit”, or “Import as translated”. ### Overriding authorship With admin permissions, you can also specify authorship of uploaded file. This can be useful in case you’ve received the file in another way and want to merge it into existing translations while properly crediting the actual author. # user/glossary.md # Glossary Each project can include one or more glossaries for storing terms and their preferred translations. Glossaries help keep translations consistent by showing matching terms in the translation editor. Glossaries are regular translation components with special behavior. The source language stores the terms Weblate searches for in source strings. Each glossary translation stores the preferred term, forbidden term, or untranslatable entry for one target language. Terms from the glossary containing words from the currently translated source string are displayed in the sidebar of the translation editor. #### HINT The glossary terms are not used in quality checks unless you enable that, see [Does not follow glossary](https://docs.weblate.org/en/latest/user/checks.md#check-check-glossary) for more information. ## How glossary matching works When you translate a regular component, Weblate searches the source string for terms from the source language of the project glossaries. When a term matches, Weblate looks up the corresponding glossary entry for the language currently being translated and shows it in the editor. This means glossary entries need to exist in the target glossary language to be shown while translating that target language. A source-language-only glossary can still store definitions and context, but it will not provide target-language matches for languages that do not have glossary entries. If you want a term to be present in every glossary language, mark the source entry as [Terminology](https://docs.weblate.org/en/latest/user/glossary.md#glossary-terminology). If the term should stay unchanged in every language, use [Untranslatable terms](https://docs.weblate.org/en/latest/user/glossary.md#glossary-untranslatable); combine it with terminology only when you want Weblate to create and maintain entries for all glossary languages. ## Managing glossaries #### Versionchanged Changed in version 4.5: Glossaries are now regular translation components and you can use all Weblate features on them — commenting, storing in a remote repository, or adding explanations. Use any component as a glossary by turning on [Use as a glossary](https://docs.weblate.org/en/latest/admin/projects.md#component-is-glossary). You can create multiple glossaries for one project. An empty glossary for a given project is automatically created with the project. Glossaries are shared among all components of the same project, and optionally with other projects using [Share in projects](https://docs.weblate.org/en/latest/admin/projects.md#component-links) from the respective glossary component. The glossary component looks like any other component in Weblate with added colored label: ![image](screenshots/glossary-component.webp) You can browse all glossary terms: ![image](screenshots/glossary-browse.webp) or edit them as any translations. ## Glossary terms Glossary terms are translated the same way regular strings are. You can toggle additional features using the Tools menu for each term. ![image](screenshots/glossary-tools.webp) #### SEE ALSO [Adding new strings](https://docs.weblate.org/en/latest/devel/translations.md#adding-strings) #### Glossary entry types | Type | Purpose | |-----------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------| | Regular glossary term | Preferred translation or explanation for a term in one or more
languages. | | [Terminology](https://docs.weblate.org/en/latest/user/glossary.md#glossary-terminology) | Source term Weblate keeps present in every glossary language so missing
translations can be tracked and filled. | | [Untranslatable terms](https://docs.weblate.org/en/latest/user/glossary.md#glossary-untranslatable) | Term that should stay unchanged or should not be translated. | | [Forbidden translations](https://docs.weblate.org/en/latest/user/glossary.md#glossary-forbidden) | Translation that should not be used for the source term. | | [Variants](https://docs.weblate.org/en/latest/user/glossary.md#glossary-variants) | Alternative wording, abbreviation, or shorter form grouped with another
glossary term. | ### Choosing glossary terms Choose glossary terms for meaning and audience, not only for literal word shape. If a source term is ambiguous, add an explanation so translators know which meaning applies in the project. Glossary entries are especially useful for brand names, acronyms, product features, technical terms, and newly coined or transliterated words. Use variants for abbreviations or shorter wording, mark important cross-language terms as [Terminology](https://docs.weblate.org/en/latest/user/glossary.md#glossary-terminology), mark terms that should stay unchanged as [Untranslatable terms](https://docs.weblate.org/en/latest/user/glossary.md#glossary-untranslatable), and mark misleading translations as [Forbidden translations](https://docs.weblate.org/en/latest/user/glossary.md#glossary-forbidden). ### Untranslatable terms #### Versionadded Added in version 4.5. Flagging certain glossary term translations `read-only` by bulk-editing, typing in the flag, or by using Tools ↓ Mark as untranslatable means they can not be translated. Use this for brand names, product names, domains, technology names, or other terms that should not be changed in other languages. Such terms are visually highlighted in the glossary sidebar. The `read-only` flag is enough when the glossary entry already exists in the languages where it should be shown. Add the [Terminology](https://docs.weblate.org/en/latest/user/glossary.md#glossary-terminology) flag as well only when Weblate should create and maintain the untranslatable entry in every glossary language. #### SEE ALSO [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) ### Forbidden translations #### Versionadded Added in version 4.5. Flagging certain glossary term translations as `forbidden` by bulk-editing, typing in the flag, or by using Tools ↓ Mark as forbidden translation means they are **not** to be used. Use this to clarify translation when some words are ambiguous or could have unexpected meanings. Use forbidden entries for translations that should be avoided. Use regular glossary entries for preferred translations. #### SEE ALSO [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) ### Terminology #### Versionadded Added in version 4.5. Flagging certain source-language glossary terms as `terminology` by bulk-editing, typing in the flag, or by using Tools ↓ Mark as terminology adds entries for them to all languages in the glossary. Use this for important terms that should be well thought out, and retain a consistent meaning across all languages. Enable [Manage strings](https://docs.weblate.org/en/latest/admin/projects.md#component-manage-units) on the glossary component to synchronize terminology. When it is disabled, Weblate does not create missing language entries, even for terms marked as terminology. Weblate shows a dismissible [diagnostic](https://docs.weblate.org/en/latest/devel/alerts.md#alerts) when string management is disabled for a glossary with no remote repository, or for another glossary that contains terminology. Enable string management to add terms directly in Weblate and synchronize terminology, or dismiss the warning if you maintain the glossary files separately. The terminology flag is ongoing state, not just a one-time action. While the flag remains on the source term, Weblate treats it as terminology and keeps an entry for it in every glossary language. If a language entry is removed, the next glossary synchronization creates it again. Removing the `terminology` flag stops this automatic maintenance, but it does not remove or otherwise revert entries that were already created. They remain regular glossary entries. A regular glossary term can also have translations in every language. The difference is that Weblate does not recreate missing language entries for a regular term after they are removed. #### SEE ALSO [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks) ### Variants Variants are a generic way to group strings together. All term variants are listed in the glossary sidebar when translating. #### HINT You can use this to add abbreviations or shorter expressions for a term. #### SEE ALSO [String variants](https://docs.weblate.org/en/latest/devel/translations.md#variants) ## Glossary import Similar to regular translation components, you can upload existing glossaries to Weblate. Formats like [CSV files](https://docs.weblate.org/en/latest/formats/csv.md) or [TermBase eXchange format](https://docs.weblate.org/en/latest/formats/tbx.md) are supported and can be uploaded, see [Uploading translations](https://docs.weblate.org/en/latest/user/files.md#upload). TBX files can include explanations, read-only metadata, and glossary flags; see [TermBase eXchange format](https://docs.weblate.org/en/latest/formats/tbx.md#tbx) for the exact metadata mapping. Even though TBX can contain multiple languages, Weblate still maps component files to languages using the component file mask and language settings. For a TBX glossary component, keep the component source language as the source term language and name translation files for the target language they represent. Avoid naming a translation file with the same language as the component source language, because the source language already exists in Weblate and this can lead to duplicate language detection. #### SEE ALSO * [Language aliases](https://docs.weblate.org/en/latest/admin/projects.md#project-language-aliases) * [Language filter](https://docs.weblate.org/en/latest/admin/projects.md#component-language-regex) ## Language files and synchronization Glossary components follow the languages used by the regular components in the same project. When a language is added to a regular component, Weblate adds the missing glossary language as well so glossary matches can be shown for that language. This automatic language synchronization is intentional. Filtering glossary language files with [Language filter](https://docs.weblate.org/en/latest/admin/projects.md#component-language-regex) can reduce the number of managed files, but it also means Weblate has no glossary entries to show for filtered-out target languages. Terminology entries are also synchronized. When a source glossary term is marked as terminology, Weblate creates missing entries in all glossary languages and recreates them if they are removed while the flag is still set. Weblate can clean up stale glossary translations only for Weblate-managed glossaries, only when no regular component in the project still uses that language, and only when the stale glossary translation has no translated terms. If the stale glossary language still contains terms, Weblate keeps it and reports it as an unused glossary language. ## Common setup patterns English-only explanatory glossary : Add source-language glossary terms with explanations. This works as a maintained term list, but it will not show target-language glossary matches unless you also create entries in the target glossary languages. Required terminology : Add terms in the source glossary language, mark them as [Terminology](https://docs.weblate.org/en/latest/user/glossary.md#glossary-terminology), and let translators fill the created entries in each target language. Use explanations to document the intended meaning. Non-translatable terms : Mark terms as [Untranslatable terms](https://docs.weblate.org/en/latest/user/glossary.md#glossary-untranslatable) when they should stay unchanged. Add [Terminology](https://docs.weblate.org/en/latest/user/glossary.md#glossary-terminology) only when the term should be present in every glossary language for matching and review. Forbidden translations : Add the misleading translation as a [Forbidden translations](https://docs.weblate.org/en/latest/user/glossary.md#glossary-forbidden) entry. Add the preferred wording as a separate regular glossary entry when translators should use a specific translation instead. ## Glossaries in automatic suggestion #### Versionadded Added in version 5.3. Some automatic suggestion services utilize glossaries during the translation, please consult their documentation in [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md) to see the support. The glossary is processed before exposed to the service: * Duplicate source entries are skipped for services that require unique source terms. LLM-based services can receive duplicates with explanations to disambiguate them. * Any control characters and leading and trailing whitespace are stripped. * [Forbidden translations](https://docs.weblate.org/en/latest/user/glossary.md#glossary-forbidden) are skipped. #### NOTE Many services store glossaries server-side and enforce limit on the number of saved glossaries. Weblate always deletes the oldest glossary if it runs out of space. # user/profile.md # Registration and user profile ## Registration Everybody can browse projects, view translations or suggest translations by default. Only registered users are allowed to actually save changes, and are credited for every translation made. You can register by following a few simple steps: 1. Fill out the registration form with your credentials. 2. Activate registration by following the link in the e-mail you receive. 3. Optionally adjust your profile to choose which languages you know. ## Dashboard When you sign in, you will see an overview of projects and components, as well as their respective translation progression. Components of projects you are watching are shown by default, and cross-referenced with your preferred languages. #### HINT You can switch to different views using the navigation tabs. ![image](screenshots/dashboard-dropdown.webp) The menu has these options: - Projects > Browse all projects in the main menu showing translation status for each project on the Weblate instance. - Selecting a language in the main menu Languages will show translation status of all projects, filtered by one of your primary languages. - Watched translations in the Dashboard will show translation status of only those projects you are watching, filtered by your primary languages. In addition, the drop-down can also show any number of *component lists*, sets of project components preconfigured by the Weblate administrator, see [Component Lists](https://docs.weblate.org/en/latest/admin/componentlists.md#componentlists). You can configure your personal default dashboard view in the Preferences section of your user profile settings. #### NOTE When Weblate is configured for a single project using [`SINGLE_PROJECT`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SINGLE_PROJECT) in the `settings.py` file (see [Configuration](https://docs.weblate.org/en/latest/admin/config.md#config)), the dashboard will not be shown, as the user will be redirected to a single project or component instead. ## User profile The user profile is accessible by clicking your user icon in the top-right of the top menu, then the Settings menu. The user profile contains your preferences. Name and e-mail address are used in VCS commits, so keep this info accurate. #### NOTE All language selections only offer currently translated languages. #### HINT Request or add other languages you want to translate by clicking the button to make them available too. ## Languages ### Interface language Choose the language you want to display the UI in. ### Translated languages Choose which languages you prefer to translate, and they will be offered on the main page of watched projects, so that you have easier access to all these translations in each of those languages. ![image](screenshots/your-translations.webp) ### Secondary languages You can define which secondary languages are shown to you as a guide while translating. An example can be seen in the following image, where the Hebrew language is shown as secondarily: ![image](screenshots/secondary-language.webp) #### HINT This can be also configured in the project ([Secondary language](https://docs.weblate.org/en/latest/admin/projects.md#project-secondary-language)) or component ([Secondary language](https://docs.weblate.org/en/latest/admin/projects.md#component-secondary-language)). In that case it can be used for [String consolidation using secondary language](https://docs.weblate.org/en/latest/workflows.md#secondary-language-workflow). ## Preferences ### Theme Choose whether Weblate follows system settings for dark or light theme, or choose one of them manually. ### Table columns By default, Weblate hides some columns in listings (languages, components, projects, …) when the browser window is too narrow to fit them. Enable Show all columns in lists using horizontal scrolling to keep all columns instead and scroll the table horizontally when needed. Use Visible columns in lists to choose which statistics columns are shown in the listings. This way you can hide numbers you are not interested in, or make room for additional ones such as Total strings. ### Default dashboard view On the Preferences tab, you can pick which of the available dashboard views to present by default. If you pick the Component list, you have to select which component list will be displayed from the Default component list drop-down. #### SEE ALSO [Component Lists](https://docs.weblate.org/en/latest/admin/componentlists.md#componentlists) ### Editor link A source code link is shown in the web-browser configured in the [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) by default. #### HINT By setting the Editor link, you use your local editor to open the VCS source code file of translated strings. You can use [Template markup](https://docs.weblate.org/en/latest/admin/projects.md#markup). Usually something like `editor://open/?file={{filename}}&line={{line}}` is a good option. #### SEE ALSO You can find more info on registering custom URL protocols for the editor in the [Nette documentation](https://tracy.nette.org/en/open-files-in-ide). ### Special characters Additional special characters to include in the [Visual keyboard](https://docs.weblate.org/en/latest/user/translating.md#visual-keyboard). ## Notifications Subscribe to various notifications from the Notifications tab. Notifications for selected events on watched or administered projects will be sent to you per e-mail. Some of the notifications are sent only for events in your languages (for example about new strings to translate), while some trigger at component level (for example merge errors). These two groups of notifications are visually separated in the settings. The Translation activity summary notification is digest-only and summarizes added, updated, translated, approved, needs editing, and unfinished strings. Each periodic notification e-mail contains entries from all matching projects, up to 100 entries, and indicates when additional entries were omitted. You can toggle notifications for watched projects and administered projects and it can be further tweaked (or muted) per project and component. Visit the component overview page and select appropriate choice from the Watching menu. In case Automatically watch projects on contribution is enabled you will automatically start watching projects upon contributing to them. The default value depends on [`DEFAULT_AUTO_WATCH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DEFAULT_AUTO_WATCH). #### NOTE You will not receive notifications for your own actions. #### HINT Sending out notifications is limited, you will not receive more than 1000 e-mails per day. Any further notifications for you will be discarded. Open Notification diagnostics from your notification settings to inspect your own subscriptions. Administrators with management access and permission to edit users can open the same page for another user from that user’s Edit tab. The Overview tab includes watched projects, notification languages, and subscriptions grouped by scope and target. In the Diagnostics tab, enter an object path such as `project/category/component/cs`. Project and category paths summarize inherited project settings and exceptions across all accessible components. Equivalent component settings are grouped together, with counts and up to five example links to inspect individual components. Component paths show effective settings and language restrictions; translation paths check the selected language specifically. Broad summaries do not enumerate individual translations. Summaries are limited to 200 accessible components and 10 original projects (including the selected project). For larger scopes, choose a smaller category, a component, or a translation; partial summaries are not shown. Lists of more than five watched projects or notification languages show counts instead of individual links. Only events with a matching subscription are shown, including disabled subscriptions and subscriptions blocked by language or account conditions. Event conditions and overridden subscriptions are shown directly. Subscription links highlight the matching row in the Overview tab. Component example links open diagnostics for that component. Shared components use subscriptions from their original project. The diagnostics check eligibility without sending e-mail. Notifications that depend on event details, such as mentions or alerts, are marked as conditional. Actual delivery also depends on the event author, digest content, and rate limits. ![image](screenshots/profile-subscriptions.webp) ## Account The Account tab lets you set up basic account details, connect various services you can use to sign in into Weblate, completely remove your account, or download your user data (see [Weblate user data export](https://docs.weblate.org/en/latest/contributing/schemas.md#schema-userdata)). The private commit e-mail will be used instead of your account e-mail in version control commits. Use this to avoid leaking your real e-mail there. Be aware that using different e-mail can disconnect your contributions on other servers (for example your contributions will no longer link to your profile on GitHub). The private e-mail can be turned on site-wide using [`PRIVATE_COMMIT_EMAIL_OPT_IN`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-PRIVATE_COMMIT_EMAIL_OPT_IN). #### NOTE The list of services depends on your Weblate configuration, but can be made to include popular sites such as GitLab, GitHub, Google, Facebook, or Bitbucket or other OAuth 2.0 providers. ![image](screenshots/authentication.webp) ## Profile All of the fields on this page are optional and can be deleted at any time, and by filling them out, you’re giving us consent to share this data wherever your user profile appears. Public profile URLs, such as Website URL, Contact URL, Fediverse URL, and Code site URL, should point to a website, contact, or profile page. Obvious direct file download links can be rejected, and public profile links show a warning before leaving Weblate where possible. The Code site URL should use common code-hosting profile paths, such as `/username` or `/~username`; existing repository-style links such as `/username/project` or `/group/subgroup/project` are also accepted. The Fediverse URL should use common profile paths, such as `/username`, `/@username`, `/web/@username`, `/users/username`, `/accounts/username`, `/channel/username`, `/profile/username`, `/u/username`, or `/people/identifier`. Avatar can be shown for each user (depending on [`ENABLE_AVATARS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-ENABLE_AVATARS)). These images are obtained using [https://gravatar.com/](https://gravatar.com/). ## Licenses ## API access You can get or reset your API access token here. ## Audit log Audit log keeps track of the actions performed with your account. It logs IP address and browser for every important action with your account. The critical actions also trigger a notification to a primary e-mail address. #### SEE ALSO [Running behind reverse proxy](https://docs.weblate.org/en/latest/admin/install.md#reverse-proxy) # user/search.md # Searching ## Results while translating The translation editor keeps the current search results while you translate. For example, translating an untranslated string does not remove it from the list, so you can navigate back to it. Reloading a page with a saved position in its URL (`offset`) keeps this list. An initial search URL without a position runs the search again when reloaded. Select the Refresh results icon next to the query input or press `Enter` in the filter field to run the search again and start at the first matching string. This also works in Zen mode. Changing the sort order keeps the current result list. After 30 minutes of inactivity, the saved search results expire. Weblate refreshes the results when you continue and displays a notice. Saving still applies to the string you were editing, subject to the usual checks for conflicting changes. If that string no longer matches the filters, it is kept at the start of the refreshed list so you can return to it. If results expire while scrolling in Zen mode, save any pending edits and select Refresh results to continue loading strings. ## Search query syntax Advanced searches support boolean operations, parentheses, field-specific lookup, field operators, exact match, date values, and regular expressions. The available fields depend on what kind of object is being searched. ### Boolean operators You can combine lookups using `AND`, `OR`, `NOT` and parentheses to form complex queries. Boolean operators are case-insensitive, so `and`, `And` and `AND` are equivalent. The `NOT` operator has higher precedence than the `AND` operator; the `AND` operator has higher precedence than the `OR` operator. You can add parenthesis to define a precedence of your own. Omitting the operator will make the query behave like the `AND` operator was used. #### Equivalent expressions | `(state:translated AND source:hello) OR source:bar` | Parenthesized expression to clearly show the precedence. | |-------------------------------------------------------|------------------------------------------------------------------| | `state:translated AND source:hello OR source:bar` | The `AND` operator has higher precedence than the `OR` operator. | | `state:translated source:hello OR source:bar` | Query using an implicit `AND` operator. | ### Field operators You can specify operators, ranges or partial lookups for date or numeric searches: `state:>=translated` : State is `translated` or better (`approved`). `changed:[2019-03-01 to 2019-04-01]` : Changed between two given dates (inclusive). `position:[10 to 100]` : Strings with position between 10 and 100 (inclusive). ### Searching for DATETIME fields Timestamp searching supports multiple ways to specify the value. It supports wide range of ways to specify date and time. * ISO 8601 formatted like `2025-09-08T12:16:55.336146+00:00`. * English written date and time like `July 4, 2013 PST`. * English adverbs of time like `yesterday`, `last month`, and `2 days ago`. Whenever only the date is specified, it is always used as inclusive and covers that date. Specify the exact timestamp if you need to override this behavior. Examples: `changed:>=2019-03-01` : Changed on 1st March 2019 and later (inclusive). `changed:>="2 weeks ago"` : Changed 2 weeks ago from the current date and time. `changed:>=yesterday` : Changed starting yesterday. `changed:2019` : Changed in the year 2019. `changed:[2019-03-01 to 2019-04-01]` : Changed between two given dates (inclusive). `changed:[20_days_ago to yesterday]` : Changed between two relative dates (inclusive). ### Exact operators You can do an exact match query on different string fields using `=` operator. For example, to search for all source strings exactly matching `hello world`, use: `source:="hello world"`. For searching single word expressions, you can skip quotes. For example, to search for all source strings matching `hello`, you can use: `source:=hello`. ### Regular expressions Anywhere text is accepted you can also specify a regular expression as `r"regexp"`. For example, to search for all source strings which contain any digit between 2 and 5, use `source:r"[2-5]"`. #### HINT The regular expressions are evaluated by the database backend and might use different extensions, please consult the database documentation for more details: * [PostgreSQL Regular Expressions Details](https://www.postgresql.org/docs/current/functions-matching.html#POSIX-SYNTAX-DETAILS) ## Searching for strings String search supports the shared query syntax above. When no field is defined, the lookup happens on source, target, and context strings. Select All strings at the top of the Filters menu to clear the query within the current search scope. If the form does not submit automatically, submit it to show all strings. Shared filters follow the order and status colors used in the strings status overview. ![image](screenshots/search.webp) ### Simple search Any phrase typed into the search box is split into words. Strings containing all of them are shown. To look for an exact phrase, put “the searchphrase” into quotes (both single (`'`) and double (`"`) quotes will work): `"this is a quoted string"` or `'another quoted string'`. ### Fields `source:TEXT` : Source string case-insensitive search. `target:TEXT` : Target string case-insensitive search. `context:TEXT` : Context string case-insensitive search. `key:TEXT` : Key string case-insensitive search. `note:TEXT` : Source string description case-insensitive search. `location:TEXT` : Location string case-insensitive search. `priority:NUMBER` : String priority. `id:NUMBER` : String unique identifier. `position:NUMBER` : String position in the translation file. `added:DATETIME` : Timestamp for when the string was added to Weblate. `state:TEXT` : Search for string states (`approved`, `translated`, `needs-editing`, `needs-rewriting`, `needs-checking`, `empty`, `read-only`).
This field also supports [Field operators](https://docs.weblate.org/en/latest/user/search.md#search-operators), so searching for completed strings can be performed as `state:>=translated`, searching for strings needing translation as `state: `read-only` or `readonly` : Read-only strings, same as `state:read-only`.
`approved` : Approved strings, same as `state:approved`.
`needs-editing` or `fuzzy` : Needing editing/checking/rewriting strings, same as `state:needs-editing OR state:needs-rewriting OR state:needs-checking`.
`translated` : Translated strings, same as `state:>translated`.
`untranslated` : Untranslated strings, same as `state: `pending` : Pending strings not yet committed to the file (see [Lazy commits](https://docs.weblate.org/en/latest/admin/continuous.md#lazy-commit)).
`automatically-translated` : Strings that were translated automatically (see [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation)). `language:TEXT` : String target language. `component:TEXT` : Component slug or name case-insensitive search, see [Component slug](https://docs.weblate.org/en/latest/admin/projects.md#component-slug) and [Component name](https://docs.weblate.org/en/latest/admin/projects.md#component-name). `project:TEXT` : Project slug, see [URL slug](https://docs.weblate.org/en/latest/admin/projects.md#project-slug). `path:TEXT` : Path to the object to limit searching inside component, category, project, or translation. `changed_by:TEXT` : String was changed by author with given username. Use `changed_by:""` to search for strings with at least one content change without a recorded author. `changed:DATETIME` : String content was changed on date, supports [Field operators](https://docs.weblate.org/en/latest/user/search.md#search-operators) and [Searching for DATETIME fields](https://docs.weblate.org/en/latest/user/search.md#date-search). `change_time:DATETIME` : String was changed on date, supports [Field operators](https://docs.weblate.org/en/latest/user/search.md#search-operators) and [Searching for DATETIME fields](https://docs.weblate.org/en/latest/user/search.md#date-search).
Unlike `changed` this includes event which don’t change content and you can apply custom action filtering using `change_action`. `change_action:TEXT` : Filters on change action, useful together with `change_time`. Accepts English name of the change action, either quoted and with spaces or lowercase and spaces replaced by a hyphen. See [Searching for changes](https://docs.weblate.org/en/latest/user/search.md#search-changes) for examples.
When combining `changed_by`, `changed`, `change_time`, and `change_action` filters, the filters apply to the same change event. `source_changed:DATETIME` : Source string was last changed on date, supports [Field operators](https://docs.weblate.org/en/latest/user/search.md#search-operators) and [Searching for DATETIME fields](https://docs.weblate.org/en/latest/user/search.md#date-search). `last_changed:DATETIME` : The string was last changed on date, supports [Field operators](https://docs.weblate.org/en/latest/user/search.md#search-operators) and [Searching for DATETIME fields](https://docs.weblate.org/en/latest/user/search.md#date-search). `check:TEXT` : String has failing check, see [Checks and fixups](https://docs.weblate.org/en/latest/user/checks.md) for check identifiers. `dismissed_check:TEXT` : String has dismissed check, see [Checks and fixups](https://docs.weblate.org/en/latest/user/checks.md) for check identifiers. `comment:TEXT` : Search in unresolved user comments on the string. `resolved_comment:TEXT` : Search in resolved comments. `comment_author:TEXT` : Filter by comment author. `source_comment:TEXT` : Search in unresolved source string comments. `resolved_source_comment:TEXT` : Search in resolved source string comments. `source_comment_author:TEXT` : Filter by source string comment author.
Source string comment filters match comments attached to the source string. When searching across languages, matching target strings sharing that source string can be included in the results. `suggestion:TEXT` : Search in suggestions. `suggestion_author:TEXT` : Filter by suggestion author. `explanation:TEXT` : Search in explanations. `label:TEXT` : Search in labels. `screenshot:TEXT` : Search in screenshots. `labels_count:NUMBER` : Filter by count of labels ### Searching for changes #### Versionadded Added in version 4.4. Searching for history events can be done using `change_action` and `change_time` operators. For example, searching for strings marked for edit in 2018 can be entered as `change_time:2018 AND change_action:marked-for-edit` or `change_time:2018 AND change_action:"Marked for edit"`. ### Predefined queries You can select out of predefined queries on the search page, this allows you to quickly access the most frequent searches: ![image](screenshots/query-dropdown.webp) ### Ordering the results There are many options to order the strings according to your needs: ![image](screenshots/query-sort.webp) ## Searching for screenshots The screenshot listing in a component accepts advanced queries using boolean operations, parentheses, or field specific lookup. When no field is defined, the lookup happens on the screenshot name. Use field-specific lookups to search repository paths, screenshot languages, or assigned source strings. ### Screenshot fields `name:TEXT` : Screenshot name case-insensitive search. `path:TEXT` : Repository path to screenshot case-insensitive search. `repository:TEXT` : Repository path to screenshot case-insensitive search, same as `path:TEXT`. `language:TEXT` : Screenshot language code or language name case-insensitive search. `string:TEXT` : Assigned source string case-insensitive search. `context:TEXT` : Assigned source string context case-insensitive search. `location:TEXT` : Assigned source string location case-insensitive search. `id:NUMBER` : Screenshot unique identifier. `timestamp:DATETIME` : Timestamp for when the screenshot was added to Weblate. `strings:NUMBER` : Number of assigned source strings. `has:TEXT` : Search for screenshots having attributes:
`string` : Screenshot assigned to at least one source string.
`repository` : Screenshot with a repository path.
`path` : Screenshot with a repository path, same as `repository`. ### Screenshot search examples `login` : Search for screenshots matching `login` in the screenshot name. `name:login` : Search for screenshots with `login` in the screenshot name. `language:cs` : Search for screenshots in languages matching `cs`. `string:"Save changes"` : Search for screenshots assigned to source strings matching `Save changes`. `has:string` : Search for screenshots assigned to at least one source string. `NOT has:string` : Search for screenshots not assigned to any source string. `repository:fastlane` : Search for screenshots with `fastlane` in the repository path. `strings:>2` : Search for screenshots assigned to more than two source strings. `has:repository AND NOT has:string` : Search for screenshots imported from the repository that still need source string assignment. Screenshot search supports the same [Boolean operators](https://docs.weblate.org/en/latest/user/search.md#search-boolean), [Field operators](https://docs.weblate.org/en/latest/user/search.md#search-operators), [Searching for DATETIME fields](https://docs.weblate.org/en/latest/user/search.md#date-search), exact match, and regular expression syntax as string search. ## Searching for users #### Versionadded Added in version 4.18. The user browsing has similar search abilities: `username:TEXT` : Search in usernames. `full_name:TEXT` : Search in full names. `language:TEXT` : User configured translation language (see [Translated languages](https://docs.weblate.org/en/latest/user/profile.md#profile-translated-languages)). `joined:DATETIME` : String content was changed on date, supports [Field operators](https://docs.weblate.org/en/latest/user/search.md#search-operators). `translates:TEXT` : User has contributed to a given language.
You might want to limit contribution time by `change_time`, for example `change_time:>"90 days ago"`. `contributes:TEXT` : User has contributed to a given project or component.
You might want to limit contribution time by `change_time`, for example `change_time:>"90 days ago"`. `change_time:DATETIME` : Same as in [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings). `change_action:TEXT` : Same as in [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings). Additional lookups are available in the [Management interface](https://docs.weblate.org/en/latest/admin/admin.md#management-interface): `is:bot` : Search for bots (used for project scoped tokens). `is:active` : Search for active users. `email:TEXT` : Search by e-mail. `ip:TEXT` : Search by audit log IP address. # user/translating.md # Translating using Weblate Thank you for your interest in translating with Weblate! Generally, there are two most used modes of translation: * Project accepts direct translations * Project accepts the suggestions made by users. Sometimes, anonymous suggestions are accepted as well. There are more translation workflows detailed in [Translation workflows](https://docs.weblate.org/en/latest/workflows.md#workflows). Projects, or the components in them are either visible to everyone, or only to a certain group of translators. #### SEE ALSO * [Access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) * [Translation workflows](https://docs.weblate.org/en/latest/workflows.md#workflows) ## Translation projects Translation projects hold related components; resources for the same software, book, or project. ![image](screenshots/project-overview.webp) ## Translation links Having navigated to a component, a set of links lead to its actual translation. The translation is further divided into individual checks, like Untranslated strings or Unfinished strings. If the whole project is already translated without any errors, All strings is still available. Alternatively you can use the [Search](https://docs.weblate.org/en/latest/user/search.md) feature to find a specific string or term. ![image](screenshots/strings-to-check.webp) ## Suggestions #### NOTE Actual permissions might vary depending on your Weblate configuration. Anonymous users (by default) can only forward suggestions. Doing so is still available to signed-in users, in cases where uncertainty about a translation arises, prompting other translators to review it. Any user can clone an existing suggestion into the translation fields, including plural forms, and use it as the basis for a new suggestion or translation. All suggestions are scanned on a daily basis to remove duplicates and those matching current translations. If you have the Accept suggestions permission, you can bulk accept all suggestions from a specific user by clicking the account check icon next to their suggestion. This is useful for quickly processing suggestions from trusted contributors. Suggestions failing quality checks are skipped and remain for manual review. Weblate shows the number of matching suggestions for confirmation and processes the acceptance in the background. If you can review the translation, you can accept and approve the suggestions in the same step. Bulk acceptance selects suggestions from that user only for the current language in the current component. It does not select suggestions in other languages or components, even within the same project. For example, when translating a component into French, bulk acceptance selects only that user’s French suggestions in that component. ## Comments Three types of comments can be posted: * for translations * for source strings * for reporting source string bugs when this functionality is turned on using [Enable source reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-source-review). Choose the suitable type for the topic you want to discuss. Source string comments are in any event good for providing feedback on the original string, for example that it should be rephrased, or to ask questions about it. Markdown syntax can be used in all comments, as well as mentioning other users by using `@username`. Mention a maintainer or another translator when you need them to see a follow-up question; they can reply in the same Comments tab. To find comments again, open your [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile); the comment count links to your comment activity. To find strings with comments by a specific user, use [Searching](https://docs.weblate.org/en/latest/user/search.md). For example, `comment_author:USERNAME` finds strings with comments by that user, and `source_comment_author:USERNAME` finds strings with source string comments by that user. When you are signed in, the search filter menu also includes shortcuts for comments by you and source comments by you. #### SEE ALSO * [Receiving source string feedback](https://docs.weblate.org/en/latest/devel/review.md#report-source) * [Source strings reviews](https://docs.weblate.org/en/latest/workflows.md#source-reviews) * [Enable source reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-source-review) ## Variants Variants are used to group different-length variants of a string. The frontend of your project can then utilize different strings depending on the size of a screen or window. #### SEE ALSO * [String variants](https://docs.weblate.org/en/latest/devel/translations.md#variants) * [Variants](https://docs.weblate.org/en/latest/user/glossary.md#glossary-variants) ## Labels Labels are used to categorize strings within a project to further customize the localization workflow (for example to define categories of strings). Following labels are used by Weblate: Automatically translated : String translated using [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation). Source needs review : String marked for review using [Source strings reviews](https://docs.weblate.org/en/latest/workflows.md#source-reviews). #### SEE ALSO [String labels](https://docs.weblate.org/en/latest/devel/translations.md#labels) ## Translating On the translation page, the source string and an editing area for its translation are shown. Should the translation be plural, multiple source strings and editing areas are shown, each described and labeled in the amount of plural forms the translated language has. All special whitespace characters are underlined in red and indicated with grey symbols. More than one subsequent space is also underlined in red to alert the translator to a potential formatting issue. Various bits of extra info can be shown on this page, most of which coming from the project source code (like context, comments or where the message is being used). Translation fields for any secondary languages translators select in the preferences will be shown (see [Secondary languages](https://docs.weblate.org/en/latest/user/profile.md#secondary-languages)) above the source string. Below the translation, translators will find suggestions made by others, to be accepted (✓), accepted with changes (✏️), bulk accepted for a specific user (👤✓), cloned into the translation fields (📑) or deleted (🗑). ### Translating special text safely Some source strings contain text that the application interprets at runtime. Translate the human-readable parts, but keep technical markers intact unless the project instructions say otherwise. Placeholders and format strings : Keep variables such as `%s`, `%1$d`, `%(name)s`, `{count}`, `{{ value }}`, or similar markers in the translation. Named placeholders describe the inserted value, but the names themselves are not translated. You can usually reorder numbered or named placeholders to fit the target language. Use the placeable copy shortcuts to insert them without typing mistakes. Markup : Keep HTML and XML tags, tag names, and attribute names unchanged. Translate the visible text between tags and any attribute value that is meant for users, for example alternative text or a tooltip, when it appears as part of the translatable string. Make sure opening and closing tags still match after reordering the sentence. Program syntax : Leave function names, commands, environment variables, spreadsheet functions, SQL keywords, and similar program syntax untranslated unless the project explicitly documents a localized form. Punctuation and whitespace : Preserve punctuation and spaces that affect the interface, such as trailing colons, ellipses, leading or trailing spaces, and punctuation next to placeholders. Follow the target language’s typography when it differs from the source, and use comments when a source punctuation choice looks wrong. Accelerators : Menu labels can mark keyboard accelerators with characters such as `&`, `_`, or `~`. When the source has an accelerator, keep one in the translation. Choose a readable key in the translated label and avoid obvious conflicts with nearby menu items or buttons. Plural forms : Translate each plural field Weblate shows. Do not combine forms into a single construction such as `file(s)` unless that is correct for the target language and project. If the source string uses an ambiguous plural, report it with a source string comment or review. Weblate quality checks catch many technical mistakes in placeholders, markup, punctuation, whitespace, and plural forms. They do not replace translator judgment, so use [Translation context](https://docs.weblate.org/en/latest/user/translating.md#source-context), [Glossary](https://docs.weblate.org/en/latest/user/glossary.md), and [Comments](https://docs.weblate.org/en/latest/user/translating.md#user-comments) when the source text needs clarification. #### SEE ALSO * [Checks and fixups](https://docs.weblate.org/en/latest/user/checks.md) * [Plurals](https://docs.weblate.org/en/latest/user/translating.md#plurals) * [Translation context](https://docs.weblate.org/en/latest/user/translating.md#source-context) * [Comments](https://docs.weblate.org/en/latest/user/translating.md#user-comments) ### Plurals Words changing form to account for their numeric designation are called plurals. Each language has its own definition of them. English, for example, supports one. In the singular definition of an example “car”, implicitly one car is referenced, in the plural definition of “cars”, two or more cars are referenced (or the concept of cars as a noun). Languages like, for example, Czech or Arabic have more forms of plurals, and their rules for plurals are different as well. Weblate has full support for each of these forms, in each respective language. Each grammatical number is translated in a separate field for a pre-defined set of cardinal numbers specific to the translation language. The number of fields and how they are in turn used in the translated application or project, depends on the configured plural formula. Weblate shows the basic information and the [Language Plural Rules](https://unicode-org.github.io/cldr-staging/charts/37/supplemental/language_plural_rules.html) by the Unicode Consortium is a more detailed description. #### SEE ALSO [Plural definitions](https://docs.weblate.org/en/latest/admin/languages.md#plural-definitions) ![image](screenshots/plurals.webp) ### Alternative translations #### Versionadded Added in version 4.13. #### NOTE This is currently only supported with [Multivalue CSV file](https://docs.weblate.org/en/latest/formats/csv.md#multivalue-csv). With some formats, it is possible to have more translations for a single string. You can add more alternative translations using the Tools menu. Any blank alternative translations will be automatically removed upon saving. ### Keyboard shortcuts The following keyboard shortcuts can be utilized during translation: | Keyboard shortcut | Description | |----------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------| | `?` | Open available keyboard shortcuts. | | `Alt`+`Home` | Navigate to the first translation in the current search. | | `Alt`+`End` | Navigate to the last translation in the current search. | | `Alt`+`PageUp` or

`Ctrl`+`↑` or

`Alt`+`↑` or

`Cmd`+`↑` | Navigate to the previous translation in the current search. | | `Alt`+`PageDown` or

`Ctrl`+`↓` or

`Alt`+`↓` or

`Cmd`+`↓` | Navigate to the next translation in the current search. | | `Ctrl`+`Enter` or

`Cmd`+`Enter` | Submit current form; this is same as
pressing Save and continue while editing translation. | | `Ctrl`+`Shift`+`Enter` or

`Cmd`+`Shift`+`Enter` | Unmark translation as Needing edit and submit it. | | `Ctrl`+`Alt`+`Enter` or

`Cmd`+`Alt`+`Enter` | Approve the translation and save and continue.
Only available to reviewers. | | `Alt`+`Enter` or

`Option`+`Enter` | Submit the string as a suggestion; this works the same as
pressing Suggest while editing translation. | | `Ctrl`+`E` or

`Cmd`+`E` | Focus on translation editor. | | `Ctrl`+`U` or

`Cmd`+`U` | Focus on comment editor. | | `Ctrl`+`M` or

`Cmd`+`M` | Shows Automatic suggestions tab,
see [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation). | | `Ctrl`+`1` to `Ctrl`+`9` or

`Cmd`+`1` to `Cmd`+`9` | Copies placeable of a given number from source string. | | `Ctrl`+`M` followed by
`1` to `9` or

`Cmd`+`M` followed by
`1` to `9` | Copy the machine translation of a given number to current translation. | | `Ctrl`+`I` followed by
`1` to `9` or

`Cmd`+`I` followed by
`1` to `9` | Ignore one item in the list of failing checks. | | `Ctrl`+`J` or

`Cmd`+`J` | Shows the Nearby strings tab. | | `Ctrl`+`S` or

`Cmd`+`S` | Focus on search field. | | `Ctrl`+`O` or

`Cmd`+`O` | Copy the source string. | | `Ctrl`+`Y` or

`Cmd`+`Y` | Toggle the Needs editing checkbox. | | `→` | Browse the next translation string. | | `←` | Browse the previous translation string. | ### Visual keyboard A small visual keyboard row is shown just above the translation field. Its rows are specific to each language; it can be useful for local punctuation or characters that are hard to type by hand. The shown symbols factor into three categories: * User configured [Special characters](https://docs.weblate.org/en/latest/user/profile.md#profile-specialchars) defined in the [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile) * Per-language characters provided by Weblate (e.g. quotes or RTL-specific characters) * Characters configured using [`SPECIAL_CHARS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SPECIAL_CHARS) ![image](screenshots/visual-keyboard.webp) ### Translation context This contextual description provides related info about the current string. String attributes : Things like message ID, context (`msgctxt`) or location in source code. Explanation : Further clarification can be provided in Weblate via [Explanation](https://docs.weblate.org/en/latest/admin/translating.md#additional-explanation). Screenshots : Screenshots can be uploaded directly from this panel using Upload screenshot, or linked using Add existing screenshot to show where and how the string is used. Source-language screenshots are shown for every translation of the string, while translation-specific screenshots are shown only for that translation; see [Screenshots and visual context](https://docs.weblate.org/en/latest/admin/translating.md#screenshots). Nearby strings : Displays neighbouring strings from the translation file. These are usually also used in a similar context and prove useful in keeping the translation consistent. Other occurrences : In case a message appears in multiple places (e.g. multiple components), this tab shows all of them if they are found to be inconsistent (see [Inconsistent](https://docs.weblate.org/en/latest/user/checks.md#check-inconsistent)). You can choose which one to use. Translation memory : Look at similar strings translated in past, see [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#memory). Glossary : Displays terms from the project glossary used in the current message. History : List of people whom have changed this message recently using Weblate. Project : Project info like instructions for translators, or a directory or link to the string in the version control system repository the project uses. If you want direct links, the translation format has to support it. #### Adding an existing screenshot To link a screenshot that has already been uploaded, open the string in the translation editor: 1. In the Screenshots panel, choose Add existing screenshot. 2. Browse the thumbnails, or enter a query in Search screenshots and choose Search. Use Previous and Next to browse additional results. 3. Select a screenshot by clicking its card. The card is highlighted and marked Selected. To select with a keyboard, press `Tab` to reach the cards, use the arrow keys to move between them, and press `Space` to select a card. 4. Choose Add screenshot. The editor reloads on the same string and displays the associated screenshot in the Screenshots panel. ![Screenshot picker with a highlighted card marked Selected.](screenshots/screenshot-picker-selected.webp) The picker shows screenshots from the current component in the source language or the current translation language. A source-language screenshot is linked to the source string and shown for every translation. A translation-language screenshot is shown only for that language. Screenshots already linked to the string are excluded from the picker. This action requires the Edit screenshot permission. To upload a new image, use Upload screenshot instead. Use Manage screenshots for the full [screenshot management interface](https://docs.weblate.org/en/latest/admin/translating.md#screenshots). ### Translation history Every change is by default (unless turned-off in component settings) saved in the database, and can be reverted. Optionally, translations can also be reverted in the underlying version control system. ### Translated string length Weblate can limit the length of a translation in several ways to ensure the translated string is not too long: * The default limitation for translation is ten times longer than the source string. This can be modified with [`LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-LIMIT_TRANSLATION_LENGTH_BY_SOURCE_LENGTH). If you are hitting this, it can also be caused by a monolingual translation being wrongly set up as a bilingual one, making Weblate mistaking the translation key for the actual source string. See [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) for more info. * Maximum length in characters defined by the translation file or flag, as per [Maximum length of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-length). * Maximal rendered size in pixels as defined by flags; see [Maximum size of translation](https://docs.weblate.org/en/latest/user/checks.md#check-max-size). ## Automatic suggestions Based on configuration and your translated language, Weblate provides suggestions from several machine translation tools and [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory). All machine translations are available in a single tab of each translation page. You can also perform a concordance search on the [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory). #### SEE ALSO You can find the list of supported tools in [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup). ## Automatic translation You can use automatic translation to bootstrap translation based on external sources. This tool is called Automatic translation accessible in the Operations menu, once you have selected a component and a language: ![image](screenshots/automatic-translation.webp) A similar operation Batch automatic translation is available if you have selected a project language, a component or a category. Two modes of operation are possible: - Using other Weblate components as a source for translations. - Using selected machine translation services with translations above a certain quality threshold. When using other components as the source, Weblate first looks for an exact match of both source text and context, including empty context. If none exists, it uses a translation matching only the source text. Context matches take precedence over source component order; component order breaks ties between equally matching candidates. Weblate applies translations only when plural forms are compatible. If the source component uses different plural rules, pluralized strings are skipped and Weblate shows a warning, while single-form strings are still translated. You can also choose which strings are to be auto-translated. #### WARNING Be mindful that this will overwrite existing translations if employed with wide filters such as All strings. Useful in several situations like consolidating translation between different components (for example the application and its website) or when bootstrapping a translation for a new component using existing translations (translation memory). The automatically translated strings are labelled Automatically translated. #### SEE ALSO [Keeping translations same across components](https://docs.weblate.org/en/latest/admin/continuous.md#translation-consistency) ## Rate limiting To avoid abuse of the interface, rate limiting is applied to several operations like searching, sending contact forms, or translating. If affected by it, you are blocked for a certain period, until you can perform the operation again. Default limits and fine-tuning are described in the administrative manual, see [Rate limiting](https://docs.weblate.org/en/latest/admin/optionals.md#rate-limit). ## Search and replace Change terminology effectively or perform bulk fixing of the strings using Search and replace in the Operations menu. ![image](screenshots/search-replace.webp) #### HINT Don’t worry about messing up the strings, as it is a two-step process. A preview of edited strings is shown before confirming the change. You can adjust the search parameters from the preview and update it before applying the replacement. ## Bulk edit Bulk editing allows performing one operation for multiple strings. Define strings by searching for them and actions to perform on matching ones. Supported operations: * Change string state (for example to approve all unreviewed strings). * Adjust translation flags (see [Customizing behavior using flags](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks)) * Adjust string labels (see [String labels](https://docs.weblate.org/en/latest/devel/translations.md#labels)) #### HINT This tool is called Bulk edit, accessible in the Operations menu of each project, component or translation. ![image](screenshots/bulk-edit.webp) #### SEE ALSO [Bulk edit add-on](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-flags-bulk) ## Matrix View You can compare different languages efficiently using this view. It is available on every component page, from the Operations menu. First select all languages you want to compare, confirm your selection, then click on any translation to open and edit it. The matrix view is also a very good starting point to find missing translations in different languages, and quickly add them from one view. ![image](screenshots/matrix-view.webp) ## Zen Mode This mode simplifies the layout and removes additional UI elements such as Nearby strings or the Glossary. It is available by clicking the Zen button on the top-right of the regular editor (translation of a string). You can select the Zen editor as your default editor using the [Preferences](https://docs.weblate.org/en/latest/user/profile.md#profile-preferences) tab on your [User profile](https://docs.weblate.org/en/latest/user/profile.md#user-profile). You can also choose there between having translations listed Top to bottom or Side by side, depending on your personal preference. ![image](screenshots/zen-mode.webp) # vcs.md # Version control integration Weblate currently supports [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git) (with extended support for [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests), [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests), [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests), [Gerrit review requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gerrit), [Subversion](https://docs.weblate.org/en/latest/vcs.md#vcs-git-svn), [Bitbucket Cloud pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-cloud-pull-requests), [Bitbucket Data Center pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-data-center-pull-requests), and [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests)) and [Mercurial](https://docs.weblate.org/en/latest/vcs.md#vcs-mercurial) as version control back-ends. For provider-specific setup steps that combine repository access, incoming notifications, and pushing translations back, see [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md). ## Accessing repositories The VCS repository you want to use has to be accessible to Weblate. With a publicly available repository you just need to enter the correct URL (for example `https://github.com/WeblateOrg/weblate.git`), but for private repositories or for push URLs the setup is more complex and requires authentication. ### Troubleshooting repository URLs Weblate validates repository and push URLs before connecting. HTTPS and SSH are permitted by default; instance administrators can adjust this using [`VCS_ALLOW_SCHEMES`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_SCHEMES). Repository hostnames have to resolve from the Weblate server. When [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE) is enabled, Weblate also rejects destinations which resolve to internal or otherwise non-public addresses. Use a publicly reachable repository URL where possible. For an intentionally private repository on a trusted network, ask the instance administrator to add its hostname to [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS). Git over HTTPS and SSH can bind connections to addresses approved during validation. Backends which cannot do this safely, including Mercurial and Subversion, require the trusted repository hostname in [`VCS_ALLOW_HOSTS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_ALLOW_HOSTS) while private-address restrictions are enabled. Configure the final repository URL directly when possible. Weblate can automatically accept a permanent HTTP redirect only when it stays on the same host and the target is successfully validated. Redirects to another host or protocol have to be configured manually. ### Accessing repositories from Hosted Weblate #### NOTE This section applies **only** to Hosted Weblate (hosted.weblate.org). If you are running your own self-hosted Weblate instance, please see [the next section](https://docs.weblate.org/en/latest/vcs.md#vcs-repos-code-hosting) instead. For GitHub repositories on Hosted Weblate, use the [Hosted Weblate app](https://github.com/apps/hosted-weblate) from Weblate’s Connect GitHub account flow whenever possible. The App grants repository access, receives incoming notifications, pushes translation branches, and creates pull requests without inviting the Hosted Weblate weblate user. See [GitHub repository access](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-repositories) for the full setup. For direct SSH access outside the GitHub App workflow, and for Bitbucket, Codeberg, and GitLab repositories, Hosted Weblate has a dedicated push user (with the username weblate, e-mail `hosted@weblate.org`, and a name or profile description Weblate push user). #### HINT There can be more Weblate users on the platforms, designated for other Weblate instances. Searching by e-mail `hosted@weblate.org` is recommended to find the correct user for Hosted Weblate. You need to add this user as a collaborator and give it appropriate permissions to your repository (read-only is okay for cloning, write is required for pushing). Depending on the service and your organization’s settings, this happens immediately, or requires confirmation on the Weblate side. The weblate user on GitHub accepts invitations automatically within five minutes when you intentionally use direct SSH access there. Manual processing might be needed on the other services, so please be patient. For this direct SSH-user setup, once the weblate user is added to your repository, you can configure [Source code repository](https://docs.weblate.org/en/latest/admin/projects.md#component-repo) and [Repository push URL](https://docs.weblate.org/en/latest/admin/projects.md#component-push) using the SSH protocol, for example `git@example.com:group/project.git`. ### Accessing repositories on code-hosting sites (GitHub, GitLab, Bitbucket, Azure DevOps, …) #### NOTE This section applies to **self-hosted** Weblate instances. If you are using Hosted Weblate (hosted.weblate.org), see [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push) instead. For self-hosted Weblate, a single private repository is often easiest to set up using an HTTPS repository URL with an access token, see [Code-hosting integrations](https://docs.weblate.org/en/latest/admin/code-hosting.md). For multiple repositories, create a dedicated code-hosting user associated with a Weblate SSH key (see [Weblate SSH key](https://docs.weblate.org/en/latest/vcs.md#weblate-ssh-key)). This way you associate Weblate SSH key with a single user, because platforms frequently enforce single use of an SSH key. Grant this user access to the repositories, and use SSH URLs to access them (see [SSH repositories](https://docs.weblate.org/en/latest/vcs.md#ssh-repos)). ### SSH repositories One common method to access private repositories is based on SSH. Authorize the public Weblate SSH key (see [Weblate SSH key](https://docs.weblate.org/en/latest/vcs.md#weblate-ssh-key)) to access the upstream repository this way. #### WARNING On GitHub, each key can only be used once, see [GitHub repository access](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-repositories) and [Accessing repositories from Hosted Weblate](https://docs.weblate.org/en/latest/vcs.md#hosted-push). Weblate also stores the host key fingerprint upon first connection, and fails to connect to the host should it be changed later (see [Verifying SSH host keys](https://docs.weblate.org/en/latest/vcs.md#verify-ssh)). In case adjustment is needed, do so from the Weblate admin interface: ![image](screenshots/ssh-keys.webp) #### Weblate SSH key #### Versionchanged Changed in version 4.17: Weblate now generates both RSA and Ed25519 SSH keys. Using Ed25519 is recommended for new setups. The Weblate public key is visible to all users browsing the About page. Admins can generate or display the public key currently used by Weblate in the connection (from SSH keys) on the admin interface landing page. #### NOTE The corresponding private SSH key can not currently have a password, so ensure it is well protected. #### HINT Make a backup of the generated private Weblate SSH key. #### Verifying SSH host keys Weblate automatically stores the SSH host keys on first access and remembers them for further use. When [`VCS_RESTRICT_PRIVATE`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-VCS_RESTRICT_PRIVATE) is enabled, Weblate resolves and validates the repository host before scanning its key and connects `ssh-keyscan` only to the approved addresses. The stored key remains associated with the original hostname. For Git connections, Weblate also applies `HostName` and `Port` from `DATA_DIR/ssh/config` before validating and pinning the effective destination. SSH configuration and [`SSH_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SSH_EXTRA_ARGS) are trusted administrator-controlled inputs. They can alter connection routing, and [`SSH_EXTRA_ARGS`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-SSH_EXTRA_ARGS) can override Weblate’s address pinning; administrators are responsible for their effects. In case you want to verify the key fingerprint before connecting to the repository, add the SSH host keys of the servers you are going to access in Add host key, from the same section of the admin interface. Enter the hostname you are going to access (e.g. `gitlab.com`), and press Submit. Verify its fingerprint matches the server you added. The added keys with fingerprints are shown in the confirmation message: ![image](screenshots/ssh-keys-added.webp) #### Connecting to legacy SSH servers Recent OpenSSH releases (for example the one used in Weblate Docker container) disable RSA signatures using the SHA-1 hash algorithm by default. This change has been made as the SHA-1 hash algorithm is cryptographically broken, and it is possible to create chosen-prefix hash collisions for ### GitHub repositories Detailed GitHub repository access is covered in [GitHub repository access](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-repositories). ### GitLab repositories Detailed GitLab repository access is covered in [GitLab repository access](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-repositories). ### Weblate internal URLs Share one repository setup between different components by referring to its placement as `weblate://project/component` in other (linked) components. This way linked components use the VCS repository configuration of the main (referenced) component. #### WARNING Removing main component also removes linked components. Linked components share the complete repository checkout; the link does not isolate them to particular files or directories. Users allowed to administer a linked component can configure operations affecting files anywhere in the shared checkout. For example, they can change file masks, formats, and templates, or install and configure add-ons that read, generate, or modify repository files. Weblate can commit and push resulting changes using the main component’s repository configuration. Only link components when the repository owner trusts the administrators of every linked component with the complete checkout. Use separate repositories when components require file-level isolation. Weblate automatically adjusts the repository URL when creating a component if it finds a component with a matching repository setup. You can override this in the last step of the component configuration. Reasons to use this: * Saves disk space on the server, the repository is stored just once. * Makes the updates faster, only one repository is updated. * There is just single exported repository with Weblate translations (see [Git exporter](https://docs.weblate.org/en/latest/admin/optionals.md#git-exporter)). * Some add-ons can operate on multiple components sharing one repository, for example [Squash Git commits](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-git-squash). ### HTTPS repositories #### SEE ALSO * [GitHub repository access](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-repositories) * [GitLab repository access](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-repositories) To access protected HTTPS repositories, include the username and password in the URL. Don’t worry, Weblate will strip this info when the URL is shown to users (if even allowed to see the repository URL at all). For example the GitHub URL with authentication added might look like: `https://user:your_access_token@github.com/WeblateOrg/weblate.git`. In case you don’t provide credentials in the URL and the repository requires it, Git will fail with an error: ```text fatal: could not read Username for 'https://github.com': terminal prompts disabled ``` #### Versionchanged Changed in version 5.10.2: Weblate uses proactive authentication with Git 2.46.0 and newer when HTTP credentials are supplied. This makes it possible to access Azure DevOps repositories and makes access to authenticated repositories faster. #### NOTE If your username or password contains special characters, those have to be URL encoded, for example `https://user%40example.com:%24password%23@bitbucket.org/…`. ### Using proxy If you need to access Git repositories over HTTPS using a proxy server, configure the per-protocol environment variables described in [HTTP proxy](https://docs.weblate.org/en/latest/admin/install.md#http-proxy). ## Version control parameters #### Versionadded Added in version 2026.9. Version control parameters tune how a component interacts with its repository without having to choose a different version control system. They are configured per component in [Version control parameters](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs-params), and only the parameters applicable to the selected [Version control system](https://docs.weblate.org/en/latest/admin/projects.md#component-vcs) are offered. ### List of version control parameters | Parameter name | Version control systems | Label | Help text | |----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | create_merge_request | * `azure_devops`
* `bitbucketcloud`
* `bitbucketserver`
* `gitea`
* `github`
* `github-app`
* `gitlab`
* `pagure` | Create merge requests | Open a pull or merge request for the translation changes. When turned off, Weblate pushes to the translated branch directly, which requires write access to it. | | git_force_push | * `git` | Force push | Overwrite the remote branch instead of refusing to push non-fast-forward changes. Only use this with a repository dedicated to translations, as it discards upstream commits which are not present in Weblate. | | merge_request_automerge | * `github`
* `github-app` | Merge pull requests automatically | Turn on GitHub auto-merge for pull requests created by Weblate, so that they are merged once the required checks pass. Pull requests with nothing to wait for are merged right away. | | merge_request_merge_method | * `github`
* `github-app` | Merge method | Method used when merging pull requests automatically. The repository has to allow it.

Available choices:

* `merge` – Create a merge commit
* `squash` – Squash and merge
* `rebase` – Rebase and merge | ## Git #### HINT Weblate needs Git 2.46 or newer. #### NOTE Weblate validates permanent HTTP redirects which stay on the repository hostname and automatically stores the canonical repository URL. The change is recorded in the component history as repository maintenance. Redirects to another hostname have to be configured manually. #### SEE ALSO See [Accessing repositories](https://docs.weblate.org/en/latest/vcs.md#vcs-repos) for info on how to access different kinds of repositories. ### Git LFS Weblate does not support files tracked by Git LFS as translation files. It does not download or upload Git LFS objects. Git LFS smudging and pre-push uploads are disabled for Weblate-managed repositories, so LFS-tracked files remain pointer files. This behavior applies to every Git hosting provider. A repository can use Git LFS for files that Weblate does not need to read or modify. The upstream repository remains the authoritative source for these LFS objects. Clone from upstream when you need the actual files rather than their pointers because repositories served by Weblate do not include LFS objects. For the GitLab merge request workflow, Weblate disables Git LFS in its managed fork. This prevents GitLab from rejecting pointer-only translation branches when the upstream repository added LFS objects after the fork was created. Existing managed forks are reconfigured on their next push. This does not change the Git LFS configuration of the upstream project. ### Git submodules Weblate does not populate Git submodules when cloning repositories. It does not initialize or update submodules, and it does not recurse into submodule repositories during file discovery or translation updates. Files stored inside a submodule are therefore not available to file masks when Weblate is connected to the parent repository. If translation files live in a submodule, add the submodule repository to Weblate as its own component instead of reaching it through the parent repository. Weblate can then clone, update, commit, and push to the repository that actually stores the translation files. The parent repository only records the submodule commit pointer, so updating that pointer has to happen outside Weblate, for example in your normal development workflow or CI. ### Force pushing Turn on the `git_force_push` [version control parameter](https://docs.weblate.org/en/latest/vcs.md#vcs-params) to make Weblate always force push. This is intended only in the case of using a separate repository for translations. #### WARNING Use with caution, as this easily leads to lost commits in your upstream repository. #### Versionchanged Changed in version 2026.9: This used to be a separate Git with force push version control system. Existing components were migrated to Git with the `git_force_push` parameter turned on. ### Customizing Git configuration Weblate invokes all VCS commands with `HOME=$DATA_DIR/home` (see [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR)), therefore editing the user configuration needs to be done in `DATA_DIR/home/.git`. ## GitHub pull requests Detailed GitHub pull request setup is covered in [GitHub pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-github-pull-requests). ## GitLab merge requests Detailed GitLab merge request setup is covered in [GitLab merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitlab-merge-requests). ## Gitea pull requests Detailed Gitea pull request setup is covered in [Gitea pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gitea-pull-requests). ## Bitbucket Data Center pull requests Detailed Bitbucket Data Center pull request setup is covered in [Bitbucket Data Center pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-data-center-pull-requests). ## Bitbucket Cloud pull requests Detailed Bitbucket Cloud pull request setup is covered in [Bitbucket Cloud pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-bitbucket-cloud-pull-requests). ## Pagure merge requests Detailed Pagure merge request setup is covered in [Pagure merge requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-pagure-merge-requests). ## Gerrit Detailed Gerrit review request setup is covered in [Gerrit review requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-gerrit). ## Azure DevOps pull requests Detailed Azure DevOps pull request setup is covered in [Azure DevOps pull requests](https://docs.weblate.org/en/latest/admin/code-hosting.md#code-hosting-azure-devops-pull-requests). ## Mercurial Mercurial is another VCS you can use directly in Weblate. #### NOTE It should work with any Mercurial version, but there are sometimes incompatible changes to the command-line interface which breaks Weblate integration. #### SEE ALSO See [Accessing repositories](https://docs.weblate.org/en/latest/vcs.md#vcs-repos) for info on how to access different kinds of repositories. ## Subversion Weblate uses [git-svn](https://git-scm.com/docs/git-svn) to interact with [subversion](https://subversion.apache.org/) repositories. It is a Perl script that lets subversion be used by a Git client, enabling users to maintain a full clone of the internal repository and commit locally. #### NOTE Weblate tries to detect Subversion repository layout automatically - it supports both direct URLs for branch or repositories with standard layout (branches/, tags/ and trunk/). More info about this is to be found in the [git-svn documentation](https://git-scm.com/docs/git-svn#Documentation/git-svn.txt---stdlayout). If your repository does not have a standard layout and you encounter errors, try including the branch name in the repository URL and leaving branch empty. ### Subversion credentials Weblate expects you to have accepted the certificate up-front (and your credentials if needed). It will look to insert them into the [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) directory. Accept the certificate by using svn once with the $HOME environment variable set to the [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR): ```sh # Use DATA_DIR as configured in Weblate settings.py, it is /app/data in the Docker HOME=${DATA_DIR}/home svn co https://svn.example.com/example ``` #### SEE ALSO [`DATA_DIR`](https://docs.weblate.org/en/latest/admin/config.md#std-setting-DATA_DIR) ## Local files #### HINT Underneath, this uses [Git](https://docs.weblate.org/en/latest/vcs.md#vcs-git). It requires Git installed and allows you to switch to using Git natively with full history of your translations. Weblate can also operate without a remote VCS. The initial translations are imported by uploading them. Later you can replace individual files by file upload, or add translation strings directly from Weblate (currently available only for monolingual translations). In the background Weblate creates a Git repository for you and all changes are tracked in. In case you later decide to use a VCS to store the translations, you already have a repository within Weblate can base your integration on. # wlc.md # Weblate Client ## Installation The [Weblate Client](https://pypi.org/project/wlc/) is shipped separately and includes the Python module. The source code is maintained in the [WeblateOrg/wlc repository](https://github.com/WeblateOrg/wlc). To use the commands below, you need to install **wlc** using pip: ```sh pip install wlc ``` You can also execute it directly using **uvx**: ```sh uvx wlc --help ``` #### HINT You can also use this **wlc** as a Python module, see [`wlc`](https://docs.weblate.org/en/latest/python.md#module-wlc). ## Docker usage The Weblate Client is also available as a Docker image. Images are published on [Docker Hub](https://hub.docker.com/r/weblate/wlc) and the [GitHub Container Registry](https://github.com/WeblateOrg/wlc/pkgs/container/wlc). The examples below use the Docker Hub image name. Installing: ```sh docker pull weblate/wlc ``` The following tags are available: `latest` : Latest stable release. Full version, for example `2.2.0` : A specific stable release. Major version, for example `2` : Latest stable release in that major series. `edge` : Current development version from the main branch. `edge-YYYY-MM-DD-COMMIT` : A specific development snapshot. To build an image from the source checkout: ```sh docker build -t weblate/wlc . ``` The Docker container uses Weblate Client defaults and connects to the API deployed on localhost. Configure the API URL and API key using the normal **wlc** arguments or environment variables, for example [`--url`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-url), [`--key`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-key), [`WLC_URL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_URL), and [`WLC_KEY`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_KEY). API keys are rejected over non-local `http://` URLs by default; use HTTPS, loopback HTTP for local development, or explicitly opt in to insecure HTTP. The command to launch the container uses the following syntax: ```sh docker run --rm weblate/wlc [WLC_ARGS] ``` Example: ```sh docker run --rm weblate/wlc --url https://hosted.weblate.org/api/ list-projects ``` You might want to pass your [Configuration files](https://docs.weblate.org/en/latest/wlc.md#wlc-config) to the Docker container. When your repository contains a project configuration such as `.weblate`, the easiest approach is to add your current directory as the `/home/weblate` volume: ```sh docker run --volume $PWD:/home/weblate --rm weblate/wlc show ``` When the mounted repository provides the API URL in project configuration and you pass an unscoped API key to the container, also pin the URL explicitly: [`WLC_KEY`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_KEY) requires [`WLC_URL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_URL), and [`--key`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-key) requires [`--url`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-url). The same pairing is required for the [`--allow-insecure-http`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-allow-insecure-http) and [`--allow-insecure-ssl`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-allow-insecure-ssl) overrides. If the configured API URL uses non-local `http://` and an API key is provided, the container refuses to send the key unless insecure HTTP is explicitly enabled. Prefer HTTPS; for legacy deployments, pass [`--allow-insecure-http`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-allow-insecure-http) or set [`WLC_ALLOW_INSECURE_HTTP`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_ALLOW_INSECURE_HTTP). TLS certificates are always verified by default, including for loopback URLs. Use [`--allow-insecure-ssl`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-allow-insecure-ssl) or [`WLC_ALLOW_INSECURE_SSL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_ALLOW_INSECURE_SSL) only when certificate verification can not be enabled. ## Getting started The easiest way to get started is to create a personal **wlc** configuration in `~/.config/weblate` (see [Configuration files](https://docs.weblate.org/en/latest/wlc.md#wlc-config) for the full discovery rules and other locations): ```ini [weblate] url = https://hosted.weblate.org/api/ [keys] https://hosted.weblate.org/api/ = APIKEY ``` You can then invoke commands on the default server: ```console wlc ls wlc commit sandbox/hello-world ``` #### SEE ALSO [Configuration files](https://docs.weblate.org/en/latest/wlc.md#wlc-config) ## Legacy configuration #### Versionchanged Changed in version 1.17: The legacy configuration using unscoped `key` is no longer supported. #### Versionchanged Changed in version 2.2.0: Global `allow_insecure_http` configuration is no longer supported. Configure an origin in the `[insecure_http]` section instead. Migrate legacy configuration: ```ini [weblate] url = https://hosted.weblate.org/api/ key = YOUR_KEY_HERE ``` To a configuration with key scoped to an API URL: ```ini [weblate] url = https://hosted.weblate.org/api/ [keys] https://hosted.weblate.org/api/ = YOUR_KEY_HERE ``` ## Synopsis ```text wlc [arguments] [options] ``` Commands actually indicate which operation should be performed. ## Description Weblate Client is a Python library and command-line utility to manage Weblate remotely using [Weblate’s REST API](https://docs.weblate.org/en/latest/api.md#api). Invoke the command-line utility as **wlc**; see [`wlc`](https://docs.weblate.org/en/latest/python.md#module-wlc) for the Python API. ### Arguments The program accepts the following arguments which define output format or which Weblate instance to use. These must be entered before any command. ### --format {csv,json,text,html} Specify the output format. The default is `text`. ### --version Print the program version and exit. The [`version`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-arg-version) command supports output formatting and can print only the version number. ### --debug Print verbose HTTP communication. Authorization header values are redacted and request bodies are not logged, but query parameters are; do not put secrets in query parameters. ### --url URL Specify the API URL. Overrides any value found in the configuration file, see [Configuration files](https://docs.weblate.org/en/latest/wlc.md#wlc-config). The URL should end with `/api/`, for example `https://hosted.weblate.org/api/`. ### --key KEY Specify the API user key to use. Overrides any value found in the configuration file, see [Configuration files](https://docs.weblate.org/en/latest/wlc.md#wlc-config). You can find your key in your profile on Weblate. When the API URL is loaded from automatically discovered project configuration, [`--key`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-key) must be used together with [`--url`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-url). API keys are rejected over non-local `http://` URLs by default. ### --allow-insecure-http Allow sending API keys over non-local `http://` URLs. Prefer HTTPS or loopback HTTP instead; this option is intended only for legacy deployments where HTTPS is not available. This option only enables insecure HTTP for the current run. When the API URL comes from automatically discovered project configuration, this option requires [`--url`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-url). ### --allow-insecure-ssl Disable TLS certificate verification for the current run. Certificates are verified by default for every HTTPS URL, including loopback URLs. When the API URL comes from automatically discovered project configuration, this option requires [`--url`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-url). ### --config PATH Load configuration only from `PATH` instead of the discovered global and project configuration files, see [Configuration files](https://docs.weblate.org/en/latest/wlc.md#wlc-config). ### --config-section SECTION Selects the configuration file section to use instead of `[weblate]`, see [Configuration files](https://docs.weblate.org/en/latest/wlc.md#wlc-config). ### Object paths Commands that operate on an object accept one of these paths: `PROJECT` : Project slug. `PROJECT/COMPONENT` : Component slug, including its project. `PROJECT/COMPONENT/LANGUAGE` : Translation language, including its project and component. `UNIT_ID` : Numeric translation unit ID. Only commands that explicitly support units accept this form. Commands that require an object use the `translation` setting from [Configuration files](https://docs.weblate.org/en/latest/wlc.md#wlc-config) when the path is omitted. The [`ls`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-arg-ls) and [`download`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-arg-download) commands also use this setting before falling back to their no-object behavior. For [`list-components`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-arg-list-components) and [`list-translations`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-arg-list-translations), an omitted object always requests an instance-wide list. ### Commands The following commands are available: ### version Prints the current version. ### --bare Prints only the version number. ### list-languages Lists all languages in Weblate. ### list-projects Lists all projects in Weblate. ### list-components Lists all components in Weblate, or components in the specified project. ### list-translations Lists all translations in Weblate, or translations in the specified component. ### list-units Lists units in the specified translation. ### --query QUERY Filters units using the [search query syntax](https://docs.weblate.org/en/latest/user/search.md). ### show Shows a project, component, translation, or unit. ### delete Deletes a project, component, translation, or unit without a confirmation prompt. ### ls Lists all projects when no object is specified, components in a project, or translations in a component. ### commit Commits changes made in a Weblate object (translation, component or project). ### pull Pulls remote repository changes into Weblate object (translation, component or project). ### push Pushes Weblate object changes into remote repository (translation, component or project). ### reset Resets changes in Weblate object to match remote repository (translation, component or project). ### cleanup Removes any untracked changes in a Weblate object to match the remote repository (translation, component or project). ### repo Displays repository status for a given Weblate object (translation, component or project). ### stats Displays detailed statistics for a given Weblate object (translation, component or project). ### lock-status Displays the lock status of a component. ### lock Locks component from further translation in Weblate. ### unlock Unlocks translation of Weblate component. ### changes Displays changes for a project, component, or translation. ### download Downloads translation files. For a translation, **wlc** writes the file to [`--output`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-output) or to redirected standard output. It refuses to write raw file content to an interactive terminal. For a component or project, [`--output`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-output) is required and is treated as a directory. **wlc** writes one ZIP archive per component. With no object, it downloads every component in the Weblate instance in the same way. ### --convert FORMAT Requests conversion to `FORMAT` on the server. If unspecified, no conversion happens. ### --output PATH Specifies the output file for a translation or output directory for a component, project, or instance-wide download. Use `-` to write a translation to standard output. ### --no-glossary Excludes glossary components from component, project, and instance-wide downloads. ### upload Uploads a translation file. ### --overwrite Overwrites existing translated strings. This is equivalent to `--conflicts replace-translated`. ### --conflicts {ignore,replace-translated,replace-approved} Selects how conflicts with existing translations are handled. ### --input PATH Reads content from `PATH`. If unspecified or `-`, content is read from standard input. ### --method {translate,approve,suggest,fuzzy,replace,source,add} Upload method to use, see [Import methods](https://docs.weblate.org/en/latest/user/files.md#upload-method). The default is `translate`. ### --fuzzy {process,approve} Selects processing of fuzzy strings (marked for edit). ### --author-name NAME Author name, to override currently authenticated user ### --author-email EMAIL Author e-mail, to override currently authenticated user ### edit-unit Updates a translation unit. At least one update option is required. ### --target TARGET [TARGET ...] Sets one or more translated strings. ### --state STATE Sets the unit state: `0` for empty, `10` for fuzzy, `20` for translated, or `30` for approved. ### --explanation EXPLANATION Sets the string explanation. ### --extra-flags FLAGS Sets additional string flags. #### HINT You can get more detailed information on invoking individual commands by passing `--help`, for example: `wlc ls --help`. ## Configuration files When [`--config`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-config) is provided, **wlc** loads only that file. Without [`--config`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-config), **wlc** first loads the discovered global configuration file from the standard platform-specific locations: `C:\Users\NAME\AppData\Roaming\weblate.ini` : Global configuration file on Windows in the roamed profile. `C:\Users\NAME\AppData\Local\weblate.ini` : Global configuration file on Windows in the local profile. `~/.config/weblate` : Global configuration file on Unix-like systems. `~/.config/weblate.ini` : Alternative global configuration filename on Unix-like systems. `/etc/xdg/weblate` : System-wide fallback configuration file. `/etc/xdg/weblate.ini` : Alternative system-wide fallback filename. The program follows the XDG specification, so you can adjust the placement of config files by environment variables `XDG_CONFIG_HOME` or `XDG_CONFIG_DIRS`. On Windows `APPDATA` and `LOCALAPPDATA` directories are the preferred locations for the configuration file. After loading the global configuration, **wlc** loads the nearest project configuration file from the current directory or its parents: `.weblate`, `.weblate.ini`, `weblate.ini` : Project configuration file placed in the repository. Project configuration is loaded after global configuration and overrides matching settings. It can select the API URL, default object, request settings, and a matching URL-scoped API key, allowing a cloned repository to automatically select its Weblate server and translation. Only the closest project configuration file is loaded. Configuration files in farther parent directories are ignored. Following settings can be configured in the `[weblate]` section (you can customize this by [`--config-section`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-config-section)): ### key #### Versionremoved Removed in version 1.17: Use the `[keys]` section to specify keys scoped for individual API URLs, see [Legacy configuration](https://docs.weblate.org/en/latest/wlc.md#wlc-legacy). ### url API server URL, defaults to `http://127.0.0.1:8000/api/`. ### translation Default object path for commands that accept one: a project, component, translation, or numeric unit ID. ### retries, timeout, allowed_methods, backoff_factor, status_forcelist HTTP request retry and timeout settings. `retries` defaults to `0` and `backoff_factor` to `0`. `status_forcelist` is a comma-separated list of HTTP status codes that trigger retries and is empty by default. `allowed_methods` lists methods that may be retried, separated by commas or whitespace. It defaults to `HEAD`, `DELETE`, `OPTIONS`, `PUT`, and `GET`. These retry settings are passed to `urllib3.util.Retry`. `timeout` is the request timeout in seconds and defaults to `300`. Current **wlc** releases use `allowed_methods` in place of the older `method_whitelist` option. The configuration file is an INI file, for example: ```ini [weblate] url = https://hosted.weblate.org/api/ translation = weblate/application retries = 3 allowed_methods = PUT,POST,GET backoff_factor = 0.2 status_forcelist = 429,500,502,503,504 timeout = 30 ``` The API keys are stored in the `[keys]` section: ```ini [keys] https://hosted.weblate.org/api/ = APIKEY ``` This allows you to store keys in your personal settings, while using the `.weblate` configuration in the VCS repository so that **wlc** knows which server it should talk to. The `[keys]` lookup is scoped to the complete configured API URL, not merely its network origin. Project configuration can also supply or replace a matching entry in `[keys]`. Do not commit valuable API keys to version control; normally keep keys in personal configuration and only the API URL and default object in project configuration. Insecure transport exceptions are stored in origin-scoped sections in trusted user configuration: ```ini [insecure_http] http://legacy.example.com:80 = true [insecure_ssl] https://legacy.example.com:443 = true ``` An origin consists of the scheme, normalized hostname, and effective port. The API path is ignored, while different schemes and ports remain isolated. The `[insecure_http]` section allows API keys over non-local HTTP for matching origins. The `[insecure_ssl]` section disables TLS certificate verification for matching origins. #### Versionchanged Changed in version 2.2.0: TLS certificates are verified for all hosts by default. Insecure HTTP and TLS configuration is scoped to origins. Automatically discovered project configuration can neither add entries to these sections nor enable the removed global settings. User configuration and explicitly selected [`--config`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-config) files are trusted. In CI, unscoped keys must pin the API URL explicitly: set both [`WLC_URL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_URL) and [`WLC_KEY`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_KEY), or use [`--url`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-url) together with [`--key`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-key). ## Environment variables #### Versionadded Added in version 1.18.0. #### Versionchanged Changed in version 2.0.1: Unscoped API keys require an explicit API URL when project configuration is discovered automatically. API keys are rejected over non-local `http://` URLs unless insecure HTTP is explicitly enabled. #### Versionchanged Changed in version 2.2.0: Insecure HTTP and TLS environment overrides require [`WLC_URL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_URL) when the API URL would otherwise come from automatically discovered project configuration. The API URL and key can also be configured using environment variables. This is especially useful for CI workflows where [`WLC_URL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_URL) pins the destination and [`WLC_KEY`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_KEY) is injected as a secret: ### WLC_URL API URL ### WLC_KEY API key. When the API URL would otherwise come from automatically discovered project configuration, [`WLC_KEY`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_KEY) is accepted only together with [`WLC_URL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_URL). API keys are rejected over non-local `http://` URLs by default. ### WLC_ALLOW_INSECURE_HTTP Set to `1`, `true`, `yes`, or `on` to allow API keys over non-local `http://` URLs. Prefer HTTPS or loopback HTTP instead. Other values, such as `0` or `false`, are treated as unset. When the API URL would otherwise come from automatically discovered project configuration, this variable is accepted only together with [`WLC_URL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_URL). ### WLC_ALLOW_INSECURE_SSL Set to `1`, `true`, `yes`, or `on` to disable TLS certificate verification. Other values, such as `0` or `false`, are treated as unset. When the API URL would otherwise come from automatically discovered project configuration, this variable is accepted only together with [`WLC_URL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_URL). The same protection applies to command-line arguments: [`--key`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-key), [`--allow-insecure-http`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-allow-insecure-http), and [`--allow-insecure-ssl`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-allow-insecure-ssl) are accepted with automatically discovered project configuration only when [`--url`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-url) is provided. The API URL and key configuration precedence (highest to lowest) is: 1. Command-line arguments ([`--url`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-url), [`--key`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-key)). 2. Environment variables ([`WLC_URL`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_URL), [`WLC_KEY`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_KEY)). 3. Configuration loaded from [`--config`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-config), or from the discovered global configuration plus the nearest project configuration when [`--config`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-config) is not used. The insecure transport opt-ins are enable-only rather than normal precedence settings. They are enabled by a command-line or environment override, or by a matching origin in the trusted `[insecure_http]` or `[insecure_ssl]` section. Automatically discovered project configuration cannot add trusted origins. ## Security model Project configuration is part of the repository workflow and is intentionally trusted to select the API endpoint, default object, request settings, and a matching URL-scoped API key. Running **wlc** inside a repository authorizes its nearest project configuration to select the server that receives commands and uploads and supplies displayed or downloaded content. Use an explicit trusted [`--config`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-config) file when this is not desired. The command-line client accepts API keys from [`--key`](https://docs.weblate.org/en/latest/wlc.md#cmdoption-wlc-key), [`WLC_KEY`](https://docs.weblate.org/en/latest/wlc.md#envvar-WLC_KEY), or the `[keys]` section. It does not load HTTP authentication from `.netrc` or the file named by `NETRC`. Credentials embedded in API URLs are rejected; use an API key instead. Other Requests environment integration, including proxy and CA-bundle variables, remains enabled. The [wlc threat model](https://github.com/WeblateOrg/wlc/blob/main/THREAT_MODEL.md) documents the complete trust boundaries, security properties, non-goals, and downstream responsibilities. A version-matched copy is included in source and wheel distributions. Report security issues using the [Weblate vulnerability reporting process](https://docs.weblate.org/en/latest/security/issues.md#security). ## Examples Print current program version: ```sh $ wlc version ``` List all projects: ```sh $ wlc list-projects name: Hello slug: hello url: http://example.com/api/projects/hello/ web: https://weblate.org/ web_url: http://example.com/projects/hello/ ``` Upload translation file: ```sh $ wlc upload project/component/language --input /tmp/hello.po ``` You can also designate what project **wlc** should work on: ```sh $ cat .weblate [weblate] url = https://hosted.weblate.org/api/ translation = weblate/application $ wlc show branch: main file_format: po source_language: en filemask: weblate/locale/*/LC_MESSAGES/django.po git_export: https://hosted.weblate.org/git/weblate/application/ license: GPL-3.0+ license_url: https://spdx.org/licenses/GPL-3.0+ name: Application new_base: weblate/locale/django.pot project: weblate repo: git://github.com/WeblateOrg/weblate.git slug: application template: url: https://hosted.weblate.org/api/components/weblate/application/ vcs: git web_url: https://hosted.weblate.org/projects/weblate/application/ ``` With this setup it is easy to commit pending changes in the current project: ```sh $ wlc commit ``` # workflows.md # Translation workflows Using Weblate raises quality, reduces manual work, and brings everyone involved in the localization process closer to each other. It is up to you to decide how many of Weblate features you want to make use of. The following is not a complete list of ways to configure Weblate. You can base other workflows on the examples listed here. ## Workflow customization In addition to configuration at [Project configuration](https://docs.weblate.org/en/latest/admin/projects.md#project) and [Component configuration](https://docs.weblate.org/en/latest/admin/projects.md#component) (as [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review), [Enable suggestions](https://docs.weblate.org/en/latest/admin/projects.md#component-enable-suggestions), [Suggestion voting](https://docs.weblate.org/en/latest/admin/projects.md#component-suggestion-voting), and [Automatically accept suggestions](https://docs.weblate.org/en/latest/admin/projects.md#component-suggestion-autoaccept)), the translation workflow can be customized per language. Site-wide workflow customization can be done while [Changing language definitions](https://docs.weblate.org/en/latest/admin/languages.md#changing-languages). Per-project customization can be done on each language page of the project. All workflow settings can be overridden, the only limitation is that [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) needs to be turned on and can only be disabled in the per-language customization. The first existing setting applies: 1. Project-language customization 2. Language customization 3. The project/component settings #### NOTE Please be careful when using site-wide override as that applies to all projects (unless they have own overrides for a given language). ### Limiting translation languages Several settings can limit translation languages. They address different stages of the translation lifecycle and can be combined: Control requests for languages that do not exist yet : Configure [Adding new translation](https://docs.weblate.org/en/latest/admin/projects.md#project-new-lang) at workspace, project, category, or component level. Categories and components can inherit this setting; see [Settings inheritance](https://docs.weblate.org/en/latest/admin/workspaces.md#workspace-inherited-settings). You can let users contact maintainers, point them to translation instructions, create the language file automatically, or disable adding new translations.
Project admins can still add a translation when Weblate can create its file. For components that do not inherit the project setting, change [Adding new translation](https://docs.weblate.org/en/latest/admin/projects.md#component-new-lang) individually or automate the changes using [`PATCH /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#patch--api-components-(string-project)-(string-component)-).
To allow existing project languages while requesting approval for new ones, select Create existing project languages; contact maintainers for new languages. A language qualifies when any non-glossary component in the project has a target translation for it, even with no translated strings. Source-only languages and glossary translations do not qualify. This applies across categories, including shared components and components the contributor cannot access.
Maintainers approve a language by creating its first target translation. Removing the last qualifying translation removes eligibility. Component overrides that allow unrestricted language creation can also introduce an eligible language. Project and category submissions use the languages present at the start of the operation, so component processing order does not affect the result.
Project and category submissions modify only components owned by that project or category. To add a language to a shared component, use its own language creation page; the owning project’s eligibility and permissions apply there.
The REST translation creation endpoint returns HTTP 403 for languages requiring approval; submit these requests through the web interface. The permission to add several languages does not bypass this policy. Maintainers and trusted add-ons retain their existing creation permissions, and repository file discovery is unaffected.
Disabling new translations controls user requests. It does not stop discovery of translation files added to the repository or [automatic glossary language synchronization](https://docs.weblate.org/en/latest/user/glossary.md#glossary-language-sync). Limit which translation files Weblate discovers or creates : Configure [Language filter](https://docs.weblate.org/en/latest/admin/projects.md#component-language-regex) on each component. For example, `^(de|en|fr)$` limits the component to translation files whose language code is `de`, `en`, or `fr`. The filter applies while scanning the component file mask and when creating a new translation file; it does not change permissions for translations that are already present.
Language filters are configured per component, with no project-wide language allowlist. To apply a filter across many components, automate the changes using [`PATCH /api/components/(string:project)/(string:component)/`](https://docs.weblate.org/en/latest/api.md#patch--api-components-(string-project)-(string-component)-). Grant translation access only for selected languages : Use [language-scoped teams](https://docs.weblate.org/en/latest/admin/access.md#custom-acl) when different users should be able to translate different languages. A team can only grant permissions, so remove any broader translation permission that would otherwise apply to the same users. Restrict direct editing of an existing language : Open the language settings in the project, enable Customize translation workflow for this language in this project, and turn on Restrict direct editing.
Users with the Edit string when suggestions are enforced permission can continue editing directly. Other users can add suggestions when Turn on suggestions is enabled. Turn off suggestions as well to make the language editable only by privileged users.
The restriction can also be configured site-wide while [Changing language definitions](https://docs.weblate.org/en/latest/admin/languages.md#changing-languages). A project-language customization takes precedence over the site-wide language setting. Use suggestion voting : Turn on Suggestion voting to let users vote on suggestions. Voting alone does not restrict direct editing. A positive Automatically accept suggestions threshold also requires users without the Edit string when suggestions are enforced permission to submit suggestions. Use Restrict direct editing when this restriction should not depend on automatic acceptance. #### SEE ALSO * [Adding new translation](https://docs.weblate.org/en/latest/admin/projects.md#component-new-lang) * [Language filter](https://docs.weblate.org/en/latest/admin/projects.md#component-language-regex) * [Site-wide access control](https://docs.weblate.org/en/latest/admin/access.md#custom-acl) ## Translation access The [access control](https://docs.weblate.org/en/latest/admin/access.md#access-control) is not discussed in detail as a whole in the workflows, as most of its options can be applied to any workflow. Please consult the respective documentation on how to manage access to translations. In the following chapters, *any user* means a user who has access to the translation. It can be any authenticated user if the project is public, or a user with Translate permission to the project. ## Translation states Each translated string can be in one of the following states: Untranslated : Translation is empty, it might or not be stored in the file, depending on the file format. Needs editing : Translation needs editing, this is usually the result of fuzzy matching or translator action. Depending on the file format it might be marked as needing edit (for example as it gets a `fuzzy` flag in the gettext file). Needs rewriting : Translation needs to be rewritten because of a source string change. Needs checking : State used for source/template strings that need developer review. It is typically set for new source strings imported from the VCS when the Source edit addon is enabled, or when a source string is reported for checking. Translated / Waiting for review : Translation is made. The translated state is shown as “Waiting for review” if reviews are enabled. Approved : Translation has been approved in the review. It can no longer be changed by translators, but only by reviewers. Translators can only add suggestions to it.
This state is only available when reviews are enabled. Read-only : String is read-only as a result of having `read-only` [flag](https://docs.weblate.org/en/latest/admin/checks.md#custom-checks), being a non-editable source string, or marked such in the translation file. Suggestions : Suggestions are stored in Weblate only and not in the translation file. The states are represented in the translation files when possible. #### HINT If the file format you use does not support storing states, you might want to use the [Flag unchanged translations as “Needs rewriting”](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-flags-same-edit) add-on to flag unchanged strings as needing rewriting. #### NOTE The [Translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) determines which translation states are stored in the file. #### SEE ALSO * [Translation types capabilities](https://docs.weblate.org/en/latest/formats.md#fmt-capabs) * [Translation workflows](https://docs.weblate.org/en/latest/workflows.md#workflows) ## Direct translation The most common setup for smaller teams, where anybody can translate directly. This is also the default setup in Weblate. * *Any user* can edit translations. * Suggestions are optional ways to suggest changes, when translators are not sure about the change. | Setting | Value | Note | |----------------------------------|---------|-------------------------------------------------------------------------------------------------------------| | Enable reviews | off | Configured at project level. | | Enable suggestions | on | Useful for users to be able
to suggest when they are not sure. | | Suggestion voting | off | | | Automatically accept suggestions | 0 | | | Translators group | Users | Or Translate with
[per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl). | | Reviewers group | N/A | Not used. | ## Peer review With this workflow, anybody can add a suggestion, which needs approval from additional members before it is accepted as a translation. * *Any user* can add suggestions. * *Any user* can vote for suggestions. * Suggestions become translations when given a predetermined number of votes. | Setting | Value | Note | |----------------------------------|---------|-------------------------------------------------------------------------------------------------------------| | Enable reviews | off | Configured at project level. | | Enable suggestions | on | | | Suggestion voting | on | | | Automatically accept suggestions | 2 | You can set higher value to
require more peer reviews. | | Translators group | Users | Or Translate with
[per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl). | | Reviewers group | N/A | Not used, all translators review. | ## Dedicated reviewers With dedicated reviewers you have two groups of users, one able to submit translations, and one able to review them to ensure translations are consistent and that the quality is good. * *Any user* can edit unapproved translations. * *Reviewer* can approve / unapprove strings. * *Reviewer* can edit all translations (including approved ones). * Suggestions can also be used to suggest changes for approved strings. | Setting | Value | Note | |----------------------------------|-----------|-------------------------------------------------------------------------------------------------------------| | Enable reviews | on | Configured at project level. | | Enable suggestions | on | Useful for users to be able
to suggest when they are not sure. | | Suggestion voting | off | | | Automatically accept suggestions | 0 | | | Translators group | Users | Or Translate with
[per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl). | | Reviewers group | Reviewers | Or Review with
[per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl). | ## Turning on reviews Reviews can be turned on in the project configuration, from the Workflow subpage of project settings (to be found in the Operations → Settings menu): ![image](screenshots/project-workflow.webp) ### Per-language reviews To require review only for selected languages, first turn on [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) for the whole project. Then open each project language page that should use different behavior, enable Customize translation workflow for this language in this project, and turn Enable reviews off for languages that should not require review. Reviewers also need review access for the same language. Add them to a team whose roles include Review strings, and limit that team or the user membership to the language they should review. See [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl) and [Site-wide access control](https://docs.weblate.org/en/latest/admin/access.md#custom-acl) for language-scoped access setup. If approval buttons are not visible, check both parts of the setup: reviews have to be enabled for that translation, and the signed-in user has to have review permission for that language. ## Machine translation and LLM workflows Machine translation services, including large language model (LLM) services, can assist human translators or generate translations for them to edit or approve. Choose a workflow based on when humans should check the generated text and when it should reach the repository. First, configure the services under Automatic suggestions in the project settings or site administration; see [Automatic suggestions](https://docs.weblate.org/en/latest/admin/machine.md#machine-translation-setup). For LLM services, see [LLM translation context](https://docs.weblate.org/en/latest/admin/machine.md#llm-translation-context) for the context and instructions used to guide translation. To process strings in bulk, run [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation), select Machine translation as the source, and choose the services to use. For ongoing automation, configure the [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) add-on on the component with the same source and desired mode. Use the query `state:empty` to fill empty translations without replacing existing human work; see [Searching for strings](https://docs.weblate.org/en/latest/user/search.md#search-strings). ### Human translation assisted by services Use this workflow when translators should choose when to use machine translation for each string. Translators consult the [Automatic suggestions](https://docs.weblate.org/en/latest/user/translating.md#machine-translation) tab in the editor, choose a service result, edit it as needed, and save the translation. These service results are distinct from stored suggestions awaiting acceptance: a human decides what to save. This workflow does not require the Automatic translation add-on and can be combined with [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews). ### Service translation with human editing Use this workflow to fill translations automatically and let humans improve them directly. * Select Add as translation as the automatic translation mode. * Turn off [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) and allow translators to edit directly, as in the direct translation workflow. * Set [Translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) to Commit all translations regardless of quality. The service output becomes a translation that humans can edit in the usual editor. It can be committed to the repository without human approval. For machine drafts that should remain visibly unfinished, choose Add as “Needing edit” instead. Humans edit these drafts and clear the Needs editing state when finished. To keep unfinished drafts out of repository commits, set [Translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) to Skip translations marked as needing editing. ### Service suggestions with human acceptance Use this workflow when humans should check service output before it becomes a translation. * Select Add as suggestion as the automatic translation mode. * Turn on [Enable suggestions](https://docs.weblate.org/en/latest/admin/projects.md#component-enable-suggestions), turn off [Suggestion voting](https://docs.weblate.org/en/latest/admin/projects.md#component-suggestion-voting), and set [Automatically accept suggestions](https://docs.weblate.org/en/latest/admin/projects.md#component-suggestion-autoaccept) to `0`. * Leave [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) off for a single acceptance step. Give the people checking suggestions permission to accept them; see [Managing per-project access control](https://docs.weblate.org/en/latest/admin/access.md#manage-acl). Humans check the stored suggestions and accept suitable ones, or edit the proposed text before saving a translation. Suggestions are stored only in Weblate and do not enter translation files until accepted as translations. Accepting a suggestion is separate from approving a translation in the [dedicated review workflow](https://docs.weblate.org/en/latest/workflows.md#reviews). ### Service translation with review and a quality gateway Use this workflow when humans should edit machine translations in Weblate, but only reviewer-approved translations should reach the repository. * Select Add as translation as the automatic translation mode. * Turn on [Enable reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-translation-review) and assign translators and reviewers as described in [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews). * Set [Translation quality filter](https://docs.weblate.org/en/latest/admin/projects.md#project-commit-policy) to Only include approved translations. Generated translations appear as Waiting for review. Translators can edit them, and reviewers check and approve the finished translations. Only after approval are these translations eligible for repository commits. Translators can suggest further changes to approved strings, while reviewers can edit them directly. Enabling reviews alone does not keep unapproved translations out of commits. The translation quality filter provides that gateway. Keep reviews enabled for every language that should follow this workflow; check any [workflow customization](https://docs.weblate.org/en/latest/workflows.md#workflow-customization) overrides. ## Reusing existing translations Use existing translations to bootstrap a new language or component, then have humans adapt matches and fill the remaining gaps. Run [Automatic translation](https://docs.weblate.org/en/latest/user/translating.md#auto-translation) with Other translation components as the source, or select the [Translation Memory](https://docs.weblate.org/en/latest/admin/memory.md#translation-memory) service under Machine translation. Choose whether matches become translations, drafts needing editing, or suggestions using the modes described above. Use `state:empty` to preserve existing translations. The [Automatic translation](https://docs.weblate.org/en/latest/admin/addons.md#addon-weblate-autotranslate-autotranslate) add-on can apply this reuse automatically as strings arrive. For ongoing consistency, [Translation propagation](https://docs.weblate.org/en/latest/admin/continuous.md#translation-propagation) can copy edits to matching strings across components in the same project. Propagation happens while translating; it does not copy translations merely loaded from the repository. See [Keeping translations same across components](https://docs.weblate.org/en/latest/admin/continuous.md#translation-consistency) for its requirements and for checks that help humans resolve differences. ## Quality gateway for the source strings The original source language strings usually come from developers, since they write the code and provide the initial strings. However, developers are often not native speakers of the source language and do not provide the desired quality of the source strings. The intermediate translation can help you address this - there is an additional quality gateway for the strings between developers and translators. By setting the [Intermediate language file](https://docs.weblate.org/en/latest/admin/projects.md#component-intermediate), this file is used for translating strings to the source language by translators/editors while it is owned by the developers (often using arbitrary languages such as `en_devel`). Once this stage is done, strings are available for translations to target languages, based on what is now a polished source language stored in the [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template). #### SEE ALSO * [Intermediate language file](https://docs.weblate.org/en/latest/admin/projects.md#component-intermediate) * [Monolingual base language file](https://docs.weblate.org/en/latest/admin/projects.md#component-template) * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) ## String consolidation using secondary language When [Intermediate language file](https://docs.weblate.org/en/latest/admin/projects.md#component-intermediate) cannot be used to consolidate the strings, you can choose one of the translations to act as a secondary language. The language can be configured in a project ([Secondary language](https://docs.weblate.org/en/latest/admin/projects.md#project-secondary-language)) or in a component ([Secondary language](https://docs.weblate.org/en/latest/admin/projects.md#component-secondary-language)). It is then shown to the translators while translating (see [Secondary languages](https://docs.weblate.org/en/latest/user/profile.md#secondary-languages)) and can be optionally used as a source for machine translations (see [Source strings for the machine translation](https://docs.weblate.org/en/latest/admin/machine.md#mt-sources)). This setup can be useful with mixed language source strings and consolidating them into a single translation, which is then used as a baseline for other work. ## Source strings reviews With [Enable source reviews](https://docs.weblate.org/en/latest/admin/projects.md#project-source-review) enabled, the review process can be applied for source strings. Once enabled, users can report issues with source strings. The actual process depends on whether bilingual or monolingual formats are in use. For monolingual formats, source string review functions similarly to [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews) — once an issue with a source string is reported, the source string is marked as Needs editing. Bilingual formats do not allow direct editing of source strings (these are typically extracted directly from the source code). In this case, a Source needs review label is attached to strings reported by translators. You should review such strings and either edit them in the source code, or remove the label. #### SEE ALSO * [Bilingual and monolingual formats](https://docs.weblate.org/en/latest/formats.md#bimono) * [Dedicated reviewers](https://docs.weblate.org/en/latest/workflows.md#reviews) * [String labels](https://docs.weblate.org/en/latest/devel/translations.md#labels) * [Comments](https://docs.weblate.org/en/latest/user/translating.md#user-comments)