diff --git a/.gitattributes b/.gitattributes index 20ef6a046..6fdfba861 100644 --- a/.gitattributes +++ b/.gitattributes @@ -9,6 +9,9 @@ *.cmd text eol=crlf *.ps1 text eol=crlf +# Not sure why these use CRLF, but keeping consistent with the old repository for now +/resources/translations/*.ini text eol=crlf + # Custom for Visual Studio *.cs diff=csharp *.sln merge=union diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ded96ca5d..40f386a86 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -7,12 +7,6 @@ updates: time: "10:00" open-pull-requests-limit: 10 ignore: - #only allow patch updates for locale-data - this has to be updated manually due to codegen - - dependency-name: pocketmine/locale-data - update-types: - - "version-update:semver-major" - - "version-update:semver-minor" - #since we lock this to exact versions, it causes conflicts with minor-next & major-next in composer.lock #better to just test updates to this locally anyway since almost every version breaks something - dependency-name: phpstan/phpstan diff --git a/resources/translations/.github/workflows/download-translations.yml b/.github/workflows/download-translations.yml similarity index 85% rename from resources/translations/.github/workflows/download-translations.yml rename to .github/workflows/download-translations.yml index 1c29fde94..b0b054d1b 100644 --- a/resources/translations/.github/workflows/download-translations.yml +++ b/.github/workflows/download-translations.yml @@ -4,7 +4,6 @@ on: schedule: - cron: 0 21 * * * #every day at 9pm workflow_dispatch: - push: jobs: download: @@ -13,7 +12,11 @@ jobs: strategy: matrix: - branch: [ stable ] + branch: + - stable + - minor-next + - major-next + fail-fast: false steps: - uses: actions/checkout@v4 @@ -35,12 +38,14 @@ jobs: CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} - name: Post-process placeholders back into PocketMine format + working-directory: resources/translations run: | sed -i -r 's/\{([A-Za-z0-9]+)\}/\{%\1\}/g' *.ini git diff git status - name: Delete translation files with no translations + working-directory: resources/translations run: | for file in *.ini; do if grep -q -P '^[A-Za-z0-9_\-\.]+=' $file; then @@ -55,7 +60,7 @@ jobs: uses: peter-evans/create-pull-request@v7 with: add-paths: '*.ini' - commit-message: 'New translations from Crowdin' + commit-message: 'New translations from Crowdin (${{ matrix.branch }})' branch: crowdin-auto-fetch/${{ matrix.branch }} title: 'New translations from Crowdin' base: ${{ matrix.branch }} diff --git a/resources/translations/.github/workflows/upload-translations.yml b/.github/workflows/upload-translations.yml similarity index 84% rename from resources/translations/.github/workflows/upload-translations.yml rename to .github/workflows/upload-translations.yml index fc8e7698d..6c8a1a398 100644 --- a/resources/translations/.github/workflows/upload-translations.yml +++ b/.github/workflows/upload-translations.yml @@ -3,7 +3,11 @@ name: Upload translations to Crowdin on: push: paths: - - eng.ini + - resources/translations/eng.ini + branches: + - stable + - minor-next + - major-next workflow_dispatch: jobs: @@ -15,6 +19,7 @@ jobs: - uses: actions/checkout@v5 - name: Preprocess eng.ini placeholders so Crowdin can understand them + working-directory: resources/translations run: | sed -i -r 's/\{%([A-Za-z0-9]+)\}/\{\1\}/g' eng.ini cat eng.ini diff --git a/resources/translations/.github/workflows/verify-translations.php b/.github/workflows/verify-translations.php similarity index 81% rename from resources/translations/.github/workflows/verify-translations.php rename to .github/workflows/verify-translations.php index dae030e42..f03cf5718 100644 --- a/resources/translations/.github/workflows/verify-translations.php +++ b/.github/workflows/verify-translations.php @@ -29,6 +29,7 @@ use function explode; use function file_get_contents; use function fwrite; use function in_array; +use function is_array; use function json_decode; use function json_encode; use function parse_ini_file; @@ -38,6 +39,7 @@ use const INI_SCANNER_RAW; use const JSON_PRETTY_PRINT; use const JSON_THROW_ON_ERROR; use const PHP_EOL; +use const PHP_INT_MAX; use const STDERR; /** @@ -85,6 +87,10 @@ function verify_translations(array $baseLanguageDef, string $altLanguageName, ar return $ok; } +/** + * @return string[]|null + * @phpstan-return array|null + */ function parse_language_file(string $path, string $code) : ?array{ $lang = parse_ini_file($path . "/" . "$code.ini", false, INI_SCANNER_RAW); if($lang === false){ @@ -93,9 +99,13 @@ function parse_language_file(string $path, string $code) : ?array{ return $lang; } +/** + * @return string[] + * @phpstan-return array + */ function parse_mojang_language_defs(string $contents) : array{ $result = []; - foreach(explode("\n", $contents) as $line){ + foreach(explode("\n", $contents, limit: PHP_INT_MAX) as $line){ $stripped = explode("##", $line, 2)[0]; $kv = explode("=", $stripped, 2); if(count($kv) !== 2){ @@ -107,6 +117,17 @@ function parse_mojang_language_defs(string $contents) : array{ return $result; } +/** + * @param string[] $pocketmine + * @param string[] $mojang + * @param string[] $knownBadKeys + * @phpstan-param array $pocketmine + * @phpstan-param array $mojang + * @phpstan-param array $knownBadKeys + * + * @return string[] + * @phpstan-return list + */ function verify_keys(array $pocketmine, array $mojang, array $knownBadKeys) : array{ $wrong = []; foreach($pocketmine as $k => $v){ @@ -138,8 +159,21 @@ if($mojangRaw === false){ } $mojang = parse_mojang_language_defs($mojangRaw); -$knownBadKeysRaw = file_get_contents(__DIR__ . "/known-bad-keys.json"); -$knownBadKeys = $knownBadKeysRaw !== false ? json_decode($knownBadKeysRaw, associative: true, flags: JSON_THROW_ON_ERROR) : []; +$knownBadKeysRaw = file_get_contents($argv[1] . "/known-bad-keys.json"); +$knownBadKeysDecoded = $knownBadKeysRaw !== false ? json_decode($knownBadKeysRaw, associative: true, flags: JSON_THROW_ON_ERROR) : []; + +if(!is_array($knownBadKeysDecoded)){ + fwrite(STDERR, "known-bad-keys.json should contain an array of strings\n"); + exit(1); +} +$knownBadKeys = []; +foreach($knownBadKeysDecoded as $key){ + if(!is_string($key)){ + fwrite(STDERR, "known-bad-keys.json should contain an array of strings\n"); + exit(1); + } + $knownBadKeys[] = $key; +} $badKeys = verify_keys($eng, $mojang, array_fill_keys($knownBadKeys, true)); if(count($badKeys) !== 0){ @@ -151,6 +185,10 @@ if(count($badKeys) !== 0){ } $exit = 0; +/** + * @var string[] $match + * @phpstan-var array{0: string, 1: string} $match + */ foreach(new \RegexIterator(new \FilesystemIterator($argv[1], \FilesystemIterator::CURRENT_AS_PATHNAME), "/([a-z]+)\.ini$/", \RegexIterator::GET_MATCH) as $match){ $code = $match[1]; if($code === "eng"){ diff --git a/resources/translations/.github/workflows/verify-translations.yml b/.github/workflows/verify-translations.yml similarity index 77% rename from resources/translations/.github/workflows/verify-translations.yml rename to .github/workflows/verify-translations.yml index eb66c0a23..b6715a214 100644 --- a/resources/translations/.github/workflows/verify-translations.yml +++ b/.github/workflows/verify-translations.yml @@ -3,7 +3,7 @@ name: Verify translations on: push: branches-ignore: - - 'l10n/*' + - 'crowdin-auto-fetch/*' #this will be run on pull_request anyway pull_request: workflow_dispatch: @@ -20,4 +20,4 @@ jobs: php-version: 8.3 - name: Verify translations - run: php .github/workflows/verify-translations.php ${{ github.workspace }} + run: php .github/workflows/verify-translations.php ${{ github.workspace }}/resources/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 72e4c768c..835153bb7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,6 +4,12 @@ Small contributions (e.g. minor bug fixes) can be submitted as pull requests dir Larger contributions like feature additions should be preceded by a [Change Proposal](#rfcs--change-proposals) to allow maintainers and other people to discuss and decide if it's a good idea or not. +> [!TIP] +> Want to contribute (non-English) translations? Visit our +> [Crowdin Translation Project](https://crowdin.com/project/pocketmine) instead. +> +> Translations need to go through a different review process, so we can't accept changes to them in PRs. + ## Useful documentation from github.com - [About pull requests](https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) - [About forks](https://docs.github.com/en/github/collaborating-with-pull-requests/working-with-forks/about-forks) @@ -37,22 +43,24 @@ Take a look at the table below if you can't find the class or function you're lo ## Choosing a target branch PocketMine-MP has three primary branches of development. -| Type of change | `stable` | `minor-next` | `major-next` | -|:--------------------------------------------------------------------------------------------|:--------:|:-------------------------------:|:------------:| -| Bug fixes | ✔️ | ✔️ | ✔️ | -| Improvements to API docs | ✔️ | ✔️ | ✔️ | -| Cleaning up code | ❌ | ✔️ | ✔️ | -| Changing code formatting or style | ❌ | ✔️ | ✔️ | -| Addition of new core features | ❌ | 🟡 Only if non-disruptive | ✔️ | -| Changing core behaviour (e.g. making something use threads) | ❌ | ✔️ | ✔️ | -| Addition of new configuration options | ❌ | 🟡 Only if optional | ✔️ | -| Addition of new API classes, methods or constants | ❌ | ✔️ | ✔️ | -| Deprecating API classes, methods or constants | ❌ | ✔️ | ✔️ | -| Adding optional parameters to an API method | ❌ | ✔️ | ✔️ | -| Changing API behaviour | ❌ | 🟡 Only if backwards-compatible | ✔️ | -| Removal of API | ❌ | ❌ | ✔️ | -| Backwards-incompatible API change (e.g. renaming a method) | ❌ | ❌ | ✔️ | -| Backwards-incompatible internals change (e.g. changing things in `pocketmine\network\mcpe`) | ❌ | ✔️ | ✔️ | +| Type of change | `stable` | `minor-next` | `major-next` | +|:---------------------------------------------------------------------------------------------------------|:--------:|:-------------------------------:|:------------:| +| Bug fixes | ✔️ | ✔️ | ✔️ | +| Improvements to API docs | ✔️ | ✔️ | ✔️ | +| Fixing base (`eng.ini`) language strings, or adding new ones | ✔️ | ✔️ | ✔️ | +| Changes to existing base (`eng.ini`) language strings (e.g. changing parameters, renaming/removing keys) | ❌ | ✔️ | ✔️ | +| Cleaning up code | ❌ | ✔️ | ✔️ | +| Changing code formatting or style | ❌ | ✔️ | ✔️ | +| Addition of new core features | ❌ | 🟡 Only if non-disruptive | ✔️ | +| Changing core behaviour (e.g. making something use threads) | ❌ | ✔️ | ✔️ | +| Addition of new configuration options | ❌ | 🟡 Only if optional | ✔️ | +| Addition of new API classes, methods or constants | ❌ | ✔️ | ✔️ | +| Deprecating API classes, methods or constants | ❌ | ✔️ | ✔️ | +| Adding optional parameters to an API method | ❌ | ✔️ | ✔️ | +| Changing API behaviour | ❌ | 🟡 Only if backwards-compatible | ✔️ | +| Removal of API | ❌ | ❌ | ✔️ | +| Backwards-incompatible API change (e.g. renaming a method) | ❌ | ❌ | ✔️ | +| Backwards-incompatible internals change (e.g. changing things in `pocketmine\network\mcpe`) | ❌ | ✔️ | ✔️ | ### Notes - **Non-disruptive** means that usage should not be significantly altered by the change. diff --git a/composer.json b/composer.json index 87dddf5e8..8ab76a451 100644 --- a/composer.json +++ b/composer.json @@ -42,7 +42,6 @@ "pocketmine/callback-validator": "^1.0.2", "pocketmine/color": "^0.3.0", "pocketmine/errorhandler": "^0.7.0", - "pocketmine/locale-data": "~2.26.0", "pocketmine/log": "^0.4.0", "pocketmine/math": "~1.0.0", "pocketmine/nbt": "~1.2.0", diff --git a/composer.lock b/composer.lock index 50f2934c8..f4452d998 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ad9a8e8069598ae5ec679f069461623f", + "content-hash": "2c893fe1da8c1159aec2f54de70c1119", "packages": [ { "name": "adhocore/json-comment", @@ -470,29 +470,6 @@ }, "time": "2024-04-02T18:29:54+00:00" }, - { - "name": "pocketmine/locale-data", - "version": "2.26.0", - "source": { - "type": "git", - "url": "https://github.com/pmmp/Language.git", - "reference": "f791369ae082fc5cdf0f2b0bd683e611ff7f90f6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pmmp/Language/zipball/f791369ae082fc5cdf0f2b0bd683e611ff7f90f6", - "reference": "f791369ae082fc5cdf0f2b0bd683e611ff7f90f6", - "shasum": "" - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "description": "Language resources used by PocketMine-MP", - "support": { - "issues": "https://github.com/pmmp/Language/issues", - "source": "https://github.com/pmmp/Language/tree/2.26.0" - }, - "time": "2025-10-07T17:26:32+00:00" - }, { "name": "pocketmine/log", "version": "0.4.0", diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 000000000..54ad72f15 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,7 @@ +files: + - source: resources/translations/eng.ini + translation: /resources/translations/%three_letters_code%.ini + languages_mapping: + three_letters_code: + zh-CN: chs + pt-BR: bra diff --git a/resources/translations/.github/PULL_REQUEST_TEMPLATE.md b/resources/translations/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 64ec732f1..000000000 --- a/resources/translations/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/resources/translations/.github/dependabot.yml b/resources/translations/.github/dependabot.yml deleted file mode 100644 index 7a968a8de..000000000 --- a/resources/translations/.github/dependabot.yml +++ /dev/null @@ -1,6 +0,0 @@ -version: 2 -updates: -- package-ecosystem: github-actions - directory: "/" - schedule: - interval: monthly diff --git a/resources/translations/.github/workflows/tag-patches.yml b/resources/translations/.github/workflows/tag-patches.yml deleted file mode 100644 index a332ece9b..000000000 --- a/resources/translations/.github/workflows/tag-patches.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Tag new patch releases on branch push - -on: - push: - branches: [ stable ] - workflow_dispatch: - -jobs: - build: - name: Tag new patch release - runs-on: ubuntu-latest - if: "github.event_name == 'workflow_dispatch' || startsWith(github.event.head_commit.message, 'New translations') || startsWith(github.event.head_commit.message, 'New Crowdin updates') " - concurrency: tag-patches - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 #we need to fetch tags to calculate new patch number - - - name: Tag new version - run: | - BASE_VERSION="2.27" - - PREVIOUS_TAG=$(git tag --list | awk -v s="$BASE_VERSION." 'index($0, s) == 1' | sort -r --version-sort | head -n1) - echo "Previous tag is $PREVIOUS_TAG" - PREVIOUS_PATCH=$(echo "$PREVIOUS_TAG" | cut -d. -f3) - - regex='^[0-9]+$' - if [[ "$PREVIOUS_PATCH" =~ ^[0-9]+$ ]]; then - PATCH_VERSION="$(($PREVIOUS_PATCH+1))" - elif [[ "$PREVIOUS_PATCH" == "" ]]; then - PATCH_VERSION="0" - else - echo "Can't calculate next patch number from tag $PREVIOUS_TAG" - exit 1 - fi - - FULL_VERSION="$BASE_VERSION.$PATCH_VERSION" - - echo "Tagging version $FULL_VERSION" - - git config user.name github-actions - git config user.email github-actions@github.com - git tag "$FULL_VERSION" - - - name: Push changes - run: git push origin --tags diff --git a/resources/translations/README.md b/resources/translations/README.md index e37c45090..48b07c778 100644 --- a/resources/translations/README.md +++ b/resources/translations/README.md @@ -3,17 +3,11 @@ These files contain translation strings used in PocketMine-MP. ## Contributing translations -To contribute translations, please use the [Crowdin Translation Page](http://translate.pocketmine.net/), select the language you want to translate and and go to PocketMine-MP and select "PocketMine core strings". There may be multiple branches available - if in doubt, stick with `stable`. +To contribute translations, please use the [Crowdin Translation Page](http://translate.pocketmine.net/), select the language you want to translate and go to PocketMine-MP and select "PocketMine core strings". There may be multiple branches available - if in doubt, stick with `stable`. ## For maintainers ### Adding new strings Only English should be modified directly. To add new strings, add them ONLY to eng.ini. Crowdin will then synchronize them and the new strings will be put up for translation within Crowdin. -### Versioning -- Versions must be updated in [`tag-patches.yml` workflow](.github/workflows/tag-patches.yml#L19). -- When removing a string, or adding/removing/renaming parameters, bump the major version, e.g. `2.8.0` -> `3.0.0` -- When adding new strings, bump the minor version, e.g. `2.8.0` -> `2.9.0` -- Patches are automatically tagged by GitHub Actions whenever new translations are merged from Crowdin. - ### Pitfalls - If you have issues with translation files being deleted, add a language mapping in the Crowdin config. Some issues arose with Chinese due to Chinese Simplified and Chinese Traditional both mapping to `zho`, requiring a mapping to `zho-cn` for simplified. diff --git a/resources/translations/composer.json b/resources/translations/composer.json deleted file mode 100644 index f1acf34cc..000000000 --- a/resources/translations/composer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "pocketmine/locale-data", - "description": "Language resources used by PocketMine-MP", - "type": "library", - "require": {} -} diff --git a/resources/translations/crowdin.yml b/resources/translations/crowdin.yml deleted file mode 100644 index cfb696c60..000000000 --- a/resources/translations/crowdin.yml +++ /dev/null @@ -1,7 +0,0 @@ -files: - - source: eng.ini - translation: /%three_letters_code%.ini - languages_mapping: - three_letters_code: - zh-CN: chs - pt-BR: bra diff --git a/resources/translations/.github/workflows/known-bad-keys.json b/resources/translations/known-bad-keys.json similarity index 100% rename from resources/translations/.github/workflows/known-bad-keys.json rename to resources/translations/known-bad-keys.json diff --git a/src/CoreConstants.php b/src/CoreConstants.php index c18486237..b26e8394b 100644 --- a/src/CoreConstants.php +++ b/src/CoreConstants.php @@ -36,7 +36,7 @@ define('pocketmine\_CORE_CONSTANTS_INCLUDED', true); define('pocketmine\PATH', dirname(__DIR__) . '/'); define('pocketmine\RESOURCE_PATH', dirname(__DIR__) . '/resources/'); define('pocketmine\BEDROCK_DATA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-data/'); -define('pocketmine\LOCALE_DATA_PATH', dirname(__DIR__) . '/vendor/pocketmine/locale-data/'); +define('pocketmine\LOCALE_DATA_PATH', dirname(__DIR__) . '/resources/translations/'); define('pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-block-upgrade-schema/'); define('pocketmine\BEDROCK_ITEM_UPGRADE_SCHEMA_PATH', dirname(__DIR__) . '/vendor/pocketmine/bedrock-item-upgrade-schema/'); define('pocketmine\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__) . '/vendor/autoload.php'); diff --git a/src/lang/KnownTranslationFactory.php b/src/lang/KnownTranslationFactory.php index cfd8d378e..fdbfc4676 100644 --- a/src/lang/KnownTranslationFactory.php +++ b/src/lang/KnownTranslationFactory.php @@ -1535,6 +1535,62 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CLEAR_USAGE, []); } + public static function pocketmine_command_cmdalias_create_success(Translatable|string $alias, Translatable|string $target) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_CREATE_SUCCESS, [ + "alias" => $alias, + "target" => $target, + ]); + } + + public static function pocketmine_command_cmdalias_delete_notFound(Translatable|string $alias) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_DELETE_NOTFOUND, [ + "alias" => $alias, + ]); + } + + public static function pocketmine_command_cmdalias_delete_success(Translatable|string $alias) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_DELETE_SUCCESS, [ + "alias" => $alias, + ]); + } + + public static function pocketmine_command_cmdalias_description() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_DESCRIPTION, []); + } + + public static function pocketmine_command_cmdalias_list_conflicted(Translatable|string $alias, Translatable|string $commandIds) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_LIST_CONFLICTED, [ + "alias" => $alias, + "commandIds" => $commandIds, + ]); + } + + public static function pocketmine_command_cmdalias_list_noneSet() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_LIST_NONESET, []); + } + + public static function pocketmine_command_cmdalias_list_normal(Translatable|string $alias, Translatable|string $commandId) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_LIST_NORMAL, [ + "alias" => $alias, + "commandId" => $commandId, + ]); + } + + public static function pocketmine_command_cmdalias_scope_global() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_SCOPE_GLOBAL, []); + } + + public static function pocketmine_command_cmdalias_scope_userSpecific() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_SCOPE_USERSPECIFIC, []); + } + + public static function pocketmine_command_cmdalias_template(Translatable|string $message, Translatable|string $scope) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_CMDALIAS_TEMPLATE, [ + "message" => $message, + "scope" => $scope, + ]); + } + public static function pocketmine_command_defaultgamemode_description() : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_DEFAULTGAMEMODE_DESCRIPTION, []); } @@ -1559,6 +1615,19 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_ENCHANT_DESCRIPTION, []); } + public static function pocketmine_command_error_aliasConflict(Translatable|string $alias, Translatable|string $commandIdList) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_ERROR_ALIASCONFLICT, [ + "alias" => $alias, + "commandIdList" => $commandIdList, + ]); + } + + public static function pocketmine_command_error_aliasConflictTip(Translatable|string $cmdAliasCommand) : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_ERROR_ALIASCONFLICTTIP, [ + "cmdAliasCommand" => $cmdAliasCommand, + ]); + } + public static function pocketmine_command_error_permission(Translatable|string $commandName) : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_COMMAND_ERROR_PERMISSION, [ "commandName" => $commandName, @@ -2227,6 +2296,18 @@ final class KnownTranslationFactory{ return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_CLEAR_SELF, []); } + public static function pocketmine_permission_command_cmdalias_edit_global() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_CMDALIAS_EDIT_GLOBAL, []); + } + + public static function pocketmine_permission_command_cmdalias_edit_self() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_CMDALIAS_EDIT_SELF, []); + } + + public static function pocketmine_permission_command_cmdalias_list() : Translatable{ + return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_CMDALIAS_LIST, []); + } + public static function pocketmine_permission_command_defaultgamemode() : Translatable{ return new Translatable(KnownTranslationKeys::POCKETMINE_PERMISSION_COMMAND_DEFAULTGAMEMODE, []); } diff --git a/src/lang/KnownTranslationKeys.php b/src/lang/KnownTranslationKeys.php index d0e2c1a68..598edc501 100644 --- a/src/lang/KnownTranslationKeys.php +++ b/src/lang/KnownTranslationKeys.php @@ -347,12 +347,24 @@ final class KnownTranslationKeys{ public const POCKETMINE_COMMAND_BANLIST_DESCRIPTION = "pocketmine.command.banlist.description"; public const POCKETMINE_COMMAND_CLEAR_DESCRIPTION = "pocketmine.command.clear.description"; public const POCKETMINE_COMMAND_CLEAR_USAGE = "pocketmine.command.clear.usage"; + public const POCKETMINE_COMMAND_CMDALIAS_CREATE_SUCCESS = "pocketmine.command.cmdalias.create.success"; + public const POCKETMINE_COMMAND_CMDALIAS_DELETE_NOTFOUND = "pocketmine.command.cmdalias.delete.notFound"; + public const POCKETMINE_COMMAND_CMDALIAS_DELETE_SUCCESS = "pocketmine.command.cmdalias.delete.success"; + public const POCKETMINE_COMMAND_CMDALIAS_DESCRIPTION = "pocketmine.command.cmdalias.description"; + public const POCKETMINE_COMMAND_CMDALIAS_LIST_CONFLICTED = "pocketmine.command.cmdalias.list.conflicted"; + public const POCKETMINE_COMMAND_CMDALIAS_LIST_NONESET = "pocketmine.command.cmdalias.list.noneSet"; + public const POCKETMINE_COMMAND_CMDALIAS_LIST_NORMAL = "pocketmine.command.cmdalias.list.normal"; + public const POCKETMINE_COMMAND_CMDALIAS_SCOPE_GLOBAL = "pocketmine.command.cmdalias.scope.global"; + public const POCKETMINE_COMMAND_CMDALIAS_SCOPE_USERSPECIFIC = "pocketmine.command.cmdalias.scope.userSpecific"; + public const POCKETMINE_COMMAND_CMDALIAS_TEMPLATE = "pocketmine.command.cmdalias.template"; public const POCKETMINE_COMMAND_DEFAULTGAMEMODE_DESCRIPTION = "pocketmine.command.defaultgamemode.description"; public const POCKETMINE_COMMAND_DEOP_DESCRIPTION = "pocketmine.command.deop.description"; public const POCKETMINE_COMMAND_DIFFICULTY_DESCRIPTION = "pocketmine.command.difficulty.description"; public const POCKETMINE_COMMAND_DUMPMEMORY_DESCRIPTION = "pocketmine.command.dumpmemory.description"; public const POCKETMINE_COMMAND_EFFECT_DESCRIPTION = "pocketmine.command.effect.description"; public const POCKETMINE_COMMAND_ENCHANT_DESCRIPTION = "pocketmine.command.enchant.description"; + public const POCKETMINE_COMMAND_ERROR_ALIASCONFLICT = "pocketmine.command.error.aliasConflict"; + public const POCKETMINE_COMMAND_ERROR_ALIASCONFLICTTIP = "pocketmine.command.error.aliasConflictTip"; public const POCKETMINE_COMMAND_ERROR_PERMISSION = "pocketmine.command.error.permission"; public const POCKETMINE_COMMAND_ERROR_PLAYERNOTFOUND = "pocketmine.command.error.playerNotFound"; public const POCKETMINE_COMMAND_EXCEPTION = "pocketmine.command.exception"; @@ -489,6 +501,9 @@ final class KnownTranslationKeys{ public const POCKETMINE_PERMISSION_COMMAND_BAN_PLAYER = "pocketmine.permission.command.ban.player"; public const POCKETMINE_PERMISSION_COMMAND_CLEAR_OTHER = "pocketmine.permission.command.clear.other"; public const POCKETMINE_PERMISSION_COMMAND_CLEAR_SELF = "pocketmine.permission.command.clear.self"; + public const POCKETMINE_PERMISSION_COMMAND_CMDALIAS_EDIT_GLOBAL = "pocketmine.permission.command.cmdalias.edit.global"; + public const POCKETMINE_PERMISSION_COMMAND_CMDALIAS_EDIT_SELF = "pocketmine.permission.command.cmdalias.edit.self"; + public const POCKETMINE_PERMISSION_COMMAND_CMDALIAS_LIST = "pocketmine.permission.command.cmdalias.list"; public const POCKETMINE_PERMISSION_COMMAND_DEFAULTGAMEMODE = "pocketmine.permission.command.defaultgamemode"; public const POCKETMINE_PERMISSION_COMMAND_DIFFICULTY = "pocketmine.permission.command.difficulty"; public const POCKETMINE_PERMISSION_COMMAND_DUMPMEMORY = "pocketmine.permission.command.dumpmemory";