This page says wildcards can be used to ignore files:
You can also use wildcards to ignore files.
Configuration File | Crowdin Docs
However, I tried either of these in crowdin.yaml, but neither worked and files under .../testmod/... are still being uploaded:
files:
- source: /*/src/*/resources/assets/*/lang/en_us.json
translation: "%original_path%/%locale_with_underscore%.json"
ignore: [/*/src/test*]
# or
ignore: [/*/src/test*/**/*]
preserve_hierarchy: true
project_id: "647524"
Here’s the relevant links:
# This workflow is based on work originally published under the MIT License, and available here:
# <https://github.com/modrinth/code/blob/efcc0d87b5621ac4c9656ee3967d28b5903a8fe9/.github/workflows/i18n-push.yml>
# The required copyright notice and the full text of the license, which apply to the original file, are reported below.
# Copyright 2025 Rinth, Inc.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
name: Push to Crowdin
on:
push:
paths:
- ".github/workflows/l10n-push.yml"
- "crowdin.yaml"
- "*/src/*/resources/assets/*/lang/en_us.json"
This file has been truncated. show original
Another question: Does a setup like that not delete sources on Crowdin when deleted on GitHub? Because this did not seem to happen…
Dima
April 15, 2026, 1:05pm
2
Hi,
The reason your ignore pattern isn’t catching those files is due to how the Crowdin CLI parses mixed globs (like combining * and **/*) without quotation marks in the YAML file.
The most bulletproof way to ignore a specific subset of files is to mirror your exact source path pattern, but replace the specific wildcard with your exclusion string. Also, make sure to wrap the pattern in quotes so the YAML parser doesn’t misinterpret the asterisks.
Try updating your crowdin.yaml like this:
files:
- source: "/*/src/*/resources/assets/*/lang/*.json"
translation: "%original_path%/%locale_with_underscore%.json"
ignore:
- "/*/src/test*/resources/assets/*/lang/en_not_us.json"
Regarding your second question: by default, Crowdin integrations and the GitHub Action do not delete files on the Crowdin side when they are deleted in your repository. This is a deliberate safety measure to prevent accidental data and translation loss. To force Crowdin to delete files, you need to use delete-obsolete
1 Like