j1b1x / github-language
Requires
- ext-curl: *
Requires (Dev)
- pocketmine/pocketmine-mp: ^5.0
This package is auto-updated.
Last update: 2024-09-20 22:43:20 UTC
README
GitHub-Language是一个基于GitHub的非常高级的语言库。如果您拥有国际服务器并希望将消息、弹出窗口、UI等翻译成玩家的个人语言,则可以使用它。所有语言文件都可以存储在GitHub仓库中(它也支持私有仓库),这使得编辑和贡献语言变得更加容易。它还包括UI和命令描述的自动翻译以及免费的Google Translate API。
分类
注册
说明
$this
是您的插件基实例$repositoryType
基本上是您的语言仓库的类型,其中包含URL和私有仓库的访问令牌$getPlayerLanguage
是一个闭包函数,它返回玩家的语言。这用于自动将命令描述和UI内容翻译成玩家的语言。您可以使用null如果您不想使用此功能
示例
protected function onEnable(): void{ LanguageManager::initialize( $this, RepositoryType::PUBLIC("YourOrganization/language/main/") //RepositoryType::PRIVATE("YourOrganization/language/main/", "ACCESS_TOKEN") fn (Player $player): Language => Session::get($player)->getLanguage() ); }
语言
语言管理器
如果您想重新加载语言(例如使用命令),您可以这样做
LanguageManager::getInstance()->reloadLanguages();
完成后,它会自动调用一次LanguageReloadEvent。如果您取消该事件,则不会应用重新加载的更改
public function onLanguageReload(LanguageReloadEvent $event): void{ $event->cancel(); //To cancel the event $event->setLanguages($customLanguages); //To manually change the reloaded languages }
如果您想按代码添加自己的语言,只需这样做
LanguageManager::getInstance()->addLanguage($firstLanguage, $secondLanguage, $thirdLanguage, $etc);
您还可以通过名称或快捷方式搜索语言,如果您想按名称或快捷方式获取语言(这对于命令非常有用,例如“/translate”命令)
$language = LanguageManager::getInstance()->searchLanguage($string); //Returns Language or null if the language couldn't be found
可翻译特质
如果要在类中存储语言并使用它进行翻译,TranslatableTrait非常有用。基本操作如下
class MyClass{ use TranslatableTrait; public function __construct(){ $this->setLanguage(LanguageManager::getInstance()->getLanguage("my_language")); //You can make this dynamic if you want } }
现在您可以轻松地获取语言或通过这样做来翻译某些内容
$language = $myClass->getLanguage(); //Returns the initialized language object $translated = $myClass->translate("message.helloWorld", ["Example"]); //Output: "Example: Hello world"
翻译
将键翻译成玩家语言有多种方法。第一种是这种
$playerLanguage->translate($text, $params);
这样您必须首先获取玩家的语言,这可能会有些烦恼,所以这里有一个更简单的方法
Language::translateStatic($player, $text, $params);
这会自动获取玩家语言,使用在LanguageManager中定义的getPlayerLanguage
闭包将给定文本翻译成玩家的语言。重要提示:这将仅在您在LanguageManager中定义了get getPlayerLanguage
闭包的情况下工作,否则它将仅返回您的$text
,因此不会进行翻译。您可能会想知道$params
是什么。您可以通过使用此变量将自定义参数传递到文本中。例如,如果您有一个“/fly”命令,并且希望将目标名称传递到成功消息中,只需这样做
Language::translateStatic($sender, "message.fly.success.other", [$target->getName()]);
为了实际显示目标名称,您需要使用语言键中的参数,通过这样做
"message.fly.success.other": "§aYou have successfully toggled the flight of§b {0}§a!",
如您所见,我在这里使用了{0},它将用实际的目标名称替换。如果您有多个参数,只需在{}之间计数,例如{0}、{1}、{2}。以下是一个另一个示例
//"message.counting": "This message will count {0} numbers. {1}, {2}, {3}. {4}" Language::translateStatic($sender, "message.counting", ["up", 1, 2, 3, "Bin Chillin"]); //Output: "This message will count up numbers. 1, 2, 3. Bin Chillin"
翻译/获取数组值
如以下示例所示,您也可以将数组值添加到您的语言文件中。由于 Language::translate
仅支持字符串,您可能想知道如何获取翻译后的数组值。实际上,如果您想获取原始值(例如不带任何参数或替换),或者数组值,这其实非常简单。只需这样做:
$language->getValue($key, $default); //Example: $language->getValue("broadcasts", ["This is an example broadcast"]);
语言仓库
必需文件
为了使插件能够从您的存储库中获取语言,您需要以下文件。文件名是 locales.txt
,它将包含所有语言的位置。以下是一个小例子:
en_US
de_DE
gr_GR
tr_TR
语言文件
现在您已经在 locales.txt
文件中放置了您语言的位置,您可以创建实际的语言文件。您基本上只需定义一些默认值,其余的都是可选的。您的文件应如下所示(此示例是“英语”语言的文件):
{ "name": "English", //the name of the language "prefix": "§bMyServer §8>§7 ", //#optional | the prefix of the language (recommend to use the server prefix) "locale": "en_US", //the locale of the language (should be the same as the file name) "shortcut": "en", //the language's shortcut to make it easier for commands and other things to get the language by a string "contributors": ["Jibix"], //#optional | the language's contributors (in case you want to display the contributors in some ui or something) "values": { //the language's values that eventually get translated to the player's language "raw.none": "§cNone", "time.day": "Day", "time.night": "Night", "message.fly.success": "{PREFIX}§aYou have successfully toggled your flight!", //{PREFIX} will basically get replaced with the language's selected prefix "message.fly.success.other": "{PREFIX}§aYou have successfully toggled the flight of§b {0}§a!", "command.description.fl": "Toggle your flight!", "ui.title.fly": "§bThis is a fly UI", "ui.description.fly": "Click a button to toggle your flight!", "ui.button.confirm": "§aEnable", "ui.button.cancel": "§cDisable", "popup.welcome": "§aWelcome to the server§b {0}§a, you got§6 {1}§a start coins!", "broadcasts": [ "§aStar this repository!", "§bFollow J1b1x on github!", "§5You like men!" ] } }
Google Translate API
以下是一个使用 Google 翻译 API 异步翻译文本的示例
$languageFrom = LanguageManager::getInstance()->getLanguage("en_US"); $languageTo = LanguageManager::getInstance()->getLanguage("de_DE"); GoogleUtils::translate($languageFrom, $languageTo, "Hello world", static function (string $result): void{ var_dump($result); //Output: "Hallo welt" });
您也可以通过这种方式同步翻译(实际上并不推荐):
$translation = GoogleUtils::translateRequest($languageFrom, $languageTo, $text);