diff --git a/src/block/Jukebox.php b/src/block/Jukebox.php index 257425668..20c3cab61 100644 --- a/src/block/Jukebox.php +++ b/src/block/Jukebox.php @@ -26,7 +26,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Jukebox as JukeboxTile; use pocketmine\item\Item; use pocketmine\item\Record; -use pocketmine\lang\KnownTranslationKeys; +use pocketmine\lang\KnownTranslationFactory; use pocketmine\math\Vector3; use pocketmine\player\Player; use pocketmine\world\sound\RecordSound; @@ -45,7 +45,7 @@ class Jukebox extends Opaque{ if($this->record !== null){ $this->ejectRecord(); }elseif($item instanceof Record){ - $player->sendJukeboxPopup(KnownTranslationKeys::RECORD_NOWPLAYING, [$player->getLanguage()->translate($item->getRecordType()->getTranslatableName())]); + $player->sendJukeboxPopup(KnownTranslationFactory::record_nowPlaying($item->getRecordType()->getTranslatableName())); $this->insertRecord($item->pop()); } } diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index 93e06e524..f16a75d97 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -991,26 +991,39 @@ class NetworkSession{ $this->sendDataPacket(AvailableCommandsPacket::create($commandData, [], [], [])); } + /** + * @return string[][] + * @phpstan-return array{string, string[]} + */ + public function prepareClientTranslatableMessage(Translatable $message) : array{ + //we can't send nested translations to the client, so make sure they are always pre-translated by the server + $language = $this->player->getLanguage(); + $parameters = array_map(fn(string|Translatable $p) => $p instanceof Translatable ? $language->translate($p) : $p, $message->getParameters()); + return [$language->translateString($message->getText(), $parameters, "pocketmine."), $parameters]; + } + public function onChatMessage(Translatable|string $message) : void{ if($message instanceof Translatable){ - $language = $this->player->getLanguage(); if(!$this->server->isLanguageForced()){ - //we can't send nested translations to the client, so make sure they are always pre-translated by the server - $parameters = array_map(fn(string|Translatable $p) => $p instanceof Translatable ? $language->translate($p) : $p, $message->getParameters()); - $this->sendDataPacket(TextPacket::translation($language->translateString($message->getText(), $parameters, "pocketmine."), $parameters)); + $this->sendDataPacket(TextPacket::translation(...$this->prepareClientTranslatableMessage($message))); }else{ - $this->sendDataPacket(TextPacket::raw($language->translate($message))); + $this->sendDataPacket(TextPacket::raw($this->player->getLanguage()->translate($message))); } }else{ $this->sendDataPacket(TextPacket::raw($message)); } } - /** - * @param string[] $parameters - */ - public function onJukeboxPopup(string $key, array $parameters) : void{ - $this->sendDataPacket(TextPacket::jukeboxPopup($key, $parameters)); + public function onJukeboxPopup(Translatable|string $message) : void{ + $parameters = []; + if($message instanceof Translatable){ + if(!$this->server->isLanguageForced()){ + [$message, $parameters] = $this->prepareClientTranslatableMessage($message); + }else{ + $message = $this->player->getLanguage()->translate($message); + } + } + $this->sendDataPacket(TextPacket::jukeboxPopup($message, $parameters)); } public function onPopup(string $message) : void{ diff --git a/src/network/mcpe/handler/DeathPacketHandler.php b/src/network/mcpe/handler/DeathPacketHandler.php index 6347d8f65..c0c6e45ba 100644 --- a/src/network/mcpe/handler/DeathPacketHandler.php +++ b/src/network/mcpe/handler/DeathPacketHandler.php @@ -54,9 +54,7 @@ class DeathPacketHandler extends PacketHandler{ if($this->deathMessage instanceof Translatable){ $language = $this->player->getLanguage(); if(!$this->player->getServer()->isLanguageForced()){ - //we can't send nested translations to the client, so make sure they are always pre-translated by the server - $parameters = array_map(fn(string|Translatable $p) => $p instanceof Translatable ? $language->translate($p) : $p, $this->deathMessage->getParameters()); - $message = $language->translateString($this->deathMessage->getText(), $parameters, "pocketmine."); + [$message, $parameters] = $this->session->prepareClientTranslatableMessage($this->deathMessage); }else{ $message = $language->translate($this->deathMessage); } diff --git a/src/player/Player.php b/src/player/Player.php index 523e5c81f..0478080cf 100644 --- a/src/player/Player.php +++ b/src/player/Player.php @@ -2014,11 +2014,8 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{ $this->getNetworkSession()->onChatMessage($message); } - /** - * @param string[] $args - */ - public function sendJukeboxPopup(string $key, array $args) : void{ - $this->getNetworkSession()->onJukeboxPopup($key, $args); + public function sendJukeboxPopup(Translatable|string $message) : void{ + $this->getNetworkSession()->onJukeboxPopup($message); } /**