j1b1x/github-language

该软件包最新版本(dev-master)没有可用的许可证信息。

dev-master 2023-12-20 21:05 UTC

This package is auto-updated.

Last update: 2024-09-20 22:43:20 UTC


README

php api

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);