diff --git a/config/example-bot.conf b/config/example-bot.conf index f8f595f1..b27c143e 100644 --- a/config/example-bot.conf +++ b/config/example-bot.conf @@ -11,6 +11,8 @@ ALSO_READ = config/emojis.conf, config/secrets.conf, config/gui.conf asset_path = assets +support_guild = + [ENDPOINTS] guild_log = gem_transaction = @@ -19,8 +21,10 @@ gem_transaction = log_file = bot.log general_log = -error_log = -critical_log = +error_log = %(general_log) +critical_log = %(general_log) +warning_log = %(general_log) +warning_prefix = error_prefix = critical_prefix = @@ -40,8 +44,8 @@ server_host = 127.0.0.1 server_port = 4999 [BABEL] -locales = ceaser -domains = base, shop, economy, user_config, config, ranks, tasklist, exec, rooms, test, reminders, Pomodoro, statistics, utils, timer-gui, goals-gui, weekly-gui, profile-gui, monthly-gui, leaderboard-gui, stats-gui, settings_base, voice-tracker, text-tracker, core_config, babel +locales = en-GB, ceaser +domains = base, wards, schedule, shop, moderation, economy, user_config, config, member_admin, ranks, tasklist, sysadmin, exec, meta, rooms, rolemenus, test, reminders, video, Pomodoro, statistics, utils, timer-gui, goals-gui, weekly-gui, profile-gui, monthly-gui, leaderboard-gui, stats-gui, settings_base, voice-tracker, text-tracker, lion-core, core_config, babel [TEXT_TRACKER] batchsize = 1 diff --git a/locales/ceaser/LC_MESSAGES/Pomodoro.po b/locales/ceaser/LC_MESSAGES/Pomodoro.po new file mode 100644 index 00000000..6fd27796 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/Pomodoro.po @@ -0,0 +1,929 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/pomodoro/timer.py:51 +msgctxt "timer|stage:break|name" +msgid "BREAK" +msgstr "CSFBL" + +#: src/modules/pomodoro/timer.py:52 +msgctxt "timer|stage:focus|name" +msgid "FOCUS" +msgstr "GPDVT" + +#: src/modules/pomodoro/timer.py:158 +#, possible-python-brace-format +msgctxt "timer|webhook|name" +msgid "{bot_name} Pomodoro" +msgstr "{bot_name} Qpnpepsp" + +#: src/modules/pomodoro/timer.py:162 +msgctxt "timer|webhook|audit_reason" +msgid "Pomodoro Notifications" +msgstr "Qpnpepsp Opujgjdbujpot" + +#: src/modules/pomodoro/timer.py:173 +msgctxt "timer|webhook|error:insufficient_permissions" +msgid "" +"I require the `MANAGE_WEBHOOKS` permission to send pomodoro notifications " +"here!" +msgstr "" +"J sfrvjsf uif `NBOBHF_XFCIPPLT` qfsnjttjpo up tfoe qpnpepsp opujgjdbujpot " +"ifsf!" + +#: src/modules/pomodoro/timer.py:232 +#, possible-python-brace-format +msgctxt "timer|default_base_name" +msgid "Timer {pattern}" +msgstr "Ujnfs {pattern}" + +#: src/modules/pomodoro/timer.py:406 +#, possible-python-brace-format +msgctxt "timer|kicked_message" +msgid "" +"{mentions} was removed from {channel} because they were inactive! Remember " +"to press {tick} to register your presence every stage." +msgid_plural "" +"{mentions} were removed from {channel} because they were inactive! Remember " +"to press {tick} to register your presence every stage." +msgstr[0] "" +"{mentions} xbt sfnpwfe gspn {channel} cfdbvtf uifz xfsf jobdujwf! Sfnfncfs " +"up qsftt {tick} up sfhjtufs zpvs qsftfodf fwfsz tubhf." +msgstr[1] "" +"{mentions} xfsf sfnpwfe gspn {channel} cfdbvtf uifz xfsf jobdujwf! Sfnfncfs " +"up qsftt {tick} up sfhjtufs zpvs qsftfodf fwfsz tubhf." + +#: src/modules/pomodoro/timer.py:499 +#, possible-python-brace-format +msgctxt "timer|status|stage:focus|statusline" +msgid "{channel} is now in **FOCUS**! Good luck, **BREAK** starts {timestamp}" +msgstr "" +"{channel} jt opx jo **GPDVT**! Hppe mvdl, **CSFBL** tubsut {timestamp}" + +#: src/modules/pomodoro/timer.py:504 +#, possible-python-brace-format +msgctxt "timer|status|stage:break|statusline" +msgid "" +"{channel} is now on **BREAK**! Take a rest, **FOCUS** starts {timestamp}" +msgstr "" +"{channel} jt opx po **CSFBL**! Ublf b sftu, **GPDVT** tubsut {timestamp}" + +#: src/modules/pomodoro/timer.py:536 +#, possible-python-brace-format +msgctxt "timer|status|warningline" +msgid "" +"**Warning:** {mentions}, please press {tick} to avoid being removed on the " +"next stage." +msgstr "" +"**Xbsojoh:** {mentions}, qmfbtf qsftt {tick} up bwpje cfjoh sfnpwfe po uif " +"ofyu tubhf." + +#: src/modules/pomodoro/timer.py:555 +#, possible-python-brace-format +msgctxt "timer|status|stopped:auto" +msgid "Timer stopped! Join {channel} to start the timer." +msgstr "Ujnfs tupqqfe! Kpjo {channel} up tubsu uif ujnfs." + +#: src/modules/pomodoro/timer.py:560 +msgctxt "timer|status|stopped:manual" +msgid "Timer stopped! Press `Start` to restart the timer." +msgstr "Ujnfs tupqqfe! Qsftt `Tubsu` up sftubsu uif ujnfs." + +#: src/modules/pomodoro/settingui.py:39 +msgctxt "ui:timer_config|menu:channels|placeholder" +msgid "Select Pomodoro Notification Channel" +msgstr "Tfmfdu Qpnpepsp Opujgjdbujpo Diboofm" + +#: src/modules/pomodoro/settingui.py:47 +msgctxt "ui:timer_config|embed|title" +msgid "Timer Configuration Panel" +msgstr "Ujnfs Dpogjhvsbujpo Qbofm" + +#: src/modules/pomodoro/settingui.py:81 +msgctxt "dash:pomodoro|title" +msgid "Pomodoro Configuration ({commands[configure pomodoro]})" +msgstr "Qpnpepsp Dpogjhvsbujpo ({commands[configure pomodoro]})" + +#: src/modules/pomodoro/settingui.py:85 +msgctxt "dash:stats|dropdown|placeholder" +msgid "Pomodoro Timer Panel" +msgstr "Qpnpepsp Ujnfs Qbofm" + +#: src/modules/pomodoro/cog.py:82 +msgctxt "cmd_check:ready|failed" +msgid "" +"I am currently restarting! The Pomodoro timers will be unavailable until I " +"have restarted. Thank you for your patience!" +msgstr "" +"J bn dvssfoumz sftubsujoh! Uif Qpnpepsp ujnfst xjmm cf vobwbjmbcmf voujm J " +"ibwf sftubsufe. Uibol zpv gps zpvs qbujfodf!" + +#: src/modules/pomodoro/cog.py:322 +msgctxt "cmd:timer" +msgid "timer" +msgstr "ujnfs" + +#: src/modules/pomodoro/cog.py:323 +msgctxt "cmd:timer|desc" +msgid "Show your current (or selected) pomodoro timer." +msgstr "Tipx zpvs dvssfou (ps tfmfdufe) qpnpepsp ujnfs." + +#: src/modules/pomodoro/cog.py:326 +msgctxt "cmd:timer|param:channel" +msgid "timer_channel" +msgstr "ujnfs_diboofm" + +#: src/modules/pomodoro/cog.py:331 +msgctxt "cmd:timer|param:channel|desc" +msgid "Select a timer to display (by selecting the timer voice channel)" +msgstr "Tfmfdu b ujnfs up ejtqmbz (cz tfmfdujoh uif ujnfs wpjdf diboofm)" + +#: src/modules/pomodoro/cog.py:353 src/modules/pomodoro/cog.py:423 +#, possible-python-brace-format +msgctxt "cmd:timer|error:no_timers|desc" +msgid "" +"**This server has no timers set up!**\n" +"Ask an admin to set up and configure a timer with {create_cmd} first, or rent a private room with {room_cmd} and create one yourself!" +msgstr "" +"**Uijt tfswfs ibt op ujnfst tfu vq!**\n" +"Btl bo benjo up tfu vq boe dpogjhvsf b ujnfs xjui {create_cmd} gjstu, ps sfou b qsjwbuf sppn xjui {room_cmd} boe dsfbuf pof zpvstfmg!" + +#: src/modules/pomodoro/cog.py:367 +#, possible-python-brace-format +msgctxt "cmd:timer|error:no_channel|desc" +msgid "" +"**I don't know what timer to show you.**\n" +"No channel selected and you are not in a voice channel! Use {timers_cmd} to list the available timers in this server." +msgstr "" +"**J epo'u lopx xibu ujnfs up tipx zpv.**\n" +"Op diboofm tfmfdufe boe zpv bsf opu jo b wpjdf diboofm! Vtf {timers_cmd} up mjtu uif bwbjmbcmf ujnfst jo uijt tfswfs." + +#: src/modules/pomodoro/cog.py:380 +#, possible-python-brace-format +msgctxt "cmd:timer|error:no_timer_in_channel" +msgid "" +"The channel {channel} is not a pomodoro timer room!\n" +"Use {timers_cmd} to list the available timers in this server." +msgstr "" +"Uif diboofm {channel} jt opu b qpnpepsp ujnfs sppn!\n" +"Vtf {timers_cmd} up mjtu uif bwbjmbcmf ujnfst jo uijt tfswfs." + +#: src/modules/pomodoro/cog.py:396 +msgctxt "cmd:timers" +msgid "timers" +msgstr "ujnfst" + +#: src/modules/pomodoro/cog.py:397 +msgctxt "cmd:timers|desc" +msgid "List the available pomodoro timer rooms." +msgstr "Mjtu uif bwbjmbcmf qpnpepsp ujnfs sppnt." + +#: src/modules/pomodoro/cog.py:436 +#, possible-python-brace-format +msgctxt "cmd:timer|error:no_visible_timers|desc" +msgid "" +"**There are no available pomodoro timers!**\n" +"Ask an admin to set up a new timer with {create_cmd}, or rent a private room with {room_cmd} and create one yourself!" +msgstr "" +"**Uifsf bsf op bwbjmbcmf qpnpepsp ujnfst!**\n" +"Btl bo benjo up tfu vq b ofx ujnfs xjui {create_cmd}, ps sfou b qsjwbuf sppn xjui {room_cmd} boe dsfbuf pof zpvstfmg!" + +#: src/modules/pomodoro/cog.py:449 +#, possible-python-brace-format +msgctxt "cmd:timers|embed:timer_list|title" +msgid "Pomodoro Timer Rooms in **{guild}**" +msgstr "Qpnpepsp Ujnfs Sppnt jo **{guild}**" + +#: src/modules/pomodoro/cog.py:458 +#, possible-python-brace-format +msgctxt "cmd:timers|status:stopped_auto" +msgid "" +"`{pattern}` timer is stopped with no members!\n" +"Join {channel} to restart it." +msgstr "" +"`{pattern}` ujnfs jt tupqqfe xjui op nfncfst!\n" +"Kpjo {channel} up sftubsu ju." + +#: src/modules/pomodoro/cog.py:464 +#, possible-python-brace-format +msgctxt "cmd:timers|status:stopped_manual" +msgid "" +"`{pattern}` timer is stopped with `{members}` members!\n" +"Join {channel} and press `Start` to start it!" +msgstr "" +"`{pattern}` ujnfs jt tupqqfe xjui `{members}` nfncfst!\n" +"Kpjo {channel} boe qsftt `Tubsu` up tubsu ju!" + +#: src/modules/pomodoro/cog.py:471 +#, possible-python-brace-format +msgctxt "cmd:timers|status:running_focus" +msgid "" +"`{pattern}` timer is running with `{members}` members!\n" +"Currently **focusing**, with break starting {timestamp}" +msgstr "" +"`{pattern}` ujnfs jt svoojoh xjui `{members}` nfncfst!\n" +"Dvssfoumz **gpdvtjoh**, xjui csfbl tubsujoh {timestamp}" + +#: src/modules/pomodoro/cog.py:477 +#, possible-python-brace-format +msgctxt "cmd:timers|status:running_break" +msgid "" +"`{pattern}` timer is running with `{members}` members!\n" +"Currently **resting**, with focus starting {timestamp}" +msgstr "" +"`{pattern}` ujnfs jt svoojoh xjui `{members}` nfncfst!\n" +"Dvssfoumz **sftujoh**, xjui gpdvt tubsujoh {timestamp}" + +#: src/modules/pomodoro/cog.py:491 +msgctxt "cmd:pomodoro" +msgid "pomodoro" +msgstr "qpnpepsp" + +#: src/modules/pomodoro/cog.py:492 +msgctxt "cmd:pomodoro|desc" +msgid "Create and configure pomodoro timer rooms." +msgstr "Dsfbuf boe dpogjhvsf qpnpepsp ujnfs sppnt." + +#: src/modules/pomodoro/cog.py:499 +msgctxt "cmd:pomodoro_create" +msgid "create" +msgstr "dsfbuf" + +#: src/modules/pomodoro/cog.py:502 +msgctxt "cmd:pomodoro_create|desc" +msgid "Create a new Pomodoro timer. Requires manage channel permissions." +msgstr "Dsfbuf b ofx Qpnpepsp ujnfs. Sfrvjsft nbobhf diboofm qfsnjttjpot." + +#: src/modules/pomodoro/cog.py:506 +msgctxt "cmd:pomodoro_create|param:channel" +msgid "timer_channel" +msgstr "ujnfs_diboofm" + +#: src/modules/pomodoro/cog.py:512 +msgctxt "cmd:pomodoro_create|param:channel|desc" +msgid "" +"Voice channel to create the timer in. (Defaults to your current channel, or " +"makes a new one.)" +msgstr "" +"Wpjdf diboofm up dsfbuf uif ujnfs jo. (Efgbvmut up zpvs dvssfou diboofm, ps " +"nblft b ofx pof.)" + +#: src/modules/pomodoro/cog.py:557 +msgctxt "cmd:pomodoro_create|new_channel|error:your_insufficient_perms|title" +msgid "Could not create pomodoro voice channel!" +msgstr "Dpvme opu dsfbuf qpnpepsp wpjdf diboofm!" + +#: src/modules/pomodoro/cog.py:561 +msgctxt "cmd:pomodoro_create|new_channel|error:your_insufficient_perms" +msgid "" +"No `timer_channel` was provided, and you lack the 'Manage Channels` " +"permission required to create a new timer room!" +msgstr "" +"Op `ujnfs_diboofm` xbt qspwjefe, boe zpv mbdl uif 'Nbobhf Diboofmt` " +"qfsnjttjpo sfrvjsfe up dsfbuf b ofx ujnfs sppn!" + +#: src/modules/pomodoro/cog.py:572 +msgctxt "cmd:pomodoro_create|new_channel|error:my_insufficient_perms|title" +msgid "Could not create pomodoro voice channel!" +msgstr "Dpvme opu dsfbuf qpnpepsp wpjdf diboofm!" + +#: src/modules/pomodoro/cog.py:576 +msgctxt "cmd:pomodoro_create|new_channel|error:my_insufficient_perms|desc" +msgid "" +"No `timer_channel` was provided, and I lack the 'Manage Channels' permission" +" required to create a new voice channel." +msgstr "" +"Op `ujnfs_diboofm` xbt qspwjefe, boe J mbdl uif 'Nbobhf Diboofmt' qfsnjttjpo" +" sfrvjsfe up dsfbuf b ofx wpjdf diboofm." + +#: src/modules/pomodoro/cog.py:587 +msgctxt "cmd:pomodoro_create|new_channel|default_name" +msgid "Timer" +msgstr "Ujnfs" + +#: src/modules/pomodoro/cog.py:591 +msgctxt "cmd:pomodoro_create|new_channel|audit_reason" +msgid "Creating Pomodoro Voice Channel" +msgstr "Dsfbujoh Qpnpepsp Wpjdf Diboofm" + +#: src/modules/pomodoro/cog.py:600 +msgctxt "cmd:pomodoro_create|new_channel|error:channel_create_failed|title" +msgid "Could not create pomodoro voice channel!" +msgstr "Dpvme opu dsfbuf qpnpepsp wpjdf diboofm!" + +#: src/modules/pomodoro/cog.py:604 +msgctxt "cmd:pomodoro_create|new_channel|error:channel_create_failed|desc" +msgid "" +"Failed to create a new pomodoro voice channel due to an unknown Discord " +"communication error. Please try creating the channel manually and pass it to" +" the `timer_channel` argument of this command." +msgstr "" +"Gbjmfe up dsfbuf b ofx qpnpepsp wpjdf diboofm evf up bo volopxo Ejtdpse " +"dpnnvojdbujpo fssps. Qmfbtf usz dsfbujoh uif diboofm nbovbmmz boe qbtt ju up" +" uif `ujnfs_diboofm` bshvnfou pg uijt dpnnboe." + +#: src/modules/pomodoro/cog.py:621 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_create|add_timer|error:timer_exists" +msgid "A timer already exists in {channel}! Reconfigure it with {edit_cmd}." +msgstr "B ujnfs bmsfbez fyjtut jo {channel}! Sfdpogjhvsf ju xjui {edit_cmd}." + +#: src/modules/pomodoro/cog.py:635 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_create|add_timer|error:your_insufficient_perms" +msgid "" +"You must have the 'Manage Channel' permission in {channel} in order to add a" +" timer there!" +msgstr "" +"Zpv nvtu ibwf uif 'Nbobhf Diboofm' qfsnjttjpo jo {channel} jo psefs up bee b" +" ujnfs uifsf!" + +#: src/modules/pomodoro/cog.py:684 +msgctxt "cmd:pomodoro_create|response:success|content" +msgid "Timer created successfully! Use the panel below to reconfigure." +msgstr "Ujnfs dsfbufe tvddfttgvmmz! Vtf uif qbofm cfmpx up sfdpogjhvsf." + +#: src/modules/pomodoro/cog.py:690 +msgctxt "cmd:pomodoro_destroy" +msgid "destroy" +msgstr "eftuspz" + +#: src/modules/pomodoro/cog.py:693 +msgctxt "cmd:pomodoro_destroy|desc" +msgid "Remove a pomodoro timer from a voice channel." +msgstr "Sfnpwf b qpnpepsp ujnfs gspn b wpjdf diboofm." + +#: src/modules/pomodoro/cog.py:697 +msgctxt "cmd:pomodoro_destroy|param:channel" +msgid "timer_channel" +msgstr "ujnfs_diboofm" + +#: src/modules/pomodoro/cog.py:700 +msgctxt "cmd:pomodoro_destroy|param:channel" +msgid "Select a timer voice channel to remove the timer from." +msgstr "Tfmfdu b ujnfs wpjdf diboofm up sfnpwf uif ujnfs gspn." + +#: src/modules/pomodoro/cog.py:718 +msgctxt "cmd:pomodoro_destroy|error:no_timer" +msgid "This channel doesn't have an attached pomodoro timer!" +msgstr "Uijt diboofm epfto'u ibwf bo buubdife qpnpepsp ujnfs!" + +#: src/modules/pomodoro/cog.py:731 +msgctxt "cmd:pomodoro_destroy|error:insufficient_perms|owned" +msgid "" +"You need to be an administrator or own this channel to remove this timer!" +msgstr "" +"Zpv offe up cf bo benjojtusbups ps pxo uijt diboofm up sfnpwf uijt ujnfs!" + +#: src/modules/pomodoro/cog.py:740 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_destroy|error:insufficient_perms|notowned" +msgid "" +"You need to have the `Manage Channels` permission in {channel} to remove " +"this timer!" +msgstr "" +"Zpv offe up ibwf uif `Nbobhf Diboofmt` qfsnjttjpo jo {channel} up sfnpwf " +"uijt ujnfs!" + +#: src/modules/pomodoro/cog.py:751 +#, possible-python-brace-format +msgctxt "cmd:pomdoro_destroy|response:success|description" +msgid "Timer successfully removed from {channel}." +msgstr "Ujnfs tvddfttgvmmz sfnpwfe gspn {channel}." + +#: src/modules/pomodoro/cog.py:757 +msgctxt "cmd:pomodoro_edit" +msgid "edit" +msgstr "feju" + +#: src/modules/pomodoro/cog.py:760 +msgctxt "cmd:pomodoro_edit|desc" +msgid "Reconfigure a pomodoro timer." +msgstr "Sfdpogjhvsf b qpnpepsp ujnfs." + +#: src/modules/pomodoro/cog.py:764 +msgctxt "cmd:pomodoro_edit|param:channel" +msgid "timer_channel" +msgstr "ujnfs_diboofm" + +#: src/modules/pomodoro/cog.py:770 +msgctxt "cmd:pomodoro_edit|param:channel|desc" +msgid "Select a timer voice channel to reconfigure." +msgstr "Tfmfdu b ujnfs wpjdf diboofm up sfdpogjhvsf." + +#: src/modules/pomodoro/cog.py:811 +msgctxt "cmd:pomodoro_edit|error:no_timer" +msgid "This channel doesn't have an attached pomodoro timer to edit!" +msgstr "Uijt diboofm epfto'u ibwf bo buubdife qpnpepsp ujnfs up feju!" + +#: src/modules/pomodoro/cog.py:824 +msgctxt "cmd:pomodoro_edit|error:insufficient_perms|role:other" +msgid "" +"Insufficient permissions to modifiy this timer!\n" +"You need to be a server administrator, own this channel, or have the timer manager role." +msgstr "" +"Jotvggjdjfou qfsnjttjpot up npejgjz uijt ujnfs!\n" +"Zpv offe up cf b tfswfs benjojtusbups, pxo uijt diboofm, ps ibwf uif ujnfs nbobhfs spmf." + +#: src/modules/pomodoro/cog.py:845 +msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:admin" +msgid "You need to be a guild admin to modify this option!" +msgstr "Zpv offe up cf b hvjme benjo up npejgz uijt pqujpo!" + +#: src/modules/pomodoro/cog.py:850 +msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:owner" +msgid "You need to be a channel owner or guild admin to modify this option!" +msgstr "Zpv offe up cf b diboofm pxofs ps hvjme benjo up npejgz uijt pqujpo!" + +#: src/modules/pomodoro/cog.py:855 +msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:manager" +msgid "" +"You need to be a guild admin or have the manager role to modify this option!" +msgstr "" +"Zpv offe up cf b hvjme benjo ps ibwf uif nbobhfs spmf up npejgz uijt pqujpo!" + +#: src/modules/pomodoro/cog.py:891 +msgctxt "cmd:configure_pomodoro" +msgid "pomodoro" +msgstr "qpnpepsp" + +#: src/modules/pomodoro/cog.py:892 +msgctxt "cmd:configure_pomodoro|desc" +msgid "Configure Pomodoro Timer System" +msgstr "Dpogjhvsf Qpnpepsp Ujnfs Tztufn" + +#: src/modules/pomodoro/lib.py:19 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:remaining" +msgid "{remaining}" +msgstr "{remaining}" + +#: src/modules/pomodoro/lib.py:20 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:stage" +msgid "{stage}" +msgstr "{stage}" + +#: src/modules/pomodoro/lib.py:21 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:members" +msgid "{members}" +msgstr "{members}" + +#: src/modules/pomodoro/lib.py:22 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:name" +msgid "{name}" +msgstr "{name}" + +#: src/modules/pomodoro/lib.py:23 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:pattern" +msgid "{pattern}" +msgstr "{pattern}" + +#: src/modules/pomodoro/options.py:33 +msgctxt "timerset:voice_channel" +msgid "channel" +msgstr "diboofm" + +#: src/modules/pomodoro/options.py:36 +msgctxt "timerset:voice_channel|desc" +msgid "Channel in which to track timer members and send alerts." +msgstr "Diboofm jo xijdi up usbdl ujnfs nfncfst boe tfoe bmfsut." + +#: src/modules/pomodoro/options.py:48 +msgctxt "timerset:notification_channel" +msgid "notification_channel" +msgstr "opujgjdbujpo_diboofm" + +#: src/modules/pomodoro/options.py:51 +msgctxt "timerset:notification_channel|desc" +msgid "Channel to which to send timer status cards and notifications." +msgstr "Diboofm up xijdi up tfoe ujnfs tubuvt dbset boe opujgjdbujpot." + +#: src/modules/pomodoro/options.py:73 +#, possible-python-brace-format +msgctxt "timerset:notification_channel|format:notset" +msgid "Not Set (Using {channel})" +msgstr "Opu Tfu (Vtjoh {channel})" + +#: src/modules/pomodoro/options.py:83 +msgctxt "timerset:inactivity_threshold|inactivity_threshold" +msgid "inactivity_threshold" +msgstr "jobdujwjuz_uisftipme" + +#: src/modules/pomodoro/options.py:86 +msgctxt "timerset:inactivity_threshold|desc" +msgid "" +"Number of inactive focus+break stages before a member is removed from the " +"timer." +msgstr "" +"Ovncfs pg jobdujwf gpdvt+csfbl tubhft cfgpsf b nfncfs jt sfnpwfe gspn uif " +"ujnfs." + +#: src/modules/pomodoro/options.py:90 +msgctxt "timerset:inactivity_threshold|desc" +msgid "How many timer cycles before kicking inactive members." +msgstr "Ipx nboz ujnfs dzdmft cfgpsf ljdljoh jobdujwf nfncfst." + +#: src/modules/pomodoro/options.py:112 +msgctxt "timerset:inactivity_length|desc" +msgid "The inactivity threshold must be a positive whole number!" +msgstr "Uif jobdujwjuz uisftipme nvtu cf b qptjujwf xipmf ovncfs!" + +#: src/modules/pomodoro/options.py:120 +msgctxt "timerset:manager_role" +msgid "manager_role" +msgstr "nbobhfs_spmf" + +#: src/modules/pomodoro/options.py:123 +msgctxt "timerset:manager_role|desc" +msgid "Role allowed to start, stop, and edit the focus/break lengths." +msgstr "Spmf bmmpxfe up tubsu, tupq, boe feju uif gpdvt/csfbl mfohuit." + +#: src/modules/pomodoro/options.py:137 +msgctxt "timerset:manager_role|format:notset" +msgid "Not Set (Only Admins may start/stop or edit pattern)" +msgstr "Opu Tfu (Pomz Benjot nbz tubsu/tupq ps feju qbuufso)" + +#: src/modules/pomodoro/options.py:147 +msgctxt "timerset:voice_alerts" +msgid "voice_alerts" +msgstr "wpjdf_bmfsut" + +#: src/modules/pomodoro/options.py:150 +msgctxt "timerset:voice_alerts|desc" +msgid "Whether to join the voice channel and announce focus and break stages." +msgstr "" +"Xifuifs up kpjo uif wpjdf diboofm boe boopvodf gpdvt boe csfbl tubhft." + +#: src/modules/pomodoro/options.py:162 +msgctxt "timerset:base_name" +msgid "name" +msgstr "obnf" + +#: src/modules/pomodoro/options.py:165 +msgctxt "timerset:base_name|desc" +msgid "Timer name, as shown on the timer card." +msgstr "Ujnfs obnf, bt tipxo po uif ujnfs dbse." + +#: src/modules/pomodoro/options.py:169 +msgctxt "timerset:base_name|accepts" +msgid "Any short name, shown on the timer card." +msgstr "Boz tipsu obnf, tipxo po uif ujnfs dbse." + +#: src/modules/pomodoro/options.py:184 +msgctxt "timerset:channel_name_format" +msgid "channel_name" +msgstr "diboofm_obnf" + +#: src/modules/pomodoro/options.py:187 +#, possible-python-brace-format +msgctxt "timerset:channel_name_format|desc" +msgid "" +"Auto-updating voice channel name, accepting {remaining}, {name}, {pattern}, " +"and {stage} keys." +msgstr "" +"Bvup-vqebujoh wpjdf diboofm obnf, bddfqujoh {remaining}, {name}, {pattern}, " +"boe {stage} lfzt." + +#: src/modules/pomodoro/options.py:191 +#, possible-python-brace-format +msgctxt "timerset:channel_name|accepts" +msgid "" +"Timer channel name, with keys {remaining}, {name}, {pattern}, and {stage}." +msgstr "" +"Ujnfs diboofm obnf, xjui lfzt {remaining}, {name}, {pattern}, boe {stage}." + +#: src/modules/pomodoro/options.py:221 +msgctxt "timerset:channel_name_format|error:too_long" +msgid "" +"The provided name is too long! Channel names can be at most `100` " +"characters." +msgstr "" +"Uif qspwjefe obnf jt upp mpoh! Diboofm obnft dbo cf bu nptu `100` " +"dibsbdufst." + +#: src/modules/pomodoro/options.py:240 +msgctxt "timerset:focus_length" +msgid "focus_length" +msgstr "gpdvt_mfohui" + +#: src/modules/pomodoro/options.py:243 +msgctxt "timerset:focus_length|desc" +msgid "Length of the focus stage of the timer in minutes." +msgstr "Mfohui pg uif gpdvt tubhf pg uif ujnfs jo njovuft." + +#: src/modules/pomodoro/options.py:248 +msgctxt "timerset:focus_length|accepts" +msgid "A positive integer number of minutes." +msgstr "B qptjujwf joufhfs ovncfs pg njovuft." + +#: src/modules/pomodoro/options.py:273 +msgctxt "timerset:focus_length|desc" +msgid "Please enter a positive number of minutes." +msgstr "Qmfbtf foufs b qptjujwf ovncfs pg njovuft." + +#: src/modules/pomodoro/options.py:281 +msgctxt "timerset:break_length" +msgid "break_length" +msgstr "csfbl_mfohui" + +#: src/modules/pomodoro/options.py:284 +msgctxt "timerset:break_length|desc" +msgid "Length of the break stage of the timer in minutes." +msgstr "Mfohui pg uif csfbl tubhf pg uif ujnfs jo njovuft." + +#: src/modules/pomodoro/options.py:289 +msgctxt "timerset:break_length|accepts" +msgid "A positive integer number of minutes." +msgstr "B qptjujwf joufhfs ovncfs pg njovuft." + +#: src/modules/pomodoro/options.py:314 +msgctxt "timerset:break_length|desc" +msgid "Please enter a positive number of minutes." +msgstr "Qmfbtf foufs b qptjujwf ovncfs pg njovuft." + +#: src/modules/pomodoro/settings.py:19 +msgctxt "guildset:pomodoro_channel" +msgid "pomodoro_channel" +msgstr "qpnpepsp_diboofm" + +#: src/modules/pomodoro/settings.py:22 +msgctxt "guildset:pomodoro_channel|desc" +msgid "Default central notification channel for pomodoro timers." +msgstr "Efgbvmu dfousbm opujgjdbujpo diboofm gps qpnpepsp ujnfst." + +#: src/modules/pomodoro/settings.py:26 +msgctxt "guildset:pomodoro_channel|long_desc" +msgid "" +"Pomodoro timers which do not have a custom notification channel set will " +"send timer notifications in this channel. If this setting is not set, " +"pomodoro notifications will default to the timer voice channel itself." +msgstr "" +"Qpnpepsp ujnfst xijdi ep opu ibwf b dvtupn opujgjdbujpo diboofm tfu xjmm " +"tfoe ujnfs opujgjdbujpot jo uijt diboofm. Jg uijt tfuujoh jt opu tfu, " +"qpnpepsp opujgjdbujpot xjmm efgbvmu up uif ujnfs wpjdf diboofm jutfmg." + +#: src/modules/pomodoro/settings.py:33 +msgctxt "guildset:pomodoro_channel|formatted|notset" +msgid "Not Set (Will use timer voice channel.)" +msgstr "Opu Tfu (Xjmm vtf ujnfs wpjdf diboofm.)" + +#: src/modules/pomodoro/settings.py:37 +msgctxt "guildset:pomodoro_channel|accepts" +msgid "Timer notification channel name or id." +msgstr "Ujnfs opujgjdbujpo diboofm obnf ps je." + +#: src/modules/pomodoro/settings.py:51 +#, possible-python-brace-format +msgctxt "guildset:pomodoro_channel|set_response|set" +msgid "Pomodoro timer notifications will now default to {channel}" +msgstr "Qpnpepsp ujnfs opujgjdbujpot xjmm opx efgbvmu up {channel}" + +#: src/modules/pomodoro/settings.py:56 +msgctxt "guildset:pomodoro_channel|set_response|unset" +msgid "Pomodoro timer notifications will now default to their voice channel." +msgstr "Qpnpepsp ujnfs opujgjdbujpot xjmm opx efgbvmu up uifjs wpjdf diboofm." + +#: src/modules/pomodoro/settings.py:66 +#, possible-python-brace-format +msgctxt "guildset:pomdoro_channel|set_using" +msgid "{cmd} or channel selector below." +msgstr "{cmd} ps diboofm tfmfdups cfmpx." + +#: src/modules/pomodoro/ui/edit.py:63 +msgctxt "modal:timer_editor|title" +msgid "Timer Option Editor" +msgstr "Ujnfs Pqujpo Fejups" + +#: src/modules/pomodoro/ui/status.py:61 +msgctxt "ui:timer_status|button:present|ack" +msgid "" +"Thank you for marking your presence.\n" +"Good luck and stay productive!" +msgstr "" +"Uibol zpv gps nbsljoh zpvs qsftfodf.\n" +"Hppe mvdl boe tubz qspevdujwf!" + +#: src/modules/pomodoro/ui/status.py:72 +#, possible-python-brace-format +msgctxt "ui:timer_status|button:present|error:not_in_timer" +msgid "" +"You are not in this timer! Join the timer channel by pressing {channel}." +msgstr "" +"Zpv bsf opu jo uijt ujnfs! Kpjo uif ujnfs diboofm cz qsfttjoh {channel}." + +#: src/modules/pomodoro/ui/status.py:82 +msgctxt "ui:timer_status|button:present|label" +msgid "Present" +msgstr "Qsftfou" + +#: src/modules/pomodoro/ui/status.py:106 +msgctxt "ui:timer_status|button:edit|error:no_permissions" +msgid "" +"Configuring this timer requires `MANAGE_CHANNEL` permissions on the timer " +"channel, or the configured manager role!" +msgstr "" +"Dpogjhvsjoh uijt ujnfs sfrvjsft `NBOBHF_DIBOOFM` qfsnjttjpot po uif ujnfs " +"diboofm, ps uif dpogjhvsfe nbobhfs spmf!" + +#: src/modules/pomodoro/ui/status.py:119 +msgctxt "ui:timer_status|button:edit|label" +msgid "Options" +msgstr "Pqujpot" + +#: src/modules/pomodoro/ui/status.py:138 +msgctxt "ui:timer_status|button:start|error:already_running" +msgid "Cannot start a timer that is already running!" +msgstr "Dboopu tubsu b ujnfs uibu jt bmsfbez svoojoh!" + +#: src/modules/pomodoro/ui/status.py:154 +msgctxt "ui:timer_status|button:start|error:not_manager|title" +msgid "Insufficient permissions!" +msgstr "Jotvggjdjfou qfsnjttjpot!" + +#: src/modules/pomodoro/ui/status.py:158 +msgctxt "ui:timer_status|button:start|error:not_manager|desc" +msgid "" +"Starting this timer requires `MANAGE_CHANNEL` permissions on the timer " +"channel, or the configured `manager_role`!" +msgstr "" +"Tubsujoh uijt ujnfs sfrvjsft `NBOBHF_DIBOOFM` qfsnjttjpot po uif ujnfs " +"diboofm, ps uif dpogjhvsfe `nbobhfs_spmf`!" + +#: src/modules/pomodoro/ui/status.py:168 +msgctxt "ui:timer_status|button:start|label" +msgid "Start" +msgstr "Tubsu" + +#: src/modules/pomodoro/ui/status.py:190 +msgctxt "ui:timer_status|button:stop|error:not_manager|title" +msgid "Insufficient permissions!" +msgstr "Jotvggjdjfou qfsnjttjpot!" + +#: src/modules/pomodoro/ui/status.py:194 +msgctxt "ui:timer_status|button:stop|error:not_manager|desc" +msgid "" +"Stopping this timer requires `MANAGE_CHANNEL` permissions on the timer " +"channel, or the configured `manager_role`!" +msgstr "" +"Tupqqjoh uijt ujnfs sfrvjsft `NBOBHF_DIBOOFM` qfsnjttjpot po uif ujnfs " +"diboofm, ps uif dpogjhvsfe `nbobhfs_spmf`!" + +#: src/modules/pomodoro/ui/status.py:204 +msgctxt "ui:timer_status|button:stop|label" +msgid "Stop" +msgstr "Tupq" + +#: src/modules/pomodoro/ui/config.py:45 +msgctxt "ui:timer_options|error:timer_destroyed" +msgid "This timer no longer exists! Closing option menu." +msgstr "Uijt ujnfs op mpohfs fyjtut! Dmptjoh pqujpo nfov." + +#: src/modules/pomodoro/ui/config.py:68 +msgctxt "ui:timer_options|button:edit|label" +msgid "Edit" +msgstr "Feju" + +#: src/modules/pomodoro/ui/config.py:84 +msgctxt "ui:timer_options|button:voice_alerts|label" +msgid "Voice Alerts" +msgstr "Wpjdf Bmfsut" + +#: src/modules/pomodoro/ui/config.py:105 +msgctxt "ui:timer_options|button:delete|success|title" +msgid "Timer Deleted" +msgstr "Ujnfs Efmfufe" + +#: src/modules/pomodoro/ui/config.py:109 +#, possible-python-brace-format +msgctxt "ui:timer_options|button:delete|success|description" +msgid "The timer in {channel} has been removed." +msgstr "Uif ujnfs jo {channel} ibt cffo sfnpwfe." + +#: src/modules/pomodoro/ui/config.py:117 +msgctxt "ui:timer_options|button:delete|label" +msgid "Delete" +msgstr "Efmfuf" + +#: src/modules/pomodoro/ui/config.py:136 +msgctxt "ui:timer_options|menu:voice_channel|placeholder" +msgid "Set Voice Channel" +msgstr "Tfu Wpjdf Diboofm" + +#: src/modules/pomodoro/ui/config.py:159 +msgctxt "ui:timer_options|menu:notification_channel|placeholder" +msgid "Set Notification Channel" +msgstr "Tfu Opujgjdbujpo Diboofm" + +#: src/modules/pomodoro/ui/config.py:174 +msgctxt "ui:timer_options|menu:manager_role|placeholder" +msgid "Set Manager Role" +msgstr "Tfu Nbobhfs Spmf" + +#: src/modules/pomodoro/ui/config.py:183 +#, possible-python-brace-format +msgctxt "ui:timer_options|embed|title" +msgid "Timer Control Panel for {channel}" +msgstr "Ujnfs Dpouspm Qbofm gps {channel}" + +#: src/modules/pomodoro/ui/config.py:190 +msgctxt "ui:timer_options|embed|footer" +msgid "Hover over the option names to view descriptions." +msgstr "Ipwfs pwfs uif pqujpo obnft up wjfx eftdsjqujpot." + +#: src/modules/pomodoro/ui/config.py:202 +msgctxt "ui:timer_options|embed|field:pattern|name" +msgid "Pattern" +msgstr "Qbuufso" + +#: src/modules/pomodoro/ui/config.py:205 +#, possible-python-brace-format +msgctxt "ui:timer_options|embed|field:pattern|value" +msgid "" +"**`{focus_len} minutes`** focus\n" +"**`{break_len} minutes`** break" +msgstr "" +"**`{focus_len} njovuft`** gpdvt\n" +"**`{break_len} njovuft`** csfbl" + +#: src/modules/pomodoro/ui/config.py:216 +msgctxt "ui:timer_options|embed|field:channel_name|name" +msgid "Channel Name Preview" +msgstr "Diboofm Obnf Qsfwjfx" + +#: src/modules/pomodoro/ui/config.py:220 +#, possible-python-brace-format +msgctxt "ui:timer_options|embed|field:channel_name|value" +msgid "" +"**`{name}`**\n" +"(The actual channel name may not match due to ratelimits.)" +msgstr "" +"**`{name}`**\n" +"(Uif bduvbm diboofm obnf nbz opu nbudi evf up sbufmjnjut.)" + +#: src/modules/pomodoro/ui/config.py:230 +msgctxt "ui:timer_options|embed|field:issues|name" +msgid "Issues" +msgstr "Jttvft" + +#: src/modules/pomodoro/ui/config.py:248 +msgctxt "ui:timer_options|issue:no_voice_channel" +msgid "The configured voice channel does not exist! Please update it below." +msgstr "Uif dpogjhvsfe wpjdf diboofm epft opu fyjtu! Qmfbtf vqebuf ju cfmpx." + +#: src/modules/pomodoro/ui/config.py:259 +#, possible-python-brace-format +msgctxt "ui:timer_options|issue:cannot_speak" +msgid "" +"Voice alerts are on, but I don't have speaking permissions in {channel}" +msgstr "" +"Wpjdf bmfsut bsf po, cvu J epo'u ibwf tqfbljoh qfsnjttjpot jo {channel}" + +#: src/modules/pomodoro/ui/config.py:266 +#, possible-python-brace-format +msgctxt "ui:timer_options|issue:cannot_change_name" +msgid "" +"I cannot update the name of {channel}! (Needs `MANAGE_CHANNELS` permission)" +msgstr "" +"J dboopu vqebuf uif obnf pg {channel}! (Offet `NBOBHF_DIBOOFMT` qfsnjttjpo)" + +#: src/modules/pomodoro/ui/config.py:277 +msgctxt "ui:timer_options|issue:notif_channel_dne" +msgid "Configured notification channel does not exist!" +msgstr "Dpogjhvsfe opujgjdbujpo diboofm epft opu fyjtu!" + +#: src/modules/pomodoro/ui/config.py:286 +#, possible-python-brace-format +msgctxt "ui:timer_options|issue:notif_channel_write" +msgid "" +"I cannot attach files (`ATTACH_FILES`) or send embeds (`EMBED_LINKS`) in " +"{channel}" +msgstr "" +"J dboopu buubdi gjmft (`BUUBDI_GJMFT`) ps tfoe fncfet (`FNCFE_MJOLT`) jo " +"{channel}" + +#: src/modules/pomodoro/ui/config.py:294 +#, possible-python-brace-format +msgctxt "ui:timer_options|issues:cannot_make_webhooks" +msgid "" +"I cannot create the notification webhook (`MANAGE_WEBHOOKS`) in {channel}" +msgstr "" +"J dboopu dsfbuf uif opujgjdbujpo xfcippl (`NBOBHF_XFCIPPLT`) jo {channel}" diff --git a/locales/ceaser/LC_MESSAGES/babel.po b/locales/ceaser/LC_MESSAGES/babel.po new file mode 100644 index 00000000..d5e2fedd --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/babel.po @@ -0,0 +1,389 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/babel/settingui.py:40 +msgctxt "ui:locale_config|button:force|label" +msgid "Toggle Force" +msgstr "Uphhmf Gpsdf" + +#: src/babel/settingui.py:49 +msgctxt "ui:locale_config|embed|title" +msgid "Language Configuration Panel" +msgstr "Mbohvbhf Dpogjhvsbujpo Qbofm" + +#: src/babel/settingui.py:83 +msgctxt "dash:locale|title" +msgid "Server Language Configuration ({commands[configure language]})" +msgstr "Tfswfs Mbohvbhf Dpogjhvsbujpo ({commands[configure language]})" + +#: src/babel/settingui.py:87 +msgctxt "dash:locale|dropdown|placeholder" +msgid "Server Language Panel" +msgstr "Tfswfs Mbohvbhf Qbofm" + +#: src/babel/cog.py:99 +msgctxt "cmd:configure_language" +msgid "language" +msgstr "mbohvbhf" + +#: src/babel/cog.py:101 +msgctxt "cmd:configure_language|desc" +msgid "Configure the default language I will use in this server." +msgstr "Dpogjhvsf uif efgbvmu mbohvbhf J xjmm vtf jo uijt tfswfs." + +#: src/babel/cog.py:147 +#, possible-python-brace-format +msgctxt "cmd:configure_language|error" +msgid "" +"You cannot enable `{force_setting}` without having a configured language!" +msgstr "" +"Zpv dboopu fobcmf `{force_setting}` xjuipvu ibwjoh b dpogjhvsfe mbohvbhf!" + +#: src/babel/cog.py:167 +msgctxt "cmd:configure_language|success" +msgid "Language settings updated!" +msgstr "Mbohvbhf tfuujoht vqebufe!" + +#: src/babel/cog.py:183 +msgctxt "cmd:userconfig_language" +msgid "language" +msgstr "mbohvbhf" + +#: src/babel/cog.py:186 +msgctxt "cmd:userconfig_language|desc" +msgid "Set your preferred interaction language." +msgstr "Tfu zpvs qsfgfssfe joufsbdujpo mbohvbhf." + +#: src/babel/cog.py:190 +msgctxt "cmd:userconfig_language|param:language" +msgid "language" +msgstr "mbohvbhf" + +#: src/babel/cog.py:195 +msgctxt "cmd:userconfig_language|param:language|desc" +msgid "Which language do you want me to respond in?" +msgstr "Xijdi mbohvbhf ep zpv xbou nf up sftqpoe jo?" + +#: src/babel/cog.py:211 +msgctxt "cmd:userconfig_language|button:reset|label" +msgid "Reset" +msgstr "Sftfu" + +#: src/babel/cog.py:251 +#, possible-python-brace-format +msgctxt "acmpl:language|no_match" +msgid "No supported languages matching {partial}" +msgstr "Op tvqqpsufe mbohvbhft nbudijoh {partial}" + +#: src/babel/utils.py:9 +msgctxt "utils|months" +msgid "" +"January,February,March,April,May,June,July,August,September,October,November,December" +msgstr "" +"Kbovbsz,Gfcsvbsz,Nbsdi,Bqsjm,Nbz,Kvof,Kvmz,Bvhvtu,Tfqufncfs,Pdupcfs,Opwfncfs,Efdfncfs" + +#: src/babel/utils.py:14 +msgctxt "utils|short_months" +msgid "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec" +msgstr "Kbo,Gfc,Nbs,Bqs,Nbz,Kvo,Kvm,Bvh,Tfq,Pdu,Opw,Efd" + +#: src/babel/settings.py:23 +msgctxt "settype:locale|accepts" +msgid "Enter a supported language (e.g. 'en-GB')." +msgstr "Foufs b tvqqpsufe mbohvbhf (f.h. 'fo-HC')." + +#: src/babel/settings.py:34 +msgctxt "settype:locale|summary_table|field:supported|key" +msgid "Supported" +msgstr "Tvqqpsufe" + +#: src/babel/settings.py:44 +msgctxt "settype:locale|formatted:unset" +msgid "Unset" +msgstr "Votfu" + +#: src/babel/settings.py:60 +#, possible-python-brace-format +msgctxt "settype:locale|error" +msgid "Sorry, we do not support the language `{lang}` at this time!" +msgstr "Tpssz, xf ep opu tvqqpsu uif mbohvbhf `{lang}` bu uijt ujnf!" + +#: src/babel/settings.py:75 +msgctxt "userset:locale" +msgid "language" +msgstr "mbohvbhf" + +#: src/babel/settings.py:76 +msgctxt "userset:locale|desc" +msgid "Your preferred language for interacting with me." +msgstr "Zpvs qsfgfssfe mbohvbhf gps joufsbdujoh xjui nf." + +#: src/babel/settings.py:79 +msgctxt "userset:locale|long_desc" +msgid "" +"The language you would prefer me to respond to commands and interactions in." +" Servers may be configured to override this with their own language." +msgstr "" +"Uif mbohvbhf zpv xpvme qsfgfs nf up sftqpoe up dpnnboet boe joufsbdujpot jo." +" Tfswfst nbz cf dpogjhvsfe up pwfssjef uijt xjui uifjs pxo mbohvbhf." + +#: src/babel/settings.py:90 +msgctxt "userset:locale|response" +msgid "You have unset your language." +msgstr "Zpv ibwf votfu zpvs mbohvbhf." + +#: src/babel/settings.py:92 +#, possible-python-brace-format +msgctxt "userset:locale|response" +msgid "You have set your language to {lang}." +msgstr "Zpv ibwf tfu zpvs mbohvbhf up {lang}." + +#: src/babel/settings.py:110 +msgctxt "guildset:force_locale" +msgid "force_language" +msgstr "gpsdf_mbohvbhf" + +#: src/babel/settings.py:112 +msgctxt "guildset:force_locale|desc" +msgid "" +"Whether to force all members to use the configured guild language when " +"interacting with me." +msgstr "" +"Xifuifs up gpsdf bmm nfncfst up vtf uif dpogjhvsfe hvjme mbohvbhf xifo " +"joufsbdujoh xjui nf." + +#: src/babel/settings.py:115 +msgctxt "guildset:force_locale|long_desc" +msgid "" +"When enabled, commands in this guild will always use the configured guild " +"language, regardless of the member's personally configured language." +msgstr "" +"Xifo fobcmfe, dpnnboet jo uijt hvjme xjmm bmxbzt vtf uif dpogjhvsfe hvjme " +"mbohvbhf, sfhbsemftt pg uif nfncfs't qfstpobmmz dpogjhvsfe mbohvbhf." + +#: src/babel/settings.py:119 +msgctxt "guildset:force_locale|output" +msgid "Enabled (members will be forced to use the server language)" +msgstr "Fobcmfe (nfncfst xjmm cf gpsdfe up vtf uif tfswfs mbohvbhf)" + +#: src/babel/settings.py:120 +msgctxt "guildset:force_locale|output" +msgid "Disabled (members may set their own language)" +msgstr "Ejtbcmfe (nfncfst nbz tfu uifjs pxo mbohvbhf)" + +#: src/babel/settings.py:134 +msgctxt "guildset:force_locale|response" +msgid "I will always use the set language in this server." +msgstr "J xjmm bmxbzt vtf uif tfu mbohvbhf jo uijt tfswfs." + +#: src/babel/settings.py:139 +msgctxt "guildset:force_locale|response" +msgid "I will now allow the members to set their own language here." +msgstr "J xjmm opx bmmpx uif nfncfst up tfu uifjs pxo mbohvbhf ifsf." + +#: src/babel/settings.py:156 +msgctxt "guildset:locale" +msgid "language" +msgstr "mbohvbhf" + +#: src/babel/settings.py:157 +msgctxt "guildset:locale|desc" +msgid "Your preferred language for interacting with me." +msgstr "Zpvs qsfgfssfe mbohvbhf gps joufsbdujoh xjui nf." + +#: src/babel/settings.py:160 +msgctxt "guildset:locale|long_desc" +msgid "" +"The default language to use for responses and interactions in this server. " +"Member's own configured language will override this for their commands " +"unless `force_language` is enabled." +msgstr "" +"Uif efgbvmu mbohvbhf up vtf gps sftqpotft boe joufsbdujpot jo uijt tfswfs. " +"Nfncfs't pxo dpogjhvsfe mbohvbhf xjmm pwfssjef uijt gps uifjs dpnnboet " +"vomftt `gpsdf_mbohvbhf` jt fobcmfe." + +#: src/babel/settings.py:172 +msgctxt "guildset:locale|response" +msgid "You have unset the guild language." +msgstr "Zpv ibwf votfu uif hvjme mbohvbhf." + +#: src/babel/settings.py:174 +#, possible-python-brace-format +msgctxt "guildset:locale|response" +msgid "You have set the guild language to {lang}." +msgstr "Zpv ibwf tfu uif hvjme mbohvbhf up {lang}." + +#: src/babel/enums.py:42 +msgctxt "localenames|locale:en-US" +msgid "American English" +msgstr "Bnfsjdbo Fohmjti" + +#: src/babel/enums.py:43 +msgctxt "localenames|locale:en-GB" +msgid "British English" +msgstr "Csjujti Fohmjti" + +#: src/babel/enums.py:44 +msgctxt "localenames|locale:bg" +msgid "Bulgarian" +msgstr "Cvmhbsjbo" + +#: src/babel/enums.py:45 +msgctxt "localenames|locale:zh-CN" +msgid "Chinese" +msgstr "Dijoftf" + +#: src/babel/enums.py:46 +msgctxt "localenames|locale:zh-TW" +msgid "Taiwan Chinese" +msgstr "Ubjxbo Dijoftf" + +#: src/babel/enums.py:47 +msgctxt "localenames|locale:hr" +msgid "Croatian" +msgstr "Dspbujbo" + +#: src/babel/enums.py:48 +msgctxt "localenames|locale:cs" +msgid "Czech" +msgstr "Dafdi" + +#: src/babel/enums.py:49 +msgctxt "localenames|locale:da" +msgid "Danish" +msgstr "Ebojti" + +#: src/babel/enums.py:50 +msgctxt "localenames|locale:nl" +msgid "Dutch" +msgstr "Evudi" + +#: src/babel/enums.py:51 +msgctxt "localenames|locale:fi" +msgid "Finnish" +msgstr "Gjoojti" + +#: src/babel/enums.py:52 +msgctxt "localenames|locale:fr" +msgid "French" +msgstr "Gsfodi" + +#: src/babel/enums.py:53 +msgctxt "localenames|locale:de" +msgid "German" +msgstr "Hfsnbo" + +#: src/babel/enums.py:54 +msgctxt "localenames|locale:el" +msgid "Greek" +msgstr "Hsffl" + +#: src/babel/enums.py:55 +msgctxt "localenames|locale:hi" +msgid "Hindi" +msgstr "Ijoej" + +#: src/babel/enums.py:56 +msgctxt "localenames|locale:hu" +msgid "Hungarian" +msgstr "Ivohbsjbo" + +#: src/babel/enums.py:57 +msgctxt "localenames|locale:it" +msgid "Italian" +msgstr "Jubmjbo" + +#: src/babel/enums.py:58 +msgctxt "localenames|locale:ja" +msgid "Japanese" +msgstr "Kbqboftf" + +#: src/babel/enums.py:59 +msgctxt "localenames|locale:ko" +msgid "Korean" +msgstr "Lpsfbo" + +#: src/babel/enums.py:60 +msgctxt "localenames|locale:lt" +msgid "Lithuanian" +msgstr "Mjuivbojbo" + +#: src/babel/enums.py:61 +msgctxt "localenames|locale:no" +msgid "Norwegian" +msgstr "Opsxfhjbo" + +#: src/babel/enums.py:62 +msgctxt "localenames|locale:pl" +msgid "Polish" +msgstr "Qpmjti" + +#: src/babel/enums.py:63 +msgctxt "localenames|locale:pt-BR" +msgid "Brazil Portuguese" +msgstr "Csbajm Qpsuvhvftf" + +#: src/babel/enums.py:64 +msgctxt "localenames|locale:ro" +msgid "Romanian" +msgstr "Spnbojbo" + +#: src/babel/enums.py:65 +msgctxt "localenames|locale:ru" +msgid "Russian" +msgstr "Svttjbo" + +#: src/babel/enums.py:66 +msgctxt "localenames|locale:es-ES" +msgid "Spain Spanish" +msgstr "Tqbjo Tqbojti" + +#: src/babel/enums.py:67 +msgctxt "localenames|locale:sv-SE" +msgid "Swedish" +msgstr "Txfejti" + +#: src/babel/enums.py:68 +msgctxt "localenames|locale:th" +msgid "Thai" +msgstr "Uibj" + +#: src/babel/enums.py:69 +msgctxt "localenames|locale:tr" +msgid "Turkish" +msgstr "Uvsljti" + +#: src/babel/enums.py:70 +msgctxt "localenames|locale:uk" +msgid "Ukrainian" +msgstr "Vlsbjojbo" + +#: src/babel/enums.py:71 +msgctxt "localenames|locale:vi" +msgid "Vietnamese" +msgstr "Wjfuobnftf" + +#: src/babel/enums.py:72 +msgctxt "localenames|locale:he" +msgid "Hebrew" +msgstr "Ifcsfx" + +#: src/babel/enums.py:73 +msgctxt "localenames|locale:he_IL" +msgid "Hebrew (Israel)" +msgstr "Ifcsfx (Jtsbfm)" diff --git a/locales/ceaser/LC_MESSAGES/base.po b/locales/ceaser/LC_MESSAGES/base.po new file mode 100644 index 00000000..165d56ae --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/base.po @@ -0,0 +1,33 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: bot/modules/sysadmin/exec_cog.py:70 +msgid "You cannot use this interface!" +msgstr "Zpv dboopu vtf uijt joufsgbdf!" + +#: bot/modules/sysadmin/exec_cog.py:252 bot/modules/sysadmin/exec_cog.py:254 +msgid "async" +msgstr "btzod" + +#: bot/modules/sysadmin/exec_cog.py:253 bot/modules/sysadmin/exec_cog.py:255 +msgid "Execute arbitrary code with Exec" +msgstr "Fyfdvuf bscjusbsz dpef xjui Fyfd" + +#: bot/modules/sysadmin/exec_cog.py:265 +msgid "eval" +msgstr "fwbm" diff --git a/locales/ceaser/LC_MESSAGES/config.po b/locales/ceaser/LC_MESSAGES/config.po new file mode 100644 index 00000000..c93465b7 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/config.po @@ -0,0 +1,85 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/config/general.py:41 +msgctxt "guildset:timezone" +msgid "timezone" +msgstr "ujnfapof" + +#: src/modules/config/general.py:44 +msgctxt "guildset:timezone|desc" +msgid "Guild timezone for statistics display." +msgstr "Hvjme ujnfapof gps tubujtujdt ejtqmbz." + +#: src/modules/config/general.py:48 +msgctxt "guildset:timezone|long_desc" +msgid "" +"Guild-wide timezone. Used to determine start of the day for the " +"leaderboards, and as the default statistics timezone for members who have " +"not set one." +msgstr "" +"Hvjme-xjef ujnfapof. Vtfe up efufsnjof tubsu pg uif ebz gps uif " +"mfbefscpbset, boe bt uif efgbvmu tubujtujdt ujnfapof gps nfncfst xip ibwf " +"opu tfu pof." + +#: src/modules/config/general.py:62 +#, possible-python-brace-format +msgctxt "guildset:timezone|response" +msgid "The guild timezone has been set to `{timezone}`." +msgstr "Uif hvjme ujnfapof ibt cffo tfu up `{timezone}`." + +#: src/modules/config/general.py:94 +msgctxt "cmd:configure_general" +msgid "general" +msgstr "hfofsbm" + +#: src/modules/config/general.py:95 +msgctxt "cmd:configure_general|desc" +msgid "General configuration panel" +msgstr "Hfofsbm dpogjhvsbujpo qbofm" + +#: src/modules/config/general.py:129 +msgctxt "cmd:configure_general|parse_failure:timezone" +msgid "Could not set the timezone!" +msgstr "Dpvme opu tfu uif ujnfapof!" + +#: src/modules/config/general.py:150 +msgctxt "cmd:configure_general|success" +msgid "Settings Updated!" +msgstr "Tfuujoht Vqebufe!" + +#: src/modules/config/general.py:165 +msgctxt "cmd:configure_general|panel|title" +msgid "General Configuration Panel" +msgstr "Hfofsbm Dpogjhvsbujpo Qbofm" + +#: src/modules/config/dashboard.py:98 +#, possible-python-brace-format +msgctxt "ui:dashboard|title" +msgid "Guild Dashboard (Page {page}/{total})" +msgstr "Hvjme Ebticpbse (Qbhf {page}/{total})" + +#: src/modules/config/dashboard.py:109 +msgctxt "ui:dashboard|footer" +msgid "Hover over setting names for a brief description" +msgstr "Ipwfs pwfs tfuujoh obnft gps b csjfg eftdsjqujpo" + +#: src/modules/config/dashboard.py:172 +msgctxt "ui:dashboard|menu:config|placeholder" +msgid "Open Configuration Panel" +msgstr "Pqfo Dpogjhvsbujpo Qbofm" diff --git a/locales/ceaser/LC_MESSAGES/core_config.po b/locales/ceaser/LC_MESSAGES/core_config.po new file mode 100644 index 00000000..79a8ead4 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/core_config.po @@ -0,0 +1,27 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/core/config.py:28 +msgctxt "group:configure" +msgid "configure" +msgstr "dpogjhvsf" + +#: src/core/config.py:29 +msgctxt "group:configure|desc" +msgid "View and adjust my configuration options." +msgstr "Wjfx boe bekvtu nz dpogjhvsbujpo pqujpot." diff --git a/locales/ceaser/LC_MESSAGES/economy.po b/locales/ceaser/LC_MESSAGES/economy.po new file mode 100644 index 00000000..975dccee --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/economy.po @@ -0,0 +1,577 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/economy/settingui.py:33 +msgctxt "ui:economy_config|embed|title" +msgid "Economy Configuration Panel" +msgstr "Fdpopnz Dpogjhvsbujpo Qbofm" + +#: src/modules/economy/settingui.py:68 +msgctxt "dash:economy|title" +msgid "Economy Configuration ({commands[configure economy]})" +msgstr "Fdpopnz Dpogjhvsbujpo ({commands[configure economy]})" + +#: src/modules/economy/settingui.py:72 +msgctxt "dash:economy|dropdown|placeholder" +msgid "Economy Panel" +msgstr "Fdpopnz Qbofm" + +#. ----- Economy group commands ----- +#: src/modules/economy/cog.py:86 +msgctxt "cmd:economy" +msgid "economy" +msgstr "fdpopnz" + +#: src/modules/economy/cog.py:92 +msgctxt "cmd:economy_balance" +msgid "balance" +msgstr "cbmbodf" + +#: src/modules/economy/cog.py:95 +msgctxt "cmd:economy_balance|desc" +msgid "Display or modify LionCoin balance for members and roles." +msgstr "Ejtqmbz ps npejgz MjpoDpjo cbmbodf gps nfncfst boe spmft." + +#: src/modules/economy/cog.py:99 +msgctxt "cmd:economy_balance|param:target" +msgid "target" +msgstr "ubshfu" + +#: src/modules/economy/cog.py:100 +msgctxt "cmd:economy_balance|param:add" +msgid "add" +msgstr "bee" + +#: src/modules/economy/cog.py:101 +msgctxt "cmd:economy_balance|param:set" +msgid "set" +msgstr "tfu" + +#: src/modules/economy/cog.py:106 +msgctxt "cmd:economy_balance|param:target|desc" +msgid "" +"Target user or role to view or update. Use @everyone to update the entire " +"guild." +msgstr "" +"Ubshfu vtfs ps spmf up wjfx ps vqebuf. Vtf @fwfszpof up vqebuf uif foujsf " +"hvjme." + +#: src/modules/economy/cog.py:110 +msgctxt "cmd:economy_balance|param:add|desc" +msgid "" +"Number of LionCoins to add to the target member's balance. May be negative " +"to remove." +msgstr "" +"Ovncfs pg MjpoDpjot up bee up uif ubshfu nfncfs't cbmbodf. Nbz cf ofhbujwf " +"up sfnpwf." + +#: src/modules/economy/cog.py:114 +msgctxt "cmd:economy_balance|param:set|set" +msgid "New balance to set the target's balance to." +msgstr "Ofx cbmbodf up tfu uif ubshfu't cbmbodf up." + +#: src/modules/economy/cog.py:152 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|error:no_target" +msgid "" +"There are no valid members in {role.mention}! It has a total of `0` LC." +msgstr "" +"Uifsf bsf op wbmje nfncfst jo {role.mention}! Ju ibt b upubm pg `0` MD." + +#: src/modules/economy/cog.py:163 +msgctxt "cmd:economy_balance|error:target_is_bot" +msgid "Bots cannot have coin balances!" +msgstr "Cput dboopu ibwf dpjo cbmbodft!" + +#: src/modules/economy/cog.py:174 +msgctxt "cmd:economy_balance|error:args" +msgid "You cannot simultaneously `set` and `add` member balances!" +msgstr "Zpv dboopu tjnvmubofpvtmz `tfu` boe `bee` nfncfs cbmbodft!" + +#: src/modules/economy/cog.py:223 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success|affected" +msgid "One user was affected." +msgid_plural "**{count}** users were affected." +msgstr[0] "Pof vtfs xbt bggfdufe." +msgstr[1] "**{count}** vtfst xfsf bggfdufe." + +#: src/modules/economy/cog.py:229 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm|affected" +msgid "One user will be affected." +msgid_plural "**{count}** users will be affected." +msgstr[0] "Pof vtfs xjmm cf bggfdufe." +msgstr[1] "**{count}** vtfst xjmm cf bggfdufe." + +#: src/modules/economy/cog.py:236 +msgctxt "cmd:economy_balance|confirm|button:confirm" +msgid "Yes, adjust balances" +msgstr "Zft, bekvtu cbmbodft" + +#: src/modules/economy/cog.py:240 +msgctxt "cmd:economy_balance|confirm|button:cancel" +msgid "No, cancel" +msgstr "Op, dbodfm" + +#: src/modules/economy/cog.py:247 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_set|desc" +msgid "" +"All members of **{guild_name}** have had their balance set to " +"{coin_emoji}**{amount}**." +msgstr "" +"Bmm nfncfst pg **{guild_name}** ibwf ibe uifjs cbmbodf tfu up " +"{coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:256 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm_set|desc" +msgid "" +"Are you sure you want to set everyone's balance to {coin_emoji}**{amount}**?" +msgstr "" +"Bsf zpv tvsf zpv xbou up tfu fwfszpof't cbmbodf up {coin_emoji}**{amount}**?" + +#: src/modules/economy/cog.py:264 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_set|desc" +msgid "" +"All members of {role_mention} have had their balance set to " +"{coin_emoji}**{amount}**." +msgstr "" +"Bmm nfncfst pg {role_mention} ibwf ibe uifjs cbmbodf tfu up " +"{coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:273 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm_set|desc" +msgid "" +"Are you sure you want to set the balance of everyone with {role_mention} to " +"{coin_emoji}**{amount}**?" +msgstr "" +"Bsf zpv tvsf zpv xbou up tfu uif cbmbodf pg fwfszpof xjui {role_mention} up " +"{coin_emoji}**{amount}**?" + +#: src/modules/economy/cog.py:290 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_set|desc" +msgid "{user_mention} now has a balance of {coin_emoji}**{amount}**." +msgstr "{user_mention} opx ibt b cbmbodf pg {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:306 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_add|desc" +msgid "" +"All members of **{guild_name}** have been given {coin_emoji}**{amount}**." +msgstr "" +"Bmm nfncfst pg **{guild_name}** ibwf cffo hjwfo {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:315 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm_add|desc" +msgid "Are you sure you want to add **{amount}** to everyone's balance?" +msgstr "Bsf zpv tvsf zpv xbou up bee **{amount}** up fwfszpof't cbmbodf?" + +#: src/modules/economy/cog.py:323 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_add|desc" +msgid "" +"All members of {role_mention} have been given {coin_emoji}**{amount}**." +msgstr "" +"Bmm nfncfst pg {role_mention} ibwf cffo hjwfo {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:332 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm_add|desc" +msgid "" +"Are you sure you want to add {coin_emoji}**{amount}** to everyone in " +"{role_mention}?" +msgstr "" +"Bsf zpv tvsf zpv xbou up bee {coin_emoji}**{amount}** up fwfszpof jo " +"{role_mention}?" + +#: src/modules/economy/cog.py:354 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_add|desc" +msgid "" +"{user_mention} was given {coin_emoji}**{amount}**, and now has a balance of " +"{coin_emoji}**{new_amount}**." +msgstr "" +"{user_mention} xbt hjwfo {coin_emoji}**{amount}**, boe opx ibt b cbmbodf pg " +"{coin_emoji}**{new_amount}**." + +#: src/modules/economy/cog.py:365 +msgctxt "cmd:economy_balance|embed:success|title" +msgid "Account successfully updated." +msgid_plural "Accounts successfully updated." +msgstr[0] "Bddpvou tvddfttgvmmz vqebufe." +msgstr[1] "Bddpvout tvddfttgvmmz vqebufe." + +#: src/modules/economy/cog.py:409 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|author" +msgid "Balance sheet for {name}" +msgstr "Cbmbodf tiffu gps {name}" + +#: src/modules/economy/cog.py:415 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|header" +msgid "This server has a total balance of {coin_emoji}**{total}**." +msgstr "Uijt tfswfs ibt b upubm cbmbodf pg {coin_emoji}**{total}**." + +#: src/modules/economy/cog.py:423 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|header" +msgid "" +"{role_mention} has `{count}` members with non-zero balance, with a total " +"balance of {coin_emoji}**{total}**." +msgstr "" +"{role_mention} ibt `{count}` nfncfst xjui opo-afsp cbmbodf, xjui b upubm " +"cbmbodf pg {coin_emoji}**{total}**." + +#: src/modules/economy/cog.py:435 +msgctxt "cmd:economy_balance|embed:role_lb|row_format" +msgid "`[{pos:>{numwidth}}]` | `{coins:>{coinwidth}} LC` | {mention}" +msgstr "`[{pos:>{ovnxjeui}}]` | `{coins:>{dpjoxjeui}} MD` | {mention}" + +#: src/modules/economy/cog.py:463 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|footer" +msgid "Page {page}/{total}" +msgstr "Qbhf {page}/{total}" + +#: src/modules/economy/cog.py:473 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|header" +msgid "This server has a total balance of {coin_emoji}**0**." +msgstr "Uijt tfswfs ibt b upubm cbmbodf pg {coin_emoji}**0**." + +#: src/modules/economy/cog.py:480 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|header" +msgid "The role {role_mention} has a total balance of {coin_emoji}**0**." +msgstr "Uif spmf {role_mention} ibt b upubm cbmbodf pg {coin_emoji}**0**." + +#: src/modules/economy/cog.py:500 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:single|desc" +msgid "{mention} currently owns {coin_emoji} {coins}." +msgstr "{mention} dvssfoumz pxot {coin_emoji} {coins}." + +#: src/modules/economy/cog.py:510 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:single|author" +msgid "Balance statement for {user}" +msgstr "Cbmbodf tubufnfou gps {user}" + +#: src/modules/economy/cog.py:519 +msgctxt "cmd:economy_reset" +msgid "reset" +msgstr "sftfu" + +#: src/modules/economy/cog.py:522 +msgctxt "cmd:economy_reset|desc" +msgid "" +"Reset the coin balance for a target user or role. (See also \"economy " +"balance\".)" +msgstr "" +"Sftfu uif dpjo cbmbodf gps b ubshfu vtfs ps spmf. (Tff bmtp \"fdpopnz " +"cbmbodf\".)" + +#: src/modules/economy/cog.py:526 +msgctxt "cmd:economy_reset|param:target" +msgid "target" +msgstr "ubshfu" + +#: src/modules/economy/cog.py:531 +msgctxt "cmd:economy_reset|param:target|desc" +msgid "" +"Target user or role to view or update. Use @everyone to reset the entire " +"guild." +msgstr "" +"Ubshfu vtfs ps spmf up wjfx ps vqebuf. Vtf @fwfszpof up sftfu uif foujsf " +"hvjme." + +#: src/modules/economy/cog.py:558 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|confirm:reset_guild|desc" +msgid "" +"Are you sure you want to reset the coin balance for everyone in **{guild_name}**?\n" +"*This is not reversible!*" +msgstr "" +"Bsf zpv tvsf zpv xbou up sftfu uif dpjo cbmbodf gps fwfszpof jo **{guild_name}**?\n" +"*Uijt jt opu sfwfstjcmf!*" + +#: src/modules/economy/cog.py:566 +msgctxt "cmd:economy_reset|confirm:reset_guild|button:confirm" +msgid "Yes, reset the economy" +msgstr "Zft, sftfu uif fdpopnz" + +#: src/modules/economy/cog.py:570 +msgctxt "cmd:economy_reset|confirm:reset_guild|button:cancel" +msgid "Cancel reset" +msgstr "Dbodfm sftfu" + +#: src/modules/economy/cog.py:586 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|embed:success_guild|desc" +msgid "" +"Everyone in **{guild_name}** has had their balance reset to " +"{coin_emoji}**{amount}**." +msgstr "" +"Fwfszpof jo **{guild_name}** ibt ibe uifjs cbmbodf sftfu up " +"{coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:603 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|error:no_target|desc" +msgid "The role {mention} has no members to reset!" +msgstr "Uif spmf {mention} ibt op nfncfst up sftfu!" + +#: src/modules/economy/cog.py:613 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|confirm:reset_role|desc" +msgid "" +"Are you sure you want to reset the balance for everyone in {mention}?\n" +"**{count}** members will be affected." +msgstr "" +"Bsf zpv tvsf zpv xbou up sftfu uif cbmbodf gps fwfszpof jo {mention}?\n" +"**{count}** nfncfst xjmm cf bggfdufe." + +#: src/modules/economy/cog.py:622 +msgctxt "cmd:economy_reset|confirm:reset_role|button:confirm" +msgid "Yes, complete economy reset" +msgstr "Zft, dpnqmfuf fdpopnz sftfu" + +#: src/modules/economy/cog.py:626 +msgctxt "cmd:economy_reset|confirm:reset_role|button:cancel" +msgid "Cancel" +msgstr "Dbodfm" + +#: src/modules/economy/cog.py:643 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|embed:success_role|desc" +msgid "" +"Everyone in {role_mention} has had their coin balance reset to " +"{coin_emoji}**{amount}**." +msgstr "" +"Fwfszpof jo {role_mention} ibt ibe uifjs dpjo cbmbodf sftfu up " +"{coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:665 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|embed:success_user|desc" +msgid "{mention}'s balance has been reset to {coin_emoji}**{amount}**." +msgstr "{mention}'t cbmbodf ibt cffo sftfu up {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:675 +msgctxt "cmd:send" +msgid "send" +msgstr "tfoe" + +#: src/modules/economy/cog.py:678 +msgctxt "cmd:send|desc" +msgid "Gift the target user a certain number of LionCoins." +msgstr "Hjgu uif ubshfu vtfs b dfsubjo ovncfs pg MjpoDpjot." + +#: src/modules/economy/cog.py:682 +msgctxt "cmd:send|param:target" +msgid "target" +msgstr "ubshfu" + +#: src/modules/economy/cog.py:683 +msgctxt "cmd:send|param:amount" +msgid "amount" +msgstr "bnpvou" + +#: src/modules/economy/cog.py:684 +msgctxt "cmd:send|param:note" +msgid "note" +msgstr "opuf" + +#: src/modules/economy/cog.py:687 +msgctxt "cmd:send|param:target|desc" +msgid "User to send the gift to" +msgstr "Vtfs up tfoe uif hjgu up" + +#: src/modules/economy/cog.py:688 +msgctxt "cmd:send|param:amount|desc" +msgid "Number of coins to send" +msgstr "Ovncfs pg dpjot up tfoe" + +#: src/modules/economy/cog.py:689 +msgctxt "cmd:send|param:note|desc" +msgid "Optional note to add to the gift." +msgstr "Pqujpobm opuf up bee up uif hjgu." + +#: src/modules/economy/cog.py:713 +msgctxt "cmd:send|error:not_allowed" +msgid "Sorry, this server has disabled LionCoin transfers!" +msgstr "Tpssz, uijt tfswfs ibt ejtbcmfe MjpoDpjo usbotgfst!" + +#: src/modules/economy/cog.py:722 +msgctxt "cmd:send|error:sending-to-self" +msgid "" +"What is this, tax evasion?\n" +"(You can not send coins to yourself.)" +msgstr "" +"Xibu jt uijt, uby fwbtjpo?\n" +"(Zpv dbo opu tfoe dpjot up zpvstfmg.)" + +#: src/modules/economy/cog.py:732 +msgctxt "cmd:send|error:sending-to-leo" +msgid "" +"I appreciate it, but you need it more than I do!\n" +"(You cannot send coins to bots.)" +msgstr "" +"J bqqsfdjbuf ju, cvu zpv offe ju npsf uibo J ep!\n" +"(Zpv dboopu tfoe dpjot up cput.)" + +#: src/modules/economy/cog.py:742 +#, possible-python-brace-format +msgctxt "cmd:send|error:sending-to-bot" +msgid "" +"{target} appreciates the gesture, but said they don't have any use for {coin}.\n" +"(You cannot send coins to bots.)" +msgstr "" +"{target} bqqsfdjbuft uif hftuvsf, cvu tbje uifz epo'u ibwf boz vtf gps {coin}.\n" +"(Zpv dboopu tfoe dpjot up cput.)" + +#: src/modules/economy/cog.py:770 +#, possible-python-brace-format +msgctxt "cmd:send|error:insufficient" +msgid "" +"You do not have enough lioncoins to do this!\n" +"`Current Balance:` {coin_emoji}{balance}" +msgstr "" +"Zpv ep opu ibwf fopvhi mjpodpjot up ep uijt!\n" +"`Dvssfou Cbmbodf:` {coin_emoji}{balance}" + +#: src/modules/economy/cog.py:791 +#, possible-python-brace-format +msgctxt "cmd:send|embed:gift|title" +msgid "{user} sent you a gift!" +msgstr "{user} tfou zpv b hjgu!" + +#: src/modules/economy/cog.py:795 +#, possible-python-brace-format +msgctxt "cmd:send|embed:gift|desc" +msgid "{mention} sent you {coin_emoji}**{amount}**." +msgstr "{mention} tfou zpv {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:820 +#, possible-python-brace-format +msgctxt "cmd:send|embed:ack|desc" +msgid "" +"**{coin_emoji}{amount}** has been deducted from your balance and sent to " +"{mention}!" +msgstr "" +"**{coin_emoji}{amount}** ibt cffo efevdufe gspn zpvs cbmbodf boe tfou up " +"{mention}!" + +#: src/modules/economy/cog.py:830 +msgctxt "cmd:send|embed:ack|desc|error:unreachable" +msgid "" +"Unfortunately, I was not able to message the recipient. Perhaps they have me" +" blocked?" +msgstr "" +"Vogpsuvobufmz, J xbt opu bcmf up nfttbhf uif sfdjqjfou. Qfsibqt uifz ibwf nf" +" cmpdlfe?" + +#: src/modules/economy/cog.py:842 +msgctxt "cmd:configure_economy" +msgid "economy" +msgstr "fdpopnz" + +#: src/modules/economy/cog.py:845 +msgctxt "cmd:configure_economy|desc" +msgid "Configure LionCoin Economy" +msgstr "Dpogjhvsf MjpoDpjo Fdpopnz" + +#: src/modules/economy/settings.py:35 +msgctxt "guildset:coins_per_xp" +msgid "coins_per_100xp" +msgstr "dpjot_qfs_100yq" + +#: src/modules/economy/settings.py:38 +msgctxt "guildset:coins_per_xp|desc" +msgid "How many LionCoins to reward members per 100 XP they earn." +msgstr "Ipx nboz MjpoDpjot up sfxbse nfncfst qfs 100 YQ uifz fbso." + +#: src/modules/economy/settings.py:42 +msgctxt "guildset:coins_per_xp|long_desc" +msgid "" +"Members will be rewarded with this many LionCoins for every 100 XP they " +"earn." +msgstr "" +"Nfncfst xjmm cf sfxbsefe xjui uijt nboz MjpoDpjot gps fwfsz 100 YQ uifz " +"fbso." + +#: src/modules/economy/settings.py:46 +msgctxt "guildset:coins_per_xp|long_desc" +msgid "The number of coins to reward per 100 XP." +msgstr "Uif ovncfs pg dpjot up sfxbse qfs 100 YQ." + +#: src/modules/economy/settings.py:59 +#, possible-python-brace-format +msgctxt "guildset:coins_per_xp|set_response" +msgid "" +"For every **100** XP they earn, members will now be given " +"{coin}**{amount}**." +msgstr "" +"Gps fwfsz **100** YQ uifz fbso, nfncfst xjmm opx cf hjwfo " +"{coin}**{amount}**." + +#: src/modules/economy/settings.py:70 +msgctxt "guildset:allow_transfers" +msgid "allow_transfers" +msgstr "bmmpx_usbotgfst" + +#: src/modules/economy/settings.py:73 +msgctxt "guildset:allow_transfers|desc" +msgid "Whether to allow members to transfer LionCoins to each other." +msgstr "Xifuifs up bmmpx nfncfst up usbotgfs MjpoDpjot up fbdi puifs." + +#: src/modules/economy/settings.py:77 +msgctxt "guildset:allow_transfers|long_desc" +msgid "" +"If disabled, members will not be able to transfer LionCoins to each other." +msgstr "" +"Jg ejtbcmfe, nfncfst xjmm opu cf bcmf up usbotgfs MjpoDpjot up fbdi puifs." + +#: src/modules/economy/settings.py:85 +msgctxt "guildset:allow_transfers|outputs:true" +msgid "Enabled (Coin transfers allowed.)" +msgstr "Fobcmfe (Dpjo usbotgfst bmmpxfe.)" + +#: src/modules/economy/settings.py:86 +msgctxt "guildset:allow_transfers|outputs:false" +msgid "Disabled (Coin transfers not allowed.)" +msgstr "Ejtbcmfe (Dpjo usbotgfst opu bmmpxfe.)" + +#: src/modules/economy/settings.py:102 +#, possible-python-brace-format +msgctxt "guildset:allow_transfers|set_response|set:true" +msgid "Members will now be able to use {send_cmd} to transfer {coin}" +msgstr "Nfncfst xjmm opx cf bcmf up vtf {send_cmd} up usbotgfs {coin}" + +#: src/modules/economy/settings.py:107 +#, possible-python-brace-format +msgctxt "guildset:allow_transfers|set_response|set:false" +msgid "Members will not be able to use {send_cmd} to transfer {coin}" +msgstr "Nfncfst xjmm opu cf bcmf up vtf {send_cmd} up usbotgfs {coin}" diff --git a/locales/ceaser/LC_MESSAGES/exec.po b/locales/ceaser/LC_MESSAGES/exec.po new file mode 100644 index 00000000..5c3ddaba --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/exec.po @@ -0,0 +1,89 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/sysadmin/exec_cog.py:257 +msgctxt "ward:sys_admin|failed" +msgid "You must be a bot owner to do this!" +msgstr "Zpv nvtu cf b cpu pxofs up ep uijt!" + +#: src/modules/sysadmin/exec_cog.py:262 +msgid "async" +msgstr "btzod" + +#: src/modules/sysadmin/exec_cog.py:263 +msgid "Execute arbitrary code with Exec" +msgstr "Fyfdvuf bscjusbsz dpef xjui Fyfd" + +#: src/modules/sysadmin/exec_cog.py:325 +msgctxt "command" +msgid "eval" +msgstr "fwbm" + +#: src/modules/sysadmin/exec_cog.py:326 +msgctxt "command:eval" +msgid "Execute arbitrary code with Eval" +msgstr "Fyfdvuf bscjusbsz dpef xjui Fwbm" + +#: src/modules/sysadmin/exec_cog.py:329 +msgctxt "command:eval|param:string" +msgid "Code to evaluate." +msgstr "Dpef up fwbmvbuf." + +#: src/modules/sysadmin/exec_cog.py:336 +msgctxt "command" +msgid "asyncall" +msgstr "btzodbmm" + +#: src/modules/sysadmin/exec_cog.py:337 +msgctxt "command:asyncall|desc" +msgid "Execute arbitrary code on all shards." +msgstr "Fyfdvuf bscjusbsz dpef po bmm tibset." + +#: src/modules/sysadmin/exec_cog.py:340 +msgctxt "command:asyncall|param:string" +msgid "Cross-shard code to execute. Cannot reference ctx!" +msgstr "Dsptt-tibse dpef up fyfdvuf. Dboopu sfgfsfodf duy!" + +#: src/modules/sysadmin/exec_cog.py:341 +msgctxt "command:asyncall|param:target" +msgid "Target shard app name, see autocomplete for options." +msgstr "Ubshfu tibse bqq obnf, tff bvupdpnqmfuf gps pqujpot." + +#: src/modules/sysadmin/exec_cog.py:384 +msgid "reload" +msgstr "sfmpbe" + +#: src/modules/sysadmin/exec_cog.py:385 +msgid "Reload a given LionBot extension. Launches an ExecUI." +msgstr "Sfmpbe b hjwfo MjpoCpu fyufotjpo. Mbvodift bo FyfdVJ." + +#: src/modules/sysadmin/exec_cog.py:388 +msgid "Name of the extension to reload. See autocomplete for options." +msgstr "Obnf pg uif fyufotjpo up sfmpbe. Tff bvupdpnqmfuf gps pqujpot." + +#: src/modules/sysadmin/exec_cog.py:389 +msgid "Whether to force an extension reload even if it doesn't exist." +msgstr "Xifuifs up gpsdf bo fyufotjpo sfmpbe fwfo jg ju epfto'u fyjtu." + +#: src/modules/sysadmin/exec_cog.py:425 +msgid "shutdown" +msgstr "tivuepxo" + +#: src/modules/sysadmin/exec_cog.py:426 +msgid "Shutdown (or restart) the client." +msgstr "Tivuepxo (ps sftubsu) uif dmjfou." diff --git a/locales/ceaser/LC_MESSAGES/goals-gui.po b/locales/ceaser/LC_MESSAGES/goals-gui.po new file mode 100644 index 00000000..e3689c5a --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/goals-gui.po @@ -0,0 +1,102 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/cards/goals.py:97 +msgctxt "skin:goals|goal:tasks|name" +msgid "TASKS DONE" +msgstr "UBTLT EPOF" + +#: src/gui/cards/goals.py:101 +msgctxt "skin:goals|goal:tasks|goal" +msgid "GOAL: " +msgstr "HPBM: " + +#: src/gui/cards/goals.py:127 +msgctxt "skin:goals|goal:attendance|name" +msgid "" +"ATTENDANCE\n" +"RATE" +msgstr "" +"BUUFOEBODF\n" +"SBUF" + +#: src/gui/cards/goals.py:141 +msgctxt "skin:goals|mode:study|goal:middle|above" +msgid "STUDIED" +msgstr "TUVEJFE" + +#: src/gui/cards/goals.py:145 +msgctxt "skin:goals|mode:study|goal:middle|below" +msgid "HOURS" +msgstr "IPVST" + +#: src/gui/cards/goals.py:149 +msgctxt "skin:goals|mode:voice|goal:middle|above" +msgid "CHATTED" +msgstr "DIBUUFE" + +#: src/gui/cards/goals.py:153 +msgctxt "skin:goals|mode:voice|goal:middle|below" +msgid "HOURS" +msgstr "IPVST" + +#: src/gui/cards/goals.py:157 +msgctxt "skin:goals|mode:text|goal:middle|above" +msgid "SENT" +msgstr "TFOU" + +#: src/gui/cards/goals.py:161 +msgctxt "skin:goals|mode:text|goal:middle|below" +msgid "MESSAGES" +msgstr "NFTTBHFT" + +#: src/gui/cards/goals.py:165 +msgctxt "skin:goals|mode:anki|goal:middle|above" +msgid "REVIEWED" +msgstr "SFWJFXFE" + +#: src/gui/cards/goals.py:169 +msgctxt "skin:goals|mode:anki|goal:middle|below" +msgid "CARDS" +msgstr "DBSET" + +#: src/gui/cards/goals.py:230 +#, possible-python-brace-format +msgctxt "skin:goals|footer" +msgid "As of {day} {month} • {name}" +msgstr "Bt pg {day} {month} • {name}" + +#: src/gui/cards/goals.py:242 +msgctxt "ui:goals|weekly|title" +msgid "WEEKLY STATISTICS" +msgstr "XFFLMZ TUBUJTUJDT" + +#: src/gui/cards/goals.py:246 +msgctxt "ui:goals|weekly|task_header" +msgid "GOALS OF THE WEEK" +msgstr "HPBMT PG UIF XFFL" + +#: src/gui/cards/goals.py:256 +msgctxt "ui:goals|monthly|title" +msgid "MONTHLY STATISTICS" +msgstr "NPOUIMZ TUBUJTUJDT" + +#: src/gui/cards/goals.py:260 +msgctxt "ui:goals|monthly|task_header" +msgid "GOALS OF THE MONTH" +msgstr "HPBMT PG UIF NPOUI" diff --git a/locales/ceaser/LC_MESSAGES/leaderboard-gui.po b/locales/ceaser/LC_MESSAGES/leaderboard-gui.po new file mode 100644 index 00000000..bb07a2ea --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/leaderboard-gui.po @@ -0,0 +1,90 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/cards/leaderboard.py:69 +msgctxt "skin:leaderboard|mode:study|header_text" +msgid "STUDY TIME LEADERBOARD" +msgstr "TUVEZ UJNF MFBEFSCPBSE" + +#: src/gui/cards/leaderboard.py:73 +msgctxt "skin:leaderboard|mode:text|header_text" +msgid "MESSAGE LEADERBOARD" +msgstr "NFTTBHF MFBEFSCPBSE" + +#: src/gui/cards/leaderboard.py:77 +msgctxt "skin:leaderboard|mode:voice|header_text" +msgid "VOICE LEADERBOARD" +msgstr "WPJDF MFBEFSCPBSE" + +#: src/gui/cards/leaderboard.py:81 +msgctxt "skin:leaderboard|mode:anki|header_text" +msgid "ANKI REVIEW LEADERBOARD" +msgstr "BOLJ SFWJFX MFBEFSCPBSE" + +#: src/gui/cards/leaderboard.py:99 +msgctxt "skin:leaderboard|field:subheader_text" +msgid "SERVER: " +msgstr "TFSWFS: " + +#: src/gui/cards/leaderboard.py:129 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:study|top_hours_text" +msgid "{amount} hours" +msgstr "{amount} ipvst" + +#: src/gui/cards/leaderboard.py:133 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:text|top_hours_text" +msgid "{amount} XP" +msgstr "{amount} YQ" + +#: src/gui/cards/leaderboard.py:137 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:voice|top_hours_text" +msgid "{amount} hours" +msgstr "{amount} ipvst" + +#: src/gui/cards/leaderboard.py:141 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:anki|top_hours_text" +msgid "{amount} cards" +msgstr "{amount} dbset" + +#: src/gui/cards/leaderboard.py:168 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:study|entry_hours_text" +msgid "{HH:02d}:{MM:02d}" +msgstr "{HH:02d}:{MM:02d}" + +#: src/gui/cards/leaderboard.py:172 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:text|entry_hours_text" +msgid "{amount} XP" +msgstr "{amount} YQ" + +#: src/gui/cards/leaderboard.py:176 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:voice|entry_hours_text" +msgid "{HH:02d}:{MM:02d}" +msgstr "{HH:02d}:{MM:02d}" + +#: src/gui/cards/leaderboard.py:180 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:anki|entry_hours_text" +msgid "{amount} cards" +msgstr "{amount} dbset" diff --git a/locales/ceaser/LC_MESSAGES/lion-core.po b/locales/ceaser/LC_MESSAGES/lion-core.po new file mode 100644 index 00000000..6d6757ef --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/lion-core.po @@ -0,0 +1,131 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/core/setting_types.py:31 +msgctxt "settype:coin|accepts" +msgid "A positive integral number of coins." +msgstr "B qptjujwf joufhsbm ovncfs pg dpjot." + +#: src/core/setting_types.py:47 +msgctxt "settype:coin|parse|error:notinteger" +msgid "The coin quantity must be a positive integer!" +msgstr "Uif dpjo rvboujuz nvtu cf b qptjujwf joufhfs!" + +#: src/core/setting_types.py:54 +msgctxt "settype:coin|parse|error:too_large" +msgid "Provided number of coins was too high!" +msgstr "Qspwjefe ovncfs pg dpjot xbt upp ijhi!" + +#: src/core/setting_types.py:60 +msgctxt "settype:coin|parse|error:too_large" +msgid "Provided number of coins was too low!" +msgstr "Qspwjefe ovncfs pg dpjot xbt upp mpx!" + +#: src/core/setting_types.py:71 +#, possible-python-brace-format +msgctxt "settype:coin|formatted" +msgid "{coin}**{amount}**" +msgstr "{coin}**{amount}**" + +#: src/core/setting_types.py:87 +msgctxt "settype:message|accepts" +msgid "JSON formatted raw message data" +msgstr "KTPO gpsnbuufe sbx nfttbhf ebub" + +#: src/core/setting_types.py:102 +msgctxt "settype:message|download|error:not_json" +msgid "The attached message data is not a JSON file!" +msgstr "Uif buubdife nfttbhf ebub jt opu b KTPO gjmf!" + +#: src/core/setting_types.py:107 +msgctxt "settype:message|download|error:size" +msgid "The attached message data is too large!" +msgstr "Uif buubdife nfttbhf ebub jt upp mbshf!" + +#: src/core/setting_types.py:116 +msgctxt "settype:message|download|error:decoding" +msgid "" +"Could not decode the message data. Please ensure it is saved with the " +"`UTF-8` encoding." +msgstr "" +"Dpvme opu efdpef uif nfttbhf ebub. Qmfbtf fotvsf ju jt tbwfe xjui uif " +"`VUG-8` fodpejoh." + +#: src/core/setting_types.py:173 +#, possible-python-brace-format +msgctxt "settype:message|error_suffix" +msgid "" +"You can view, test, and fix your embed using the online [embed " +"builder]({link})." +msgstr "" +"Zpv dbo wjfx, uftu, boe gjy zpvs fncfe vtjoh uif pomjof [fncfe " +"cvjmefs]({link})." + +#: src/core/setting_types.py:185 +#, possible-python-brace-format +msgctxt "settype:message|error:invalid_json" +msgid "" +"The provided message data was not a valid JSON document!\n" +"`{error}`" +msgstr "" +"Uif qspwjefe nfttbhf ebub xbt opu b wbmje KTPO epdvnfou!\n" +"`{error}`" + +#: src/core/setting_types.py:193 +msgctxt "settype:message|error:json_missing_keys" +msgid "" +"Message data must be a JSON object with at least one of the following " +"fields: `content`, `embed`, `embeds`" +msgstr "" +"Nfttbhf ebub nvtu cf b KTPO pckfdu xjui bu mfbtu pof pg uif gpmmpxjoh " +"gjfmet: `dpoufou`, `fncfe`, `fncfet`" + +#: src/core/setting_types.py:202 +msgctxt "settype:message|error:json_embed_type" +msgid "`embed` field must be a valid JSON object." +msgstr "`fncfe` gjfme nvtu cf b wbmje KTPO pckfdu." + +#: src/core/setting_types.py:210 +msgctxt "settype:message|error:json_embeds_type" +msgid "`embeds` field must be a list." +msgstr "`fncfet` gjfme nvtu cf b mjtu." + +#: src/core/setting_types.py:217 +msgctxt "settype:message|error:json_embed_embeds" +msgid "Message data cannot include both `embed` and `embeds`." +msgstr "Nfttbhf ebub dboopu jodmvef cpui `fncfe` boe `fncfet`." + +#: src/core/setting_types.py:225 +msgctxt "settype:message|error:json_content_type" +msgid "`content` field must be a string." +msgstr "`dpoufou` gjfme nvtu cf b tusjoh." + +#: src/core/setting_types.py:241 +#, possible-python-brace-format +msgctxt "ui:settype:message|error:embed_conversion" +msgid "" +"Could not parse the message embed data.\n" +"**Error:** `{exception}`" +msgstr "" +"Dpvme opu qbstf uif nfttbhf fncfe ebub.\n" +"**Fssps:** `{exception}`" + +#: src/core/setting_types.py:269 +msgctxt "settype:message|format:too_long" +msgid "Too long to display! See Preview." +msgstr "Upp mpoh up ejtqmbz! Tff Qsfwjfx." diff --git a/locales/ceaser/LC_MESSAGES/member_admin.po b/locales/ceaser/LC_MESSAGES/member_admin.po new file mode 100644 index 00000000..684d53b9 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/member_admin.po @@ -0,0 +1,431 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/member_admin/settingui.py:57 +msgctxt "ui:memberadmin|menu:greetch|placeholder" +msgid "Select Greeting Channel" +msgstr "Tfmfdu Hsffujoh Diboofm" + +#: src/modules/member_admin/settingui.py:86 +msgctxt "ui:memberadmin|menu:autoroles|placeholder" +msgid "Select Autoroles" +msgstr "Tfmfdu Bvupspmft" + +#: src/modules/member_admin/settingui.py:115 +msgctxt "ui:memberadmin|menu:bot_autoroles|placeholder" +msgid "Select Bot Autoroles" +msgstr "Tfmfdu Cpu Bvupspmft" + +#: src/modules/member_admin/settingui.py:156 +msgctxt "ui:member_admin|button:greet_msg|label" +msgid "Greeting Msg" +msgstr "Hsffujoh Nth" + +#: src/modules/member_admin/settingui.py:205 +msgctxt "ui:memberadmin|button:return_msg|label" +msgid "Returning Msg" +msgstr "Sfuvsojoh Nth" + +#: src/modules/member_admin/settingui.py:213 +msgctxt "ui:memberadmin|embed|title" +msgid "Member Admin Configuration Panel" +msgstr "Nfncfs Benjo Dpogjhvsbujpo Qbofm" + +#: src/modules/member_admin/settingui.py:257 +msgctxt "dash:member_admin|title" +msgid "Greetings and Initial Roles ({commands[configure welcome]})" +msgstr "Hsffujoht boe Jojujbm Spmft ({commands[configure welcome]})" + +#: src/modules/member_admin/settingui.py:261 +msgctxt "dash:member_admin|dropdown|placeholder" +msgid "Greetings and Initial Roles Panel" +msgstr "Hsffujoht boe Jojujbm Spmft Qbofm" + +#: src/modules/member_admin/settingui.py:281 +msgctxt "dash:member_admin|section:greeting_messages|name" +msgid "Greeting Messages ({commands[configure welcome]})" +msgstr "Hsffujoh Nfttbhft ({commands[configure welcome]})" + +#: src/modules/member_admin/settingui.py:292 +msgctxt "dash:member_admin|section:initial_roles|name" +msgid "Initial Roles ({commands[configure welcome]})" +msgstr "Jojujbm Spmft ({commands[configure welcome]})" + +#: src/modules/member_admin/cog.py:234 +msgctxt "cmd:resetmember" +msgid "resetmember" +msgstr "sftfunfncfs" + +#: src/modules/member_admin/cog.py:237 +msgctxt "cmd:resetmember|desc" +msgid "Reset (server-associated) member data for the target member or user." +msgstr "Sftfu (tfswfs-bttpdjbufe) nfncfs ebub gps uif ubshfu nfncfs ps vtfs." + +#: src/modules/member_admin/cog.py:241 +msgctxt "cmd:resetmember|param:target" +msgid "member_to_reset" +msgstr "nfncfs_up_sftfu" + +#: src/modules/member_admin/cog.py:242 +msgctxt "cmd:resetmember|param:saved_roles" +msgid "saved_roles" +msgstr "tbwfe_spmft" + +#: src/modules/member_admin/cog.py:247 +msgctxt "cmd:resetmember|param:target|desc" +msgid "Choose the member (current or past) you want to reset." +msgstr "Dipptf uif nfncfs (dvssfou ps qbtu) zpv xbou up sftfu." + +#: src/modules/member_admin/cog.py:251 +msgctxt "cmd:resetmember|param:saved_roles|desc" +msgid "" +"Clear the saved roles for this member, so their past roles are not restored " +"on rejoin." +msgstr "" +"Dmfbs uif tbwfe spmft gps uijt nfncfs, tp uifjs qbtu spmft bsf opu sftupsfe " +"po sfkpjo." + +#: src/modules/member_admin/cog.py:278 +#, possible-python-brace-format +msgctxt "cmd:resetmember|reset:saved_roles|success" +msgid "" +"The saved roles for {target} have been reset. They will not regain their " +"roles if they rejoin." +msgstr "" +"Uif tbwfe spmft gps {target} ibwf cffo sftfu. Uifz xjmm opu sfhbjo uifjs " +"spmft jg uifz sfkpjo." + +#: src/modules/member_admin/cog.py:286 +msgctxt "cmd:resetmember|error:nothing_to_do" +msgid "No reset operation selected, nothing to do." +msgstr "Op sftfu pqfsbujpo tfmfdufe, opuijoh up ep." + +#: src/modules/member_admin/cog.py:302 +msgctxt "cmd:configure_welcome" +msgid "welcome" +msgstr "xfmdpnf" + +#: src/modules/member_admin/cog.py:305 +msgctxt "cmd:configure_welcome|desc" +msgid "Configure new member greetings and roles." +msgstr "Dpogjhvsf ofx nfncfs hsffujoht boe spmft." + +#: src/modules/member_admin/settings.py:20 +msgctxt "guildset:greeting_message|formatkey:mention" +msgid "Mention the new member." +msgstr "Nfoujpo uif ofx nfncfs." + +#: src/modules/member_admin/settings.py:22 +msgctxt "guildset:greeting_message|formatkey:user_name" +msgid "Display name of the new member." +msgstr "Ejtqmbz obnf pg uif ofx nfncfs." + +#: src/modules/member_admin/settings.py:24 +msgctxt "guildset:greeting_message|formatkey:user_avatar" +msgid "Avatar url of the new member." +msgstr "Bwbubs vsm pg uif ofx nfncfs." + +#: src/modules/member_admin/settings.py:26 +msgctxt "guildset:greeting_message|formatkey:guild_name" +msgid "Name of this server." +msgstr "Obnf pg uijt tfswfs." + +#: src/modules/member_admin/settings.py:28 +msgctxt "guildset:greeting_message|formatkey:guild_icon" +msgid "Server icon url." +msgstr "Tfswfs jdpo vsm." + +#: src/modules/member_admin/settings.py:30 +msgctxt "guildset:greeting_message|formatkey:studying_count" +msgid "Number of current voice channel members." +msgstr "Ovncfs pg dvssfou wpjdf diboofm nfncfst." + +#: src/modules/member_admin/settings.py:32 +msgctxt "guildset:greeting_message|formatkey:member_count" +msgid "Number of members in the server." +msgstr "Ovncfs pg nfncfst jo uif tfswfs." + +#: src/modules/member_admin/settings.py:40 +msgctxt "guildset:greeting_channel" +msgid "welcome_channel" +msgstr "xfmdpnf_diboofm" + +#: src/modules/member_admin/settings.py:43 +msgctxt "guildset:greeting_channel|desc" +msgid "Channel in which to welcome new members to the server." +msgstr "Diboofm jo xijdi up xfmdpnf ofx nfncfst up uif tfswfs." + +#: src/modules/member_admin/settings.py:47 +msgctxt "guildset:greeting_channel|long_desc" +msgid "" +"New members will be sent the configured `welcome_message` in this channel, " +"and returning members will be sent the configured `returning_message`. Unset" +" to send these message via direct message." +msgstr "" +"Ofx nfncfst xjmm cf tfou uif dpogjhvsfe `xfmdpnf_nfttbhf` jo uijt diboofm, " +"boe sfuvsojoh nfncfst xjmm cf tfou uif dpogjhvsfe `sfuvsojoh_nfttbhf`. Votfu" +" up tfoe uiftf nfttbhf wjb ejsfdu nfttbhf." + +#: src/modules/member_admin/settings.py:53 +msgctxt "guildset:greeting_channel|accepts" +msgid "Name or id of the greeting channel, or 0 for DM." +msgstr "Obnf ps je pg uif hsffujoh diboofm, ps 0 gps EN." + +#: src/modules/member_admin/settings.py:67 +msgctxt "guildset:greeting_channel|set_response:unset" +msgid "Welcome messages will now be sent via direct message." +msgstr "Xfmdpnf nfttbhft xjmm opx cf tfou wjb ejsfdu nfttbhf." + +#: src/modules/member_admin/settings.py:72 +#, possible-python-brace-format +msgctxt "guildset:greeting_channel|set_response:set" +msgid "Welcome messages will now be sent to {channel}" +msgstr "Xfmdpnf nfttbhft xjmm opx cf tfou up {channel}" + +#: src/modules/member_admin/settings.py:84 +msgctxt "guildset:greeting_channel|formmatted:unset" +msgid "Direct Message" +msgstr "Ejsfdu Nfttbhf" + +#: src/modules/member_admin/settings.py:91 +msgctxt "guildset:greeting_message" +msgid "welcome_message" +msgstr "xfmdpnf_nfttbhf" + +#: src/modules/member_admin/settings.py:95 +msgctxt "guildset:greeting_message|desc" +msgid "Custom message used to greet new members when they join the server." +msgstr "Dvtupn nfttbhf vtfe up hsffu ofx nfncfst xifo uifz kpjo uif tfswfs." + +#: src/modules/member_admin/settings.py:99 +msgctxt "guildset:greeting_message|long_desc" +msgid "" +"When set, this message will be sent to the `welcome_channel` when a *new* " +"member joins the server. If not set, no message will be sent." +msgstr "" +"Xifo tfu, uijt nfttbhf xjmm cf tfou up uif `xfmdpnf_diboofm` xifo b *ofx* " +"nfncfs kpjot uif tfswfs. Jg opu tfu, op nfttbhf xjmm cf tfou." + +#: src/modules/member_admin/settings.py:104 +msgctxt "guildset:greeting_message|accepts" +msgid "JSON formatted greeting message data" +msgstr "KTPO gpsnbuufe hsffujoh nfttbhf ebub" + +#: src/modules/member_admin/settings.py:108 +msgctxt "guildset:greeting_message|default" +msgid "" +"\n" +" {\n" +" \"embed\": {\n" +" \"title\": \"Welcome {user_name}!\",\n" +" \"thumbnail\": {\"url\": \"{user_avatar}\"},\n" +" \"description\": \"Welcome to **{guild_name}**!\",\n" +" \"footer\": {\n" +" \"text\": \"You are the {member_count}th member!\"\n" +" },\n" +" \"color\": 15695665\n" +" }\n" +" }\n" +" " +msgstr "" +"\n" +" {\n" +" \"embed\": {\n" +" \"ujumf\": \"Xfmdpnf {user_name}!\",\n" +" \"uivncobjm\": {\"url\": \"{vtfs_bwbubs}\"},\n" +" \"eftdsjqujpo\": \"Xfmdpnf up **{guild_name}**!\",\n" +" \"gppufs\": {\n" +" \"text\": \"You are the {nfncfs_dpvou}th member!\"\n" +" },\n" +" \"dpmps\": 15695665\n" +" }\n" +" }\n" +" " + +#: src/modules/member_admin/settings.py:136 +msgctxt "guildset:greeting_message|set_response:unset" +msgid "Welcome message unset! New members will not be greeted." +msgstr "Xfmdpnf nfttbhf votfu! Ofx nfncfst xjmm opu cf hsffufe." + +#: src/modules/member_admin/settings.py:141 +msgctxt "guildset:greeting_message|set_response:set" +msgid "The welcome message has been updated." +msgstr "Uif xfmdpnf nfttbhf ibt cffo vqebufe." + +#: src/modules/member_admin/settings.py:153 +msgctxt "guildset:greeting_message|formmatted:unset" +msgid "Not set, members will not be welcomed." +msgstr "Opu tfu, nfncfst xjmm opu cf xfmdpnfe." + +#: src/modules/member_admin/settings.py:200 +msgctxt "guildset:greeting_message|embed_field|formatkeys|explanation" +msgid "The following placeholders will be substituted with their values." +msgstr "Uif gpmmpxjoh qmbdfipmefst xjmm cf tvctujuvufe xjui uifjs wbmvft." + +#: src/modules/member_admin/settings.py:203 +msgctxt "guildset:greeting_message|embed_field|formatkeys|name" +msgid "Placeholders" +msgstr "Qmbdfipmefst" + +#: src/modules/member_admin/settings.py:213 +msgctxt "guildset:returning_message" +msgid "returning_message" +msgstr "sfuvsojoh_nfttbhf" + +#: src/modules/member_admin/settings.py:217 +msgctxt "guildset:returning_message|desc" +msgid "" +"Custom message used to greet returning members when they rejoin the server." +msgstr "" +"Dvtupn nfttbhf vtfe up hsffu sfuvsojoh nfncfst xifo uifz sfkpjo uif tfswfs." + +#: src/modules/member_admin/settings.py:221 +msgctxt "guildset:returning_message|long_desc" +msgid "" +"When set, this message will be sent to the `welcome_channel` when a member " +"*returns* to the server. If not set, no message will be sent." +msgstr "" +"Xifo tfu, uijt nfttbhf xjmm cf tfou up uif `xfmdpnf_diboofm` xifo b nfncfs " +"*sfuvsot* up uif tfswfs. Jg opu tfu, op nfttbhf xjmm cf tfou." + +#: src/modules/member_admin/settings.py:226 +msgctxt "guildset:returning_message|accepts" +msgid "JSON formatted returning message data" +msgstr "KTPO gpsnbuufe sfuvsojoh nfttbhf ebub" + +#: src/modules/member_admin/settings.py:230 +msgctxt "guildset:returning_message|default" +msgid "" +"\n" +" {\n" +" \"embed\": {\n" +" \"title\": \"Welcome Back {user_name}!\",\n" +" \"thumbnail\": {\"url\": \"{User_avatar}\"},\n" +" \"description\": \"Welcome back to **{guild_name}**!\\nYou were last seen .\",\n" +" \"color\": 15695665\n" +" }\n" +" }\n" +" " +msgstr "" +"\n" +" {\n" +" \"embed\": {\n" +" \"ujumf\": \"Xfmdpnf Cbdl {user_name}!\",\n" +" \"uivncobjm\": {\"url\": \"{Vtfs_bwbubs}\"},\n" +" \"eftdsjqujpo\": \"Xfmdpnf cbdl up **{guild_name}**!\\oZpv xfsf mbtu tffo .\",\n" +" \"dpmps\": 15695665\n" +" }\n" +" }\n" +" " + +#: src/modules/member_admin/settings.py:247 +msgctxt "guildset:returning_message|formatkey:last_time" +msgid "Unix timestamp of the last time the member was seen in the server." +msgstr "Vojy ujnftubnq pg uif mbtu ujnf uif nfncfs xbt tffo jo uif tfswfs." + +#: src/modules/member_admin/settings.py:258 +msgctxt "guildset:returning_message|set_response:unset" +msgid "Returning member greeting unset! Will use `welcome_message` if set." +msgstr "Sfuvsojoh nfncfs hsffujoh votfu! Xjmm vtf `xfmdpnf_nfttbhf` jg tfu." + +#: src/modules/member_admin/settings.py:263 +msgctxt "guildset:greeting_message|set_response:set" +msgid "The returning member greeting has been updated." +msgstr "Uif sfuvsojoh nfncfs hsffujoh ibt cffo vqebufe." + +#: src/modules/member_admin/settings.py:275 +msgctxt "guildset:greeting_message|formmatted:unset" +msgid "Not set, will use the `welcome_message` if set." +msgstr "Opu tfu, xjmm vtf uif `xfmdpnf_nfttbhf` jg tfu." + +#: src/modules/member_admin/settings.py:325 +msgctxt "guildset:returning_message|embed_field|formatkeys|explanation" +msgid "In *addition* to the placeholders supported by `welcome_message`" +msgstr "Jo *beejujpo* up uif qmbdfipmefst tvqqpsufe cz `xfmdpnf_nfttbhf`" + +#: src/modules/member_admin/settings.py:328 +msgctxt "guildset:returning_message|embed_field|formatkeys|" +msgid "Placeholders" +msgstr "Qmbdfipmefst" + +#: src/modules/member_admin/settings.py:339 +msgctxt "guildset:autoroles" +msgid "autoroles" +msgstr "bvupspmft" + +#: src/modules/member_admin/settings.py:343 +msgctxt "guildset:autoroles|desc" +msgid "Roles given to new members when they join the server." +msgstr "Spmft hjwfo up ofx nfncfst xifo uifz kpjo uif tfswfs." + +#: src/modules/member_admin/settings.py:347 +msgctxt "guildset:autoroles|long_desc" +msgid "" +"These roles will be given when a member joins the server. If " +"`role_persistence` is enabled, these roles will *not* be given to a " +"returning member." +msgstr "" +"Uiftf spmft xjmm cf hjwfo xifo b nfncfs kpjot uif tfswfs. Jg " +"`spmf_qfstjtufodf` jt fobcmfe, uiftf spmft xjmm *opu* cf hjwfo up b " +"sfuvsojoh nfncfs." + +#: src/modules/member_admin/settings.py:361 +msgctxt "guildset:bot_autoroles" +msgid "bot_autoroles" +msgstr "cpu_bvupspmft" + +#: src/modules/member_admin/settings.py:365 +msgctxt "guildset:bot_autoroles|desc" +msgid "Roles given to new bots when they join the server." +msgstr "Spmft hjwfo up ofx cput xifo uifz kpjo uif tfswfs." + +#: src/modules/member_admin/settings.py:369 +msgctxt "guildset:bot_autoroles|long_desc" +msgid "These roles will be given when a bot joins the server." +msgstr "Uiftf spmft xjmm cf hjwfo xifo b cpu kpjot uif tfswfs." + +#: src/modules/member_admin/settings.py:382 +msgctxt "guildset:role_persistence" +msgid "role_persistence" +msgstr "spmf_qfstjtufodf" + +#: src/modules/member_admin/settings.py:385 +msgctxt "guildset:role_persistence|desc" +msgid "Whether member roles should be restored on rejoin." +msgstr "Xifuifs nfncfs spmft tipvme cf sftupsfe po sfkpjo." + +#: src/modules/member_admin/settings.py:389 +msgctxt "guildset:role_persistence|long_desc" +msgid "" +"If enabled, member roles will be stored when they leave the server, and then" +" restored when they rejoin (instead of giving `autoroles`). Note that this " +"may conflict with other bots who manage join roles." +msgstr "" +"Jg fobcmfe, nfncfs spmft xjmm cf tupsfe xifo uifz mfbwf uif tfswfs, boe uifo" +" sftupsfe xifo uifz sfkpjo (jotufbe pg hjwjoh `bvupspmft`). Opuf uibu uijt " +"nbz dpogmjdu xjui puifs cput xip nbobhf kpjo spmft." + +#: src/modules/member_admin/settings.py:405 +msgctxt "guildset:role_persistence|set_response:off" +msgid "Roles will not be restored when members rejoin." +msgstr "Spmft xjmm opu cf sftupsfe xifo nfncfst sfkpjo." + +#: src/modules/member_admin/settings.py:410 +msgctxt "guildset:greeting_message|set_response:on" +msgid "Roles will now be restored when members rejoin." +msgstr "Spmft xjmm opx cf sftupsfe xifo nfncfst sfkpjo." diff --git a/locales/ceaser/LC_MESSAGES/meta.po b/locales/ceaser/LC_MESSAGES/meta.po new file mode 100644 index 00000000..e059397b --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/meta.po @@ -0,0 +1,141 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/meta/cog.py:23 +msgctxt "cmd:help" +msgid "help" +msgstr "ifmq" + +#: src/modules/meta/cog.py:26 +msgctxt "cmd:help|desc" +msgid "See a brief summary of my commands and features." +msgstr "Tff b csjfg tvnnbsz pg nz dpnnboet boe gfbuvsft." + +#: src/modules/meta/help_sections.py:40 +#, possible-python-brace-format +msgctxt "helptext|level:member|mode:study" +msgid "" +"\n" +" {config_emoji} Personal Configuration\n" +" *View or adjust personal settings with the {cmd_my} command.*\n" +" {cmd_my_timezone}: Timezone used to display your stats and set reminders.\n" +" {cmd_my_language}: Your preferred language for commands and interactions.\n" +"\n" +"\n" +" {stats_emoji} Statistics\n" +" *Study in voice channels to earn activity ranks and compete on the leaderboard!*\n" +" {cmd_me}: View your personal study profile and set your profile tags.\n" +" {cmd_stats}: View study statistics for the current and past weeks or months.\n" +" {cmd_ranks}: See the list of activity ranks.\n" +" {cmd_leaderboard}: Compete with other members on the server leaderboards.\n" +"\n" +"\n" +" {coin} Economy\n" +" *Earn coins through studying, then spend them on some well deserved rewards!*\n" +" {cmd_send}: Send your {coin} to another member.\n" +" {cmd_shop}: Purchase server roles with your {coin}.\n" +" {cmd_room}: Rent a private voice channel for you and your friends.\n" +"\n" +"\n" +" {utility_emoji} Utilities\n" +" *Some other utilities to help you stay productive while studying!*\n" +" {cmd_reminders}: Ask me to remind you about that important task!\n" +" {cmd_tasklist}: Create tasks and feel the satisfaction of checking them off.\n" +" {cmd_timers}: Stay productive using the classic *pomodoro technique*!\n" +" {cmd_schedule}: Schedule a shared study session and keep yourself accountable!\n" +" " +msgstr "" +"\n" +" {config_emoji} Qfstpobm Dpogjhvsbujpo\n" +" *Wjfx ps bekvtu qfstpobm tfuujoht xjui uif {cmd_my} dpnnboe.*\n" +" {cmd_my_timezone}: Ujnfapof vtfe up ejtqmbz zpvs tubut boe tfu sfnjoefst.\n" +" {cmd_my_language}: Zpvs qsfgfssfe mbohvbhf gps dpnnboet boe joufsbdujpot.\n" +"\n" +"\n" +" {stats_emoji} Tubujtujdt\n" +" *Tuvez jo wpjdf diboofmt up fbso bdujwjuz sbolt boe dpnqfuf po uif mfbefscpbse!*\n" +" {cmd_me}: Wjfx zpvs qfstpobm tuvez qspgjmf boe tfu zpvs qspgjmf ubht.\n" +" {cmd_stats}: Wjfx tuvez tubujtujdt gps uif dvssfou boe qbtu xfflt ps npouit.\n" +" {cmd_ranks}: Tff uif mjtu pg bdujwjuz sbolt.\n" +" {cmd_leaderboard}: Dpnqfuf xjui puifs nfncfst po uif tfswfs mfbefscpbset.\n" +"\n" +"\n" +" {coin} Fdpopnz\n" +" *Fbso dpjot uispvhi tuvezjoh, uifo tqfoe uifn po tpnf xfmm eftfswfe sfxbset!*\n" +" {cmd_send}: Tfoe zpvs {coin} up bopuifs nfncfs.\n" +" {cmd_shop}: Qvsdibtf tfswfs spmft xjui zpvs {coin}.\n" +" {cmd_room}: Sfou b qsjwbuf wpjdf diboofm gps zpv boe zpvs gsjfoet.\n" +"\n" +"\n" +" {utility_emoji} Vujmjujft\n" +" *Tpnf puifs vujmjujft up ifmq zpv tubz qspevdujwf xijmf tuvezjoh!*\n" +" {cmd_reminders}: Btl nf up sfnjoe zpv bcpvu uibu jnqpsubou ubtl!\n" +" {cmd_tasklist}: Dsfbuf ubtlt boe gffm uif tbujtgbdujpo pg difdljoh uifn pgg.\n" +" {cmd_timers}: Tubz qspevdujwf vtjoh uif dmbttjd *qpnpepsp ufdiojrvf*!\n" +" {cmd_schedule}: Tdifevmf b tibsfe tuvez tfttjpo boe lffq zpvstfmg bddpvoubcmf!\n" +" " + +#: src/modules/meta/help_sections.py:73 +#, possible-python-brace-format +msgctxt "helptext|page:admin" +msgid "" +"\n" +" Use {cmd_dashboard} to see an overview of the server configuration, and quickly jump to the feature configuration panels to modify settings.\n" +"\n" +" Configuration panels are also accessible directly through the `/configure` commands and most features may be configured through these commands.\n" +"\n" +" Other relevant commands for guild configuration below:\n" +" `/editshop`: Add/Edit/Remove colour roles from the {coin} shop.\n" +" `/ranks`: Add/Edit/Refresh/Remove activity ranks.\n" +" `/pomodoro`: Add/Edit/Remove Pomodoro timers in voice channels.\n" +" `/rolemenus`: Allow members to equip roles from customisable messages.\n" +" `/economy balance`: Display and modify LionCoin balance for members and roles.\n" +" " +msgstr "" +"\n" +" Vtf {cmd_dashboard} up tff bo pwfswjfx pg uif tfswfs dpogjhvsbujpo, boe rvjdlmz kvnq up uif gfbuvsf dpogjhvsbujpo qbofmt up npejgz tfuujoht.\n" +"\n" +" Dpogjhvsbujpo qbofmt bsf bmtp bddfttjcmf ejsfdumz uispvhi uif `/dpogjhvsf` dpnnboet boe nptu gfbuvsft nbz cf dpogjhvsfe uispvhi uiftf dpnnboet.\n" +"\n" +" Puifs sfmfwbou dpnnboet gps hvjme dpogjhvsbujpo cfmpx:\n" +" `/fejutipq`: Bee/Feju/Sfnpwf dpmpvs spmft gspn uif {coin} tipq.\n" +" `/sbolt`: Bee/Feju/Sfgsfti/Sfnpwf bdujwjuz sbolt.\n" +" `/qpnpepsp`: Bee/Feju/Sfnpwf Qpnpepsp ujnfst jo wpjdf diboofmt.\n" +" `/spmfnfovt`: Bmmpx nfncfst up frvjq spmft gspn dvtupnjtbcmf nfttbhft.\n" +" `/fdpopnz cbmbodf`: Ejtqmbz boe npejgz MjpoDpjo cbmbodf gps nfncfst boe spmft.\n" +" " + +#: src/modules/meta/help_sections.py:112 +msgctxt "helptext|level:member|title" +msgid "Command Summary (for members)" +msgstr "Dpnnboe Tvnnbsz (gps nfncfst)" + +#: src/modules/meta/help_sections.py:140 +msgctxt "helptext|level:admin|title" +msgid "Command Summary (for server admins)" +msgstr "Dpnnboe Tvnnbsz (gps tfswfs benjot)" + +#: src/modules/meta/helpui.py:47 +msgctxt "ui:help|button:member_page|label" +msgid "Member Page" +msgstr "Nfncfs Qbhf" + +#: src/modules/meta/helpui.py:59 +msgctxt "ui:help|button:admin_page|label" +msgid "Admin Page" +msgstr "Benjo Qbhf" diff --git a/locales/ceaser/LC_MESSAGES/moderation.po b/locales/ceaser/LC_MESSAGES/moderation.po new file mode 100644 index 00000000..d22a11d0 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/moderation.po @@ -0,0 +1,271 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/moderation/settingui.py:53 +msgctxt "ui:moderation_config|menu:ticket_log|placeholder" +msgid "Select Ticket Log" +msgstr "Tfmfdu Ujdlfu Mph" + +#: src/modules/moderation/settingui.py:78 +msgctxt "ui:moderation_config|menu:alert_channel|placeholder" +msgid "Select Alert Channel" +msgstr "Tfmfdu Bmfsu Diboofm" + +#: src/modules/moderation/settingui.py:103 +msgctxt "ui:moderation_config|menu:modrole|placeholder" +msgid "Select Moderator Role" +msgstr "Tfmfdu Npefsbups Spmf" + +#: src/modules/moderation/settingui.py:111 +msgctxt "ui:moderation_config|embed|title" +msgid "Moderation Configuration Panel" +msgstr "Npefsbujpo Dpogjhvsbujpo Qbofm" + +#: src/modules/moderation/settingui.py:150 +msgctxt "dash:moderation|title" +msgid "Moderation Settings ({commands[configure moderation]})" +msgstr "Npefsbujpo Tfuujoht ({commands[configure moderation]})" + +#: src/modules/moderation/settingui.py:154 +msgctxt "dash:moderation|dropdown|placeholder" +msgid "Moderation Panel" +msgstr "Npefsbujpo Qbofm" + +#: src/modules/moderation/cog.py:136 +msgctxt "cmd:configure_moderation" +msgid "moderation" +msgstr "npefsbujpo" + +#: src/modules/moderation/cog.py:139 +msgctxt "cmd:configure_moderation|desc" +msgid "Configure general moderation settings." +msgstr "Dpogjhvsf hfofsbm npefsbujpo tfuujoht." + +#: src/modules/moderation/ticket.py:147 +#, possible-python-brace-format +msgctxt "ticket|title:auto" +msgid "Ticket #{ticketid} | {state} | {type}[Auto] | {name}" +msgstr "Ujdlfu #{ticketid} | {state} | {type}[Bvup] | {name}" + +#: src/modules/moderation/ticket.py:152 +#, possible-python-brace-format +msgctxt "ticket|title:manual" +msgid "Ticket #{ticketid} | {state} | {type} | {name}" +msgstr "Ujdlfu #{ticketid} | {state} | {type} | {name}" + +#: src/modules/moderation/ticket.py:168 +msgctxt "ticket|field:target|name" +msgid "Target" +msgstr "Ubshfu" + +#: src/modules/moderation/ticket.py:173 +msgctxt "ticket|field:moderator|name" +msgid "Moderator" +msgstr "Npefsbups" + +#: src/modules/moderation/ticket.py:180 +msgctxt "ticket|field:expiry|mode:expiring|name" +msgid "Expires At" +msgstr "Fyqjsft Bu" + +#: src/modules/moderation/ticket.py:183 +#, possible-python-brace-format +msgctxt "ticket|field:expiry|mode:expiring|value" +msgid "" +"{timestamp}\n" +"Duration: `{duration}`" +msgstr "" +"{timestamp}\n" +"Evsbujpo: `{duration}`" + +#: src/modules/moderation/ticket.py:191 +msgctxt "ticket|field:expiry|mode:expired|name" +msgid "Expired" +msgstr "Fyqjsfe" + +#: src/modules/moderation/ticket.py:194 +#, possible-python-brace-format +msgctxt "ticket|field:expiry|mode:expired|value" +msgid "{timestamp}" +msgstr "{timestamp}" + +#: src/modules/moderation/ticket.py:201 +msgctxt "ticket|field:expiry|mode:open|name" +msgid "Expiry" +msgstr "Fyqjsz" + +#: src/modules/moderation/ticket.py:204 +#, possible-python-brace-format +msgctxt "ticket|field:expiry|mode:open|value" +msgid "{timestamp}" +msgstr "{timestamp}" + +#: src/modules/moderation/ticket.py:212 +msgctxt "ticket|field:context|name" +msgid "Context" +msgstr "Dpoufyu" + +#: src/modules/moderation/ticket.py:219 +msgctxt "ticket|field:notes|name" +msgid "Notes" +msgstr "Opuft" + +#: src/modules/moderation/ticket.py:226 +msgctxt "ticket|field:pardoned|name" +msgid "Pardoned" +msgstr "Qbsepofe" + +#: src/modules/moderation/ticket.py:229 +#, possible-python-brace-format +msgctxt "ticket|field:pardoned|value" +msgid "" +"Pardoned by <&{moderator}> at {timestamp}.\n" +"{reason}" +msgstr "" +"Qbsepofe cz <&{moderator}> bu {timestamp}.\n" +"{reason}" + +#: src/modules/moderation/settings.py:20 +msgctxt "guildset:ticket_log" +msgid "ticket_log" +msgstr "ujdlfu_mph" + +#: src/modules/moderation/settings.py:23 +msgctxt "guildset:ticket_log|desc" +msgid "Private moderation log to send tickets and moderation events." +msgstr "Qsjwbuf npefsbujpo mph up tfoe ujdlfut boe npefsbujpo fwfout." + +#: src/modules/moderation/settings.py:27 +msgctxt "guildset:ticket_log|long_desc" +msgid "" +"Warnings, notes, video blacklists, and other moderation events will be " +"posted as numbered tickets with context to this log." +msgstr "" +"Xbsojoht, opuft, wjefp cmbdlmjtut, boe puifs npefsbujpo fwfout xjmm cf " +"qptufe bt ovncfsfe ujdlfut xjui dpoufyu up uijt mph." + +#: src/modules/moderation/settings.py:32 +msgctxt "guildset:ticket_log|accepts" +msgid "Ticket channel name or id." +msgstr "Ujdlfu diboofm obnf ps je." + +#: src/modules/moderation/settings.py:46 +#, possible-python-brace-format +msgctxt "guildset:ticket_log|set_response:set" +msgid "Moderation tickets will be sent to {channel}" +msgstr "Npefsbujpo ujdlfut xjmm cf tfou up {channel}" + +#: src/modules/moderation/settings.py:51 +msgctxt "guildset:ticket_log|set_response:unset" +msgid "Moderation tickets will not be logged to a channel." +msgstr "Npefsbujpo ujdlfut xjmm opu cf mphhfe up b diboofm." + +#: src/modules/moderation/settings.py:63 +msgctxt "guildset:ticket_log|formatted:unset" +msgid "Not Set." +msgstr "Opu Tfu." + +#: src/modules/moderation/settings.py:70 +msgctxt "guildset:alert_channel" +msgid "alert_channel" +msgstr "bmfsu_diboofm" + +#: src/modules/moderation/settings.py:73 +msgctxt "guildset:alert_channel|desc" +msgid "Moderation notification channel for members with DMs disabled." +msgstr "Npefsbujpo opujgjdbujpo diboofm gps nfncfst xjui ENt ejtbcmfe." + +#: src/modules/moderation/settings.py:77 +msgctxt "guildset:alert_channel|long_desc" +msgid "" +"When I need to send a member a moderation-related notification (e.g. asking " +"them to enable their video in a video channel) from this server, I will try " +"to send it via direct messages. If this fails, I will instead mention the " +"user in this channel." +msgstr "" +"Xifo J offe up tfoe b nfncfs b npefsbujpo-sfmbufe opujgjdbujpo (f.h. btljoh " +"uifn up fobcmf uifjs wjefp jo b wjefp diboofm) gspn uijt tfswfs, J xjmm usz " +"up tfoe ju wjb ejsfdu nfttbhft. Jg uijt gbjmt, J xjmm jotufbe nfoujpo uif " +"vtfs jo uijt diboofm." + +#: src/modules/moderation/settings.py:84 +msgctxt "guildset:alert_channel|accepts" +msgid "Alert channel name or id." +msgstr "Bmfsu diboofm obnf ps je." + +#: src/modules/moderation/settings.py:99 +#, possible-python-brace-format +msgctxt "guildset:alert_channel|set_response:set" +msgid "Moderation alerts will be sent to {channel}" +msgstr "Npefsbujpo bmfsut xjmm cf tfou up {channel}" + +#: src/modules/moderation/settings.py:104 +msgctxt "guildset:alert_channel|set_response:unset" +msgid "Moderation alerts will be ignored if the member cannot be reached." +msgstr "Npefsbujpo bmfsut xjmm cf jhopsfe jg uif nfncfs dboopu cf sfbdife." + +#: src/modules/moderation/settings.py:116 +msgctxt "guildset:alert_channel|formatted:unset" +msgid "Not Set (Only alert via direct message.)" +msgstr "Opu Tfu (Pomz bmfsu wjb ejsfdu nfttbhf.)" + +#: src/modules/moderation/settings.py:123 +msgctxt "guildset:mod_role" +msgid "mod_role" +msgstr "npe_spmf" + +#: src/modules/moderation/settings.py:126 +msgctxt "guildset:mod_role|desc" +msgid "" +"Guild role permitted to view configuration and perform moderation tasks." +msgstr "" +"Hvjme spmf qfsnjuufe up wjfx dpogjhvsbujpo boe qfsgpsn npefsbujpo ubtlt." + +#: src/modules/moderation/settings.py:130 +msgctxt "guildset:mod_role|long_desc" +msgid "" +"Members with the set role will be able to access my configuration panels, " +"and perform some moderation tasks, such as setting up pomodoro timers. " +"Moderators cannot reconfigure most bot configuration, or perform operations " +"they do not already have permission for in Discord." +msgstr "" +"Nfncfst xjui uif tfu spmf xjmm cf bcmf up bddftt nz dpogjhvsbujpo qbofmt, " +"boe qfsgpsn tpnf npefsbujpo ubtlt, tvdi bt tfuujoh vq qpnpepsp ujnfst. " +"Npefsbupst dboopu sfdpogjhvsf nptu cpu dpogjhvsbujpo, ps qfsgpsn pqfsbujpot " +"uifz ep opu bmsfbez ibwf qfsnjttjpo gps jo Ejtdpse." + +#: src/modules/moderation/settings.py:137 +msgctxt "guildset:mod_role|accepts" +msgid "Moderation role name or id." +msgstr "Npefsbujpo spmf obnf ps je." + +#: src/modules/moderation/settings.py:151 +#, possible-python-brace-format +msgctxt "guildset:mod_role|set_response:set" +msgid "Members with the {role} will be considered moderators." +msgstr "Nfncfst xjui uif {role} xjmm cf dpotjefsfe npefsbupst." + +#: src/modules/moderation/settings.py:156 +msgctxt "guildset:mod_role|set_response:unset" +msgid "No members will be given moderation privileges." +msgstr "Op nfncfst xjmm cf hjwfo npefsbujpo qsjwjmfhft." + +#: src/modules/moderation/settings.py:168 +msgctxt "guildset:mod_role|formatted:unset" +msgid "Not Set." +msgstr "Opu Tfu." diff --git a/locales/ceaser/LC_MESSAGES/monthly-gui.po b/locales/ceaser/LC_MESSAGES/monthly-gui.po new file mode 100644 index 00000000..17b28cfe --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/monthly-gui.po @@ -0,0 +1,164 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/cards/monthly.py:40 +msgctxt "skin:monthlystats|mode:study|title" +msgid "STUDY HOURS" +msgstr "TUVEZ IPVST" + +#: src/gui/cards/monthly.py:44 +msgctxt "skin:monthlystats|mode:voice|title" +msgid "VOICE CHANNEL ACTIVITY" +msgstr "WPJDF DIBOOFM BDUJWJUZ" + +#: src/gui/cards/monthly.py:48 +msgctxt "skin:monthlystats|mode:text|title" +msgid "MESSAGE ACTIVITY" +msgstr "NFTTBHF BDUJWJUZ" + +#: src/gui/cards/monthly.py:52 +msgctxt "skin::monthlystats|mode:anki|title" +msgid "CARDS REVIEWED" +msgstr "DBSET SFWJFXFE" + +#: src/gui/cards/monthly.py:119 +#, possible-python-brace-format +msgctxt "ui:monthlystats|mode:study|bar_value" +msgid "{value} H" +msgstr "{value} I" + +#: src/gui/cards/monthly.py:123 +#, possible-python-brace-format +msgctxt "ui:monthlystats|mode:voice|bar_value" +msgid "{value} H" +msgstr "{value} I" + +#: src/gui/cards/monthly.py:127 +#, possible-python-brace-format +msgctxt "ui:monthlystats|mode:text|bar_value" +msgid "{value} M" +msgstr "{value} N" + +#: src/gui/cards/monthly.py:131 +#, possible-python-brace-format +msgctxt "ui:monthlystats|mode:anki|bar_value" +msgid "{value} C" +msgstr "{value} D" + +#: src/gui/cards/monthly.py:153 +msgctxt "skin:monthlystats|weekdays" +msgid "M,T,W,T,F,S,S" +msgstr "N,U,X,U,G,T,T" + +#: src/gui/cards/monthly.py:163 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:study|summary:this_month" +msgid "THIS MONTH: {amount} HOURS" +msgstr "UIJT NPOUI: {amount} IPVST" + +#: src/gui/cards/monthly.py:167 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:voice|summary:this_month" +msgid "THIS MONTH: {amount} HOURS" +msgstr "UIJT NPOUI: {amount} IPVST" + +#: src/gui/cards/monthly.py:171 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:text|summary:this_month" +msgid "THIS MONTH: {amount} MESSAGES" +msgstr "UIJT NPOUI: {amount} NFTTBHFT" + +#: src/gui/cards/monthly.py:175 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:text|summary:this_month" +msgid "THIS MONTH: {amount} CARDS" +msgstr "UIJT NPOUI: {amount} DBSET" + +#: src/gui/cards/monthly.py:197 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:study|summary:last_month" +msgid "LAST MONTH: {amount} HOURS" +msgstr "MBTU NPOUI: {amount} IPVST" + +#: src/gui/cards/monthly.py:201 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:voice|summary:last_month" +msgid "LAST MONTH: {amount} HOURS" +msgstr "MBTU NPOUI: {amount} IPVST" + +#: src/gui/cards/monthly.py:205 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:text|summary:last_month" +msgid "LAST MONTH: {amount} MESSAGES" +msgstr "MBTU NPOUI: {amount} NFTTBHFT" + +#: src/gui/cards/monthly.py:209 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:text|summary:last_month" +msgid "LAST MONTH: {amount} CARDS" +msgstr "MBTU NPOUI: {amount} DBSET" + +#: src/gui/cards/monthly.py:300 +msgctxt "ui:monthlystats|stats:current_streak|key" +msgid "Current Streak:" +msgstr "Dvssfou Tusfbl:" + +#: src/gui/cards/monthly.py:304 +#, possible-python-brace-format +msgctxt "ui:monthlystats|stats:current_streak|value" +msgid "{count} days" +msgstr "{count} ebzt" + +#: src/gui/cards/monthly.py:308 +msgctxt "ui:monthlystats|stats:longest_streak|key" +msgid "Longest Streak:" +msgstr "Mpohftu Tusfbl:" + +#: src/gui/cards/monthly.py:312 +#, possible-python-brace-format +msgctxt "ui:monthlystats|stats:longest_streak|value" +msgid "{count} days" +msgstr "{count} ebzt" + +#: src/gui/cards/monthly.py:316 +msgctxt "ui:monthlystats|stats:daily_average|key" +msgid "Daily Average:" +msgstr "Ebjmz Bwfsbhf:" + +#: src/gui/cards/monthly.py:320 +#, possible-python-brace-format +msgctxt "ui:monthlystats|stats:daily_average|value" +msgid "{count} hours" +msgstr "{count} ipvst" + +#: src/gui/cards/monthly.py:324 +msgctxt "ui:monthlystats|stats:days_active|key" +msgid "Days Active:" +msgstr "Ebzt Bdujwf:" + +#: src/gui/cards/monthly.py:328 +#, possible-python-brace-format +msgctxt "ui:monthlystats|stats:days_active|value" +msgid "{count} days" +msgstr "{count} ebzt" + +#: src/gui/cards/monthly.py:341 +#, possible-python-brace-format +msgctxt "skin:monthlystats|footer" +msgid "Monthly Statistics • As of {day} {month} • {name} {discrim}" +msgstr "Npouimz Tubujtujdt • Bt pg {day} {month} • {name} {discrim}" diff --git a/locales/ceaser/LC_MESSAGES/profile-gui.po b/locales/ceaser/LC_MESSAGES/profile-gui.po new file mode 100644 index 00000000..9fb50ee4 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/profile-gui.po @@ -0,0 +1,48 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/cards/profile.py:79 +msgctxt "skin:profile|header:profile" +msgid "PROFILE" +msgstr "QSPGJMF" + +#: src/gui/cards/profile.py:83 +msgctxt "skin:profile|header:achievements" +msgid "ACHIEVEMENTS" +msgstr "BDIJFWFNFOUT" + +#: src/gui/cards/profile.py:134 +msgctxt "skin:profile|field:rank_unranked_text" +msgid "UNRANKED" +msgstr "VOSBOLFE" + +#: src/gui/cards/profile.py:138 +#, possible-python-brace-format +msgctxt "skin:profile|field:rank_nextrank_text" +msgid "NEXT RANK: {name} {rangestr}" +msgstr "OFYU SBOL: {name} {rangestr}" + +#: src/gui/cards/profile.py:142 +msgctxt "skin:profile|field:rank_noranks_text" +msgid "NO RANKS AVAILABLE" +msgstr "OP SBOLT BWBJMBCMF" + +#: src/gui/cards/profile.py:146 +msgctxt "skin:profile|field:rank_maxrank_text" +msgid "YOU HAVE REACHED THE MAXIMUM RANK" +msgstr "ZPV IBWF SFBDIFE UIF NBYJNVN SBOL" diff --git a/locales/ceaser/LC_MESSAGES/ranks.po b/locales/ceaser/LC_MESSAGES/ranks.po new file mode 100644 index 00000000..e28865c8 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/ranks.po @@ -0,0 +1,949 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/ranks/cog.py:76 +msgctxt "cmd:configure_ranks|param:rank_type|choice:voice" +msgid "Voice" +msgstr "Wpjdf" + +#: src/modules/ranks/cog.py:77 +msgctxt "cmd:configure_ranks|param:rank_type|choice:xp" +msgid "XP" +msgstr "YQ" + +#: src/modules/ranks/cog.py:78 +msgctxt "cmd:configure_ranks|param:rank_type|choice:message" +msgid "Message" +msgstr "Nfttbhf" + +#: src/modules/ranks/cog.py:406 +msgctxt "event:rank_update|embed:notify" +msgid "New Activity Rank Attained!" +msgstr "Ofx Bdujwjuz Sbol Buubjofe!" + +#: src/modules/ranks/cog.py:516 +msgctxt "rank_refresh|error:roles_dne|desc" +msgid "Some ranks have invalid or deleted roles! Please remove them first." +msgstr "Tpnf sbolt ibwf jowbmje ps efmfufe spmft! Qmfbtf sfnpwf uifn gjstu." + +#: src/modules/ranks/cog.py:526 +#, possible-python-brace-format +msgctxt "rank_refresh|error:unassignable_roles|desc" +msgid "" +"I have insufficient permissions to assign the following role(s):\n" +"{roles}" +msgstr "" +"J ibwf jotvggjdjfou qfsnjttjpot up bttjho uif gpmmpxjoh spmf(t):\n" +"{roles}" + +#: src/modules/ranks/cog.py:596 +msgctxt "rank_refresh|remove_roles|audit" +msgid "Removing invalid rank role." +msgstr "Sfnpwjoh jowbmje sbol spmf." + +#: src/modules/ranks/cog.py:610 +#, possible-python-brace-format +msgctxt "rank_refresh|remove_roles|small_error" +msgid "*Could not remove ranks from {member}*" +msgstr "*Dpvme opu sfnpwf sbolt gspn {member}*" + +#: src/modules/ranks/cog.py:617 +msgctxt "rank_refresh|remove_roles|error:too_many_issues" +msgid "" +"Too many issues occurred while removing ranks! Please check my permissions " +"and try again in a few minutes." +msgstr "" +"Upp nboz jttvft pddvssfe xijmf sfnpwjoh sbolt! Qmfbtf difdl nz qfsnjttjpot " +"boe usz bhbjo jo b gfx njovuft." + +#: src/modules/ranks/cog.py:631 +msgctxt "rank_refresh|add_roles|audit" +msgid "Adding rank role from refresh" +msgstr "Beejoh sbol spmf gspn sfgsfti" + +#: src/modules/ranks/cog.py:645 +#, possible-python-brace-format +msgctxt "rank_refresh|add_roles|small_error" +msgid "*Could not add {role} to {member}*" +msgstr "*Dpvme opu bee {role} up {member}*" + +#: src/modules/ranks/cog.py:652 +msgctxt "rank_refresh|add_roles|error:too_many_issues" +msgid "" +"Too many issues occurred while adding ranks! Please check my permissions and" +" try again in a few minutes." +msgstr "" +"Upp nboz jttvft pddvssfe xijmf beejoh sbolt! Qmfbtf difdl nz qfsnjttjpot boe" +" usz bhbjo jo b gfx njovuft." + +#. ---------- Commands ---------- +#: src/modules/ranks/cog.py:677 +msgctxt "cmd:ranks" +msgid "ranks" +msgstr "sbolt" + +#: src/modules/ranks/cog.py:709 +msgctxt "cmd:configure_ranks" +msgid "ranks" +msgstr "sbolt" + +#: src/modules/ranks/cog.py:710 +msgctxt "cmd:configure_ranks|desc" +msgid "Configure Activity Ranks" +msgstr "Dpogjhvsf Bdujwjuz Sbolt" + +#: src/modules/ranks/cog.py:770 +#, possible-python-brace-format +msgctxt "" +"cmd:configure_ranks|response:updated|setting:notification|withdm_withchannel" +msgid "" +"Rank update notifications will be sent via **direct message** when possible," +" otherwise to {channel}" +msgstr "" +"Sbol vqebuf opujgjdbujpot xjmm cf tfou wjb **ejsfdu nfttbhf** xifo qpttjcmf," +" puifsxjtf up {channel}" + +#: src/modules/ranks/cog.py:776 +msgctxt "" +"cmd:configure_ranks|response:updated|setting:notification|withdm_nochannel" +msgid "Rank update notifications will be sent via **direct message**." +msgstr "Sbol vqebuf opujgjdbujpot xjmm cf tfou wjb **ejsfdu nfttbhf**." + +#: src/modules/ranks/cog.py:782 +#, possible-python-brace-format +msgctxt "" +"cmd:configure_ranks|response:updated|setting:notification|nodm_withchannel" +msgid "Rank update notifications will be sent to {channel}." +msgstr "Sbol vqebuf opujgjdbujpot xjmm cf tfou up {channel}." + +#: src/modules/ranks/cog.py:787 +msgctxt "" +"cmd:configure_ranks|response:updated|setting:notification|nodm_nochannel" +msgid "Members will not be notified when their activity rank updates." +msgstr "Nfncfst xjmm opu cf opujgjfe xifo uifjs bdujwjuz sbol vqebuft." + +#: src/modules/ranks/utils.py:13 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:role_name" +msgid "{role_name}" +msgstr "{role_name}" + +#: src/modules/ranks/utils.py:14 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:guild_name" +msgid "{guild_name}" +msgstr "{guild_name}" + +#: src/modules/ranks/utils.py:15 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:user_name" +msgid "{user_name}" +msgstr "{user_name}" + +#: src/modules/ranks/utils.py:16 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:role_id" +msgid "{role_id}" +msgstr "{role_id}" + +#: src/modules/ranks/utils.py:17 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:guild_id" +msgid "{guild_id}" +msgstr "{guild_id}" + +#: src/modules/ranks/utils.py:18 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:user_id" +msgid "{user_id}" +msgstr "{user_id}" + +#: src/modules/ranks/utils.py:19 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:role_mention" +msgid "{role_mention}" +msgstr "{role_mention}" + +#: src/modules/ranks/utils.py:20 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:user_mention" +msgid "{user_mention}" +msgstr "{user_mention}" + +#: src/modules/ranks/utils.py:21 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:requires" +msgid "{rank_requires}" +msgstr "{rank_requires}" + +#: src/modules/ranks/settings.py:26 +msgctxt "guildset:rank_type|output:voice" +msgid "`Voice`" +msgstr "`Wpjdf`" + +#: src/modules/ranks/settings.py:27 +msgctxt "guildset:rank_type|output:xp" +msgid "`Exp`" +msgstr "`Fyq`" + +#: src/modules/ranks/settings.py:28 +msgctxt "guildset:rank_type|output:message" +msgid "`Messages`" +msgstr "`Nfttbhft`" + +#: src/modules/ranks/settings.py:31 +msgctxt "guildset:rank_type|input_format:voice" +msgid "Voice" +msgstr "Wpjdf" + +#: src/modules/ranks/settings.py:32 +msgctxt "guildset:rank_type|input_format:xp" +msgid "Exp" +msgstr "Fyq" + +#: src/modules/ranks/settings.py:33 +msgctxt "guildset:rank_type|input_format:message" +msgid "Messages" +msgstr "Nfttbhft" + +#: src/modules/ranks/settings.py:36 +msgctxt "guildset:rank_type|input_pattern:voice" +msgid "voice|study" +msgstr "wpjdf|tuvez" + +#: src/modules/ranks/settings.py:37 +msgctxt "guildset:rank_type|input_pattern:voice" +msgid "text|message|messages" +msgstr "ufyu|nfttbhf|nfttbhft" + +#: src/modules/ranks/settings.py:38 +msgctxt "guildset:rank_type|input_pattern:xp" +msgid "xp|exp|experience" +msgstr "yq|fyq|fyqfsjfodf" + +#: src/modules/ranks/settings.py:45 +msgctxt "guildset:rank_type" +msgid "rank_type" +msgstr "sbol_uzqf" + +#: src/modules/ranks/settings.py:48 +msgctxt "guildset:rank_type|desc" +msgid "" +"The type of statistic (messages | xp | voice hours) used to determine " +"activity ranks." +msgstr "" +"Uif uzqf pg tubujtujd (nfttbhft | yq | wpjdf ipvst) vtfe up efufsnjof " +"bdujwjuz sbolt." + +#: src/modules/ranks/settings.py:52 +msgctxt "guildset:rank_type|long_desc" +msgid "" +"Which statistic is used to reward activity ranks.\n" +"`Voice` is the number of hours active in tracked voice channels, `Exp` is a measure of message activity, and `Message` is a simple count of messages sent." +msgstr "" +"Xijdi tubujtujd jt vtfe up sfxbse bdujwjuz sbolt.\n" +"`Wpjdf` jt uif ovncfs pg ipvst bdujwf jo usbdlfe wpjdf diboofmt, `Fyq` jt b nfbtvsf pg nfttbhf bdujwjuz, boe `Nfttbhf` jt b tjnqmf dpvou pg nfttbhft tfou." + +#: src/modules/ranks/settings.py:59 +msgctxt "guildset:rank_type|accepts" +msgid "Voice/Exp/Messages" +msgstr "Wpjdf/Fyq/Nfttbhft" + +#: src/modules/ranks/settings.py:71 +msgctxt "guildset:rank_type|set_response|type:voice" +msgid "Members will be awarded activity ranks based on `Voice Activity`." +msgstr "Nfncfst xjmm cf bxbsefe bdujwjuz sbolt cbtfe po `Wpjdf Bdujwjuz`." + +#: src/modules/ranks/settings.py:76 +msgctxt "guildset:rank_type|set_response|type:messages" +msgid "Members will be awarded activity ranks based on `Messages Sent`." +msgstr "Nfncfst xjmm cf bxbsefe bdujwjuz sbolt cbtfe po `Nfttbhft Tfou`." + +#: src/modules/ranks/settings.py:81 +msgctxt "guildset:rank_type|set_response|type:xp" +msgid "Members will be awarded activity ranks based on `Message XP Earned`." +msgstr "Nfncfst xjmm cf bxbsefe bdujwjuz sbolt cbtfe po `Nfttbhf YQ Fbsofe`." + +#: src/modules/ranks/settings.py:91 +#, possible-python-brace-format +msgctxt "guildset:rank_channel|set_using" +msgid "{cmd} or option menu below." +msgstr "{cmd} ps pqujpo nfov cfmpx." + +#: src/modules/ranks/settings.py:103 +msgctxt "guildset:rank_channel" +msgid "rank_channel" +msgstr "sbol_diboofm" + +#: src/modules/ranks/settings.py:106 +msgctxt "guildset:rank_channel|desc" +msgid "The channel in which to send rank update notifications." +msgstr "Uif diboofm jo xijdi up tfoe sbol vqebuf opujgjdbujpot." + +#: src/modules/ranks/settings.py:110 +msgctxt "guildset:rank_channel|long_desc" +msgid "" +"Whenever a user advances a rank, a congratulatory message will be sent in " +"this channel, if set. If `dm_ranks` is enabled, this channel will only be " +"used when the user has opted not to receive DM notifications, or is " +"otherwise unreachable." +msgstr "" +"Xifofwfs b vtfs bewbodft b sbol, b dpohsbuvmbupsz nfttbhf xjmm cf tfou jo " +"uijt diboofm, jg tfu. Jg `en_sbolt` jt fobcmfe, uijt diboofm xjmm pomz cf " +"vtfe xifo uif vtfs ibt pqufe opu up sfdfjwf EN opujgjdbujpot, ps jt " +"puifsxjtf vosfbdibcmf." + +#: src/modules/ranks/settings.py:116 +msgctxt "guildset:rank_channel|accepts" +msgid "Rank notification channel name or id." +msgstr "Sbol opujgjdbujpo diboofm obnf ps je." + +#: src/modules/ranks/settings.py:128 +#, possible-python-brace-format +msgctxt "guildset:rank_channel|set_response|set" +msgid "Rank update messages will be sent to {channel}." +msgstr "Sbol vqebuf nfttbhft xjmm cf tfou up {channel}." + +#: src/modules/ranks/settings.py:133 +msgctxt "guildset:rank_channel|set_response|unset" +msgid "" +"Rank update messages will be ignored or sent via DM (if `dm_ranks` is " +"enabled)." +msgstr "" +"Sbol vqebuf nfttbhft xjmm cf jhopsfe ps tfou wjb EN (jg `en_sbolt` jt " +"fobcmfe)." + +#: src/modules/ranks/settings.py:143 +#, possible-python-brace-format +msgctxt "guildset:rank_channel|set_using" +msgid "{cmd} or channel selector below." +msgstr "{cmd} ps diboofm tfmfdups cfmpx." + +#: src/modules/ranks/settings.py:153 +msgctxt "guildset:dm_ranks" +msgid "dm_ranks" +msgstr "en_sbolt" + +#: src/modules/ranks/settings.py:156 +msgctxt "guildset:dm_ranks|desc" +msgid "" +"Whether to send rank advancement notifications through direct messages." +msgstr "" +"Xifuifs up tfoe sbol bewbodfnfou opujgjdbujpot uispvhi ejsfdu nfttbhft." + +#: src/modules/ranks/settings.py:160 +msgctxt "guildset:dm_ranks|long_desc" +msgid "" +"If enabled, congratulatory messages for rank advancement will be direct " +"messaged to the user, instead of being sent to the configured " +"`rank_channel`." +msgstr "" +"Jg fobcmfe, dpohsbuvmbupsz nfttbhft gps sbol bewbodfnfou xjmm cf ejsfdu " +"nfttbhfe up uif vtfs, jotufbe pg cfjoh tfou up uif dpogjhvsfe " +"`sbol_diboofm`." + +#: src/modules/ranks/settings.py:174 +msgctxt "guildset:dm_ranks|response:true" +msgid "I will direct message members upon rank advancement." +msgstr "J xjmm ejsfdu nfttbhf nfncfst vqpo sbol bewbodfnfou." + +#: src/modules/ranks/settings.py:179 +msgctxt "guildset:dm_ranks|response:false" +msgid "I will never direct message members upon rank advancement." +msgstr "J xjmm ofwfs ejsfdu nfttbhf nfncfst vqpo sbol bewbodfnfou." + +#: src/modules/ranks/ui/preview.py:74 +msgctxt "ui:rank_preview|button:edit|error:role_deleted" +msgid "" +"The role underlying this rank no longer exists! Please select a new role " +"from the role menu." +msgstr "" +"Uif spmf voefsmzjoh uijt sbol op mpohfs fyjtut! Qmfbtf tfmfdu b ofx spmf " +"gspn uif spmf nfov." + +#: src/modules/ranks/ui/preview.py:81 +msgctxt "ui:rank_preview|button:edit|error:role_not_assignable" +msgid "" +"I do not have permission to edit the underlying role! Please select a new " +"role from the role menu, or ensure my top role is above the selected role." +msgstr "" +"J ep opu ibwf qfsnjttjpo up feju uif voefsmzjoh spmf! Qmfbtf tfmfdu b ofx " +"spmf gspn uif spmf nfov, ps fotvsf nz upq spmf jt bcpwf uif tfmfdufe spmf." + +#: src/modules/ranks/ui/preview.py:90 +msgctxt "ui:rank_preview|button:edit|error|title" +msgid "Failed to edit rank!" +msgstr "Gbjmfe up feju sbol!" + +#: src/modules/ranks/ui/preview.py:108 +msgctxt "ui:rank_preview|button:edit|label" +msgid "Edit" +msgstr "Feju" + +#: src/modules/ranks/ui/preview.py:139 +#, possible-python-brace-format +msgctxt "ui:rank_preview|button:delete|response:success|description|with_role" +msgid "" +"You have deleted the rank {mention}. Press the button below to also delete " +"the role." +msgstr "" +"Zpv ibwf efmfufe uif sbol {mention}. Qsftt uif cvuupo cfmpx up bmtp efmfuf " +"uif spmf." + +#: src/modules/ranks/ui/preview.py:144 +#, possible-python-brace-format +msgctxt "ui:rank_preview|button:delete|response:success|description|no_role" +msgid "You have deleted the rank {mention}." +msgstr "Zpv ibwf efmfufe uif sbol {mention}." + +#: src/modules/ranks/ui/preview.py:150 +msgctxt "ui:rank_preview|button:delete|response:success|title" +msgid "Rank Deleted" +msgstr "Sbol Efmfufe" + +#: src/modules/ranks/ui/preview.py:160 +msgctxt "" +"ui:rank_preview|button:delete|response:success|button:delete_role|label" +msgid "Delete Role" +msgstr "Efmfuf Spmf" + +#: src/modules/ranks/ui/preview.py:176 +#, possible-python-brace-format +msgctxt "" +"ui:rank_preview|button:delete|response:success|button:delete_role|response:errored|desc" +msgid "" +"You have deleted the rank **{name}**! Could not delete the role due to an " +"unknown error." +msgstr "" +"Zpv ibwf efmfufe uif sbol **{name}**! Dpvme opu efmfuf uif spmf evf up bo " +"volopxo fssps." + +#: src/modules/ranks/ui/preview.py:182 +#, possible-python-brace-format +msgctxt "" +"ui:rank_preview|button:delete|response:success|button:delete_role|response:success|desc" +msgid "You have deleted the rank **{name}** along with the underlying role." +msgstr "Zpv ibwf efmfufe uif sbol **{name}** bmpoh xjui uif voefsmzjoh spmf." + +#: src/modules/ranks/ui/preview.py:199 +msgctxt "ui:rank_preview|button:delete|label" +msgid "Delete Rank" +msgstr "Efmfuf Sbol" + +#: src/modules/ranks/ui/preview.py:219 +#, possible-python-brace-format +msgctxt "ui:rank_preview|menu:roles|error:above_caller" +msgid "" +"You have insufficient permissions to assign {mention} as a rank role! You " +"may only manage roles below your top role." +msgstr "" +"Zpv ibwf jotvggjdjfou qfsnjttjpot up bttjho {mention} bt b sbol spmf! Zpv " +"nbz pomz nbobhf spmft cfmpx zpvs upq spmf." + +#: src/modules/ranks/ui/preview.py:225 +msgctxt "ui:rank_preview|menu:roles|error:above_caller|title" +msgid "Insufficient permissions!" +msgstr "Jotvggjdjfou qfsnjttjpot!" + +#: src/modules/ranks/ui/preview.py:241 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|suberror:is_default" +msgid "The @everyone role cannot be removed, and cannot be a rank!" +msgstr "Uif @fwfszpof spmf dboopu cf sfnpwfe, boe dboopu cf b sbol!" + +#: src/modules/ranks/ui/preview.py:246 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|suberror:is_managed" +msgid "" +"The role is managed by another application or integration, and cannot be a " +"rank!" +msgstr "" +"Uif spmf jt nbobhfe cz bopuifs bqqmjdbujpo ps joufhsbujpo, boe dboopu cf b " +"sbol!" + +#: src/modules/ranks/ui/preview.py:251 +msgctxt "" +"ui:rank_preview|menu:roles|error:not_assignable|suberror:no_permissions" +msgid "" +"I do not have the `MANAGE_ROLES` permission in this server, so I cannot " +"manage ranks!" +msgstr "" +"J ep opu ibwf uif `NBOBHF_SPMFT` qfsnjttjpo jo uijt tfswfs, tp J dboopu " +"nbobhf sbolt!" + +#: src/modules/ranks/ui/preview.py:256 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|suberror:above_me" +msgid "" +"This role is above my top role in the role hierarchy, so I cannot add or " +"remove it!" +msgstr "" +"Uijt spmf jt bcpwf nz upq spmf jo uif spmf ijfsbsdiz, tp J dboopu bee ps " +"sfnpwf ju!" + +#: src/modules/ranks/ui/preview.py:262 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|suberror:other" +msgid "I am not able to manage the selected role, so it cannot be a rank!" +msgstr "J bn opu bcmf up nbobhf uif tfmfdufe spmf, tp ju dboopu cf b sbol!" + +#: src/modules/ranks/ui/preview.py:268 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|title" +msgid "Could not update rank!" +msgstr "Dpvme opu vqebuf sbol!" + +#: src/modules/ranks/ui/preview.py:278 +msgctxt "ui:rank_preview|menu:roles|placeholder" +msgid "Update Rank Role" +msgstr "Vqebuf Sbol Spmf" + +#: src/modules/ranks/ui/preview.py:290 +msgctxt "ui:rank_preview|embed|title" +msgid "Rank Information" +msgstr "Sbol Jogpsnbujpo" + +#: src/modules/ranks/ui/preview.py:297 +msgctxt "ui:rank_preview|embed|field:role|name" +msgid "Role" +msgstr "Spmf" + +#: src/modules/ranks/ui/preview.py:304 +msgctxt "ui:rank_preview|embed|field:required|name" +msgid "Required" +msgstr "Sfrvjsfe" + +#: src/modules/ranks/ui/preview.py:311 +msgctxt "ui:rank_preview|embed|field:reward|name" +msgid "Reward" +msgstr "Sfxbse" + +#: src/modules/ranks/ui/preview.py:320 +msgctxt "ui:rank_preview|embed|field:message" +msgid "Congratulatory Message" +msgstr "Dpohsbuvmbupsz Nfttbhf" + +#: src/modules/ranks/ui/refresh.py:125 +msgctxt "ui:refresh_ranks|embed|title:errored" +msgid "Could not refresh the server ranks!" +msgstr "Dpvme opu sfgsfti uif tfswfs sbolt!" + +#: src/modules/ranks/ui/refresh.py:133 +msgctxt "ui:refresh_ranks|embed|title:done" +msgid "Rank refresh complete!" +msgstr "Sbol sfgsfti dpnqmfuf!" + +#: src/modules/ranks/ui/refresh.py:139 +msgctxt "ui:refresh_ranks|embed|title:working" +msgid "Refreshing your server ranks, please wait." +msgstr "Sfgsftijoh zpvs tfswfs sbolt, qmfbtf xbju." + +#: src/modules/ranks/ui/refresh.py:157 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:ranks" +msgid "**Loading server ranks:** {emoji}" +msgstr "**Mpbejoh tfswfs sbolt:** {emoji}" + +#: src/modules/ranks/ui/refresh.py:167 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:members" +msgid "**Loading server members:** {emoji}" +msgstr "**Mpbejoh tfswfs nfncfst:** {emoji}" + +#: src/modules/ranks/ui/refresh.py:177 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:roles" +msgid "**Loading rank roles:** {emoji}" +msgstr "**Mpbejoh sbol spmft:** {emoji}" + +#: src/modules/ranks/ui/refresh.py:187 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:compute" +msgid "**Computing correct ranks:** {emoji}" +msgstr "**Dpnqvujoh dpssfdu sbolt:** {emoji}" + +#: src/modules/ranks/ui/refresh.py:198 +msgctxt "ui:refresh_ranks|embed|field:remove|name" +msgid "Removing invalid rank roles from members" +msgstr "Sfnpwjoh jowbmje sbol spmft gspn nfncfst" + +#: src/modules/ranks/ui/refresh.py:202 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|field:remove|value" +msgid "{progress} {done}/{total} removed" +msgstr "{progress} {done}/{total} sfnpwfe" + +#: src/modules/ranks/ui/refresh.py:213 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:remove" +msgid "**Removed invalid ranks:** {done}/{target}" +msgstr "**Sfnpwfe jowbmje sbolt:** {done}/{target}" + +#: src/modules/ranks/ui/refresh.py:221 +msgctxt "ui:refresh_ranks|embed|field:add|name" +msgid "Giving members their rank roles" +msgstr "Hjwjoh nfncfst uifjs sbol spmft" + +#: src/modules/ranks/ui/refresh.py:225 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|field:add|value" +msgid "{progress} {done}/{total} given" +msgstr "{progress} {done}/{total} hjwfo" + +#: src/modules/ranks/ui/refresh.py:236 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:add" +msgid "**Updated member ranks:** {done}/{target}" +msgstr "**Vqebufe nfncfs sbolt:** {done}/{target}" + +#: src/modules/ranks/ui/config.py:42 +msgctxt "ui:rankconfigui|check|not_permitted" +msgid "You have insufficient server permissions to use this UI!" +msgstr "Zpv ibwf jotvggjdjfou tfswfs qfsnjttjpot up vtf uijt VJ!" + +#: src/modules/ranks/ui/config.py:64 +msgctxt "ui:rank_config|button:overview|label" +msgid "Edit Ranks" +msgstr "Feju Sbolt" + +#: src/modules/ranks/ui/config.py:82 +msgctxt "ui:rank_config|menu:types|placeholder" +msgid "Select Statistic Type" +msgstr "Tfmfdu Tubujtujd Uzqf" + +#: src/modules/ranks/ui/config.py:90 +msgctxt "ui:rank_config|menu:types|option:voice" +msgid "Voice Activity" +msgstr "Wpjdf Bdujwjuz" + +#: src/modules/ranks/ui/config.py:98 +msgctxt "ui:rank_config|menu:types|option:xp" +msgid "XP Earned" +msgstr "YQ Fbsofe" + +#: src/modules/ranks/ui/config.py:106 +msgctxt "ui:rank_config|menu:types|option:messages" +msgid "Messages Sent" +msgstr "Nfttbhft Tfou" + +#: src/modules/ranks/ui/config.py:126 +msgctxt "ui:rank_config|menu:channels|placeholder" +msgid "Select Rank Notification Channel" +msgstr "Tfmfdu Sbol Opujgjdbujpo Diboofm" + +#: src/modules/ranks/ui/config.py:134 +msgctxt "ui:rank_config|embed|title" +msgid "Ranks Configuration Panel" +msgstr "Sbolt Dpogjhvsbujpo Qbofm" + +#: src/modules/ranks/ui/config.py:171 +msgctxt "dash:rank|title" +msgid "Rank Configuration ({commands[configure ranks]})" +msgstr "Sbol Dpogjhvsbujpo ({commands[configure ranks]})" + +#: src/modules/ranks/ui/config.py:175 +msgctxt "dash:rank|dropdown|placeholder" +msgid "Activity Rank Panel" +msgstr "Bdujwjuz Sbol Qbofm" + +#: src/modules/ranks/ui/overview.py:94 +msgctxt "ui:rank_overview|button:auto|label" +msgid "Auto Create" +msgstr "Bvup Dsfbuf" + +#: src/modules/ranks/ui/overview.py:109 +msgctxt "ui:rank_overview|button:refresh|label" +msgid "Refresh Member Ranks" +msgstr "Sfgsfti Nfncfs Sbolt" + +#: src/modules/ranks/ui/overview.py:121 +msgctxt "ui:rank_overview|button:clear|confirm" +msgid "Are you sure you want to **delete all activity ranks** in this server?" +msgstr "" +"Bsf zpv tvsf zpv xbou up **efmfuf bmm bdujwjuz sbolt** jo uijt tfswfs?" + +#: src/modules/ranks/ui/overview.py:126 +msgctxt "ui:rank_overview|button:clear|confirm|button:yes" +msgid "Yes, clear ranks" +msgstr "Zft, dmfbs sbolt" + +#: src/modules/ranks/ui/overview.py:132 +msgctxt "ui:rank_overview|button:clear|confirm|button:no" +msgid "Cancel" +msgstr "Dbodfm" + +#: src/modules/ranks/ui/overview.py:148 +msgctxt "ui:rank_overview|button:clear|label" +msgid "Clear Ranks" +msgstr "Dmfbs Sbolt" + +#: src/modules/ranks/ui/overview.py:178 +msgctxt "ui:rank_overview|button:create|label" +msgid "Create Rank" +msgstr "Dsfbuf Sbol" + +#: src/modules/ranks/ui/overview.py:194 +#, possible-python-brace-format +msgctxt "ui:rank_overview|menu:roles|error:above_caller" +msgid "" +"You have insufficient permissions to assign {mention} as a rank role! You " +"may only manage roles below your top role." +msgstr "" +"Zpv ibwf jotvggjdjfou qfsnjttjpot up bttjho {mention} bt b sbol spmf! Zpv " +"nbz pomz nbobhf spmft cfmpx zpvs upq spmf." + +#: src/modules/ranks/ui/overview.py:200 +msgctxt "ui:rank_overview|menu:roles|error:above_caller|title" +msgid "Insufficient permissions!" +msgstr "Jotvggjdjfou qfsnjttjpot!" + +#: src/modules/ranks/ui/overview.py:233 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:is_default" +msgid "The @everyone role cannot be removed, and cannot be a rank!" +msgstr "Uif @fwfszpof spmf dboopu cf sfnpwfe, boe dboopu cf b sbol!" + +#: src/modules/ranks/ui/overview.py:238 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:is_managed" +msgid "" +"The role is managed by another application or integration, and cannot be a " +"rank!" +msgstr "" +"Uif spmf jt nbobhfe cz bopuifs bqqmjdbujpo ps joufhsbujpo, boe dboopu cf b " +"sbol!" + +#: src/modules/ranks/ui/overview.py:243 +msgctxt "" +"ui:rank_overview|menu:roles|error:not_assignable|suberror:no_permissions" +msgid "" +"I do not have the `MANAGE_ROLES` permission in this server, so I cannot " +"manage ranks!" +msgstr "" +"J ep opu ibwf uif `NBOBHF_SPMFT` qfsnjttjpo jo uijt tfswfs, tp J dboopu " +"nbobhf sbolt!" + +#: src/modules/ranks/ui/overview.py:248 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:above_me" +msgid "" +"This role is above my top role in the role hierarchy, so I cannot add or " +"remove it!" +msgstr "" +"Uijt spmf jt bcpwf nz upq spmf jo uif spmf ijfsbsdiz, tp J dboopu bee ps " +"sfnpwf ju!" + +#: src/modules/ranks/ui/overview.py:254 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:other" +msgid "I am not able to manage the selected role, so it cannot be a rank!" +msgstr "J bn opu bcmf up nbobhf uif tfmfdufe spmf, tp ju dboopu cf b sbol!" + +#: src/modules/ranks/ui/overview.py:260 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|title" +msgid "Could not create rank!" +msgstr "Dpvme opu dsfbuf sbol!" + +#: src/modules/ranks/ui/overview.py:284 +msgctxt "ui:rank_overview|menu:roles|placeholder" +msgid "Create from role" +msgstr "Dsfbuf gspn spmf" + +#: src/modules/ranks/ui/overview.py:301 +msgctxt "ui:rank_overview|menu:ranks|placeholder" +msgid "View or edit rank" +msgstr "Wjfx ps feju sbol" + +#: src/modules/ranks/ui/overview.py:387 +msgctxt "ui:rank_overview|embed|field:note|name" +msgid "Note" +msgstr "Opuf" + +#: src/modules/ranks/ui/overview.py:393 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|field:note|value:with_season" +msgid "Ranks are determined by activity since {timestamp}." +msgstr "Sbolt bsf efufsnjofe cz bdujwjuz tjodf {timestamp}." + +#: src/modules/ranks/ui/overview.py:400 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|field:note|value:without_season" +msgid "" +"Ranks are determined by *all-time* statistics.\n" +"To reward ranks from a later time (e.g. to have monthly/quarterly/yearly ranks) set the `season_start` with {stats_cmd}" +msgstr "" +"Sbolt bsf efufsnjofe cz *bmm-ujnf* tubujtujdt.\n" +"Up sfxbse sbolt gspn b mbufs ujnf (f.h. up ibwf npouimz/rvbsufsmz/zfbsmz sbolt) tfu uif `tfbtpo_tubsu` xjui {stats_cmd}" + +#: src/modules/ranks/ui/overview.py:407 +msgctxt "ui:rank_overview|embed|field:note|value|voice_addendum" +msgid "" +"Also note that ranks will only be updated when a member leaves a tracked " +"voice channel! Use the **Refresh Member Ranks** button below to update all " +"members manually." +msgstr "" +"Bmtp opuf uibu sbolt xjmm pomz cf vqebufe xifo b nfncfs mfbwft b usbdlfe " +"wpjdf diboofm! Vtf uif **Sfgsfti Nfncfs Sbolt** cvuupo cfmpx up vqebuf bmm " +"nfncfst nbovbmmz." + +#: src/modules/ranks/ui/overview.py:415 +msgctxt "ui:rank_overview|embed:noranks|desc" +msgid "" +"No activity ranks have been set up!\n" +"Press 'AUTO' to automatically create a standard heirachy of voice | text | xp ranks, or select a role or press Create below!" +msgstr "" +"Op bdujwjuz sbolt ibwf cffo tfu vq!\n" +"Qsftt 'BVUP' up bvupnbujdbmmz dsfbuf b tuboebse ifjsbdiz pg wpjdf | ufyu | yq sbolt, ps tfmfdu b spmf ps qsftt Dsfbuf cfmpx!" + +#: src/modules/ranks/ui/overview.py:423 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|title|type:voice" +msgid "Voice Ranks in {guild_name}" +msgstr "Wpjdf Sbolt jo {guild_name}" + +#: src/modules/ranks/ui/overview.py:428 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|title|type:xp" +msgid "XP ranks in {guild_name}" +msgstr "YQ sbolt jo {guild_name}" + +#: src/modules/ranks/ui/overview.py:433 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|title|type:message" +msgid "Message ranks in {guild_name}" +msgstr "Nfttbhf sbolt jo {guild_name}" + +#: src/modules/ranks/ui/editor.py:33 +msgctxt "ui:rank_editor|input:role_name|label" +msgid "Role Name" +msgstr "Spmf Obnf" + +#: src/modules/ranks/ui/editor.py:37 +msgctxt "ui:rank_editor|input:role_name|placeholder" +msgid "Name of the awarded guild role" +msgstr "Obnf pg uif bxbsefe hvjme spmf" + +#: src/modules/ranks/ui/editor.py:53 +msgctxt "ui:rank_editor|input:role_colour|label" +msgid "Role Colour" +msgstr "Spmf Dpmpvs" + +#: src/modules/ranks/ui/editor.py:57 +msgctxt "ui:rank_editor|input:role_colour|placeholder" +msgid "Colour of the awarded guild role, e.g. #AB1321" +msgstr "Dpmpvs pg uif bxbsefe hvjme spmf, f.h. #BC1321" + +#: src/modules/ranks/ui/editor.py:69 +msgctxt "ui:rank_editor|input:role_colour|error:parse" +msgid "" +"`role_colour`: Could not parse colour! Please use `#` format e.g. " +"`#AB1325`." +msgstr "" +"`spmf_dpmpvs`: Dpvme opu qbstf dpmpvs! Qmfbtf vtf `#` gpsnbu f.h. " +"`#BC1325`." + +#: src/modules/ranks/ui/editor.py:88 +msgctxt "ui:rank_editor|type:voice|input:requires|label" +msgid "Required Voice Hours" +msgstr "Sfrvjsfe Wpjdf Ipvst" + +#: src/modules/ranks/ui/editor.py:92 +msgctxt "ui:rank_editor|type:voice|input:requires|placeholder" +msgid "Number of voice hours before awarding this rank" +msgstr "Ovncfs pg wpjdf ipvst cfgpsf bxbsejoh uijt sbol" + +#: src/modules/ranks/ui/editor.py:97 +msgctxt "ui:rank_editor|type:xp|input:requires|label" +msgid "Required XP" +msgstr "Sfrvjsfe YQ" + +#: src/modules/ranks/ui/editor.py:101 +msgctxt "ui:rank_editor|type:xp|input:requires|placeholder" +msgid "Amount of XP needed before obtaining this rank" +msgstr "Bnpvou pg YQ offefe cfgpsf pcubjojoh uijt sbol" + +#: src/modules/ranks/ui/editor.py:106 +msgctxt "ui:rank_editor|type:message|input:requires|label" +msgid "Required Message Count" +msgstr "Sfrvjsfe Nfttbhf Dpvou" + +#: src/modules/ranks/ui/editor.py:110 +msgctxt "ui:rank_editor|type:message|input:requires|placeholder" +msgid "Number of messages needed before awarding rank" +msgstr "Ovncfs pg nfttbhft offefe cfgpsf bxbsejoh sbol" + +#: src/modules/ranks/ui/editor.py:126 +msgctxt "ui:rank_editor|type:voice|input:requires|error:parse" +msgid "" +"`requires`: Could not parse provided minimum time! Please write a number of " +"hours." +msgstr "" +"`sfrvjsft`: Dpvme opu qbstf qspwjefe njojnvn ujnf! Qmfbtf xsjuf b ovncfs pg " +"ipvst." + +#: src/modules/ranks/ui/editor.py:137 +msgctxt "ui:rank_editor|type:message|input:requires|error:parse" +msgid "" +"`requires`: Could not parse provided minimum message count! Please enter an " +"integer." +msgstr "" +"`sfrvjsft`: Dpvme opu qbstf qspwjefe njojnvn nfttbhf dpvou! Qmfbtf foufs bo " +"joufhfs." + +#: src/modules/ranks/ui/editor.py:148 +msgctxt "ui:rank_editor|type:xp|input:requires|error:parse" +msgid "" +"`requires`: Could not parse provided minimum XP! Please enter an integer." +msgstr "" +"`sfrvjsft`: Dpvme opu qbstf qspwjefe njojnvn YQ! Qmfbtf foufs bo joufhfs." + +#: src/modules/ranks/ui/editor.py:162 +msgctxt "ui:rank_editor|input:reward|label" +msgid "LionCoins awarded upon achieving this rank" +msgstr "MjpoDpjot bxbsefe vqpo bdijfwjoh uijt sbol" + +#: src/modules/ranks/ui/editor.py:166 +msgctxt "ui:rank_editor|input:reward|placeholder" +msgid "LionCoins awarded upon achieving this rank" +msgstr "MjpoDpjot bxbsefe vqpo bdijfwjoh uijt sbol" + +#: src/modules/ranks/ui/editor.py:181 +msgctxt "ui:rank_editor|input:reward|error:parse" +msgid "`reward`: Please enter an integer number of LionCoins." +msgstr "`sfxbse`: Qmfbtf foufs bo joufhfs ovncfs pg MjpoDpjot." + +#: src/modules/ranks/ui/editor.py:197 +msgctxt "ui:rank_editor|input:message|label" +msgid "Rank Message" +msgstr "Sbol Nfttbhf" + +#: src/modules/ranks/ui/editor.py:201 +msgctxt "ui:rank_editor|input:message|placeholder" +msgid "Congratulatory message sent to the user upon achieving this rank." +msgstr "Dpohsbuvmbupsz nfttbhf tfou up uif vtfs vqpo bdijfwjoh uijt sbol." + +#: src/modules/ranks/ui/editor.py:207 +#, possible-python-brace-format +msgctxt "ui:rank_editor|input:message|default|type:voice" +msgid "" +"Congratulations {user_mention}!\n" +"For working hard for **{requires}**, you have achieved the rank of **{role_name}** in **{guild_name}**! Keep up the good work." +msgstr "" +"Dpohsbuvmbujpot {user_mention}!\n" +"Gps xpsljoh ibse gps **{requires}**, zpv ibwf bdijfwfe uif sbol pg **{role_name}** jo **{guild_name}**! Lffq vq uif hppe xpsl." + +#: src/modules/ranks/ui/editor.py:262 +msgctxt "ui:rank_editor|mode:edit|title" +msgid "Rank Editor" +msgstr "Sbol Fejups" + +#: src/modules/ranks/ui/editor.py:317 +msgctxt "ui:rank_editor|mode:create|title" +msgid "Rank Creator" +msgstr "Sbol Dsfbups" diff --git a/locales/ceaser/LC_MESSAGES/reminders.po b/locales/ceaser/LC_MESSAGES/reminders.po new file mode 100644 index 00000000..2d4c7907 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/reminders.po @@ -0,0 +1,406 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/reminders/cog.py:114 +#, possible-python-brace-format +msgctxt "create_reminder|error:past" +msgid "The provided reminder time {timestamp} is in the past!" +msgstr "Uif qspwjefe sfnjoefs ujnf {timestamp} jt jo uif qbtu!" + +#: src/modules/reminders/cog.py:123 +msgctxt "create_reminder|error:too_fast" +msgid "" +"You cannot set a repeating reminder with a period less than 10 minutes." +msgstr "" +"Zpv dboopu tfu b sfqfbujoh sfnjoefs xjui b qfsjpe mftt uibo 10 njovuft." + +#: src/modules/reminders/cog.py:133 +msgctxt "create_reminder|error:too_many" +msgid "Sorry, you have reached the maximum of `25` reminders." +msgstr "Tpssz, zpv ibwf sfbdife uif nbyjnvn pg `25` sfnjoefst." + +#: src/modules/reminders/cog.py:149 +msgctxt "create_reminder|error:cannot_dm" +msgid "" +"I cannot direct message you! Do you have me blocked or direct messages " +"closed?" +msgstr "" +"J dboopu ejsfdu nfttbhf zpv! Ep zpv ibwf nf cmpdlfe ps ejsfdu nfttbhft " +"dmptfe?" + +#: src/modules/reminders/cog.py:186 +#, possible-python-brace-format +msgctxt "parse_timestamp|error:parse" +msgid "" +"Could not parse `{given}` as a valid reminder time. Try entering the time in" +" the form `HH:MM` or `YYYY-MM-DD HH:MM`." +msgstr "" +"Dpvme opu qbstf `{given}` bt b wbmje sfnjoefs ujnf. Usz foufsjoh uif ujnf jo" +" uif gpsn `II:NN` ps `ZZZZ-NN-EE II:NN`." + +#: src/modules/reminders/cog.py:329 +msgctxt "cmd:reminders" +msgid "reminders" +msgstr "sfnjoefst" + +#: src/modules/reminders/cog.py:332 +msgctxt "cmd:reminders|desc" +msgid "View and set your reminders." +msgstr "Wjfx boe tfu zpvs sfnjoefst." + +#: src/modules/reminders/cog.py:353 +msgctxt "cmd:remindme" +msgid "remindme" +msgstr "sfnjoenf" + +#: src/modules/reminders/cog.py:354 +msgctxt "cmd:remindme|desc" +msgid "View and set task reminders." +msgstr "Wjfx boe tfu ubtl sfnjoefst." + +#: src/modules/reminders/cog.py:361 +msgctxt "cmd:reminders_cancel" +msgid "cancel" +msgstr "dbodfm" + +#: src/modules/reminders/cog.py:364 +msgctxt "cmd:reminders_cancel|desc" +msgid "" +"Cancel a single reminder. Use /reminders to clear or cancel multiple " +"reminders." +msgstr "" +"Dbodfm b tjohmf sfnjoefs. Vtf /sfnjoefst up dmfbs ps dbodfm nvmujqmf " +"sfnjoefst." + +#: src/modules/reminders/cog.py:368 +msgctxt "cmd:reminders_cancel|param:reminder" +msgid "reminder" +msgstr "sfnjoefs" + +#: src/modules/reminders/cog.py:373 +msgctxt "cmd:reminders_cancel|param:reminder|desc" +msgid "Start typing, then select a reminder to cancel." +msgstr "Tubsu uzqjoh, uifo tfmfdu b sfnjoefs up dbodfm." + +#: src/modules/reminders/cog.py:392 +msgctxt "cmd:reminders_cancel|error:no_reminders" +msgid "There are no reminders to cancel!" +msgstr "Uifsf bsf op sfnjoefst up dbodfm!" + +#: src/modules/reminders/cog.py:416 +msgctxt "cmd:reminders_cancel|error:no_match" +msgid "" +"I am not sure which reminder you want to cancel. Please try again, selecting" +" a reminder from the list of choices." +msgstr "" +"J bn opu tvsf xijdi sfnjoefs zpv xbou up dbodfm. Qmfbtf usz bhbjo, tfmfdujoh" +" b sfnjoefs gspn uif mjtu pg dipjdft." + +#: src/modules/reminders/cog.py:429 +msgctxt "cmd:reminders_cancel|embed:success|desc" +msgid "Reminder successfully cancelled." +msgstr "Sfnjoefs tvddfttgvmmz dbodfmmfe." + +#: src/modules/reminders/cog.py:446 +msgctxt "cmd:reminders_cancel|acmpl:reminder|error:no_reminders" +msgid "There are no reminders to cancel!" +msgstr "Uifsf bsf op sfnjoefst up dbodfm!" + +#: src/modules/reminders/cog.py:476 +#, possible-python-brace-format +msgctxt "cmd:reminders_cancel|acmpl:reminder|error:no_matches" +msgid "You do not have any reminders matching \"{partial}\"" +msgstr "Zpv ep opu ibwf boz sfnjoefst nbudijoh \"{partial}\"" + +#: src/modules/reminders/cog.py:484 +msgctxt "cmd:remindme_at" +msgid "at" +msgstr "bu" + +#: src/modules/reminders/cog.py:487 +msgctxt "cmd:remindme_at|desc" +msgid "Schedule a reminder for a particular time." +msgstr "Tdifevmf b sfnjoefs gps b qbsujdvmbs ujnf." + +#: src/modules/reminders/cog.py:491 +msgctxt "cmd:remindme_at|param:time" +msgid "time" +msgstr "ujnf" + +#: src/modules/reminders/cog.py:492 +msgctxt "cmd:remindme_at|param:reminder" +msgid "reminder" +msgstr "sfnjoefs" + +#: src/modules/reminders/cog.py:493 +msgctxt "cmd:remindme_at|param:every" +msgid "repeat_every" +msgstr "sfqfbu_fwfsz" + +#: src/modules/reminders/cog.py:498 +msgctxt "cmd:remindme_at|param:time|desc" +msgid "When you want to be reminded. (E.g. `4pm` or `16:00`)." +msgstr "Xifo zpv xbou up cf sfnjoefe. (F.h. `4qn` ps `16:00`)." + +#: src/modules/reminders/cog.py:502 +msgctxt "cmd:remindme_at|param:reminder|desc" +msgid "What should the reminder be?" +msgstr "Xibu tipvme uif sfnjoefs cf?" + +#: src/modules/reminders/cog.py:506 +msgctxt "cmd:remindme_at|param:every|desc" +msgid "How often to repeat this reminder." +msgstr "Ipx pgufo up sfqfbu uijt sfnjoefs." + +#: src/modules/reminders/cog.py:533 +msgctxt "cmd:remindme_at|error|title" +msgid "Could not create reminder!" +msgstr "Dpvme opu dsfbuf sfnjoefs!" + +#: src/modules/reminders/cog.py:564 +#, possible-python-brace-format +msgctxt "cmd:remindme_at|acmpl:time|error:parse" +msgid "" +"Cannot parse \"{partial}\" as a time. Try the format HH:MM or YYYY-MM-DD " +"HH:MM" +msgstr "" +"Dboopu qbstf \"{partial}\" bt b ujnf. Usz uif gpsnbu II:NN ps ZZZZ-NN-EE " +"II:NN" + +#: src/modules/reminders/cog.py:571 +msgctxt "cmd:remindme_in" +msgid "in" +msgstr "jo" + +#: src/modules/reminders/cog.py:574 +msgctxt "cmd:remindme_in|desc" +msgid "Schedule a reminder for a given amount of time in the future." +msgstr "Tdifevmf b sfnjoefs gps b hjwfo bnpvou pg ujnf jo uif gvuvsf." + +#: src/modules/reminders/cog.py:578 +msgctxt "cmd:remindme_in|param:time" +msgid "time" +msgstr "ujnf" + +#: src/modules/reminders/cog.py:579 +msgctxt "cmd:remindme_in|param:reminder" +msgid "reminder" +msgstr "sfnjoefs" + +#: src/modules/reminders/cog.py:580 +msgctxt "cmd:remindme_in|param:every" +msgid "repeat_every" +msgstr "sfqfbu_fwfsz" + +#: src/modules/reminders/cog.py:585 +msgctxt "cmd:remindme_in|param:time|desc" +msgid "How far into the future to set the reminder (e.g. 1 day 10h 5m)." +msgstr "Ipx gbs joup uif gvuvsf up tfu uif sfnjoefs (f.h. 1 ebz 10i 5n)." + +#: src/modules/reminders/cog.py:589 +msgctxt "cmd:remindme_in|param:reminder|desc" +msgid "What should the reminder be?" +msgstr "Xibu tipvme uif sfnjoefs cf?" + +#: src/modules/reminders/cog.py:593 +msgctxt "cmd:remindme_in|param:every|desc" +msgid "How often to repeat this reminder. (e.g. 1 day, or 2h)" +msgstr "Ipx pgufo up sfqfbu uijt sfnjoefs. (f.h. 1 ebz, ps 2i)" + +#: src/modules/reminders/cog.py:619 +msgctxt "cmd:remindme_in|error|title" +msgid "Could not create reminder!" +msgstr "Dpvme opu dsfbuf sfnjoefs!" + +#: src/modules/reminders/ui.py:47 +msgctxt "ui:reminderlist|button:clear|confirm|title" +msgid "Are You Sure?" +msgstr "Bsf Zpv Tvsf?" + +#: src/modules/reminders/ui.py:50 +#, possible-python-brace-format +msgctxt "ui:reminderlist|button:clear|confirm|desc" +msgid "Are you sure you want to delete your `{count}` reminder?" +msgid_plural "Are you sure you want to clear your `{count}` reminders?" +msgstr[0] "Bsf zpv tvsf zpv xbou up efmfuf zpvs `{count}` sfnjoefs?" +msgstr[1] "Bsf zpv tvsf zpv xbou up dmfbs zpvs `{count}` sfnjoefst?" + +#: src/modules/reminders/ui.py:57 +msgctxt "ui:reminderlist|button:clear|confirm|button:yes" +msgid "Yes, clear my reminders" +msgstr "Zft, dmfbs nz sfnjoefst" + +#: src/modules/reminders/ui.py:68 +msgctxt "ui:reminderlist|button:clear|success|desc" +msgid "Your reminders have been cleared!" +msgstr "Zpvs sfnjoefst ibwf cffo dmfbsfe!" + +#: src/modules/reminders/ui.py:77 +msgctxt "ui:reminderlist|button:clear|confirm|button:cancel" +msgid "Cancel" +msgstr "Dbodfm" + +#: src/modules/reminders/ui.py:89 +msgctxt "ui:reminderlist|button:clear|label" +msgid "Clear Reminders" +msgstr "Dmfbs Sfnjoefst" + +#: src/modules/reminders/ui.py:110 +msgctxt "ui:reminderlist|button:new|modal|field:time|label" +msgid "When would you like to be reminded?" +msgstr "Xifo xpvme zpv mjlf up cf sfnjoefe?" + +#: src/modules/reminders/ui.py:120 +msgctxt "ui:reminderlist|button:new|modal|field:repeat|label" +msgid "How often should the reminder repeat?" +msgstr "Ipx pgufo tipvme uif sfnjoefs sfqfbu?" + +#: src/modules/reminders/ui.py:124 +msgctxt "ui:reminderlist|button:new|modal|field:repeat|placeholder" +msgid "1 day 10 hours 5 minutes (Leave empty for no repeat.)" +msgstr "1 ebz 10 ipvst 5 njovuft (Mfbwf fnquz gps op sfqfbu.)" + +#: src/modules/reminders/ui.py:133 +msgctxt "ui:reminderlist|button:new|modal|field:content|label" +msgid "What should I remind you?" +msgstr "Xibu tipvme J sfnjoe zpv?" + +#: src/modules/reminders/ui.py:144 +msgctxt "ui:reminderlist|button:new|modal|title" +msgid "Set a Reminder" +msgstr "Tfu b Sfnjoefs" + +#: src/modules/reminders/ui.py:157 +#, possible-python-brace-format +msgctxt "ui:reminderlist|button:new|modal|parse|error:interval" +msgid "Cannot parse '{value}' as a duration." +msgstr "Dboopu qbstf '{value}' bt b evsbujpo." + +#: src/modules/reminders/ui.py:180 +msgctxt "ui:reminderlist|button:new|label" +msgid "New Reminder" +msgstr "Ofx Sfnjoefs" + +#: src/modules/reminders/ui.py:208 +msgctxt "ui:reminderlist|select:remove|placeholder" +msgid "Select to cancel" +msgstr "Tfmfdu up dbodfm" + +#: src/modules/reminders/ui.py:264 +msgctxt "ui:reminderlist|embed:list|author" +msgid "Your reminders" +msgstr "Zpvs sfnjoefst" + +#: src/modules/reminders/ui.py:270 +msgctxt "ui:reminderlist|embed:list|footer" +msgid "Click a reminder to jump back to the context!" +msgstr "Dmjdl b sfnjoefs up kvnq cbdl up uif dpoufyu!" + +#: src/modules/reminders/ui.py:277 +msgctxt "ui:reminderlist|embed:no_reminders|title" +msgid "You have no reminders set!" +msgstr "Zpv ibwf op sfnjoefst tfu!" + +#: src/modules/reminders/ui.py:286 +msgctxt "ui:reminderlist|embed|tips:name" +msgid "Reminder Tips" +msgstr "Sfnjoefs Ujqt" + +#: src/modules/reminders/ui.py:290 +#, possible-python-brace-format +msgctxt "ui:reminderlist|embed|tips:value" +msgid "" +"- Use {at_cmd} to set a reminder at a known time (e.g. `at 10 am`).\n" +"- Use {in_cmd} to set a reminder in a certain time (e.g. `in 2 hours`).\n" +"- Both commands support repeating reminders using the `every` parameter.\n" +"- Remember to tell me your timezone with {timezone_cmd} if you haven't already!" +msgstr "" +"- Vtf {at_cmd} up tfu b sfnjoefs bu b lopxo ujnf (f.h. `bu 10 bn`).\n" +"- Vtf {in_cmd} up tfu b sfnjoefs jo b dfsubjo ujnf (f.h. `jo 2 ipvst`).\n" +"- Cpui dpnnboet tvqqpsu sfqfbujoh sfnjoefst vtjoh uif `fwfsz` qbsbnfufs.\n" +"- Sfnfncfs up ufmm nf zpvs ujnfapof xjui {timezone_cmd} jg zpv ibwfo'u bmsfbez!" + +#: src/modules/reminders/data.py:63 +msgctxt "reminder_set|title" +msgid "Reminder Set!" +msgstr "Sfnjoefs Tfu!" + +#: src/modules/reminders/data.py:67 +#, possible-python-brace-format +msgctxt "reminder_set|desc" +msgid "" +"At {timestamp} I will remind you about:\n" +"> {content}" +msgstr "" +"Bu {timestamp} J xjmm sfnjoe zpv bcpvu:\n" +"> {content}" + +#: src/modules/reminders/data.py:79 +msgctxt "reminder_set|field:repeat|name" +msgid "Repeats" +msgstr "Sfqfbut" + +#: src/modules/reminders/data.py:83 +#, possible-python-brace-format +msgctxt "reminder_set|field:repeat|value" +msgid "" +"This reminder will repeat every `{interval}` (after the first reminder)." +msgstr "" +"Uijt sfnjoefs xjmm sfqfbu fwfsz `{interval}` (bgufs uif gjstu sfnjoefs)." + +#: src/modules/reminders/data.py:94 +msgctxt "reminder|embed" +msgid "You asked me to remind you!" +msgstr "Zpv btlfe nf up sfnjoe zpv!" + +#: src/modules/reminders/data.py:102 +msgctxt "reminder|embed" +msgid "Context?" +msgstr "Dpoufyu?" + +#: src/modules/reminders/data.py:104 +msgctxt "reminder|embed" +msgid "Click Here" +msgstr "Dmjdl Ifsf" + +#: src/modules/reminders/data.py:111 +msgctxt "reminder|embed" +msgid "Next reminder" +msgstr "Ofyu sfnjoefs" + +#: src/modules/reminders/data.py:135 +#, possible-python-brace-format +msgctxt "reminder|formatted|interval" +msgid "Every day" +msgid_plural "Every `{days}` days" +msgstr[0] "Fwfsz ebz" +msgstr[1] "Fwfsz `{days}` ebzt" + +#: src/modules/reminders/data.py:144 +#, possible-python-brace-format +msgctxt "reminder|formatted|interval" +msgid "Every hour" +msgid_plural "Every `{hours}` hours" +msgstr[0] "Fwfsz ipvs" +msgstr[1] "Fwfsz `{hours}` ipvst" + +#: src/modules/reminders/data.py:153 +#, possible-python-brace-format +msgctxt "reminder|formatted|interval" +msgid "Every `{duration}`" +msgstr "Fwfsz `{duration}`" diff --git a/locales/ceaser/LC_MESSAGES/rolemenus.po b/locales/ceaser/LC_MESSAGES/rolemenus.po new file mode 100644 index 00000000..b4d0b222 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/rolemenus.po @@ -0,0 +1,1571 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/rolemenus/cog.py:41 +msgctxt "argtype:menu_style|opt:reaction" +msgid "Reaction Roles" +msgstr "Sfbdujpo Spmft" + +#: src/modules/rolemenus/cog.py:45 +msgctxt "argtype:menu_style|opt:button" +msgid "Button Menu" +msgstr "Cvuupo Nfov" + +#: src/modules/rolemenus/cog.py:49 +msgctxt "argtype:menu_style|opt:dropdown" +msgid "Dropdown Menu" +msgstr "Espqepxo Nfov" + +#: src/modules/rolemenus/cog.py:68 +msgctxt "ctxcmd:rolemenu" +msgid "Role Menu Editor" +msgstr "Spmf Nfov Fejups" + +#: src/modules/rolemenus/cog.py:81 +msgctxt "ctxcmd:rolemenu|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to manage the server role " +"menus." +msgstr "" +"Zpv offe uif `NBOBHF_SPMFT` qfsnjttjpo jo psefs up nbobhf uif tfswfs spmf " +"nfovt." + +#: src/modules/rolemenus/cog.py:88 +msgctxt "ctxcmd:rolemenus|error:my_perms" +msgid "" +"I lack the `MANAGE_ROLES` permission required to offer roles from role " +"menus." +msgstr "" +"J mbdl uif `NBOBHF_SPMFT` qfsnjttjpo sfrvjsfe up pggfs spmft gspn spmf " +"nfovt." + +#: src/modules/rolemenus/cog.py:300 +msgctxt "parse:message_link|suberror:message_dne" +msgid "Could not find the linked message, has it been deleted?" +msgstr "Dpvme opu gjoe uif mjolfe nfttbhf, ibt ju cffo efmfufe?" + +#: src/modules/rolemenus/cog.py:305 +#, possible-python-brace-format +msgctxt "parse:message_link|suberror:no_perms" +msgid "" +"Insufficient permissions! I need the `MESSAGE_HISTORY` permission in " +"{channel}." +msgstr "" +"Jotvggjdjfou qfsnjttjpot! J offe uif `NFTTBHF_IJTUPSZ` qfsnjttjpo jo " +"{channel}." + +#: src/modules/rolemenus/cog.py:310 +#, possible-python-brace-format +msgctxt "parse:message_link|suberror:channel_dne" +msgid "The channel `{channelid}` could not be found in this server." +msgstr "Uif diboofm `{channelid}` dpvme opu cf gpvoe jo uijt tfswfs." + +#: src/modules/rolemenus/cog.py:315 +msgctxt "parse:message_link|suberror:malformed_link" +msgid "" +"Malformed message link. Please copy the link by right clicking the target " +"message." +msgstr "" +"Nbmgpsnfe nfttbhf mjol. Qmfbtf dpqz uif mjol cz sjhiu dmjdljoh uif ubshfu " +"nfttbhf." + +#: src/modules/rolemenus/cog.py:322 +#, possible-python-brace-format +msgctxt "parse:message_link|error" +msgid "" +"Failed to resolve the provided message link.\n" +"**ERROR:** {error}" +msgstr "" +"Gbjmfe up sftpmwf uif qspwjefe nfttbhf mjol.\n" +"**FSSPS:** {error}" + +#: src/modules/rolemenus/cog.py:434 +msgctxt "cmd:rolemenus" +msgid "rolemenus" +msgstr "spmfnfovt" + +#: src/modules/rolemenus/cog.py:437 +msgctxt "cmd:rolemenus|desc" +msgid "View and configure the role menus in this server." +msgstr "Wjfx boe dpogjhvsf uif spmf nfovt jo uijt tfswfs." + +#: src/modules/rolemenus/cog.py:454 +msgctxt "cmd:rolemenus|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to manage the server role " +"menus." +msgstr "" +"Zpv offe uif `NBOBHF_SPMFT` qfsnjttjpo jo psefs up nbobhf uif tfswfs spmf " +"nfovt." + +#: src/modules/rolemenus/cog.py:461 +msgctxt "cmd:rolemenus|error:my_perms" +msgid "" +"I lack the `MANAGE_ROLES` permission required to offer roles from role " +"menus." +msgstr "" +"J mbdl uif `NBOBHF_SPMFT` qfsnjttjpo sfrvjsfe up pggfs spmft gspn spmf " +"nfovt." + +#: src/modules/rolemenus/cog.py:496 +#, possible-python-brace-format +msgctxt "acmpl:menus|choice:no_choices|name" +msgid "No role menus matching '{partial}'" +msgstr "Op spmf nfovt nbudijoh '{partial}'" + +#: src/modules/rolemenus/cog.py:515 +msgctxt "acmpl:menuroles|param:menu|keyname" +msgid "menu" +msgstr "nfov" + +#: src/modules/rolemenus/cog.py:521 +msgctxt "acmpl:menuroles|choice:no_menu|name" +msgid "Please select a menu first" +msgstr "Qmfbtf tfmfdu b nfov gjstu" + +#: src/modules/rolemenus/cog.py:545 +#, possible-python-brace-format +msgctxt "acmpl:menuroles|choice:invalid_menu|name" +msgid "Menu '{name}' does not exist!" +msgstr "Nfov '{name}' epft opu fyjtu!" + +#: src/modules/rolemenus/cog.py:574 +#, possible-python-brace-format +msgctxt "acmpl:menuroles|choice:no_matching|name" +msgid "No roles in this menu matching '{partial}'" +msgstr "Op spmft jo uijt nfov nbudijoh '{partial}'" + +#: src/modules/rolemenus/cog.py:581 +msgctxt "group:rolemenu" +msgid "rolemenu" +msgstr "spmfnfov" + +#: src/modules/rolemenus/cog.py:584 +msgctxt "group:rolemenu|desc" +msgid "Base command group for role menu configuration." +msgstr "Cbtf dpnnboe hspvq gps spmf nfov dpogjhvsbujpo." + +#: src/modules/rolemenus/cog.py:593 +msgctxt "cmd:rolemenu_create" +msgid "newmenu" +msgstr "ofxnfov" + +#: src/modules/rolemenus/cog.py:596 +msgctxt "cmd:rolemenu_create|desc" +msgid "Create a new role menu (optionally using an existing message)" +msgstr "Dsfbuf b ofx spmf nfov (pqujpobmmz vtjoh bo fyjtujoh nfttbhf)" + +#: src/modules/rolemenus/cog.py:610 +msgctxt "cmd:rolemenu_create|param:message" +msgid "message_link" +msgstr "nfttbhf_mjol" + +#: src/modules/rolemenus/cog.py:611 +msgctxt "cmd:rolemenu_create|param:menu_style" +msgid "menu_style" +msgstr "nfov_tuzmf" + +#: src/modules/rolemenus/cog.py:612 +msgctxt "cmd:rolemenu_create|param:remplate" +msgid "template" +msgstr "ufnqmbuf" + +#: src/modules/rolemenus/cog.py:613 +msgctxt "cmd:rolemenu_create|param:rawmessage" +msgid "custom_message" +msgstr "dvtupn_nfttbhf" + +#: src/modules/rolemenus/cog.py:623 +msgctxt "cmd:rolemenu_create|param:message|desc" +msgid "Link to an existing message to turn it into a (reaction) role menu" +msgstr "Mjol up bo fyjtujoh nfttbhf up uvso ju joup b (sfbdujpo) spmf nfov" + +#: src/modules/rolemenus/cog.py:627 +msgctxt "cmd:rolemenu_create|param:menu_style" +msgid "Selection style for this menu (using buttons, dropdowns, or reactions)" +msgstr "" +"Tfmfdujpo tuzmf gps uijt nfov (vtjoh cvuupot, espqepxot, ps sfbdujpot)" + +#: src/modules/rolemenus/cog.py:631 +msgctxt "cmd:rolemenu_create|param:template" +msgid "Template to use for the menu message body" +msgstr "Ufnqmbuf up vtf gps uif nfov nfttbhf cpez" + +#: src/modules/rolemenus/cog.py:635 +msgctxt "cmd:rolemenu_create|param:rawmessage" +msgid "Attach a custom menu message to use" +msgstr "Buubdi b dvtupn nfov nfttbhf up vtf" + +#: src/modules/rolemenus/cog.py:664 +msgctxt "cmd:rolemenu_create|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to create new role menus." +msgstr "" +"Zpv offe uif `NBOBHF_SPMFT` qfsnjttjpo jo psefs up dsfbuf ofx spmf nfovt." + +#: src/modules/rolemenus/cog.py:671 +msgctxt "cmd:rolemenu_create|error:my_perms" +msgid "" +"I lack the `MANAGE_ROLES` permission needed to offer roles from role menus." +msgstr "" +"J mbdl uif `NBOBHF_SPMFT` qfsnjttjpo offefe up pggfs spmft gspn spmf nfovt." + +#: src/modules/rolemenus/cog.py:690 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:message_exists" +msgid "The message {link} already has a role menu! Use {edit_cmd} to edit it." +msgstr "" +"Uif nfttbhf {link} bmsfbez ibt b spmf nfov! Vtf {edit_cmd} up feju ju." + +#: src/modules/rolemenus/cog.py:711 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:style_notmine" +msgid "" +"I cannot create a `{style}` style menu on a message I didn't send! (Discord " +"restriction)." +msgstr "" +"J dboopu dsfbuf b `{style}` tuzmf nfov po b nfttbhf J ejeo'u tfoe! (Ejtdpse " +"sftusjdujpo)." + +#: src/modules/rolemenus/cog.py:718 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:rawmessage_notmine" +msgid "" +"Cannot apply a custom menu message to {message} because I do not own this " +"message!" +msgstr "" +"Dboopu bqqmz b dvtupn nfov nfttbhf up {message} cfdbvtf J ep opu pxo uijt " +"nfttbhf!" + +#: src/modules/rolemenus/cog.py:727 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:template_notmine" +msgid "" +"Cannot apply a menu message template to {message} because I do not own this " +"message!" +msgstr "" +"Dboopu bqqmz b nfov nfttbhf ufnqmbuf up {message} cfdbvtf J ep opu pxo uijt " +"nfttbhf!" + +#: src/modules/rolemenus/cog.py:740 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:name_exists" +msgid "A rolemenu called `{name}` already exists! Use {edit_cmd} to edit it." +msgstr "B spmfnfov dbmmfe `{name}` bmsfbez fyjtut! Vtf {edit_cmd} up feju ju." + +#: src/modules/rolemenus/cog.py:788 +msgctxt "cmd:rolemenu_edit" +msgid "editmenu" +msgstr "fejunfov" + +#: src/modules/rolemenus/cog.py:791 +msgctxt "cmd:rolemenu_edit|desc" +msgid "Edit an existing role menu." +msgstr "Feju bo fyjtujoh spmf nfov." + +#: src/modules/rolemenus/cog.py:800 +msgctxt "cmd:rolemenu_edit|param:name" +msgid "name" +msgstr "obnf" + +#: src/modules/rolemenus/cog.py:801 +msgctxt "cmd:rolemenu_edit|param:new_name" +msgid "new_name" +msgstr "ofx_obnf" + +#: src/modules/rolemenus/cog.py:802 +msgctxt "cmd:rolemenu_edit|param:channel" +msgid "new_channel" +msgstr "ofx_diboofm" + +#: src/modules/rolemenus/cog.py:807 +msgctxt "cmd:rolemenu_edit|param:menu_style" +msgid "menu_style" +msgstr "nfov_tuzmf" + +#: src/modules/rolemenus/cog.py:808 +msgctxt "cmd:rolemenu_edit|param:remplate" +msgid "template" +msgstr "ufnqmbuf" + +#: src/modules/rolemenus/cog.py:809 +msgctxt "cmd:rolemenu_edit|param:rawmessage" +msgid "custom_message" +msgstr "dvtupn_nfttbhf" + +#: src/modules/rolemenus/cog.py:814 +msgctxt "cmd:rolemenu_edit|param:name|desc" +msgid "Name of the menu to edit" +msgstr "Obnf pg uif nfov up feju" + +#: src/modules/rolemenus/cog.py:818 +msgctxt "cmd:rolemenu_edit|param:channel|desc" +msgid "Server channel to move the menu to" +msgstr "Tfswfs diboofm up npwf uif nfov up" + +#: src/modules/rolemenus/cog.py:827 +msgctxt "cmd:rolemenu_edit|param:menu_style" +msgid "Selection style for this menu (using buttons, dropdowns, or reactions)" +msgstr "" +"Tfmfdujpo tuzmf gps uijt nfov (vtjoh cvuupot, espqepxot, ps sfbdujpot)" + +#: src/modules/rolemenus/cog.py:831 +msgctxt "cmd:rolemenu_edit|param:template" +msgid "Template to use for the menu message body" +msgstr "Ufnqmbuf up vtf gps uif nfov nfttbhf cpez" + +#: src/modules/rolemenus/cog.py:835 +msgctxt "cmd:rolemenu_edit|param:rawmessage" +msgid "Attach a custom menu message to use" +msgstr "Buubdi b dvtupn nfov nfttbhf up vtf" + +#: src/modules/rolemenus/cog.py:864 +msgctxt "cmd:rolemenu_edit|error:author_perms" +msgid "You need the `MANAGE_ROLES` permission in order to edit role menus." +msgstr "Zpv offe uif `NBOBHF_SPMFT` qfsnjttjpo jo psefs up feju spmf nfovt." + +#: src/modules/rolemenus/cog.py:871 +msgctxt "cmd:rolemenu_edit|error:my_perms" +msgid "" +"I lack the `MANAGE_ROLES` permission needed to offer roles from role menus." +msgstr "" +"J mbdl uif `NBOBHF_SPMFT` qfsnjttjpo offefe up pggfs spmft gspn spmf nfovt." + +#: src/modules/rolemenus/cog.py:894 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "Uijt tfswfs epft opu ibwf b spmf nfov dbmmfe `{name}`!" + +#: src/modules/rolemenus/cog.py:914 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|parse:new_name|error:name_exists" +msgid "A role menu with the name **{new_name}** already exists!" +msgstr "B spmf nfov xjui uif obnf **{new_name}** bmsfbez fyjtut!" + +#: src/modules/rolemenus/cog.py:951 +msgctxt "cmd:rolemenu_edit|parse:template|error:not_managed" +msgid "" +"Cannot set a template message for a role menu attached to a message I did " +"not send." +msgstr "" +"Dboopu tfu b ufnqmbuf nfttbhf gps b spmf nfov buubdife up b nfttbhf J eje " +"opu tfoe." + +#: src/modules/rolemenus/cog.py:962 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|parse:template|success:template" +msgid "Now using the `{name}` menu message template." +msgstr "Opx vtjoh uif `{name}` nfov nfttbhf ufnqmbuf." + +#: src/modules/rolemenus/cog.py:969 +msgctxt "cmd:rolemenu_edit|parse:template|success:custom" +msgid "Now using a custom menu message." +msgstr "Opx vtjoh b dvtupn nfov nfttbhf." + +#: src/modules/rolemenus/cog.py:994 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|repost|success" +msgid "The role menu is now available at {message}" +msgstr "Uif spmf nfov jt opx bwbjmbcmf bu {message}" + +#: src/modules/rolemenus/cog.py:1005 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|repost|error:forbidden" +msgid "" +"Cannot update channel! I lack the `EMBED_LINKS` or `SEND_MESSAGES` " +"permission in {channel}." +msgstr "" +"Dboopu vqebuf diboofm! J mbdl uif `FNCFE_MJOLT` ps `TFOE_NFTTBHFT` " +"qfsnjttjpo jo {channel}." + +#: src/modules/rolemenus/cog.py:1010 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|repost|error:unknown" +msgid "" +"An unknown error occurred trying to repost the menu to {channel}.\n" +"**Error:** `{exception}`" +msgstr "" +"Bo volopxo fssps pddvssfe uszjoh up sfqptu uif nfov up {channel}.\n" +"**Fssps:** `{exception}`" + +#: src/modules/rolemenus/cog.py:1044 +msgctxt "cmd:rolemenu_delete" +msgid "delmenu" +msgstr "efmnfov" + +#: src/modules/rolemenus/cog.py:1047 +msgctxt "cmd:rolemenu_delete|desc" +msgid "Delete a role menu." +msgstr "Efmfuf b spmf nfov." + +#: src/modules/rolemenus/cog.py:1051 +msgctxt "cmd:rolemenu_delete|param:name" +msgid "menu" +msgstr "nfov" + +#: src/modules/rolemenus/cog.py:1056 +msgctxt "cmd:rolemenu_delete|param:name|desc" +msgid "Name of the rolemenu to delete." +msgstr "Obnf pg uif spmfnfov up efmfuf." + +#: src/modules/rolemenus/cog.py:1071 +msgctxt "cmd:rolemenu_delete|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to manage the server role " +"menus." +msgstr "" +"Zpv offe uif `NBOBHF_SPMFT` qfsnjttjpo jo psefs up nbobhf uif tfswfs spmf " +"nfovt." + +#: src/modules/rolemenus/cog.py:1094 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delete|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "Uijt tfswfs epft opu ibwf b spmf nfov dbmmfe `{name}`!" + +#: src/modules/rolemenus/cog.py:1102 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delete|confirm|title" +msgid "" +"Are you sure you want to delete the role menu **{name}**? This is not " +"reversible!" +msgstr "" +"Bsf zpv tvsf zpv xbou up efmfuf uif spmf nfov **{name}**? Uijt jt opu " +"sfwfstjcmf!" + +#: src/modules/rolemenus/cog.py:1107 +msgctxt "cmd:rolemenu_delete|confirm|button:yes" +msgid "Yes, Delete Now" +msgstr "Zft, Efmfuf Opx" + +#: src/modules/rolemenus/cog.py:1112 +msgctxt "cmd:rolemenu_delete|confirm|button:no" +msgid "No, Cancel" +msgstr "Op, Dbodfm" + +#: src/modules/rolemenus/cog.py:1137 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delete|success|desc" +msgid "Successfully deleted the menu **{name}**" +msgstr "Tvddfttgvmmz efmfufe uif nfov **{name}**" + +#: src/modules/rolemenus/cog.py:1145 +msgctxt "cmd:rolemenu_addrole" +msgid "addrole" +msgstr "beespmf" + +#: src/modules/rolemenus/cog.py:1148 +msgctxt "cmd:rolemenu_addrole|desc" +msgid "Add a new role to an existing role menu." +msgstr "Bee b ofx spmf up bo fyjtujoh spmf nfov." + +#: src/modules/rolemenus/cog.py:1153 +msgctxt "cmd:rolemenu_addrole|param:menu" +msgid "menu" +msgstr "nfov" + +#: src/modules/rolemenus/cog.py:1156 +msgctxt "cmd:rolemenu_addrole|param:role" +msgid "role" +msgstr "spmf" + +#: src/modules/rolemenus/cog.py:1167 +msgctxt "cmd:rolemenu_addrole|param:menu|desc" +msgid "Name of the menu to add a role to" +msgstr "Obnf pg uif nfov up bee b spmf up" + +#: src/modules/rolemenus/cog.py:1171 +msgctxt "cmd:rolemenu_addrole|param:role|desc" +msgid "Role to add to the menu" +msgstr "Spmf up bee up uif nfov" + +#: src/modules/rolemenus/cog.py:1179 +msgctxt "cmd:rolemenu_addrole|param:duration|desc" +msgid "Lifetime of the role after selection in minutes." +msgstr "Mjgfujnf pg uif spmf bgufs tfmfdujpo jo njovuft." + +#: src/modules/rolemenus/cog.py:1227 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_addrole|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "Uijt tfswfs epft opu ibwf b spmf nfov dbmmfe `{name}`!" + +#: src/modules/rolemenus/cog.py:1312 +msgctxt "cmd:rolemenu_addrole|success:create|title" +msgid "Added Menu Role" +msgstr "Beefe Nfov Spmf" + +#: src/modules/rolemenus/cog.py:1316 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_addrole|success:create|desc" +msgid "Add the role {role} to the menu **{menu}**." +msgstr "Bee uif spmf {role} up uif nfov **{menu}**." + +#: src/modules/rolemenus/cog.py:1334 +msgctxt "cmd:rolemenu_addrole|success:edit|title" +msgid "Menu Role updated" +msgstr "Nfov Spmf vqebufe" + +#: src/modules/rolemenus/cog.py:1346 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_addrole|error:role_exists" +msgid "The role {role} is already selectable from the menu **{menu}**" +msgstr "Uif spmf {role} jt bmsfbez tfmfdubcmf gspn uif nfov **{menu}**" + +#: src/modules/rolemenus/cog.py:1364 +msgctxt "cmd:rolemenu_addrole|success|error:reaction|name" +msgid "Note" +msgstr "Opuf" + +#: src/modules/rolemenus/cog.py:1376 +msgctxt "cmd:rolemenu_addrole|success|button:editor|label" +msgid "Edit Menu" +msgstr "Feju Nfov" + +#: src/modules/rolemenus/cog.py:1393 +msgctxt "cmd:rolemenu_editrole" +msgid "editrole" +msgstr "fejuspmf" + +#: src/modules/rolemenus/cog.py:1396 +msgctxt "cmd:rolemenu_editrole|desc" +msgid "Edit role options in an existing role menu." +msgstr "Feju spmf pqujpot jo bo fyjtujoh spmf nfov." + +#: src/modules/rolemenus/cog.py:1401 +msgctxt "cmd:rolemenu_editrole|param:menu" +msgid "menu" +msgstr "nfov" + +#: src/modules/rolemenus/cog.py:1404 +msgctxt "cmd:rolemenu_editrole|param:menu_role" +msgid "menu_role" +msgstr "nfov_spmf" + +#: src/modules/rolemenus/cog.py:1407 +msgctxt "cmd:rolemenu_editrole|param:role" +msgid "new_role" +msgstr "ofx_spmf" + +#: src/modules/rolemenus/cog.py:1418 +msgctxt "cmd:rolemenu_editrole|param:menu|desc" +msgid "Name of the menu to edit the role for" +msgstr "Obnf pg uif nfov up feju uif spmf gps" + +#: src/modules/rolemenus/cog.py:1422 +msgctxt "cmd:rolemenu_editrole|param:menu_role|desc" +msgid "Label, name, or mention of the menu role to edit." +msgstr "Mbcfm, obnf, ps nfoujpo pg uif nfov spmf up feju." + +#: src/modules/rolemenus/cog.py:1426 +msgctxt "cmd:rolemenu_editrole|param:role|desc" +msgid "New server role this menu role should give." +msgstr "Ofx tfswfs spmf uijt nfov spmf tipvme hjwf." + +#: src/modules/rolemenus/cog.py:1434 +msgctxt "cmd:rolemenu_editrole|param:duration|desc" +msgid "Lifetime of the role after selection in minutes." +msgstr "Mjgfujnf pg uif spmf bgufs tfmfdujpo jo njovuft." + +#: src/modules/rolemenus/cog.py:1475 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_editrole|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "Uijt tfswfs epft opu ibwf b spmf nfov dbmmfe `{name}`!" + +#: src/modules/rolemenus/cog.py:1503 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_editrole|error:role_not_found" +msgid "The menu **{menu}** does not have the role **{name}**" +msgstr "Uif nfov **{menu}** epft opu ibwf uif spmf **{name}**" + +#: src/modules/rolemenus/cog.py:1569 +msgctxt "cmd:rolemenu_editrole|success|title" +msgid "Role menu role updated" +msgstr "Spmf nfov spmf vqebufe" + +#: src/modules/rolemenus/cog.py:1584 +msgctxt "cmd:rolemenu_editrole|success|error:reaction|name" +msgid "Warning!" +msgstr "Xbsojoh!" + +#: src/modules/rolemenus/cog.py:1609 +msgctxt "cmd:rolemenu_delrole" +msgid "delrole" +msgstr "efmspmf" + +#: src/modules/rolemenus/cog.py:1612 +msgctxt "cmd:rolemenu_delrole|desc" +msgid "Remove a role from a role menu." +msgstr "Sfnpwf b spmf gspn b spmf nfov." + +#: src/modules/rolemenus/cog.py:1616 +msgctxt "cmd:rolemenu_delrole|param:menu" +msgid "menu" +msgstr "nfov" + +#: src/modules/rolemenus/cog.py:1617 +msgctxt "cmd:rolemenu_delrole|param:menu_role" +msgid "menu_role" +msgstr "nfov_spmf" + +#: src/modules/rolemenus/cog.py:1622 +msgctxt "cmd:rolemenu_delrole|param:menu|desc" +msgid "Name of the menu to delete the role from." +msgstr "Obnf pg uif nfov up efmfuf uif spmf gspn." + +#: src/modules/rolemenus/cog.py:1626 +msgctxt "cmd:rolemenu_delrole|param:menu_role|desc" +msgid "Name, label, or mention of the role to delete." +msgstr "Obnf, mbcfm, ps nfoujpo pg uif spmf up efmfuf." + +#: src/modules/rolemenus/cog.py:1644 +msgctxt "cmd:rolemenu_delrole|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to manage the server role " +"menus." +msgstr "" +"Zpv offe uif `NBOBHF_SPMFT` qfsnjttjpo jo psefs up nbobhf uif tfswfs spmf " +"nfovt." + +#: src/modules/rolemenus/cog.py:1668 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delrole|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "Uijt tfswfs epft opu ibwf b spmf nfov dbmmfe `{name}`!" + +#: src/modules/rolemenus/cog.py:1696 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delrole|error:role_not_found" +msgid "The menu **{menu}** does not have the role **{name}**" +msgstr "Uif nfov **{menu}** epft opu ibwf uif spmf **{name}**" + +#: src/modules/rolemenus/cog.py:1713 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delrole|success" +msgid "The role **{name}** was successfully removed from the menu **{menu}**." +msgstr "" +"Uif spmf **{name}** xbt tvddfttgvmmz sfnpwfe gspn uif nfov **{menu}**." + +#: src/modules/rolemenus/roleoptions.py:54 +msgctxt "roleset:role" +msgid "role" +msgstr "spmf" + +#: src/modules/rolemenus/roleoptions.py:57 +msgctxt "roleset:role|desc" +msgid "The role associated to this menu item." +msgstr "Uif spmf bttpdjbufe up uijt nfov jufn." + +#: src/modules/rolemenus/roleoptions.py:61 +msgctxt "roleset:role|long_desc" +msgid "The role given when this menu item is selected in the role menu." +msgstr "Uif spmf hjwfo xifo uijt nfov jufn jt tfmfdufe jo uif spmf nfov." + +#: src/modules/rolemenus/roleoptions.py:74 +#, possible-python-brace-format +msgctxt "roleset:role|set_response:set" +msgid "This menu item will now give the role {role}." +msgstr "Uijt nfov jufn xjmm opx hjwf uif spmf {role}." + +#: src/modules/rolemenus/roleoptions.py:82 +msgctxt "roleset:label" +msgid "label" +msgstr "mbcfm" + +#: src/modules/rolemenus/roleoptions.py:85 +msgctxt "roleset:label|desc" +msgid "A short button label for this role." +msgstr "B tipsu cvuupo mbcfm gps uijt spmf." + +#: src/modules/rolemenus/roleoptions.py:90 +msgctxt "roleset:label|long_desc" +msgid "" +"A short name for this role, to be displayed in button labels, dropdown " +"titles, and some menu layouts. By default uses the Discord role name." +msgstr "" +"B tipsu obnf gps uijt spmf, up cf ejtqmbzfe jo cvuupo mbcfmt, espqepxo " +"ujumft, boe tpnf nfov mbzpvut. Cz efgbvmu vtft uif Ejtdpse spmf obnf." + +#: src/modules/rolemenus/roleoptions.py:104 +#, possible-python-brace-format +msgctxt "roleset:role|set_response" +msgid "This menu role is now called `{value}`." +msgstr "Uijt nfov spmf jt opx dbmmfe `{value}`." + +#: src/modules/rolemenus/roleoptions.py:112 +msgctxt "roleset:emoji" +msgid "emoji" +msgstr "fnpkj" + +#: src/modules/rolemenus/roleoptions.py:115 +msgctxt "roleset:emoji|desc" +msgid "The emoji associated with this role." +msgstr "Uif fnpkj bttpdjbufe xjui uijt spmf." + +#: src/modules/rolemenus/roleoptions.py:119 +msgctxt "roleset:emoji|long_desc" +msgid "" +"The role emoji is used for the reaction (in reaction role menus), and " +"otherwise appears next to the role label in the button and dropdown styles. " +"The emoji is also displayed next to the role in most menu templates." +msgstr "" +"Uif spmf fnpkj jt vtfe gps uif sfbdujpo (jo sfbdujpo spmf nfovt), boe " +"puifsxjtf bqqfbst ofyu up uif spmf mbcfm jo uif cvuupo boe espqepxo tuzmft. " +"Uif fnpkj jt bmtp ejtqmbzfe ofyu up uif spmf jo nptu nfov ufnqmbuft." + +#: src/modules/rolemenus/roleoptions.py:157 +#, possible-python-brace-format +msgctxt "roleset:emoji|error:test_emoji" +msgid "The selected emoji `{emoji}` is invalid or has been deleted." +msgstr "Uif tfmfdufe fnpkj `{emoji}` jt jowbmje ps ibt cffo efmfufe." + +#: src/modules/rolemenus/roleoptions.py:168 +#, possible-python-brace-format +msgctxt "roleset:emoji|set_response:set" +msgid "The menu role emoji is now {emoji}." +msgstr "Uif nfov spmf fnpkj jt opx {emoji}." + +#: src/modules/rolemenus/roleoptions.py:173 +msgctxt "roleset:emoji|set_response:unset" +msgid "The menu role emoji has been removed." +msgstr "Uif nfov spmf fnpkj ibt cffo sfnpwfe." + +#: src/modules/rolemenus/roleoptions.py:181 +msgctxt "roleset:description" +msgid "description" +msgstr "eftdsjqujpo" + +#: src/modules/rolemenus/roleoptions.py:184 +msgctxt "roleset:description|desc" +msgid "A longer description of this role." +msgstr "B mpohfs eftdsjqujpo pg uijt spmf." + +#: src/modules/rolemenus/roleoptions.py:189 +msgctxt "roleset:description|long_desc" +msgid "" +"The description is displayed under the role label in dropdown style menus. " +"It may also be used as a substitution key in custom role selection " +"responses." +msgstr "" +"Uif eftdsjqujpo jt ejtqmbzfe voefs uif spmf mbcfm jo espqepxo tuzmf nfovt. " +"Ju nbz bmtp cf vtfe bt b tvctujuvujpo lfz jo dvtupn spmf tfmfdujpo " +"sftqpotft." + +#: src/modules/rolemenus/roleoptions.py:205 +msgctxt "roleset:description|set_response:set" +msgid "The role description has been set." +msgstr "Uif spmf eftdsjqujpo ibt cffo tfu." + +#: src/modules/rolemenus/roleoptions.py:210 +msgctxt "roleset:description|set_response:unset" +msgid "The role description has been removed." +msgstr "Uif spmf eftdsjqujpo ibt cffo sfnpwfe." + +#: src/modules/rolemenus/roleoptions.py:218 +msgctxt "roleset:price" +msgid "price" +msgstr "qsjdf" + +#: src/modules/rolemenus/roleoptions.py:221 +msgctxt "roleset:price|desc" +msgid "Price of the role, in LionCoins." +msgstr "Qsjdf pg uif spmf, jo MjpoDpjot." + +#: src/modules/rolemenus/roleoptions.py:225 +msgctxt "roleset:price|long_desc" +msgid "How much the role costs when selected, in LionCoins." +msgstr "Ipx nvdi uif spmf dptut xifo tfmfdufe, jo MjpoDpjot." + +#: src/modules/rolemenus/roleoptions.py:229 +msgctxt "roleset:price|accepts" +msgid "Amount of coins that the role costs." +msgstr "Bnpvou pg dpjot uibu uif spmf dptut." + +#: src/modules/rolemenus/roleoptions.py:242 +#, possible-python-brace-format +msgctxt "roleset:price|set_response:set" +msgid "This role will now cost {price} to equip." +msgstr "Uijt spmf xjmm opx dptu {price} up frvjq." + +#: src/modules/rolemenus/roleoptions.py:247 +msgctxt "roleset:price|set_response:unset" +msgid "This role will now be free to equip from this role menu." +msgstr "Uijt spmf xjmm opx cf gsff up frvjq gspn uijt spmf nfov." + +#: src/modules/rolemenus/roleoptions.py:255 +msgctxt "roleset:duration" +msgid "duration" +msgstr "evsbujpo" + +#: src/modules/rolemenus/roleoptions.py:258 +msgctxt "roleset:duration|desc" +msgid "Lifetime of the role after selection" +msgstr "Mjgfujnf pg uif spmf bgufs tfmfdujpo" + +#: src/modules/rolemenus/roleoptions.py:262 +msgctxt "roleset:duration|long_desc" +msgid "" +"Allows creation of 'temporary roles' which expire a given time after being " +"equipped. Refunds will not be given upon expiry." +msgstr "" +"Bmmpxt dsfbujpo pg 'ufnqpsbsz spmft' xijdi fyqjsf b hjwfo ujnf bgufs cfjoh " +"frvjqqfe. Sfgvoet xjmm opu cf hjwfo vqpo fyqjsz." + +#: src/modules/rolemenus/roleoptions.py:267 +msgctxt "roleset:duration|notset" +msgid "Forever." +msgstr "Gpsfwfs." + +#: src/modules/rolemenus/roleoptions.py:280 +#, possible-python-brace-format +msgctxt "roleset:duration|set_response:set" +msgid "This role will now expire after {duration}." +msgstr "Uijt spmf xjmm opx fyqjsf bgufs {duration}." + +#: src/modules/rolemenus/roleoptions.py:285 +msgctxt "roleset:duration|set_response:unset" +msgid "This role will no longer expire after being selected." +msgstr "Uijt spmf xjmm op mpohfs fyqjsf bgufs cfjoh tfmfdufe." + +#: src/modules/rolemenus/templates.py:53 +msgctxt "template:simple|name" +msgid "Simple Menu" +msgstr "Tjnqmf Nfov" + +#: src/modules/rolemenus/templates.py:57 +msgctxt "template:simple|desc" +msgid "A simple embedded list of roles in the menu" +msgstr "B tjnqmf fncfeefe mjtu pg spmft jo uif nfov" + +#: src/modules/rolemenus/templates.py:96 +msgctxt "template:two_column|name" +msgid "Two Column" +msgstr "Uxp Dpmvno" + +#: src/modules/rolemenus/templates.py:100 +msgctxt "template:two_column|desc" +msgid "A compact two column role layout. Excludes prices and durations." +msgstr "B dpnqbdu uxp dpmvno spmf mbzpvu. Fydmveft qsjdft boe evsbujpot." + +#: src/modules/rolemenus/templates.py:131 +msgctxt "template:three_column|name" +msgid "Three Column" +msgstr "Uisff Dpmvno" + +#: src/modules/rolemenus/templates.py:135 +msgctxt "template:three_column|desc" +msgid "" +"A compact three column layout using emojis and labels, excluding prices and " +"durations." +msgstr "" +"B dpnqbdu uisff dpmvno mbzpvu vtjoh fnpkjt boe mbcfmt, fydmvejoh qsjdft boe " +"evsbujpot." + +#: src/modules/rolemenus/templates.py:168 +msgctxt "template:shop|name" +msgid "Role Shop" +msgstr "Spmf Tipq" + +#: src/modules/rolemenus/templates.py:172 +msgctxt "template:shop|desc" +msgid "A single column display suitable for simple role shops" +msgstr "B tjohmf dpmvno ejtqmbz tvjubcmf gps tjnqmf spmf tipqt" + +#: src/modules/rolemenus/rolemenu.py:280 +msgctxt "rolemenu|menu_message|error|title" +msgid "ROLE MENU DISPLAY ERROR" +msgstr "SPMF NFOV EJTQMBZ FSSPS" + +#: src/modules/rolemenus/rolemenu.py:284 +#, possible-python-brace-format +msgctxt "rolemenu|menu_message|error|desc" +msgid "" +"A critical error occurred trying to display this role menu.\n" +"Error: `{error}`." +msgstr "" +"B dsjujdbm fssps pddvssfe uszjoh up ejtqmbz uijt spmf nfov.\n" +"Fssps: `{error}`." + +#: src/modules/rolemenus/rolemenu.py:336 +#, possible-python-brace-format +msgctxt "rolemenu|update_reactions|error" +msgid "" +"Could not add the {emoji} reaction, perhaps I do not have access to this " +"emoji! Reactions will need to be added manually." +msgstr "" +"Dpvme opu bee uif {emoji} sfbdujpo, qfsibqt J ep opu ibwf bddftt up uijt " +"fnpkj! Sfbdujpot xjmm offe up cf beefe nbovbmmz." + +#: src/modules/rolemenus/rolemenu.py:381 +msgctxt "ui:rolemenu_dropdown|placeholder" +msgid "Select Roles" +msgstr "Tfmfdu Spmft" + +#: src/modules/rolemenus/rolemenu.py:472 +msgctxt "rolemenu|error:role_gone" +msgid "This role no longer exists!" +msgstr "Uijt spmf op mpohfs fyjtut!" + +#: src/modules/rolemenus/rolemenu.py:482 +#, possible-python-brace-format +msgctxt "rolemenu|deselect|error:sticky" +msgid "**{role}** is a sticky role, you cannot remove it with this menu!" +msgstr "**{role}** jt b tujdlz spmf, zpv dboopu sfnpwf ju xjui uijt nfov!" + +#: src/modules/rolemenus/rolemenu.py:493 +msgctxt "rolemenu|deselect|error:perms" +msgid "I don't have enough permissions to remove this role from you!" +msgstr "J epo'u ibwf fopvhi qfsnjttjpot up sfnpwf uijt spmf gspn zpv!" + +#: src/modules/rolemenus/rolemenu.py:500 +msgctxt "rolemenu|deselect|error:discord" +msgid "An unknown error occurred removing your role! Please try again later." +msgstr "Bo volopxo fssps pddvssfe sfnpwjoh zpvs spmf! Qmfbtf usz bhbjo mbufs." + +#: src/modules/rolemenus/rolemenu.py:529 +msgctxt "rolemenu|deslect|success|title" +msgid "Role removed" +msgstr "Spmf sfnpwfe" + +#: src/modules/rolemenus/rolemenu.py:535 +#, possible-python-brace-format +msgctxt "rolemenu|deselect|success:refund|desc" +msgid "You have removed **{role}**, and been refunded {coin} **{amount}**." +msgstr "Zpv ibwf sfnpwfe **{role}**, boe cffo sfgvoefe {coin} **{amount}**." + +#: src/modules/rolemenus/rolemenu.py:540 +#, possible-python-brace-format +msgctxt "rolemenu|deselect|success:norefund|desc" +msgid "You have unequipped **{role}**." +msgstr "Zpv ibwf vofrvjqqfe **{role}**." + +#: src/modules/rolemenus/rolemenu.py:554 +#, possible-python-brace-format +msgctxt "rolemenu|select|error:required_role" +msgid "You need to have the **{role}** role to use this!" +msgstr "Zpv offe up ibwf uif **{role}** spmf up vtf uijt!" + +#: src/modules/rolemenus/rolemenu.py:568 +#, possible-python-brace-format +msgctxt "rolemenu|select|error:max_obtainable" +msgid "You already have the maximum of {obtainable} roles from this menu!" +msgstr "Zpv bmsfbez ibwf uif nbyjnvn pg {obtainable} spmft gspn uijt nfov!" + +#: src/modules/rolemenus/rolemenu.py:582 +#, possible-python-brace-format +msgctxt "rolemenu|select|error:insufficient_funds" +msgid "" +"The role **{role}** costs {coin}**{cost}**,but you only have " +"{coin}**{balance}**!" +msgstr "" +"Uif spmf **{role}** dptut {coin}**{cost}**,cvu zpv pomz ibwf " +"{coin}**{balance}**!" + +#: src/modules/rolemenus/rolemenu.py:598 +msgctxt "rolemenu|select|error:perms" +msgid "I don't have enough permissions to give you this role!" +msgstr "J epo'u ibwf fopvhi qfsnjttjpot up hjwf zpv uijt spmf!" + +#: src/modules/rolemenus/rolemenu.py:605 +msgctxt "rolemenu|select|error:discord" +msgid "" +"An unknown error occurred while assigning your role! Please try again later." +msgstr "" +"Bo volopxo fssps pddvssfe xijmf bttjhojoh zpvs spmf! Qmfbtf usz bhbjo mbufs." + +#: src/modules/rolemenus/rolemenu.py:647 +msgctxt "rolemenu|select|success|title" +msgid "Role equipped" +msgstr "Spmf frvjqqfe" + +#: src/modules/rolemenus/rolemenu.py:653 +#, possible-python-brace-format +msgctxt "rolemenu|select|success:purchase|desc" +msgid "You have purchased the role **{role}** for {coin}**{amount}**" +msgstr "Zpv ibwf qvsdibtfe uif spmf **{role}** gps {coin}**{amount}**" + +#: src/modules/rolemenus/rolemenu.py:658 +#, possible-python-brace-format +msgctxt "rolemenu|select|success:nopurchase|desc" +msgid "You have equipped the role **{role}**" +msgstr "Zpv ibwf frvjqqfe uif spmf **{role}**" + +#: src/modules/rolemenus/rolemenu.py:664 +#, possible-python-brace-format +msgctxt "rolemenu|select|expires_at" +msgid "The role will expire at {timestamp}." +msgstr "Uif spmf xjmm fyqjsf bu {timestamp}." + +#: src/modules/rolemenus/rolemenu.py:717 +#, possible-python-brace-format +msgctxt "rolemenu|content:reactions" +msgid "[Click here]({jump_link}) to jump back." +msgstr "[Dmjdl ifsf]({jump_link}) up kvnq cbdl." + +#: src/modules/rolemenus/menuoptions.py:56 +msgctxt "menuset:name" +msgid "name" +msgstr "obnf" + +#: src/modules/rolemenus/menuoptions.py:59 +msgctxt "menuset:name|desc" +msgid "Brief name for this role menu." +msgstr "Csjfg obnf gps uijt spmf nfov." + +#: src/modules/rolemenus/menuoptions.py:64 +msgctxt "menuset:name|long_desc" +msgid "" +"The role menu name is displayed when selecting the menu in commands, and as " +"the title of most default menu layouts." +msgstr "" +"Uif spmf nfov obnf jt ejtqmbzfe xifo tfmfdujoh uif nfov jo dpnnboet, boe bt " +"uif ujumf pg nptu efgbvmu nfov mbzpvut." + +#: src/modules/rolemenus/menuoptions.py:78 +#, possible-python-brace-format +msgctxt "menuset:name|set_response" +msgid "This role menu will now be called **{new_name}**." +msgstr "Uijt spmf nfov xjmm opx cf dbmmfe **{new_name}**." + +#: src/modules/rolemenus/menuoptions.py:86 +msgctxt "menuset:sticky" +msgid "sticky_roles" +msgstr "tujdlz_spmft" + +#: src/modules/rolemenus/menuoptions.py:89 +msgctxt "menuset:sticky|desc" +msgid "Whether the menu can be used to unequip roles." +msgstr "Xifuifs uif nfov dbo cf vtfe up vofrvjq spmft." + +#: src/modules/rolemenus/menuoptions.py:94 +msgctxt "menuset:sticky|long_desc" +msgid "" +"When enabled, members will not be able to remove equipped roles by selecting" +" them in this menu. Note that when disabled, members will be able to unequip" +" the menu roles even if they were not obtained from the menu." +msgstr "" +"Xifo fobcmfe, nfncfst xjmm opu cf bcmf up sfnpwf frvjqqfe spmft cz tfmfdujoh" +" uifn jo uijt nfov. Opuf uibu xifo ejtbcmfe, nfncfst xjmm cf bcmf up vofrvjq" +" uif nfov spmft fwfo jg uifz xfsf opu pcubjofe gspn uif nfov." + +#: src/modules/rolemenus/menuoptions.py:110 +msgctxt "menuset:sticky|set_response:true" +msgid "Members will no longer be able to remove roles with this menu." +msgstr "Nfncfst xjmm op mpohfs cf bcmf up sfnpwf spmft xjui uijt nfov." + +#: src/modules/rolemenus/menuoptions.py:115 +msgctxt "menuset:sticky|set_response:false" +msgid "Members will now be able to remove roles with this menu." +msgstr "Nfncfst xjmm opx cf bcmf up sfnpwf spmft xjui uijt nfov." + +#: src/modules/rolemenus/menuoptions.py:123 +msgctxt "menuset:refunds" +msgid "refunds" +msgstr "sfgvoet" + +#: src/modules/rolemenus/menuoptions.py:126 +msgctxt "menuset:refunds|desc" +msgid "Whether removing a role will refund the purchase price for that role." +msgstr "Xifuifs sfnpwjoh b spmf xjmm sfgvoe uif qvsdibtf qsjdf gps uibu spmf." + +#: src/modules/rolemenus/menuoptions.py:131 +msgctxt "menuset:refunds|long_desc" +msgid "" +"When enabled, members who *purchased a role through this role menu* will obtain a full refund when they remove the role through the menu.\n" +"**Refunds will only be given for roles purchased through the same menu.**\n" +"**The `sticky` option must be disabled to allow members to remove roles.**" +msgstr "" +"Xifo fobcmfe, nfncfst xip *qvsdibtfe b spmf uispvhi uijt spmf nfov* xjmm pcubjo b gvmm sfgvoe xifo uifz sfnpwf uif spmf uispvhi uif nfov.\n" +"**Sfgvoet xjmm pomz cf hjwfo gps spmft qvsdibtfe uispvhi uif tbnf nfov.**\n" +"**Uif `tujdlz` pqujpo nvtu cf ejtbcmfe up bmmpx nfncfst up sfnpwf spmft.**" + +#: src/modules/rolemenus/menuoptions.py:148 +msgctxt "menuset:refunds|set_response:true" +msgid "Members will now be refunded when removing a role with this menu." +msgstr "Nfncfst xjmm opx cf sfgvoefe xifo sfnpwjoh b spmf xjui uijt nfov." + +#: src/modules/rolemenus/menuoptions.py:153 +msgctxt "menuset:refunds|set_response:false" +msgid "" +"Members will no longer be refunded when removing a role with this menu." +msgstr "" +"Nfncfst xjmm op mpohfs cf sfgvoefe xifo sfnpwjoh b spmf xjui uijt nfov." + +#: src/modules/rolemenus/menuoptions.py:161 +msgctxt "menuset:obtainable" +msgid "obtainable" +msgstr "pcubjobcmf" + +#: src/modules/rolemenus/menuoptions.py:164 +msgctxt "menuset:obtainable|desc" +msgid "The maximum number of roles equippable from this menu." +msgstr "Uif nbyjnvn ovncfs pg spmft frvjqqbcmf gspn uijt nfov." + +#: src/modules/rolemenus/menuoptions.py:169 +msgctxt "menuset:obtainable|long_desc" +msgid "" +"Members will not be able to obtain more than this number of roles from this " +"menu. This counts roles that were not obtained through the rolemenu system." +msgstr "" +"Nfncfst xjmm opu cf bcmf up pcubjo npsf uibo uijt ovncfs pg spmft gspn uijt " +"nfov. Uijt dpvout spmft uibu xfsf opu pcubjofe uispvhi uif spmfnfov tztufn." + +#: src/modules/rolemenus/menuoptions.py:174 +msgctxt "menuset:obtainable|notset" +msgid "Unlimited." +msgstr "Vomjnjufe." + +#: src/modules/rolemenus/menuoptions.py:188 +#, possible-python-brace-format +msgctxt "menuset:obtainable|set_response:set" +msgid "" +"Members will be able to select a maximum of **{value}** roles from this " +"menu." +msgstr "" +"Nfncfst xjmm cf bcmf up tfmfdu b nbyjnvn pg **{value}** spmft gspn uijt " +"nfov." + +#: src/modules/rolemenus/menuoptions.py:193 +msgctxt "menuset:obtainable|set_response:unset" +msgid "Members will be able to select any number of roles from this menu." +msgstr "Nfncfst xjmm cf bcmf up tfmfdu boz ovncfs pg spmft gspn uijt nfov." + +#: src/modules/rolemenus/menuoptions.py:201 +msgctxt "menuset:required_role" +msgid "required_role" +msgstr "sfrvjsfe_spmf" + +#: src/modules/rolemenus/menuoptions.py:204 +msgctxt "menuset:required_role|desc" +msgid "Initial role required to use this menu." +msgstr "Jojujbm spmf sfrvjsfe up vtf uijt nfov." + +#: src/modules/rolemenus/menuoptions.py:209 +msgctxt "menuset:required_role|long_desc" +msgid "" +"If set, only members who have the `required_role` will be able to obtain or " +"remove roles using this menu." +msgstr "" +"Jg tfu, pomz nfncfst xip ibwf uif `sfrvjsfe_spmf` xjmm cf bcmf up pcubjo ps " +"sfnpwf spmft vtjoh uijt nfov." + +#: src/modules/rolemenus/menuoptions.py:223 +#, possible-python-brace-format +msgctxt "menuset:required_role|set_response:set" +msgid "Members will need to have the {role} role to use this menu." +msgstr "Nfncfst xjmm offe up ibwf uif {role} spmf up vtf uijt nfov." + +#: src/modules/rolemenus/menuoptions.py:228 +msgctxt "menuset:required_role|set_response:unset" +msgid "Any member who can see the menu may use it." +msgstr "Boz nfncfs xip dbo tff uif nfov nbz vtf ju." + +#: src/modules/rolemenus/menuoptions.py:236 +msgctxt "menuset:message" +msgid "custom_message" +msgstr "dvtupn_nfttbhf" + +#: src/modules/rolemenus/menuoptions.py:239 +msgctxt "menuset:message|desc" +msgid "Custom message data used to display the menu." +msgstr "Dvtupn nfttbhf ebub vtfe up ejtqmbz uif nfov." + +#: src/modules/rolemenus/menuoptions.py:243 +msgctxt "menuset:message|long_desc" +msgid "" +"This setting determines the body of the menu message, including the message " +"content and the message embed(s). While most easily modifiable through the " +"`Edit Message` button, raw JSON-formatted message data may also be uploaded " +"via command." +msgstr "" +"Uijt tfuujoh efufsnjoft uif cpez pg uif nfov nfttbhf, jodmvejoh uif nfttbhf " +"dpoufou boe uif nfttbhf fncfe(t). Xijmf nptu fbtjmz npejgjbcmf uispvhi uif " +"`Feju Nfttbhf` cvuupo, sbx KTPO-gpsnbuufe nfttbhf ebub nbz bmtp cf vqmpbefe " +"wjb dpnnboe." + +#: src/modules/rolemenus/menuoptions.py:260 +msgctxt "menuset:message|set_response:set" +msgid "The role menu message has been set. Edit through the menu editor." +msgstr "Uif spmf nfov nfttbhf ibt cffo tfu. Feju uispvhi uif nfov fejups." + +#: src/modules/rolemenus/menuoptions.py:265 +msgctxt "menuset:message|set_response:unset" +msgid "" +"The role menu message has been unset. Select a template through the menu " +"editor." +msgstr "" +"Uif spmf nfov nfttbhf ibt cffo votfu. Tfmfdu b ufnqmbuf uispvhi uif nfov " +"fejups." + +#: src/modules/rolemenus/ui/menus.py:105 +msgctxt "ui:menu_list|menu:editmenu|placeholder" +msgid "Select Menu to Edit" +msgstr "Tfmfdu Nfov up Feju" + +#: src/modules/rolemenus/ui/menus.py:129 +#, possible-python-brace-format +msgctxt "ui:menu_list|menu_line:attached" +msgid "[`{name}`]({jump_url}) with `{count}` roles." +msgstr "[`{name}`]({jump_url}) xjui `{count}` spmft." + +#: src/modules/rolemenus/ui/menus.py:138 +#, possible-python-brace-format +msgctxt "ui:menu_list|menu_line:unattached" +msgid "`{name}` with `{count}` roles." +msgstr "`{name}` xjui `{count}` spmft." + +#: src/modules/rolemenus/ui/menus.py:163 +#, possible-python-brace-format +msgctxt "ui:menu_list|embed|title" +msgid "Role Menus in {guild}" +msgstr "Spmf Nfovt jo {guild}" + +#: src/modules/rolemenus/ui/menus.py:172 +msgctxt "ui:menu_list|embed|field:tips|name" +msgid "Tips" +msgstr "Ujqt" + +#: src/modules/rolemenus/ui/menus.py:176 +msgctxt "ui:menu_list|embed|field:tips|value" +msgid "" +"Right click an existing message or use the `newmenu` command to create a new" +" menu." +msgstr "" +"Sjhiu dmjdl bo fyjtujoh nfttbhf ps vtf uif `ofxnfov` dpnnboe up dsfbuf b ofx" +" nfov." + +#: src/modules/rolemenus/ui/menus.py:189 +msgctxt "ui:menu_list|embed|field:unattached|name" +msgid "Unattached Menus" +msgstr "Vobuubdife Nfovt" + +#: src/modules/rolemenus/ui/menus.py:201 +msgctxt "ui:menu_list|embed|footer:text" +msgid "Click a menu name to jump to the message." +msgstr "Dmjdl b nfov obnf up kvnq up uif nfttbhf." + +#: src/modules/rolemenus/ui/menueditor.py:93 +msgctxt "ui:menu_editor|preview|error:title" +msgid "Display Error!" +msgstr "Ejtqmbz Fssps!" + +#: src/modules/rolemenus/ui/menueditor.py:97 +#, possible-python-brace-format +msgctxt "ui:menu_editor|preview|error:desc" +msgid "" +"Failed to display preview!\n" +"**Error:** `{exception}`" +msgstr "" +"Gbjmfe up ejtqmbz qsfwjfx!\n" +"**Fssps:** `{exception}`" + +#: src/modules/rolemenus/ui/menueditor.py:151 +msgctxt "ui:menu_editor|button:options|label" +msgid "Menu Options" +msgstr "Nfov Pqujpot" + +#: src/modules/rolemenus/ui/menueditor.py:179 +msgctxt "ui:menu_editor|button:bulk_edit|modal|title" +msgid "Menu Options" +msgstr "Nfov Pqujpot" + +#: src/modules/rolemenus/ui/menueditor.py:215 +msgctxt "ui:menu_editor|button:bulk_edit|label" +msgid "Bulk Edit" +msgstr "Cvml Feju" + +#: src/modules/rolemenus/ui/menueditor.py:235 +msgctxt "ui:menu_editor|button:sticky|label" +msgid "Toggle Sticky" +msgstr "Uphhmf Tujdlz" + +#: src/modules/rolemenus/ui/menueditor.py:259 +msgctxt "ui:menu_editor|button:refunds|label" +msgid "Toggle Refunds" +msgstr "Uphhmf Sfgvoet" + +#: src/modules/rolemenus/ui/menueditor.py:289 +msgctxt "ui:menu_editor|menu:reqroles|placeholder" +msgid "Select Required Role" +msgstr "Tfmfdu Sfrvjsfe Spmf" + +#: src/modules/rolemenus/ui/menueditor.py:308 +msgctxt "ui:menu_editor|button:modify_roles|label" +msgid "Modify Roles" +msgstr "Npejgz Spmft" + +#: src/modules/rolemenus/ui/menueditor.py:337 +msgctxt "ui:menu_editor|role_editor|modal|title" +msgid "Edit Menu Role" +msgstr "Feju Nfov Spmf" + +#: src/modules/rolemenus/ui/menueditor.py:411 +msgctxt "ui:menu_editor|menu:add_roles|error:too_many_reactions" +msgid "Too many roles! Reaction role menus cannot exceed `20` roles." +msgstr "Upp nboz spmft! Sfbdujpo spmf nfovt dboopu fydffe `20` spmft." + +#: src/modules/rolemenus/ui/menueditor.py:416 +msgctxt "ui:menu_editor|menu:add_roles|error:too_many_roles" +msgid "Too many roles! Role menus cannot have more than `25` roles." +msgstr "Upp nboz spmft! Spmf nfovt dboopu ibwf npsf uibo `25` spmft." + +#: src/modules/rolemenus/ui/menueditor.py:455 +msgctxt "ui:menu_editor|menu:add_roles|placeholder" +msgid "Add Roles" +msgstr "Bee Spmft" + +#: src/modules/rolemenus/ui/menueditor.py:481 +msgctxt "ui:menu_editor|menu:edit_roles|placeholder" +msgid "Edit Roles" +msgstr "Feju Spmft" + +#: src/modules/rolemenus/ui/menueditor.py:514 +msgctxt "ui:menu_editor|menu:del_role|placeholder" +msgid "Remove Roles" +msgstr "Sfnpwf Spmft" + +#: src/modules/rolemenus/ui/menueditor.py:538 +msgctxt "ui:menu_editor|button:style|error:non-managed" +msgid "" +"Cannot change the style of a menu attached to a message I did not send! " +"Please repost first." +msgstr "" +"Dboopu dibohf uif tuzmf pg b nfov buubdife up b nfttbhf J eje opu tfoe! " +"Qmfbtf sfqptu gjstu." + +#: src/modules/rolemenus/ui/menueditor.py:551 +msgctxt "ui:menu_editor|button:style|label" +msgid "Menu Style" +msgstr "Nfov Tuzmf" + +#: src/modules/rolemenus/ui/menueditor.py:576 +msgctxt "ui:menu_editor|menu:style|error:too_many_reactions" +msgid "" +"Too many roles! The Reaction style is limited to `20` roles (Discord " +"limitation)." +msgstr "" +"Upp nboz spmft! Uif Sfbdujpo tuzmf jt mjnjufe up `20` spmft (Ejtdpse " +"mjnjubujpo)." + +#: src/modules/rolemenus/ui/menueditor.py:586 +msgctxt "ui:menu_editor|menu:style|error:incomplete_emojis" +msgid "" +"Cannot switch to the Reaction Role Style! Every role needs to have a " +"distinct emoji first." +msgstr "" +"Dboopu txjudi up uif Sfbdujpo Spmf Tuzmf! Fwfsz spmf offet up ibwf b " +"ejtujodu fnpkj gjstu." + +#: src/modules/rolemenus/ui/menueditor.py:602 +msgctxt "ui:menu_editor|menu:style|placeholder" +msgid "Select Menu Style" +msgstr "Tfmfdu Nfov Tuzmf" + +#: src/modules/rolemenus/ui/menueditor.py:606 +msgctxt "ui:menu_editor|menu:style|option:reaction|label" +msgid "Reaction Roles" +msgstr "Sfbdujpo Spmft" + +#: src/modules/rolemenus/ui/menueditor.py:609 +msgctxt "ui:menu_editor|menu:style|option:reaction|desc" +msgid "Roles are represented compactly as clickable reactions on a message." +msgstr "Spmft bsf sfqsftfoufe dpnqbdumz bt dmjdlbcmf sfbdujpot po b nfttbhf." + +#: src/modules/rolemenus/ui/menueditor.py:615 +msgctxt "ui:menu_editor|menu:style|option:button|label" +msgid "Button Menu" +msgstr "Cvuupo Nfov" + +#: src/modules/rolemenus/ui/menueditor.py:618 +msgctxt "ui:menu_editor|menu:style|option:button|desc" +msgid "" +"Roles are represented in 5 rows of 5 buttons, each with an emoji and label." +msgstr "" +"Spmft bsf sfqsftfoufe jo 5 spxt pg 5 cvuupot, fbdi xjui bo fnpkj boe mbcfm." + +#: src/modules/rolemenus/ui/menueditor.py:624 +msgctxt "ui:menu_editor|menu:style|option:dropdown|label" +msgid "Dropdown Menu" +msgstr "Espqepxo Nfov" + +#: src/modules/rolemenus/ui/menueditor.py:627 +msgctxt "ui:menu_editor|menu:style|option:dropdown|desc" +msgid "Roles are selectable from a dropdown menu below the message." +msgstr "Spmft bsf tfmfdubcmf gspn b espqepxo nfov cfmpx uif nfttbhf." + +#: src/modules/rolemenus/ui/menueditor.py:697 +msgctxt "ui:menu_editor|menu:template|placeholder" +msgid "Select Message Template" +msgstr "Tfmfdu Nfttbhf Ufnqmbuf" + +#: src/modules/rolemenus/ui/menueditor.py:707 +msgctxt "ui:menu_editor|menu:template|option:custom|label" +msgid "Custom Message" +msgstr "Dvtupn Nfttbhf" + +#: src/modules/rolemenus/ui/menueditor.py:712 +msgctxt "ui:menu_editor|menu:template|option:custom|description" +msgid "Entirely custom menu message (opens an interactive editor)." +msgstr "Foujsfmz dvtupn nfov nfttbhf (pqfot bo joufsbdujwf fejups)." + +#: src/modules/rolemenus/ui/menueditor.py:729 +msgctxt "ui:menu_editor|button:delete|confirm|title" +msgid "Are you sure you want to delete this menu? This is not reversible!" +msgstr "Bsf zpv tvsf zpv xbou up efmfuf uijt nfov? Uijt jt opu sfwfstjcmf!" + +#: src/modules/rolemenus/ui/menueditor.py:734 +msgctxt "ui:menu_editor|button:delete|confirm|button:yes" +msgid "Yes, Delete Now" +msgstr "Zft, Efmfuf Opx" + +#: src/modules/rolemenus/ui/menueditor.py:739 +msgctxt "ui:menu_editor|button:delete|confirm|button:no" +msgid "No, Go Back" +msgstr "Op, Hp Cbdl" + +#: src/modules/rolemenus/ui/menueditor.py:756 +msgctxt "ui:menu_editor|button:delete|label" +msgid "Delete Menu" +msgstr "Efmfuf Nfov" + +#: src/modules/rolemenus/ui/menueditor.py:813 +msgctxt "ui:menu_editor|button:edit_msg|label" +msgid "Edit Message" +msgstr "Feju Nfttbhf" + +#: src/modules/rolemenus/ui/menueditor.py:844 +msgctxt "ui:menu_editor|button:preview|label" +msgid "Preview" +msgstr "Qsfwjfx" + +#: src/modules/rolemenus/ui/menueditor.py:860 +msgctxt "ui:menu_editor|button:repost|widget:repost|menu:channel|placeholder" +msgid "Select New Channel" +msgstr "Tfmfdu Ofx Diboofm" + +#: src/modules/rolemenus/ui/menueditor.py:878 +msgctxt "ui:menu_editor|button:repost|widget:repost|error:perms|title" +msgid "Insufficient Permissions!" +msgstr "Jotvggjdjfou Qfsnjttjpot!" + +#: src/modules/rolemenus/ui/menueditor.py:882 +msgctxt "ui:menu_editor|button:repost|eidget:repost|error:perms|desc" +msgid "" +"I lack the `EMBED_LINKS` or `SEND_MESSAGES` permission in this channel." +msgstr "" +"J mbdl uif `FNCFE_MJOLT` ps `TFOE_NFTTBHFT` qfsnjttjpo jo uijt diboofm." + +#: src/modules/rolemenus/ui/menueditor.py:895 +#, possible-python-brace-format +msgctxt "ui:menu_editor|button:repost|widget:repost|error:post_failed" +msgid "" +"An error ocurred while posting to {channel}. Do I have sufficient " +"permissions?" +msgstr "" +"Bo fssps pdvssfe xijmf qptujoh up {channel}. Ep J ibwf tvggjdjfou " +"qfsnjttjpot?" + +#: src/modules/rolemenus/ui/menueditor.py:907 +msgctxt "ui:menu_editor|button:repost|widget:repost|success|title" +msgid "Role Menu Moved" +msgstr "Spmf Nfov Npwfe" + +#: src/modules/rolemenus/ui/menueditor.py:913 +#, possible-python-brace-format +msgctxt "ui:menu_editor|button:repost|widget:repost|success|desc:general" +msgid "The role menu `{name}` is now available at {message_link}." +msgstr "Uif spmf nfov `{name}` jt opx bwbjmbcmf bu {message_link}." + +#: src/modules/rolemenus/ui/menueditor.py:927 +msgctxt "ui:menu_editor|button:repost|widget:repost|success|desc:reactions" +msgid "Please check the message reactions are correct." +msgstr "Qmfbtf difdl uif nfttbhf sfbdujpot bsf dpssfdu." + +#: src/modules/rolemenus/ui/menueditor.py:940 +msgctxt "ui:menu_editor|button:repost|widget:repost|title" +msgid "Repost Role Menu" +msgstr "Sfqptu Spmf Nfov" + +#: src/modules/rolemenus/ui/menueditor.py:944 +msgctxt "ui:menu_editor|button:repost|widget:repost|description" +msgid "Please select the channel to which you want to resend this menu." +msgstr "Qmfbtf tfmfdu uif diboofm up xijdi zpv xbou up sftfoe uijt nfov." + +#: src/modules/rolemenus/ui/menueditor.py:959 +msgctxt "ui:menu_editor|button:repost|label:repost" +msgid "Repost" +msgstr "Sfqptu" + +#: src/modules/rolemenus/ui/menueditor.py:964 +msgctxt "ui:menu_editor|button:repost|label:post" +msgid "Post" +msgstr "Qptu" + +#: src/modules/rolemenus/ui/menueditor.py:974 +msgctxt "ui:menu_editor|embed|title" +msgid "Role Menu Editor" +msgstr "Spmf Nfov Fejups" + +#: src/modules/rolemenus/ui/menueditor.py:983 +#, possible-python-brace-format +msgctxt "ui:menu_editor|embed|description|jump_text:attached" +msgid "Members may use this menu from {jump_url}" +msgstr "Nfncfst nbz vtf uijt nfov gspn {jump_url}" + +#: src/modules/rolemenus/ui/menueditor.py:988 +msgctxt "ui:menu_editor|embed|description|jump_text:unattached" +msgid "" +"This menu is not currently active!\n" +"Make it available by clicking `Post` below." +msgstr "" +"Uijt nfov jt opu dvssfoumz bdujwf!\n" +"Nblf ju bwbjmbcmf cz dmjdljoh `Qptu` cfmpx." + +#: src/modules/rolemenus/ui/menueditor.py:1002 +msgctxt "ui:menu_editor|embed|field:tips|name" +msgid "Command Tips" +msgstr "Dpnnboe Ujqt" + +#: src/modules/rolemenus/ui/menueditor.py:1006 +#, possible-python-brace-format +msgctxt "ui:menu_editor|embed|field:tips|value" +msgid "" +"Use the following commands for faster menu setup.\n" +"{menuedit} to edit the above menu options.\n" +"{addrole} to add new roles (recommended for roles with emojis).\n" +"{editrole} to edit role options." +msgstr "" +"Vtf uif gpmmpxjoh dpnnboet gps gbtufs nfov tfuvq.\n" +"{menuedit} up feju uif bcpwf nfov pqujpot.\n" +"{addrole} up bee ofx spmft (sfdpnnfoefe gps spmft xjui fnpkjt).\n" +"{editrole} up feju spmf pqujpot." + +#: src/modules/rolemenus/ui/menueditor.py:1046 +msgctxt "ui:menu_editor|error:invald_emoji|title" +msgid "Invalid emoji encountered." +msgstr "Jowbmje fnpkj fodpvoufsfe." + +#: src/modules/rolemenus/ui/menueditor.py:1050 +#, possible-python-brace-format +msgctxt "ui:menu_editor|error:invalid_emoji|desc" +msgid "" +"The emoji `{emoji}` for menu role `{label}` no longer exists, unsetting." +msgstr "" +"Uif fnpkj `{emoji}` gps nfov spmf `{label}` op mpohfs fyjtut, votfuujoh." diff --git a/locales/ceaser/LC_MESSAGES/rooms.po b/locales/ceaser/LC_MESSAGES/rooms.po new file mode 100644 index 00000000..abd04ce8 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/rooms.po @@ -0,0 +1,785 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/rooms/settingui.py:38 +msgctxt "ui:room_config|menu:category|placeholder" +msgid "Select Private Room Category" +msgstr "Tfmfdu Qsjwbuf Sppn Dbufhpsz" + +#: src/modules/rooms/settingui.py:52 +msgctxt "ui:room_config|button:visible|label" +msgid "Toggle Room Visibility" +msgstr "Uphhmf Sppn Wjtjcjmjuz" + +#: src/modules/rooms/settingui.py:62 +msgctxt "ui:rooms_config|embed|title" +msgid "Private Room System Configuration Panel" +msgstr "Qsjwbuf Sppn Tztufn Dpogjhvsbujpo Qbofm" + +#: src/modules/rooms/settingui.py:98 +msgctxt "dash:rooms|title" +msgid "Private Room Configuration ({commands[configure rooms]})" +msgstr "Qsjwbuf Sppn Dpogjhvsbujpo ({commands[configure rooms]})" + +#: src/modules/rooms/settingui.py:102 +msgctxt "dash:economy|dropdown|placeholder" +msgid "Private Room Panel" +msgstr "Qsjwbuf Sppn Qbofm" + +#: src/modules/rooms/roomui.py:56 +msgctxt "ui:room_status|error:owner_required" +msgid "You must be the private room owner to do this!" +msgstr "Zpv nvtu cf uif qsjwbuf sppn pxofs up ep uijt!" + +#: src/modules/rooms/roomui.py:72 +msgctxt "ui:room_status|error:member_required" +msgid "You need to be a member of the private room to do this!" +msgstr "Zpv offe up cf b nfncfs pg uif qsjwbuf sppn up ep uijt!" + +#: src/modules/rooms/roomui.py:90 +msgctxt "ui:room_status|button:deposit|modal:deposit|title" +msgid "Room Deposit" +msgstr "Sppn Efqptju" + +#: src/modules/rooms/roomui.py:94 +msgctxt "ui:room_status|button:deposit|modal:deposit|field:question|label" +msgid "How many LionCoins do you want to deposit?" +msgstr "Ipx nboz MjpoDpjot ep zpv xbou up efqptju?" + +#: src/modules/rooms/roomui.py:112 +#, possible-python-brace-format +msgctxt "ui:room_status|button:deposit|error:invalid_number" +msgid "Cannot deposit `{inputted}` coins. Please enter a positive integer." +msgstr "Dboopu efqptju `{inputted}` dpjot. Qmfbtf foufs b qptjujwf joufhfs." + +#: src/modules/rooms/roomui.py:144 +#, possible-python-brace-format +msgctxt "ui:room_status|button:deposit|error:insufficient_funds" +msgid "" +"You cannot deposit {coin}**{amount}**! You only have {coin}**{balance}**." +msgstr "" +"Zpv dboopu efqptju {coin}**{amount}**! Zpv pomz ibwf {coin}**{balance}**." + +#: src/modules/rooms/roomui.py:160 +msgctxt "ui:room_status|button:deposit|label" +msgid "Deposit" +msgstr "Efqptju" + +#: src/modules/rooms/roomui.py:171 +msgctxt "ui:room_status|button:edit|label" +msgid "Edit Room" +msgstr "Feju Sppn" + +#: src/modules/rooms/roomui.py:204 +msgctxt "ui:room_status|button:timer|modal:add_timer|title" +msgid "Create Room Timer" +msgstr "Dsfbuf Sppn Ujnfs" + +#: src/modules/rooms/roomui.py:236 +#, possible-python-brace-format +msgctxt "ui:room_status|button:timer|timer_created" +msgid "Timer created successfully! Use {edit_cmd} to configure further." +msgstr "Ujnfs dsfbufe tvddfttgvmmz! Vtf {edit_cmd} up dpogjhvsf gvsuifs." + +#: src/modules/rooms/roomui.py:254 +msgctxt "ui:room_status|button:timer|label:edit_timer" +msgid "Edit Timer" +msgstr "Feju Ujnfs" + +#: src/modules/rooms/roomui.py:261 +msgctxt "ui:room_status|button:timer|label:add_timer" +msgid "Add Timer" +msgstr "Bee Ujnfs" + +#: src/modules/rooms/roomui.py:304 +#, possible-python-brace-format +msgctxt "ui:room_status|menu:invite|error:too_many_members" +msgid "" +"Too many members! You are inviting `{count}` new members to your room, but " +"you already have `{current}` members! The member cap is `{cap}`." +msgstr "" +"Upp nboz nfncfst! Zpv bsf jowjujoh `{count}` ofx nfncfst up zpvs sppn, cvu " +"zpv bmsfbez ibwf `{current}` nfncfst! Uif nfncfs dbq jt `{cap}`." + +#: src/modules/rooms/roomui.py:330 +msgctxt "ui:room_status|menu:invite_menu|placeholder:capped" +msgid "Room member cap reached!" +msgstr "Sppn nfncfs dbq sfbdife!" + +#: src/modules/rooms/roomui.py:336 +msgctxt "ui:room_status|menu:invite_menu|placeholder:notcapped" +msgid "Add Members" +msgstr "Bee Nfncfst" + +#: src/modules/rooms/roomui.py:359 +msgctxt "ui:room_status|menu:kick_menu|placeholder" +msgid "Remove Members" +msgstr "Sfnpwf Nfncfst" + +#: src/modules/rooms/roomui.py:367 +msgctxt "ui:room_status|embed|title" +msgid "Room Control Panel" +msgstr "Sppn Dpouspm Qbofm" + +#: src/modules/rooms/roomui.py:375 +msgctxt "ui:room_status|embed|field:channel|name" +msgid "Channel" +msgstr "Diboofm" + +#: src/modules/rooms/roomui.py:380 +msgctxt "ui:room_status|embed|field:owner|name" +msgid "Owner" +msgstr "Pxofs" + +#: src/modules/rooms/roomui.py:385 +msgctxt "ui:room_status|embed|field:created|name" +msgid "Created At" +msgstr "Dsfbufe Bu" + +#: src/modules/rooms/roomui.py:395 +#, possible-python-brace-format +msgctxt "ui:room_status|embed|field:bank|value:expiring" +msgid "" +"**Warning:** Insufficient room balance to pay next rent ({coin} **{rent}**).\n" +"The room will expire {expiry}.\n" +"Use {room_deposit_cmd} to increase balance." +msgstr "" +"**Xbsojoh:** Jotvggjdjfou sppn cbmbodf up qbz ofyu sfou ({coin} **{rent}**).\n" +"Uif sppn xjmm fyqjsf {expiry}.\n" +"Vtf {room_deposit_cmd} up jodsfbtf cbmbodf." + +#: src/modules/rooms/roomui.py:407 +#, possible-python-brace-format +msgctxt "ui:room_status|embed|field:bank|value:notexpiring" +msgid "Next rent due {time} (- {coin}**{rent}**)" +msgstr "Ofyu sfou evf {time} (- {coin}**{rent}**)" + +#: src/modules/rooms/roomui.py:416 +#, possible-python-brace-format +msgctxt "ui:room_status|embed|field:bank|name" +msgid "Room Balance: {coin}**{amount}**" +msgstr "Sppn Cbmbodf: {coin}**{amount}**" + +#: src/modules/rooms/roomui.py:428 +#, possible-python-brace-format +msgctxt "ui:room_status|embed|field:members|name" +msgid "Members ({count}/{cap})" +msgstr "Nfncfst ({count}/{cap})" + +#: src/modules/rooms/cog.py:321 +msgctxt "cmd:room" +msgid "room" +msgstr "sppn" + +#: src/modules/rooms/cog.py:322 +msgctxt "cmd:room|desc" +msgid "Base command group for private room configuration." +msgstr "Cbtf dpnnboe hspvq gps qsjwbuf sppn dpogjhvsbujpo." + +#: src/modules/rooms/cog.py:329 +msgctxt "cmd:room_rent" +msgid "rent" +msgstr "sfou" + +#: src/modules/rooms/cog.py:332 +msgctxt "cmd:room_rent|desc" +msgid "Rent a private voice channel with LionCoins." +msgstr "Sfou b qsjwbuf wpjdf diboofm xjui MjpoDpjot." + +#: src/modules/rooms/cog.py:336 +msgctxt "cmd:room_rent|param:days" +msgid "days" +msgstr "ebzt" + +#: src/modules/rooms/cog.py:337 +msgctxt "cmd:room_rent|param:members" +msgid "members" +msgstr "nfncfst" + +#: src/modules/rooms/cog.py:338 +msgctxt "cmd:room_rent|param:name" +msgid "name" +msgstr "obnf" + +#: src/modules/rooms/cog.py:343 +msgctxt "cmd:room_rent|param:days|desc" +msgid "Number of days to pre-purchase. (Default: 1)" +msgstr "Ovncfs pg ebzt up qsf-qvsdibtf. (Efgbvmu: 1)" + +#: src/modules/rooms/cog.py:347 +msgctxt "cmd:room_rent|param:members|desc" +msgid "Mention the members you want to add to your private room." +msgstr "Nfoujpo uif nfncfst zpv xbou up bee up zpvs qsjwbuf sppn." + +#: src/modules/rooms/cog.py:351 +msgctxt "cmd:room_rent|param:name|desc" +msgid "Name of your private voice channel." +msgstr "Obnf pg zpvs qsjwbuf wpjdf diboofm." + +#: src/modules/rooms/cog.py:369 +msgctxt "cmd:room_rent|error:not_setup" +msgid "" +"The private room system has not been set up! A private room category needs " +"to be set first with `/configure rooms`." +msgstr "" +"Uif qsjwbuf sppn tztufn ibt opu cffo tfu vq! B qsjwbuf sppn dbufhpsz offet " +"up cf tfu gjstu xjui `/dpogjhvsf sppnt`." + +#: src/modules/rooms/cog.py:380 +msgctxt "cmd:room_rent|error:insufficient_perms" +msgid "" +"I do not have enough permissions to create a new channel under the " +"configured private room category!" +msgstr "" +"J ep opu ibwf fopvhi qfsnjttjpot up dsfbuf b ofx diboofm voefs uif " +"dpogjhvsfe qsjwbuf sppn dbufhpsz!" + +#: src/modules/rooms/cog.py:394 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:room_exists" +msgid "You already own a private room! Click to visit: {channel}" +msgstr "Zpv bmsfbez pxo b qsjwbuf sppn! Dmjdl up wjtju: {channel}" + +#: src/modules/rooms/cog.py:414 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:member_not_found" +msgid "Could not find the requested member {mention} in this server!" +msgstr "Dpvme opu gjoe uif sfrvftufe nfncfs {mention} jo uijt tfswfs!" + +#: src/modules/rooms/cog.py:428 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:too_many_members" +msgid "" +"Too many members! You have requested to add `{count}` members to your room, " +"but the maximum private room size is `{cap}`!" +msgstr "" +"Upp nboz nfncfst! Zpv ibwf sfrvftufe up bee `{count}` nfncfst up zpvs sppn, " +"cvu uif nbyjnvn qsjwbuf sppn tjaf jt `{cap}`!" + +#: src/modules/rooms/cog.py:442 +#, possible-python-brace-format +msgctxt "cmd:room_rent|confirm:purchase" +msgid "" +"Are you sure you want to spend {coin}**{required}** to rent a private room " +"for `one` day?" +msgid_plural "" +"Are you sure you want to spend {coin}**{required}** to rent a private room " +"for `{days}` days?" +msgstr[0] "" +"Bsf zpv tvsf zpv xbou up tqfoe {coin}**{required}** up sfou b qsjwbuf sppn " +"gps `pof` ebz?" +msgstr[1] "" +"Bsf zpv tvsf zpv xbou up tqfoe {coin}**{required}** up sfou b qsjwbuf sppn " +"gps `{days}` ebzt?" + +#: src/modules/rooms/cog.py:467 +#, possible-python-brace-format +msgctxt "cmd:room_rent|success" +msgid "Successfully created your private room {channel}!" +msgstr "Tvddfttgvmmz dsfbufe zpvs qsjwbuf sppn {channel}!" + +#: src/modules/rooms/cog.py:472 +msgctxt "cmd:room_rent|success|title" +msgid "Private Room Created!" +msgstr "Qsjwbuf Sppn Dsfbufe!" + +#: src/modules/rooms/cog.py:506 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:insufficient_funds" +msgid "" +"Renting a private room for `one` day costs {coin}**{required}**, but you " +"only have {coin}**{balance}**!" +msgid_plural "" +"Renting a private room for `{days}` days costs {coin}**{required}**, but you" +" only have {coin}**{balance}**!" +msgstr[0] "" +"Sfoujoh b qsjwbuf sppn gps `pof` ebz dptut {coin}**{required}**, cvu zpv " +"pomz ibwf {coin}**{balance}**!" +msgstr[1] "" +"Sfoujoh b qsjwbuf sppn gps `{days}` ebzt dptut {coin}**{required}**, cvu zpv" +" pomz ibwf {coin}**{balance}**!" + +#: src/modules/rooms/cog.py:540 +msgctxt "cmd:room_rent|error:my_permissions" +msgid "" +"Could not create your private room! You were not charged.\n" +"I have insufficient permissions to create a private room channel." +msgstr "" +"Dpvme opu dsfbuf zpvs qsjwbuf sppn! Zpv xfsf opu dibshfe.\n" +"J ibwf jotvggjdjfou qfsnjttjpot up dsfbuf b qsjwbuf sppn diboofm." + +#: src/modules/rooms/cog.py:552 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:unknown" +msgid "" +"Could not create your private room! You were not charged.\n" +"An unknown error occurred while creating your private room.\n" +"`{error}`" +msgstr "" +"Dpvme opu dsfbuf zpvs qsjwbuf sppn! Zpv xfsf opu dibshfe.\n" +"Bo volopxo fssps pddvssfe xijmf dsfbujoh zpvs qsjwbuf sppn.\n" +"`{error}`" + +#: src/modules/rooms/cog.py:562 +msgctxt "cmd:room_status" +msgid "status" +msgstr "tubuvt" + +#: src/modules/rooms/cog.py:565 +msgctxt "cmd:room_status|desc" +msgid "Display the status of your current room." +msgstr "Ejtqmbz uif tubuvt pg zpvs dvssfou sppn." + +#: src/modules/rooms/cog.py:582 +msgctxt "cmd:room_status|error:no_target" +msgid "" +"Could not identify target private room! Please re-run the command in the " +"private room you wish to view the status of." +msgstr "" +"Dpvme opu jefoujgz ubshfu qsjwbuf sppn! Qmfbtf sf-svo uif dpnnboe jo uif " +"qsjwbuf sppn zpv xjti up wjfx uif tubuvt pg." + +#: src/modules/rooms/cog.py:597 +msgctxt "cmd:room_invite" +msgid "invite" +msgstr "jowjuf" + +#: src/modules/rooms/cog.py:600 +msgctxt "cmd:room_invite|desc" +msgid "Add members to your private room." +msgstr "Bee nfncfst up zpvs qsjwbuf sppn." + +#: src/modules/rooms/cog.py:604 +msgctxt "cmd:room_invite|param:members" +msgid "members" +msgstr "nfncfst" + +#: src/modules/rooms/cog.py:609 +msgctxt "cmd:room_invite|param:members|desc" +msgid "Mention the members you want to add." +msgstr "Nfoujpo uif nfncfst zpv xbou up bee." + +#: src/modules/rooms/cog.py:623 +#, possible-python-brace-format +msgctxt "cmd:room_invite|error:no_room" +msgid "" +"You do not own a private room! Use `/room rent` to rent one with {coin}!" +msgstr "" +"Zpv ep opu pxo b qsjwbuf sppn! Vtf `/sppn sfou` up sfou pof xjui {coin}!" + +#: src/modules/rooms/cog.py:644 +#, possible-python-brace-format +msgctxt "cmd:room_invite|error:member_not_found" +msgid "Could not find the invited member {mention} in this server!" +msgstr "Dpvme opu gjoe uif jowjufe nfncfs {mention} jo uijt tfswfs!" + +#: src/modules/rooms/cog.py:655 +msgctxt "cmd:room_invite|error:no_new_members" +msgid "All members mentioned are already in the room!" +msgstr "Bmm nfncfst nfoujpofe bsf bmsfbez jo uif sppn!" + +#: src/modules/rooms/cog.py:669 +#, possible-python-brace-format +msgctxt "cmd:room_invite|error:too_many_members" +msgid "" +"Too many members! You have invited `{count}` new members to your room, but " +"you already have `{current}`, and the member cap is `{cap}`!" +msgstr "" +"Upp nboz nfncfst! Zpv ibwf jowjufe `{count}` ofx nfncfst up zpvs sppn, cvu " +"zpv bmsfbez ibwf `{current}`, boe uif nfncfs dbq jt `{cap}`!" + +#: src/modules/rooms/cog.py:693 +msgctxt "cmd:room_invite|success|ack" +msgid "Members Invited successfully." +msgstr "Nfncfst Jowjufe tvddfttgvmmz." + +#: src/modules/rooms/cog.py:701 +msgctxt "cmd:room_kick" +msgid "kick" +msgstr "ljdl" + +#: src/modules/rooms/cog.py:704 +msgctxt "cmd:room_kick|desc" +msgid "Remove a members from your private room." +msgstr "Sfnpwf b nfncfst gspn zpvs qsjwbuf sppn." + +#: src/modules/rooms/cog.py:708 +msgctxt "cmd:room_kick|param:members" +msgid "members" +msgstr "nfncfst" + +#: src/modules/rooms/cog.py:713 +msgctxt "cmd:room_kick|param:members|desc" +msgid "" +"Mention the members you want to remove. Also accepts space-separated user " +"ids." +msgstr "" +"Nfoujpo uif nfncfst zpv xbou up sfnpwf. Bmtp bddfqut tqbdf-tfqbsbufe vtfs " +"jet." + +#: src/modules/rooms/cog.py:727 +#, possible-python-brace-format +msgctxt "cmd:room_kick|error:no_room" +msgid "" +"You do not own a private room! Use `/room rent` to rent one with {coin}!" +msgstr "" +"Zpv ep opu pxo b qsjwbuf sppn! Vtf `/sppn sfou` up sfou pof xjui {coin}!" + +#: src/modules/rooms/cog.py:744 +msgctxt "cmd:room_kick|error:no_matching_members" +msgid "None of the mentioned members are in this room!" +msgstr "Opof pg uif nfoujpofe nfncfst bsf jo uijt sppn!" + +#: src/modules/rooms/cog.py:761 +msgctxt "cmd:room_kick|success|ack" +msgid "Members removed." +msgstr "Nfncfst sfnpwfe." + +#: src/modules/rooms/cog.py:767 +msgctxt "cmd:room_transfer" +msgid "transfer" +msgstr "usbotgfs" + +#: src/modules/rooms/cog.py:770 +msgctxt "cmd:room_transfer|desc" +msgid "Transfer your private room to another room member. Not reversible!" +msgstr "Usbotgfs zpvs qsjwbuf sppn up bopuifs sppn nfncfs. Opu sfwfstjcmf!" + +#: src/modules/rooms/cog.py:774 +msgctxt "cmd:room_transfer|param:new_owner" +msgid "new_owner" +msgstr "ofx_pxofs" + +#: src/modules/rooms/cog.py:779 +msgctxt "cmd:room_transfer|param:new_owner" +msgid "The room member you would like to transfer your room to." +msgstr "Uif sppn nfncfs zpv xpvme mjlf up usbotgfs zpvs sppn up." + +#: src/modules/rooms/cog.py:793 +msgctxt "cmd:room_transfer|error:no_room" +msgid "You do not own a private room to transfer!" +msgstr "Zpv ep opu pxo b qsjwbuf sppn up usbotgfs!" + +#: src/modules/rooms/cog.py:805 +#, possible-python-brace-format +msgctxt "cmd:room_transfer|error:target_not_member" +msgid "" +"{mention} is not a member of your private room! You must invite them first." +msgstr "" +"{mention} jt opu b nfncfs pg zpvs qsjwbuf sppn! Zpv nvtu jowjuf uifn gjstu." + +#: src/modules/rooms/cog.py:817 +#, possible-python-brace-format +msgctxt "cmd:room_transfer|error:target_has_room" +msgid "" +"{mention} already owns a room! Members can only own one room at a time." +msgstr "" +"{mention} bmsfbez pxot b sppn! Nfncfst dbo pomz pxo pof sppn bu b ujnf." + +#: src/modules/rooms/cog.py:826 +#, possible-python-brace-format +msgctxt "cmd:room_transfer|confirm|question" +msgid "" +"Are you sure you wish to transfer your private room {channel} to " +"{new_owner}? This action is not reversible!" +msgstr "" +"Bsf zpv tvsf zpv xjti up usbotgfs zpvs qsjwbuf sppn {channel} up " +"{new_owner}? Uijt bdujpo jt opu sfwfstjcmf!" + +#: src/modules/rooms/cog.py:846 +#, possible-python-brace-format +msgctxt "cmd:room_transfer|success|description" +msgid "" +"You have successfully transferred ownership of {channel} to {new_owner}." +msgstr "" +"Zpv ibwf tvddfttgvmmz usbotgfssfe pxofstijq pg {channel} up {new_owner}." + +#: src/modules/rooms/cog.py:852 +msgctxt "cmd:room_deposit" +msgid "deposit" +msgstr "efqptju" + +#: src/modules/rooms/cog.py:855 +msgctxt "cmd:room_deposit|desc" +msgid "" +"Deposit LionCoins in your private room bank to add more days. (Members may " +"also deposit!)" +msgstr "" +"Efqptju MjpoDpjot jo zpvs qsjwbuf sppn cbol up bee npsf ebzt. (Nfncfst nbz " +"bmtp efqptju!)" + +#: src/modules/rooms/cog.py:859 +msgctxt "cmd:room_deposit|param:coins" +msgid "coins" +msgstr "dpjot" + +#: src/modules/rooms/cog.py:864 +msgctxt "cmd:room_deposit|param:coins|desc" +msgid "Number of coins to deposit." +msgstr "Ovncfs pg dpjot up efqptju." + +#: src/modules/rooms/cog.py:884 +msgctxt "cmd:room_deposit|error:no_target" +msgid "" +"Could not identify target private room! Please re-run the command in the " +"private room you wish to contribute to." +msgstr "" +"Dpvme opu jefoujgz ubshfu qsjwbuf sppn! Qmfbtf sf-svo uif dpnnboe jo uif " +"qsjwbuf sppn zpv xjti up dpousjcvuf up." + +#: src/modules/rooms/cog.py:900 +#, possible-python-brace-format +msgctxt "cmd:room_deposit|error:insufficient_funds" +msgid "" +"You cannot deposit {coin}**{amount}**! You only have {coin}**{balance}**." +msgstr "" +"Zpv dboopu efqptju {coin}**{amount}**! Zpv pomz ibwf {coin}**{balance}**." + +#: src/modules/rooms/cog.py:921 +#, possible-python-brace-format +msgctxt "cmd:room_depost|success" +msgid "" +"Success! You have contributed {coin}**{amount}** to the private room bank." +msgstr "" +"Tvddftt! Zpv ibwf dpousjcvufe {coin}**{amount}** up uif qsjwbuf sppn cbol." + +#: src/modules/rooms/cog.py:936 +msgctxt "cmd:configure_rooms" +msgid "rooms" +msgstr "sppnt" + +#: src/modules/rooms/cog.py:937 +msgctxt "cmd:configure_rooms|desc" +msgid "Configure Rented Private Rooms" +msgstr "Dpogjhvsf Sfoufe Qsjwbuf Sppnt" + +#: src/modules/rooms/room.py:81 +#, possible-python-brace-format +msgctxt "room|notify:deposit|description" +msgid "{member} has deposited {coin}**{amount}** into the room bank!" +msgstr "{member} ibt efqptjufe {coin}**{amount}** joup uif sppn cbol!" + +#: src/modules/rooms/room.py:104 +msgctxt "room|notify:new_members|title" +msgid "New Members!" +msgstr "Ofx Nfncfst!" + +#: src/modules/rooms/room.py:108 +#, possible-python-brace-format +msgctxt "room|notify:new_members|desc" +msgid "Welcome {members}" +msgstr "Xfmdpnf {members}" + +#: src/modules/rooms/room.py:183 +#, possible-python-brace-format +msgctxt "room|notify:transfer|description" +msgid "{old_owner} has transferred private room ownership to {new_owner}" +msgstr "{old_owner} ibt usbotgfssfe qsjwbuf sppn pxofstijq up {new_owner}" + +#: src/modules/rooms/room.py:247 +msgctxt "room|embed:expiry|title" +msgid "Private Room Expired!" +msgstr "Qsjwbuf Sppn Fyqjsfe!" + +#: src/modules/rooms/room.py:251 +#, possible-python-brace-format +msgctxt "room|embed:expiry|description" +msgid "Your private room in **{guild}** has expired!" +msgstr "Zpvs qsjwbuf sppn jo **{guild}** ibt fyqjsfe!" + +#: src/modules/rooms/room.py:265 +#, possible-python-brace-format +msgctxt "room|tick|rent_deducted" +msgid "Daily rent deducted from room balance. New balance: {coin}**{amount}**" +msgstr "" +"Ebjmz sfou efevdufe gspn sppn cbmbodf. Ofx cbmbodf: {coin}**{amount}**" + +#: src/modules/rooms/settings.py:21 +msgctxt "guildset:room_category" +msgid "rooms_category" +msgstr "sppnt_dbufhpsz" + +#: src/modules/rooms/settings.py:25 +msgctxt "guildset:rooms_category|desc" +msgid "Category in which to create private voice channels." +msgstr "Dbufhpsz jo xijdi up dsfbuf qsjwbuf wpjdf diboofmt." + +#: src/modules/rooms/settings.py:29 +msgctxt "guildset:room_category|long_desc" +msgid "" +"When a member uses {cmds[room rent]} to rent a new private room, a private " +"voice channel will be created under this category, manageable by the member." +" I must have permission to create new channels in this category, as well as " +"to manage permissions." +msgstr "" +"Xifo b nfncfs vtft {cmds[room rent]} up sfou b ofx qsjwbuf sppn, b qsjwbuf " +"wpjdf diboofm xjmm cf dsfbufe voefs uijt dbufhpsz, nbobhfbcmf cz uif nfncfs." +" J nvtu ibwf qfsnjttjpo up dsfbuf ofx diboofmt jo uijt dbufhpsz, bt xfmm bt " +"up nbobhf qfsnjttjpot." + +#: src/modules/rooms/settings.py:37 +msgctxt "guildset:room_category|accepts" +msgid "Private room category name or id." +msgstr "Qsjwbuf sppn dbufhpsz obnf ps je." + +#: src/modules/rooms/settings.py:51 +msgctxt "guildset:rooms_category|set_response:unset" +msgid "" +"The private room category has been unset. Existing private rooms will not be" +" affected. Delete the channels manually to remove the private rooms." +msgstr "" +"Uif qsjwbuf sppn dbufhpsz ibt cffo votfu. Fyjtujoh qsjwbuf sppnt xjmm opu cf" +" bggfdufe. Efmfuf uif diboofmt nbovbmmz up sfnpwf uif qsjwbuf sppnt." + +#: src/modules/rooms/settings.py:57 +#, possible-python-brace-format +msgctxt "guildset:rooms_category|set_response:set" +msgid "" +"Private room category has been set to {channel}. Existing private rooms will" +" be moved." +msgstr "" +"Qsjwbuf sppn dbufhpsz ibt cffo tfu up {channel}. Fyjtujoh qsjwbuf sppnt xjmm" +" cf npwfe." + +#: src/modules/rooms/settings.py:67 +#, possible-python-brace-format +msgctxt "guildset:room_category|set_using" +msgid "{cmd} or category selector below." +msgstr "{cmd} ps dbufhpsz tfmfdups cfmpx." + +#: src/modules/rooms/settings.py:76 +msgctxt "guildset:rooms_price" +msgid "room_rent" +msgstr "sppn_sfou" + +#: src/modules/rooms/settings.py:80 +msgctxt "guildset:rooms_rent|desc" +msgid "Daily rent price for a private room." +msgstr "Ebjmz sfou qsjdf gps b qsjwbuf sppn." + +#: src/modules/rooms/settings.py:84 +msgctxt "guildset:rooms_rent|long_desc" +msgid "" +"Members will be charged this many LionCoins for each day they rent a private" +" room." +msgstr "" +"Nfncfst xjmm cf dibshfe uijt nboz MjpoDpjot gps fbdi ebz uifz sfou b qsjwbuf" +" sppn." + +#: src/modules/rooms/settings.py:88 +msgctxt "guildset:rooms_rent|accepts" +msgid "Number of LionCoins charged per day for a private room." +msgstr "Ovncfs pg MjpoDpjot dibshfe qfs ebz gps b qsjwbuf sppn." + +#: src/modules/rooms/settings.py:100 +#, possible-python-brace-format +msgctxt "guildset:rooms_price|set_response" +msgid "Private rooms will now cost {coin}**{amount}** per 24 hours." +msgstr "Qsjwbuf sppnt xjmm opx dptu {coin}**{amount}** qfs 24 ipvst." + +#: src/modules/rooms/settings.py:112 +msgctxt "guildset:rooms_slots" +msgid "room_member_cap" +msgstr "sppn_nfncfs_dbq" + +#: src/modules/rooms/settings.py:115 +msgctxt "guildset:rooms_slots|desc" +msgid "Maximum number of members in each private room." +msgstr "Nbyjnvn ovncfs pg nfncfst jo fbdi qsjwbuf sppn." + +#: src/modules/rooms/settings.py:119 +msgctxt "guildset:rooms_slots|long_desc" +msgid "" +"Private room owners may invite other members to their private room via the " +"UI, or through the {cmds[room invite]} command. This setting limits the " +"maximum number of members a private room may hold." +msgstr "" +"Qsjwbuf sppn pxofst nbz jowjuf puifs nfncfst up uifjs qsjwbuf sppn wjb uif " +"VJ, ps uispvhi uif {cmds[room invite]} dpnnboe. Uijt tfuujoh mjnjut uif " +"nbyjnvn ovncfs pg nfncfst b qsjwbuf sppn nbz ipme." + +#: src/modules/rooms/settings.py:125 +msgctxt "guildset:rooms_slots|accepts" +msgid "Maximum number of members allowed per private room." +msgstr "Nbyjnvn ovncfs pg nfncfst bmmpxfe qfs qsjwbuf sppn." + +#: src/modules/rooms/settings.py:137 +#, possible-python-brace-format +msgctxt "guildset:rooms_slots|set_response" +msgid "Private rooms are now capped to **{amount}** members." +msgstr "Qsjwbuf sppnt bsf opx dbqqfe up **{amount}** nfncfst." + +#: src/modules/rooms/settings.py:146 +msgctxt "guildset:rooms_visible" +msgid "room_visibility" +msgstr "sppn_wjtjcjmjuz" + +#: src/modules/rooms/settings.py:149 +msgctxt "guildset:rooms_visible|desc" +msgid "Whether private rented rooms are visible to non-members." +msgstr "Xifuifs qsjwbuf sfoufe sppnt bsf wjtjcmf up opo-nfncfst." + +#: src/modules/rooms/settings.py:153 +msgctxt "guildset:rooms_visible|long_desc" +msgid "" +"If enabled, new private rooms will be created with the `VIEW_CHANNEL` " +"permission enabled for the `@everyone` role." +msgstr "" +"Jg fobcmfe, ofx qsjwbuf sppnt xjmm cf dsfbufe xjui uif `WJFX_DIBOOFM` " +"qfsnjttjpo fobcmfe gps uif `@fwfszpof` spmf." + +#: src/modules/rooms/settings.py:157 +msgctxt "guildset:rooms_visible|accepts" +msgid "Visible/Invisible" +msgstr "Wjtjcmf/Jowjtjcmf" + +#: src/modules/rooms/settings.py:159 +msgctxt "guildset:rooms_visible|output:true" +msgid "Visible" +msgstr "Wjtjcmf" + +#: src/modules/rooms/settings.py:160 +msgctxt "guildset:rooms_visible|output:false" +msgid "Invisible" +msgstr "Jowjtjcmf" + +#: src/modules/rooms/settings.py:166 +msgctxt "guildset:rooms_visible|parse:truthy_values" +msgid "visible|enabled|yes|true|on|enable|1" +msgstr "wjtjcmf|fobcmfe|zft|usvf|po|fobcmf|1" + +#: src/modules/rooms/settings.py:170 +msgctxt "guildset:rooms_visible|parse:falsey_values" +msgid "invisible|disabled|no|false|off|disable|0" +msgstr "jowjtjcmf|ejtbcmfe|op|gbmtf|pgg|ejtbcmf|0" + +#: src/modules/rooms/settings.py:182 +msgctxt "guildset:rooms_visible|set_response:enabled" +msgid "Private rooms will now be visible to everyone." +msgstr "Qsjwbuf sppnt xjmm opx cf wjtjcmf up fwfszpof." + +#: src/modules/rooms/settings.py:187 +msgctxt "guildset:rooms_visible|set_response:disabled" +msgid "Private rooms will now only be visible to their members (and admins)." +msgstr "Qsjwbuf sppnt xjmm opx pomz cf wjtjcmf up uifjs nfncfst (boe benjot)." + +#: src/modules/rooms/settings.py:197 +#, possible-python-brace-format +msgctxt "guildset:rooms_visible|set_using" +msgid "{cmd} or toggle below." +msgstr "{cmd} ps uphhmf cfmpx." diff --git a/locales/ceaser/LC_MESSAGES/schedule.po b/locales/ceaser/LC_MESSAGES/schedule.po new file mode 100644 index 00000000..b8056554 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/schedule.po @@ -0,0 +1,1036 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/schedule/cog.py:429 +msgctxt "create_booking|error:no_lobby" +msgid "" +"This server has not set a `session_lobby`, so the scheduled session system " +"is disabled!" +msgstr "" +"Uijt tfswfs ibt opu tfu b `tfttjpo_mpccz`, tp uif tdifevmfe tfttjpo tztufn " +"jt ejtbcmfe!" + +#: src/modules/schedule/cog.py:441 +msgctxt "create_booking|error:no_member" +msgid "An unknown Discord error occurred. Please try again in a few minutes." +msgstr "Bo volopxo Ejtdpse fssps pddvssfe. Qmfbtf usz bhbjo jo b gfx njovuft." + +#: src/modules/schedule/cog.py:449 +msgctxt "create_booking|error:blacklisted" +msgid "" +"You have been blacklisted from the scheduled session system in this server." +msgstr "" +"Zpv ibwf cffo cmbdlmjtufe gspn uif tdifevmfe tfttjpo tztufn jo uijt tfswfs." + +#: src/modules/schedule/cog.py:460 +#, possible-python-brace-format +msgctxt "create_booking|error:insufficient_balance" +msgid "" +"Booking a session costs {coin}**{required}**, but you only have " +"{coin}**{balance}**." +msgid_plural "" +"Booking `{count}` sessions costs {coin}**{required}**, but you only have " +"{coin}**{balance}**." +msgstr[0] "" +"Cppljoh b tfttjpo dptut {coin}**{required}**, cvu zpv pomz ibwf " +"{coin}**{balance}**." +msgstr[1] "" +"Cppljoh `{count}` tfttjpot dptut {coin}**{required}**, cvu zpv pomz ibwf " +"{coin}**{balance}**." + +#: src/modules/schedule/cog.py:474 +msgctxt "create_booking|error:already_booked" +msgid "One or more requested timeslots are already booked!" +msgstr "Pof ps npsf sfrvftufe ujnftmput bsf bmsfbez cpplfe!" + +#: src/modules/schedule/cog.py:677 +msgctxt "cmd:schedule" +msgid "schedule" +msgstr "tdifevmf" + +#: src/modules/schedule/cog.py:680 +msgctxt "cmd:schedule|desc" +msgid "View and manage your scheduled session." +msgstr "Wjfx boe nbobhf zpvs tdifevmfe tfttjpo." + +#: src/modules/schedule/cog.py:708 +#, possible-python-brace-format +msgctxt "cmd:schedule|cancel_booking|error:parse_slot" +msgid "" +"Time slot `{provided}` not recognised. Please select a session to cancel " +"from the autocomplete options." +msgstr "" +"Ujnf tmpu `{provided}` opu sfdphojtfe. Qmfbtf tfmfdu b tfttjpo up dbodfm " +"gspn uif bvupdpnqmfuf pqujpot." + +#: src/modules/schedule/cog.py:716 +#, possible-python-brace-format +msgctxt "cmd:schedule|cancel_booking|error:not_booked" +msgid "Could not cancel {time} booking because it is not booked!" +msgstr "Dpvme opu dbodfm {time} cppljoh cfdbvtf ju jt opu cpplfe!" + +#: src/modules/schedule/cog.py:725 +#, possible-python-brace-format +msgctxt "cmd:schedule|cancel_booking|error:too_soon" +msgid "Cannot cancel {time} booking because it is running or starting soon!" +msgstr "Dboopu dbodfm {time} cppljoh cfdbvtf ju jt svoojoh ps tubsujoh tppo!" + +#: src/modules/schedule/cog.py:738 +#, possible-python-brace-format +msgctxt "cmd:schedule|cancel_booking|success" +msgid "Successfully cancelled your booking at {time}." +msgstr "Tvddfttgvmmz dbodfmmfe zpvs cppljoh bu {time}." + +#: src/modules/schedule/cog.py:751 +#, possible-python-brace-format +msgctxt "cmd:schedule|create_booking|error:parse_slot" +msgid "" +"Time slot `{provided}` not recognised. Please select a session to cancel " +"from the autocomplete options." +msgstr "" +"Ujnf tmpu `{provided}` opu sfdphojtfe. Qmfbtf tfmfdu b tfttjpo up dbodfm " +"gspn uif bvupdpnqmfuf pqujpot." + +#: src/modules/schedule/cog.py:759 +#, possible-python-brace-format +msgctxt "cmd:schedule|create_booking|error:already_booked" +msgid "You have already booked a scheduled session for {time}." +msgstr "Zpv ibwf bmsfbez cpplfe b tdifevmfe tfttjpo gps {time}." + +#: src/modules/schedule/cog.py:768 +#, possible-python-brace-format +msgctxt "cmd:schedule|create_booking|error:too_soon" +msgid "Cannot book session at {time} because it is running or starting soon!" +msgstr "Dboopu cppl tfttjpo bu {time} cfdbvtf ju jt svoojoh ps tubsujoh tppo!" + +#: src/modules/schedule/cog.py:780 +#, possible-python-brace-format +msgctxt "cmd:schedule|create_booking|success" +msgid "You have successfully scheduled a session at {time}." +msgstr "Zpv ibwf tvddfttgvmmz tdifevmfe b tfttjpo bu {time}." + +#: src/modules/schedule/cog.py:847 +msgctxt "cmd:configure_schedule" +msgid "schedule" +msgstr "tdifevmf" + +#: src/modules/schedule/cog.py:850 +msgctxt "cmd:configure_schedule|desc" +msgid "Configure Scheduled Session system" +msgstr "Dpogjhvsf Tdifevmfe Tfttjpo tztufn" + +#: src/modules/schedule/settings.py:36 +msgctxt "guildset:session_lobby" +msgid "session_lobby" +msgstr "tfttjpo_mpccz" + +#: src/modules/schedule/settings.py:39 +msgctxt "guildset:session_lobby|desc" +msgid "Channel to post scheduled session announcement and status to." +msgstr "Diboofm up qptu tdifevmfe tfttjpo boopvodfnfou boe tubuvt up." + +#: src/modules/schedule/settings.py:43 +msgctxt "guildset:session_lobby|long_desc" +msgid "" +"Channel in which to announce scheduled sessions and post their status. I must have the `MANAGE_WEBHOOKS` permission in this channel.\n" +"**This must be configured in order for the scheduled session system to function.**" +msgstr "" +"Diboofm jo xijdi up boopvodf tdifevmfe tfttjpot boe qptu uifjs tubuvt. J nvtu ibwf uif `NBOBHF_XFCIPPLT` qfsnjttjpo jo uijt diboofm.\n" +"**Uijt nvtu cf dpogjhvsfe jo psefs gps uif tdifevmfe tfttjpo tztufn up gvodujpo.**" + +#: src/modules/schedule/settings.py:49 +msgctxt "guildset:session_lobby|accepts" +msgid "Name or id of the session lobby channel." +msgstr "Obnf ps je pg uif tfttjpo mpccz diboofm." + +#: src/modules/schedule/settings.py:63 +#, possible-python-brace-format +msgctxt "guildset:session_lobby|set_response|set" +msgid "Scheduled sessions will now be announced in {channel}" +msgstr "Tdifevmfe tfttjpot xjmm opx cf boopvodfe jo {channel}" + +#: src/modules/schedule/settings.py:68 +msgctxt "guildset:session_lobby|set_response|unset" +msgid "" +"The schedule session lobby has been unset. Shutting down scheduled session " +"system." +msgstr "" +"Uif tdifevmf tfttjpo mpccz ibt cffo votfu. Tivuujoh epxo tdifevmfe tfttjpo " +"tztufn." + +#: src/modules/schedule/settings.py:78 +msgctxt "guildset:session_lobby|formatted|unset" +msgid "`Not Set` (The scheduled session system is disabled.)" +msgstr "`Opu Tfu` (Uif tdifevmfe tfttjpo tztufn jt ejtbcmfe.)" + +#: src/modules/schedule/settings.py:83 +#, possible-python-brace-format +msgctxt "guildset:session_lobby|formatted|set" +msgid "<#{channelid}>" +msgstr "<#{channelid}>" + +#: src/modules/schedule/settings.py:92 +msgctxt "guildset:session_room" +msgid "session_room" +msgstr "tfttjpo_sppn" + +#: src/modules/schedule/settings.py:95 +msgctxt "guildset:session_room|desc" +msgid "Special voice channel open to scheduled session members." +msgstr "Tqfdjbm wpjdf diboofm pqfo up tdifevmfe tfttjpo nfncfst." + +#: src/modules/schedule/settings.py:99 +msgctxt "guildset:session_room|long_desc" +msgid "" +"If set, this voice channel serves as a dedicated room for scheduled session " +"members. During (and slightly before) each scheduled session, all members " +"who have booked the session will be given permission to join the voice " +"channel (via permission overwrites). I require the `MANAGE_CHANNEL`, " +"`MANAGE_PERMISSIONS`, `CONNECT`, and `VIEW_CHANNEL` permissions in this " +"channel, and my highest role must be higher than all permission overwrites " +"set in the channel. Furthermore, if this is set to a *category* channel, " +"then the permission overwrites will apply to all *synced* channels under the" +" category, as usual." +msgstr "" +"Jg tfu, uijt wpjdf diboofm tfswft bt b efejdbufe sppn gps tdifevmfe tfttjpo " +"nfncfst. Evsjoh (boe tmjhiumz cfgpsf) fbdi tdifevmfe tfttjpo, bmm nfncfst " +"xip ibwf cpplfe uif tfttjpo xjmm cf hjwfo qfsnjttjpo up kpjo uif wpjdf " +"diboofm (wjb qfsnjttjpo pwfsxsjuft). J sfrvjsf uif `NBOBHF_DIBOOFM`, " +"`NBOBHF_QFSNJTTJPOT`, `DPOOFDU`, boe `WJFX_DIBOOFM` qfsnjttjpot jo uijt " +"diboofm, boe nz ijhiftu spmf nvtu cf ijhifs uibo bmm qfsnjttjpo pwfsxsjuft " +"tfu jo uif diboofm. Gvsuifsnpsf, jg uijt jt tfu up b *dbufhpsz* diboofm, " +"uifo uif qfsnjttjpo pwfsxsjuft xjmm bqqmz up bmm *tzodfe* diboofmt voefs uif" +" dbufhpsz, bt vtvbm." + +#: src/modules/schedule/settings.py:109 +msgctxt "guildset:session_room|accepts" +msgid "Name or id of the session room voice channel." +msgstr "Obnf ps je pg uif tfttjpo sppn wpjdf diboofm." + +#: src/modules/schedule/settings.py:123 +#, possible-python-brace-format +msgctxt "guildset:session_room|set_response|set" +msgid "Schedule session members will now be given access to {channel}" +msgstr "Tdifevmf tfttjpo nfncfst xjmm opx cf hjwfo bddftt up {channel}" + +#: src/modules/schedule/settings.py:128 +msgctxt "guildset:session_room|set_response|unset" +msgid "The dedicated schedule session room has been removed." +msgstr "Uif efejdbufe tdifevmf tfttjpo sppn ibt cffo sfnpwfe." + +#: src/modules/schedule/settings.py:135 +msgctxt "guildset:session_channels" +msgid "session_channels" +msgstr "tfttjpo_diboofmt" + +#: src/modules/schedule/settings.py:138 +msgctxt "guildset:session_channels|desc" +msgid "Voice channels in which to track activity for scheduled sessions." +msgstr "Wpjdf diboofmt jo xijdi up usbdl bdujwjuz gps tdifevmfe tfttjpot." + +#: src/modules/schedule/settings.py:142 +msgctxt "guildset:session_channels|long_desc" +msgid "" +"Only activity in these channels (and in `session_room` if set) will count " +"towards scheduled session attendance. If a category is selected, then all " +"channels under the category will also be included. Activity tracking also " +"respects the `untracked_voice_channels` setting." +msgstr "" +"Pomz bdujwjuz jo uiftf diboofmt (boe jo `tfttjpo_sppn` jg tfu) xjmm dpvou " +"upxbset tdifevmfe tfttjpo buufoebodf. Jg b dbufhpsz jt tfmfdufe, uifo bmm " +"diboofmt voefs uif dbufhpsz xjmm bmtp cf jodmvefe. Bdujwjuz usbdljoh bmtp " +"sftqfdut uif `vousbdlfe_wpjdf_diboofmt` tfuujoh." + +#: src/modules/schedule/settings.py:149 +msgctxt "guildset:session_channels|accepts" +msgid "Comma separated list of session channel names or ids." +msgstr "Dpnnb tfqbsbufe mjtu pg tfttjpo diboofm obnft ps jet." + +#: src/modules/schedule/settings.py:166 +#, possible-python-brace-format +msgctxt "guildset:session_channels|set_response|set" +msgid "" +"Activity in the following sessions will now count towards scheduled session " +"attendance: {channels}" +msgstr "" +"Bdujwjuz jo uif gpmmpxjoh tfttjpot xjmm opx dpvou upxbset tdifevmfe tfttjpo " +"buufoebodf: {channels}" + +#: src/modules/schedule/settings.py:171 +msgctxt "guildset:session_channels|set_response|unset" +msgid "" +"Activity in all (tracked) voice channels will now count towards session " +"attendance." +msgstr "" +"Bdujwjuz jo bmm (usbdlfe) wpjdf diboofmt xjmm opx dpvou upxbset tfttjpo " +"buufoebodf." + +#: src/modules/schedule/settings.py:181 +msgctxt "guildset:session_channels|formatted|unset" +msgid "All Channels (excluding `untracked_channels`)" +msgstr "Bmm Diboofmt (fydmvejoh `vousbdlfe_diboofmt`)" + +#: src/modules/schedule/settings.py:211 +msgctxt "guildset:schedule_cost" +msgid "schedule_cost" +msgstr "tdifevmf_dptu" + +#: src/modules/schedule/settings.py:214 +msgctxt "guildset:schedule_cost|desc" +msgid "Booking cost for each scheduled session." +msgstr "Cppljoh dptu gps fbdi tdifevmfe tfttjpo." + +#: src/modules/schedule/settings.py:218 +msgctxt "guildset:schedule_cost|long_desc" +msgid "" +"Members will be charged this many LionCoins for each scheduled session they " +"book." +msgstr "" +"Nfncfst xjmm cf dibshfe uijt nboz MjpoDpjot gps fbdi tdifevmfe tfttjpo uifz " +"cppl." + +#: src/modules/schedule/settings.py:222 +msgctxt "guildset:schedule_cost|accepts" +msgid "Price of each session booking (non-negative integer)." +msgstr "Qsjdf pg fbdi tfttjpo cppljoh (opo-ofhbujwf joufhfs)." + +#: src/modules/schedule/settings.py:234 +#, possible-python-brace-format +msgctxt "guildset:schedule_cost|set_response" +msgid "" +"Schedule session bookings will now cost {coin} **{amount}** per timeslot." +msgstr "" +"Tdifevmf tfttjpo cppljoht xjmm opx dptu {coin} **{amount}** qfs ujnftmpu." + +#: src/modules/schedule/settings.py:247 +#, possible-python-brace-format +msgctxt "guildset:schedule_cost|formatted" +msgid "{coin}**{amount}** per booking." +msgstr "{coin}**{amount}** qfs cppljoh." + +#: src/modules/schedule/settings.py:256 +msgctxt "guildset:attendance_reward" +msgid "attendance_reward" +msgstr "buufoebodf_sfxbse" + +#: src/modules/schedule/settings.py:259 +msgctxt "guildset:attendance_reward|desc" +msgid "Reward for attending a booked scheduled session." +msgstr "Sfxbse gps buufoejoh b cpplfe tdifevmfe tfttjpo." + +#: src/modules/schedule/settings.py:263 +msgctxt "guildset:attendance_reward|long_desc" +msgid "" +"When a member successfully attends a scheduled session they booked, they " +"will be awarded this many LionCoins. Should generally be more than the " +"`schedule_cost` setting." +msgstr "" +"Xifo b nfncfs tvddfttgvmmz buufoet b tdifevmfe tfttjpo uifz cpplfe, uifz " +"xjmm cf bxbsefe uijt nboz MjpoDpjot. Tipvme hfofsbmmz cf npsf uibo uif " +"`tdifevmf_dptu` tfuujoh." + +#: src/modules/schedule/settings.py:269 +msgctxt "guildset:attendance_reward|accepts" +msgid "Number of coins to reward session attendance." +msgstr "Ovncfs pg dpjot up sfxbse tfttjpo buufoebodf." + +#: src/modules/schedule/settings.py:281 +#, possible-python-brace-format +msgctxt "guildset:attendance_reward|set_response" +msgid "" +"Members will be rewarded {coin}**{amount}** when they attend a scheduled " +"session." +msgstr "" +"Nfncfst xjmm cf sfxbsefe {coin}**{amount}** xifo uifz buufoe b tdifevmfe " +"tfttjpo." + +#: src/modules/schedule/settings.py:291 +#, possible-python-brace-format +msgctxt "guildset:attendance_reward|formatted" +msgid "{coin}**{amount}** upon attendance." +msgstr "{coin}**{amount}** vqpo buufoebodf." + +#: src/modules/schedule/settings.py:300 +msgctxt "guildset:attendance_bonus" +msgid "group_attendance_bonus" +msgstr "hspvq_buufoebodf_cpovt" + +#: src/modules/schedule/settings.py:303 +msgctxt "guildset:attendance_bonus|desc" +msgid "Bonus reward given when all members attend a scheduled session." +msgstr "Cpovt sfxbse hjwfo xifo bmm nfncfst buufoe b tdifevmfe tfttjpo." + +#: src/modules/schedule/settings.py:307 +msgctxt "guildset:attendance_bonus|long_desc" +msgid "" +"When all members who have booked a session successfully attend the session, " +"they will be given this bonus in *addition* to the `attendance_reward`." +msgstr "" +"Xifo bmm nfncfst xip ibwf cpplfe b tfttjpo tvddfttgvmmz buufoe uif tfttjpo, " +"uifz xjmm cf hjwfo uijt cpovt jo *beejujpo* up uif `buufoebodf_sfxbse`." + +#: src/modules/schedule/settings.py:312 +msgctxt "guildset:attendance_bonus|accepts" +msgid "Bonus coins rewarded when everyone attends a session." +msgstr "Cpovt dpjot sfxbsefe xifo fwfszpof buufoet b tfttjpo." + +#: src/modules/schedule/settings.py:324 +#, possible-python-brace-format +msgctxt "guildset:attendance_bonus|set_response" +msgid "" +"Session members will be rewarded an additional {coin}**{amount}** when " +"everyone attends." +msgstr "" +"Tfttjpo nfncfst xjmm cf sfxbsefe bo beejujpobm {coin}**{amount}** xifo " +"fwfszpof buufoet." + +#: src/modules/schedule/settings.py:334 +#, possible-python-brace-format +msgctxt "guildset:attendance_bonus|formatted" +msgid "{coin}**{amount}** bonus when all booked members attend." +msgstr "{coin}**{amount}** cpovt xifo bmm cpplfe nfncfst buufoe." + +#: src/modules/schedule/settings.py:343 +msgctxt "guildset:min_attendance" +msgid "min_attendance" +msgstr "njo_buufoebodf" + +#: src/modules/schedule/settings.py:346 +msgctxt "guildset:min_attendance|desc" +msgid "Minimum attendance before reward eligability." +msgstr "Njojnvn buufoebodf cfgpsf sfxbse fmjhbcjmjuz." + +#: src/modules/schedule/settings.py:350 +msgctxt "guildset:min_attendance|long_desc" +msgid "" +"Scheduled session members will need to attend the session for at least this " +"number of minutes before they are marked as having attended (and hence are " +"rewarded)." +msgstr "" +"Tdifevmfe tfttjpo nfncfst xjmm offe up buufoe uif tfttjpo gps bu mfbtu uijt " +"ovncfs pg njovuft cfgpsf uifz bsf nbslfe bt ibwjoh buufoefe (boe ifodf bsf " +"sfxbsefe)." + +#: src/modules/schedule/settings.py:355 +msgctxt "guildset:min_attendance|accepts" +msgid "Number of minutes (1-60) before attendance is counted." +msgstr "Ovncfs pg njovuft (1-60) cfgpsf buufoebodf jt dpvoufe." + +#: src/modules/schedule/settings.py:369 +#, possible-python-brace-format +msgctxt "guildset:min_attendance|set_response" +msgid "" +"Members will be rewarded after they have attended booked sessions for at " +"least **`{amount}`** minutes." +msgstr "" +"Nfncfst xjmm cf sfxbsefe bgufs uifz ibwf buufoefe cpplfe tfttjpot gps bu " +"mfbtu **`{amount}`** njovuft." + +#: src/modules/schedule/settings.py:379 +#, possible-python-brace-format +msgctxt "guildset:min_attendance|formatted" +msgid "**`{amount}`** minutes" +msgstr "**`{amount}`** njovuft" + +#: src/modules/schedule/settings.py:400 +msgctxt "guildset:min_attendance|parse|error" +msgid "" +"Minimum attendance must be an integer number of minutes between `1` and " +"`60`." +msgstr "" +"Njojnvn buufoebodf nvtu cf bo joufhfs ovncfs pg njovuft cfuxffo `1` boe " +"`60`." + +#: src/modules/schedule/settings.py:410 +msgctxt "guildset:schedule_blacklist_role" +msgid "schedule_blacklist_role" +msgstr "tdifevmf_cmbdlmjtu_spmf" + +#: src/modules/schedule/settings.py:413 +msgctxt "guildset:schedule_blacklist_role|desc" +msgid "Role which disables scheduled session booking." +msgstr "Spmf xijdi ejtbcmft tdifevmfe tfttjpo cppljoh." + +#: src/modules/schedule/settings.py:417 +msgctxt "guildset:schedule_blacklist_role|long_desc" +msgid "" +"Members with this role will not be allowed to book scheduled sessions in " +"this server. If the role is manually added, all future scheduled sessions " +"for the user are cancelled. This provides a way to stop repeatedly " +"unreliable members from blocking the group bonus for all members. " +"Alternatively, consider setting the booking cost (and reward) very high to " +"provide a strong disincentive for not attending a session." +msgstr "" +"Nfncfst xjui uijt spmf xjmm opu cf bmmpxfe up cppl tdifevmfe tfttjpot jo " +"uijt tfswfs. Jg uif spmf jt nbovbmmz beefe, bmm gvuvsf tdifevmfe tfttjpot " +"gps uif vtfs bsf dbodfmmfe. Uijt qspwjeft b xbz up tupq sfqfbufemz " +"vosfmjbcmf nfncfst gspn cmpdljoh uif hspvq cpovt gps bmm nfncfst. " +"Bmufsobujwfmz, dpotjefs tfuujoh uif cppljoh dptu (boe sfxbse) wfsz ijhi up " +"qspwjef b tuspoh ejtjodfoujwf gps opu buufoejoh b tfttjpo." + +#: src/modules/schedule/settings.py:425 +msgctxt "guildset:schedule_blacklist_role|accepts" +msgid "Blacklist role name or id." +msgstr "Cmbdlmjtu spmf obnf ps je." + +#: src/modules/schedule/settings.py:438 +#, possible-python-brace-format +msgctxt "guildset:schedule_blacklist_role|set_response|set" +msgid "Members with {role} will be unable to book scheduled sessions." +msgstr "Nfncfst xjui {role} xjmm cf vobcmf up cppl tdifevmfe tfttjpot." + +#: src/modules/schedule/settings.py:443 +msgctxt "guildset:schedule_blacklist_role|set_response|unset" +msgid "The schedule blacklist role has been unset." +msgstr "Uif tdifevmf cmbdlmjtu spmf ibt cffo votfu." + +#: src/modules/schedule/settings.py:453 +#, possible-python-brace-format +msgctxt "guildset:schedule_blacklist_role|formatted|set" +msgid "{role} members will not be able to book scheduled sessions." +msgstr "{role} nfncfst xjmm opu cf bcmf up cppl tdifevmfe tfttjpot." + +#: src/modules/schedule/settings.py:458 +msgctxt "guildset:schedule_blacklist_role|formatted|unset" +msgid "Not Set" +msgstr "Opu Tfu" + +#: src/modules/schedule/settings.py:467 +msgctxt "guildset:schedule_blacklist_after" +msgid "schedule_blacklist_after" +msgstr "tdifevmf_cmbdlmjtu_bgufs" + +#: src/modules/schedule/settings.py:470 +msgctxt "guildset:schedule_blacklist_after|desc" +msgid "Number of missed sessions within 24h before blacklisting." +msgstr "Ovncfs pg njttfe tfttjpot xjuijo 24i cfgpsf cmbdlmjtujoh." + +#: src/modules/schedule/settings.py:474 +msgctxt "guildset:schedule_blacklist_after|long_desc" +msgid "" +"Members who miss more than this number of booked sessions in a single 24 " +"hour period will be automatically given the `blacklist_role`. Has no effect " +"if the `blacklist_role` is not set or if I do not have sufficient " +"permissions to assign the blacklist role." +msgstr "" +"Nfncfst xip njtt npsf uibo uijt ovncfs pg cpplfe tfttjpot jo b tjohmf 24 " +"ipvs qfsjpe xjmm cf bvupnbujdbmmz hjwfo uif `cmbdlmjtu_spmf`. Ibt op fggfdu " +"jg uif `cmbdlmjtu_spmf` jt opu tfu ps jg J ep opu ibwf tvggjdjfou " +"qfsnjttjpot up bttjho uif cmbdlmjtu spmf." + +#: src/modules/schedule/settings.py:481 +msgctxt "guildset:schedule_blacklist_after|accepts" +msgid "A number of missed sessions (1-24) before blacklisting." +msgstr "B ovncfs pg njttfe tfttjpot (1-24) cfgpsf cmbdlmjtujoh." + +#: src/modules/schedule/settings.py:496 +#, possible-python-brace-format +msgctxt "guildset:schedule_blacklist_after|set_response|set" +msgid "" +"Members will be blacklisted after **`{amount}`** missed sessions within " +"`24h`." +msgstr "" +"Nfncfst xjmm cf cmbdlmjtufe bgufs **`{amount}`** njttfe tfttjpot xjuijo " +"`24i`." + +#: src/modules/schedule/settings.py:501 +msgctxt "guildset:schedule_blacklist_after|set_response|unset" +msgid "" +"Members will not be automatically blacklisted from booking scheduled " +"sessions." +msgstr "" +"Nfncfst xjmm opu cf bvupnbujdbmmz cmbdlmjtufe gspn cppljoh tdifevmfe " +"tfttjpot." + +#: src/modules/schedule/settings.py:511 +#, possible-python-brace-format +msgctxt "guildset:schedule_blacklist_after|formatted|set" +msgid "Blacklist after **`{amount}`** missed sessions within `24h`." +msgstr "Cmbdlmjtu bgufs **`{amount}`** njttfe tfttjpot xjuijo `24i`." + +#: src/modules/schedule/settings.py:516 +msgctxt "guildset:schedule_blacklist_after|formatted|unset" +msgid "Do not automatically blacklist." +msgstr "Ep opu bvupnbujdbmmz cmbdlmjtu." + +#: src/modules/schedule/settings.py:528 +msgctxt "guildset:schedule_blacklist_role|parse|error" +msgid "Blacklist threshold must be a number between `1` and `24`." +msgstr "Cmbdlmjtu uisftipme nvtu cf b ovncfs cfuxffo `1` boe `24`." + +#: src/modules/schedule/ui/settingui.py:69 +msgctxt "ui:schedule_config|button:page0|label" +msgid "Page 1" +msgstr "Qbhf 1" + +#: src/modules/schedule/ui/settingui.py:88 +msgctxt "ui:schedule_config|menu:lobby|placeholder" +msgid "Select Lobby Channel" +msgstr "Tfmfdu Mpccz Diboofm" + +#: src/modules/schedule/ui/settingui.py:105 +msgctxt "ui:schedule_config|menu:room|placeholder" +msgid "Select Session Room" +msgstr "Tfmfdu Tfttjpo Sppn" + +#: src/modules/schedule/ui/settingui.py:123 +msgctxt "ui:schedule_config|menu:channels|placeholder" +msgid "Select Session Channels" +msgstr "Tfmfdu Tfttjpo Diboofmt" + +#: src/modules/schedule/ui/settingui.py:137 +msgctxt "ui:schedule_config|button:page1|label" +msgid "Page 2" +msgstr "Qbhf 2" + +#: src/modules/schedule/ui/settingui.py:152 +msgctxt "ui:schedule_config|button:page2|label" +msgid "Page 3" +msgstr "Qbhf 3" + +#: src/modules/schedule/ui/settingui.py:169 +msgctxt "ui:schedule_config|menu:blacklist_role|placeholder" +msgid "Select Blacklist Role" +msgstr "Tfmfdu Cmbdlmjtu Spmf" + +#: src/modules/schedule/ui/settingui.py:177 +msgctxt "ui:schedule_config|embed|title" +msgid "Scheduled Session Configuration Panel" +msgstr "Tdifevmfe Tfttjpo Dpogjhvsbujpo Qbofm" + +#: src/modules/schedule/ui/settingui.py:230 +msgctxt "dash:schedule|title" +msgid "Scheduled Session Configuration ({commands[configure schedule]})" +msgstr "Tdifevmfe Tfttjpo Dpogjhvsbujpo ({commands[configure schedule]})" + +#: src/modules/schedule/ui/settingui.py:234 +msgctxt "dash:schedule|dropdown|placeholder" +msgid "Scheduled Sessions Panel" +msgstr "Tdifevmfe Tfttjpot Qbofm" + +#: src/modules/schedule/ui/settingui.py:251 +msgctxt "dash:schedule|section:schedule_channels|name" +msgid "Scheduled Session Channels ({commands[configure schedule]})" +msgstr "Tdifevmfe Tfttjpo Diboofmt ({commands[configure schedule]})" + +#: src/modules/schedule/ui/settingui.py:261 +msgctxt "dash:schedule|section:schedule_rewards|name" +msgid "Scheduled Session Rewards ({commands[configure schedule]})" +msgstr "Tdifevmfe Tfttjpo Sfxbset ({commands[configure schedule]})" + +#: src/modules/schedule/ui/settingui.py:271 +msgctxt "dash:schedule|section:schedule_blacklist|name" +msgid "Scheduled Session Blacklist ({commands[configure schedule]})" +msgstr "Tdifevmfe Tfttjpo Cmbdlmjtu ({commands[configure schedule]})" + +#: src/modules/schedule/ui/scheduleui.py:31 +msgctxt "ui:schedule|about" +msgid "Guide tips here TBD" +msgstr "Hvjef ujqt ifsf UCE" + +#: src/modules/schedule/ui/scheduleui.py:116 +msgctxt "ui:schedule|button:clear|error:nothing" +msgid "No upcoming sessions to cancel! Your schedule is already clear." +msgstr "Op vqdpnjoh tfttjpot up dbodfm! Zpvs tdifevmf jt bmsfbez dmfbs." + +#: src/modules/schedule/ui/scheduleui.py:129 +msgctxt "ui:schedule|button:clear|success" +msgid "Successfully cancelled and refunded your upcoming scheduled sessions." +msgstr "Tvddfttgvmmz dbodfmmfe boe sfgvoefe zpvs vqdpnjoh tdifevmfe tfttjpot." + +#: src/modules/schedule/ui/scheduleui.py:142 +msgctxt "ui:schedule|button:clear|label" +msgid "Clear Schedule" +msgstr "Dmfbs Tdifevmf" + +#: src/modules/schedule/ui/scheduleui.py:158 +msgctxt "ui:schedule|button:about|label" +msgid "About Schedule" +msgstr "Bcpvu Tdifevmf" + +#: src/modules/schedule/ui/scheduleui.py:184 +msgctxt "ui:schedule|menu:booking|error:current_slot" +msgid "You cannot schedule a currently running session!" +msgstr "Zpv dboopu tdifevmf b dvssfoumz svoojoh tfttjpo!" + +#: src/modules/schedule/ui/scheduleui.py:191 +msgctxt "ui:schedule|menu:booking|error:next_slot" +msgid "Too late! You cannot schedule a session starting in the next minute." +msgstr "Upp mbuf! Zpv dboopu tdifevmf b tfttjpo tubsujoh jo uif ofyu njovuf." + +#: src/modules/schedule/ui/scheduleui.py:198 +msgctxt "ui:schedule|menu:booking|error:already_booked" +msgid "You have already booked one or more of the requested sessions!" +msgstr "Zpv ibwf bmsfbez cpplfe pof ps npsf pg uif sfrvftufe tfttjpot!" + +#: src/modules/schedule/ui/scheduleui.py:211 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:booking|error:insufficient_balance" +msgid "" +"Booking `{count}` scheduled sessions requires {coin}**{required}**, but you " +"only have {coin}**{balance}**!" +msgstr "" +"Cppljoh `{count}` tdifevmfe tfttjpot sfrvjsft {coin}**{required}**, cvu zpv " +"pomz ibwf {coin}**{balance}**!" + +#: src/modules/schedule/ui/scheduleui.py:227 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:booking|success" +msgid "Successfully booked your scheduled session at {times}." +msgid_plural "" +"Successfully booked the following scheduled sessions.\n" +"{times}" +msgstr[0] "Tvddfttgvmmz cpplfe zpvs tdifevmfe tfttjpo bu {times}." +msgstr[1] "" +"Tvddfttgvmmz cpplfe uif gpmmpxjoh tdifevmfe tfttjpot.\n" +"{times}" + +#: src/modules/schedule/ui/scheduleui.py:250 +msgctxt "ui:schedule|menu:booking|placeholder:blacklisted" +msgid "Book Sessions (Cannot book - Blacklisted)" +msgstr "Cppl Tfttjpot (Dboopu cppl - Cmbdlmjtufe)" + +#: src/modules/schedule/ui/scheduleui.py:258 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:booking|placeholder:regular" +msgid "Book Sessions ({amount} LC)" +msgstr "Cppl Tfttjpot ({amount} MD)" + +#: src/modules/schedule/ui/scheduleui.py:303 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:slots|option|format" +msgid "{day} {time} ({until})" +msgstr "{day} {time} ({until})" + +#: src/modules/schedule/ui/scheduleui.py:307 +msgctxt "ui:schedule|menu:slots|option|day:today" +msgid "Today" +msgstr "Upebz" + +#: src/modules/schedule/ui/scheduleui.py:311 +msgctxt "ui:schedule|menu:slots|option|day:tomorrow" +msgid "Tomorrow" +msgstr "Upnpsspx" + +#: src/modules/schedule/ui/scheduleui.py:333 +#, possible-python-brace-format +msgctxt "ui:schedule|format_until|positive" +msgid "in <1 hour" +msgid_plural "in {number} hours" +msgstr[0] "jo <1 ipvs" +msgstr[1] "jo {number} ipvst" + +#: src/modules/schedule/ui/scheduleui.py:340 +msgctxt "ui:schedule|format_until|now" +msgid "right now!" +msgstr "sjhiu opx!" + +#: src/modules/schedule/ui/scheduleui.py:362 +msgctxt "ui:schedule|menu:cancel|error:current_slot" +msgid "" +"You cannot cancel a currently running *scheduled* session! Please attend it " +"if possible." +msgstr "" +"Zpv dboopu dbodfm b dvssfoumz svoojoh *tdifevmfe* tfttjpo! Qmfbtf buufoe ju " +"jg qpttjcmf." + +#: src/modules/schedule/ui/scheduleui.py:368 +msgctxt "ui:schedule|menu:cancel|error:too_late" +msgid "" +"Too late! You cannot cancel a scheduled session within a minute of it " +"starting. Please attend it if possible." +msgstr "" +"Upp mbuf! Zpv dboopu dbodfm b tdifevmfe tfttjpo xjuijo b njovuf pg ju " +"tubsujoh. Qmfbtf buufoe ju jg qpttjcmf." + +#: src/modules/schedule/ui/scheduleui.py:385 +msgctxt "ui:schedule|menu:cancel|error:already_cancelled" +msgid "The selected bookings no longer exist! Nothing to cancel." +msgstr "Uif tfmfdufe cppljoht op mpohfs fyjtu! Opuijoh up dbodfm." + +#: src/modules/schedule/ui/scheduleui.py:395 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:cancel|success" +msgid "" +"Successfully cancelled and refunded your scheduled session booking for " +"{times}." +msgid_plural "" +"Successfully cancelled and refunded your scheduled session bookings:\n" +"{times}." +msgstr[0] "" +"Tvddfttgvmmz dbodfmmfe boe sfgvoefe zpvs tdifevmfe tfttjpo cppljoh gps " +"{times}." +msgstr[1] "" +"Tvddfttgvmmz dbodfmmfe boe sfgvoefe zpvs tdifevmfe tfttjpo cppljoht:\n" +"{times}." + +#: src/modules/schedule/ui/scheduleui.py:416 +msgctxt "ui:schedule|menu:cancel|placeholder" +msgid "Cancel booked sessions" +msgstr "Dbodfm cpplfe tfttjpot" + +#: src/modules/schedule/ui/scheduleui.py:438 +msgctxt "ui:schedule|embed|author" +msgid "Your Scheduled Sessions and Past Statistics" +msgstr "Zpvs Tdifevmfe Tfttjpot boe Qbtu Tubujtujdt" + +#: src/modules/schedule/ui/scheduleui.py:450 +msgctxt "ui:schedule|embed|field:stats|field:recent" +msgid "Recent" +msgstr "Sfdfou" + +#: src/modules/schedule/ui/scheduleui.py:457 +msgctxt "ui:schedule|embed|field:stats|field:alltime" +msgid "All Time" +msgstr "Bmm Ujnf" + +#: src/modules/schedule/ui/scheduleui.py:463 +msgctxt "ui:schedule|embed|field:stats|field:streak" +msgid "Streak" +msgstr "Tusfbl" + +#: src/modules/schedule/ui/scheduleui.py:468 +#, possible-python-brace-format +msgctxt "ui:schedule|embed|field:stats|field:streak|value:zero" +msgid "One session attended! Keep it up!" +msgid_plural "**{streak}** sessions attended in a row! Good job!" +msgstr[0] "Pof tfttjpo buufoefe! Lffq ju vq!" +msgstr[1] "**{streak}** tfttjpot buufoefe jo b spx! Hppe kpc!" + +#: src/modules/schedule/ui/scheduleui.py:475 +msgctxt "ui:schedule|embed|field:stats|field:streak|value:positive" +msgid "No streak yet!" +msgstr "Op tusfbl zfu!" + +#: src/modules/schedule/ui/scheduleui.py:483 +msgctxt "ui:schedule|embed|field:stats|name" +msgid "Session Statistics" +msgstr "Tfttjpo Tubujtujdt" + +#: src/modules/schedule/ui/scheduleui.py:502 +msgctxt "ui:schedule|embed|field:upcoming|name" +msgid "Upcoming Sessions" +msgstr "Vqdpnjoh Tfttjpot" + +#: src/modules/schedule/ui/scheduleui.py:506 +msgctxt "ui:schedule|embed|field:upcoming|value:empty" +msgid "No sessions scheduled yet!" +msgstr "Op tfttjpot tdifevmfe zfu!" + +#: src/modules/schedule/ui/scheduleui.py:520 +#, possible-python-brace-format +msgctxt "ui:schedule|embed|stats_format" +msgid "" +"**{attended}** attended out of **{total}** booked.\r\n" +"**{percent}%** attendance rate.\r\n" +"**{average}** average attendance time." +msgstr "" +"**{attended}** buufoefe pvu pg **{total}** cpplfe.\r\n" +"**{percent}%** buufoebodf sbuf.\r\n" +"**{average}** bwfsbhf buufoebodf ujnf." + +#: src/modules/schedule/ui/scheduleui.py:534 +#, possible-python-brace-format +msgctxt "ui:schedule|booking_format:short" +msgid "`{until}` | {start} - {end}" +msgstr "`{until}` | {start} - {end}" + +#: src/modules/schedule/ui/scheduleui.py:538 +#, possible-python-brace-format +msgctxt "ui:schedule|booking_format:long" +msgid "> `{until}` | {start} - {end}" +msgstr "> `{until}` | {start} - {end}" + +#: src/modules/schedule/ui/sessionui.py:52 +msgctxt "ui:sessionui|button:book|label" +msgid "Book" +msgstr "Cppl" + +#: src/modules/schedule/ui/sessionui.py:56 +msgctxt "ui:sessionui|button:cancel|label" +msgid "Cancel" +msgstr "Dbodfm" + +#: src/modules/schedule/ui/sessionui.py:60 +msgctxt "ui:sessionui|button:schedule|label" +msgid "Open Schedule" +msgstr "Pqfo Tdifevmf" + +#: src/modules/schedule/ui/sessionui.py:87 +msgctxt "ui:session|button:book|error:starting_soon" +msgid "Too late! This session has started or is starting shortly." +msgstr "Upp mbuf! Uijt tfttjpo ibt tubsufe ps jt tubsujoh tipsumz." + +#: src/modules/schedule/ui/sessionui.py:94 +msgctxt "ui:session|button:book|error:already_booked" +msgid "You are already a member of this session!" +msgstr "Zpv bsf bmsfbez b nfncfs pg uijt tfttjpo!" + +#: src/modules/schedule/ui/sessionui.py:101 +msgctxt "ui:session|button:book|success" +msgid "Successfully booked this session." +msgstr "Tvddfttgvmmz cpplfe uijt tfttjpo." + +#: src/modules/schedule/ui/sessionui.py:115 +msgctxt "ui:session|button:book|error|title" +msgid "Could not book session" +msgstr "Dpvme opu cppl tfttjpo" + +#: src/modules/schedule/ui/sessionui.py:133 +msgctxt "ui:session|button:cancel|error:starting_soon" +msgid "Too late! This session has started or is starting shortly." +msgstr "Upp mbuf! Uijt tfttjpo ibt tubsufe ps jt tubsujoh tipsumz." + +#: src/modules/schedule/ui/sessionui.py:140 +msgctxt "ui:session|button:cancel|error:not_booked" +msgid "You are not a member of this session!" +msgstr "Zpv bsf opu b nfncfs pg uijt tfttjpo!" + +#: src/modules/schedule/ui/sessionui.py:150 +msgctxt "ui:session|button:cancel|success" +msgid "Successfully cancelled this session." +msgstr "Tvddfttgvmmz dbodfmmfe uijt tfttjpo." + +#: src/modules/schedule/ui/sessionui.py:164 +msgctxt "ui:session|button:cancel|error|title" +msgid "Could not cancel session" +msgstr "Dpvme opu dbodfm tfttjpo" + +#: src/modules/schedule/core/session.py:196 +msgctxt "session|error:lobby_webhook_perms" +msgid "" +"Insufficient permissions to create a webhook in this channel. I require the " +"`MANAGE_WEBHOOKS` permission." +msgstr "" +"Jotvggjdjfou qfsnjttjpot up dsfbuf b xfcippl jo uijt diboofm. J sfrvjsf uif " +"`NBOBHF_XFCIPPLT` qfsnjttjpo." + +#: src/modules/schedule/core/session.py:274 +#, possible-python-brace-format +msgctxt "session|prepare|error:room_permissions" +msgid "" +"Could not prepare the configured session room {room} for the next scheduled " +"session! I require the `MANAGE_CHANNEL`, `MANAGE_ROLES`, `CONNECT` and " +"`VIEW_CHANNEL` permissions." +msgstr "" +"Dpvme opu qsfqbsf uif dpogjhvsfe tfttjpo sppn {room} gps uif ofyu tdifevmfe " +"tfttjpo! J sfrvjsf uif `NBOBHF_DIBOOFM`, `NBOBHF_SPMFT`, `DPOOFDU` boe " +"`WJFX_DIBOOFM` qfsnjttjpot." + +#: src/modules/schedule/core/session.py:317 +#, possible-python-brace-format +msgctxt "session|open|error:room_permissions" +msgid "" +"Could not set up the configured session room {room} for this scheduled " +"session! I require the `MANAGE_CHANNEL`, `MANAGE_ROLES`, `CONNECT` and " +"`VIEW_CHANNEL` permissions." +msgstr "" +"Dpvme opu tfu vq uif dpogjhvsfe tfttjpo sppn {room} gps uijt tdifevmfe " +"tfttjpo! J sfrvjsf uif `NBOBHF_DIBOOFM`, `NBOBHF_SPMFT`, `DPOOFDU` boe " +"`WJFX_DIBOOFM` qfsnjttjpot." + +#: src/modules/schedule/core/session.py:358 +#, possible-python-brace-format +msgctxt "session|status|title" +msgid "Session {start} - {end}" +msgstr "Tfttjpo {start} - {end}" + +#: src/modules/schedule/core/session.py:369 +msgctxt "session|status|desc:cancelled" +msgid "" +"I cancelled this scheduled session because I was unavailable. All members " +"who booked the session have been refunded." +msgstr "" +"J dbodfmmfe uijt tdifevmfe tfttjpo cfdbvtf J xbt vobwbjmbcmf. Bmm nfncfst " +"xip cpplfe uif tfttjpo ibwf cffo sfgvoefe." + +#: src/modules/schedule/core/session.py:376 +msgctxt "session|status|desc:no_members" +msgid "*No members scheduled this session.*" +msgstr "*Op nfncfst tdifevmfe uijt tfttjpo.*" + +#: src/modules/schedule/core/session.py:382 +#, possible-python-brace-format +msgctxt "session|status:preparing|desc:has_members" +msgid "Starting {start}" +msgstr "Tubsujoh {start}" + +#: src/modules/schedule/core/session.py:385 +msgctxt "session|status:preparing|field:members" +msgid "Members" +msgstr "Nfncfst" + +#: src/modules/schedule/core/session.py:392 +#, possible-python-brace-format +msgctxt "session|status:running|desc:has_members" +msgid "Finishing {start}" +msgstr "Gjojtijoh {start}" + +#: src/modules/schedule/core/session.py:426 +msgctxt "session|status:running|field:waiting" +msgid "Waiting For" +msgstr "Xbjujoh Gps" + +#: src/modules/schedule/core/session.py:432 +msgctxt "session|status:running|field:attending" +msgid "Attending" +msgstr "Buufoejoh" + +#: src/modules/schedule/core/session.py:438 +msgctxt "session|status:running|field:attended" +msgid "Attended" +msgstr "Buufoefe" + +#: src/modules/schedule/core/session.py:463 +#, possible-python-brace-format +msgctxt "session|status:finished|desc:everyone_att" +msgid "" +"Everyone attended the session! All members were rewarded with {coin} " +"**{reward} + {bonus}**!" +msgstr "" +"Fwfszpof buufoefe uif tfttjpo! Bmm nfncfst xfsf sfxbsefe xjui {coin} " +"**{reward} + {bonus}**!" + +#: src/modules/schedule/core/session.py:474 +#, possible-python-brace-format +msgctxt "session|status:finished|desc:some_att" +msgid "" +"Everyone who attended was rewarded with {coin} **{reward}**! Some members did not attend so everyone missed out on the bonus {coin} **{bonus}**.\n" +"**Members who missed their session have all future sessions cancelled without refund!*" +msgstr "" +"Fwfszpof xip buufoefe xbt sfxbsefe xjui {coin} **{reward}**! Tpnf nfncfst eje opu buufoe tp fwfszpof njttfe pvu po uif cpovt {coin} **{bonus}**.\n" +"**Nfncfst xip njttfe uifjs tfttjpo ibwf bmm gvuvsf tfttjpot dbodfmmfe xjuipvu sfgvoe!*" + +#: src/modules/schedule/core/session.py:486 +msgctxt "session|status:finished|desc:some_att" +msgid "" +"No-one attended this session! No-one received rewards.\n" +"**Members who missed their session have all future sessions cancelled without refund!*" +msgstr "" +"Op-pof buufoefe uijt tfttjpo! Op-pof sfdfjwfe sfxbset.\n" +"**Nfncfst xip njttfe uifjs tfttjpo ibwf bmm gvuvsf tfttjpot dbodfmmfe xjuipvu sfgvoe!*" + +#: src/modules/schedule/core/session.py:492 +msgctxt "session|status:finished|field:attended" +msgid "Attended" +msgstr "Buufoefe" + +#: src/modules/schedule/core/session.py:497 +msgctxt "session|status:finished|field:missing" +msgid "Missing" +msgstr "Njttjoh" diff --git a/locales/ceaser/LC_MESSAGES/settings_base.po b/locales/ceaser/LC_MESSAGES/settings_base.po new file mode 100644 index 00000000..1dcd9102 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/settings_base.po @@ -0,0 +1,222 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/settings/ui.py:179 +msgctxt "setting|formatted|notset" +msgid "Not Set" +msgstr "Opu Tfu" + +#: src/settings/ui.py:338 +#, possible-python-brace-format +msgctxt "setting|summary_embed|title" +msgid "Configuration options for `{name}`" +msgstr "Dpogjhvsbujpo pqujpot gps `{name}`" + +#: src/settings/ui.py:350 +msgctxt "setting|summary_table|field:currently|key" +msgid "Currently" +msgstr "Dvssfoumz" + +#: src/settings/ui.py:357 +msgctxt "setting|summary_table|field:default|key" +msgid "By Default" +msgstr "Cz Efgbvmu" + +#: src/settings/ui.py:364 +msgctxt "setting|summary_table|field:set|key" +msgid "Set Using" +msgstr "Tfu Vtjoh" + +#: src/settings/setting_types.py:48 +msgctxt "settype:string|accepts" +msgid "Any Text" +msgstr "Boz Ufyu" + +#: src/settings/setting_types.py:89 +#, possible-python-brace-format +msgctxt "settype:string|error" +msgid "Provided string is too long! Maximum length: {maxlen} characters." +msgstr "Qspwjefe tusjoh jt upp mpoh! Nbyjnvn mfohui: {maxlen} dibsbdufst." + +#: src/settings/setting_types.py:114 +msgctxt "settype:emoji|accepts" +msgid "Paste a builtin emoji, custom emoji, or emoji id." +msgstr "Qbtuf b cvjmujo fnpkj, dvtupn fnpkj, ps fnpkj je." + +#: src/settings/setting_types.py:167 +#, possible-python-brace-format +msgctxt "settype:emoji|error:parse" +msgid "" +"Could not parse `{provided}` as a Discord emoji. Supported formats are " +"builtin emojis (e.g. `{builtin}`), custom emojis (e.g. {custom}), or custom " +"emoji ids (e.g. `{custom_id}`)." +msgstr "" +"Dpvme opu qbstf `{provided}` bt b Ejtdpse fnpkj. Tvqqpsufe gpsnbut bsf " +"cvjmujo fnpkjt (f.h. `{builtin}`), dvtupn fnpkjt (f.h. {custom}), ps dvtupn " +"fnpkj jet (f.h. `{custom_id}`)." + +#: src/settings/setting_types.py:236 +msgctxt "settype:channel|accepts" +msgid "A channel name or id" +msgstr "B diboofm obnf ps je" + +#: src/settings/setting_types.py:282 +#, possible-python-brace-format +msgctxt "settype:channel|parse|error:not_found" +msgid "Channel `{string}` could not be found in this guild!" +msgstr "Diboofm `{string}` dpvme opu cf gpvoe jo uijt hvjme!" + +#: src/settings/setting_types.py:368 +msgctxt "settype:role|accepts" +msgid "A role name or id" +msgstr "B spmf obnf ps je" + +#: src/settings/setting_types.py:427 +#, possible-python-brace-format +msgctxt "settype:role|parse|error:not_found" +msgid "Role `{string}` could not be found in this guild!" +msgstr "Spmf `{string}` dpvme opu cf gpvoe jo uijt hvjme!" + +#: src/settings/setting_types.py:492 +msgctxt "settype:bool|accepts" +msgid "Enabled/Disabled" +msgstr "Fobcmfe/Ejtbcmfe" + +#: src/settings/setting_types.py:497 +msgctxt "settype:bool|parse:truthy_values" +msgid "enabled|yes|true|on|enable|1" +msgstr "fobcmfe|zft|usvf|po|fobcmf|1" + +#: src/settings/setting_types.py:501 +msgctxt "settype:bool|parse:falsey_values" +msgid "disabled|no|false|off|disable|0" +msgstr "ejtbcmfe|op|gbmtf|pgg|ejtbcmf|0" + +#: src/settings/setting_types.py:506 +msgctxt "settype:bool|output:true" +msgid "On" +msgstr "Po" + +#: src/settings/setting_types.py:507 +msgctxt "settype:bool|output:false" +msgid "Off" +msgstr "Pgg" + +#: src/settings/setting_types.py:508 +msgctxt "settype:bool|output:none" +msgid "Not Set" +msgstr "Opu Tfu" + +#: src/settings/setting_types.py:619 +msgctxt "settype:integer|accepts" +msgid "An integer" +msgstr "Bo joufhfs" + +#: src/settings/setting_types.py:682 +msgctxt "settype:emoji|desc" +msgid "Unicode or custom emoji" +msgstr "Vojdpef ps dvtupn fnpkj" + +#: src/settings/setting_types.py:754 +msgctxt "settype:guildid|accepts" +msgid "Any Snowflake ID" +msgstr "Boz Topxgmblf JE" + +#: src/settings/setting_types.py:823 +msgctxt "settype:timezone|accepts" +msgid "A timezone name from the 'tz database' (e.g. 'Europe/London')" +msgstr "B ujnfapof obnf gspn uif 'ua ebubcbtf' (f.h. 'Fvspqf/Mpoepo')" + +#: src/settings/setting_types.py:893 +msgctxt "settype:timezone|summary_table|field:supported|key" +msgid "Supported" +msgstr "Tvqqpsufe" + +#: src/settings/setting_types.py:897 +#, possible-python-brace-format +msgctxt "settype:timezone|summary_table|field:supported|value" +msgid "Any timezone from the [tz database]({link})." +msgstr "Boz ujnfapof gspn uif [ua ebubcbtf]({link})." + +#: src/settings/setting_types.py:914 +#, possible-python-brace-format +msgctxt "set_type:timezone|acmpl|no_matching" +msgid "No timezones matching '{input}'!" +msgstr "Op ujnfapoft nbudijoh '{input}'!" + +#: src/settings/setting_types.py:927 +#, possible-python-brace-format +msgctxt "set_type:timezone|acmpl|choice" +msgid "{tz} (Currently {now})" +msgstr "{tz} (Dvssfoumz {now})" + +#: src/settings/setting_types.py:957 +msgctxt "settype:timestamp|accepts" +msgid "A timestamp in the form YYYY-MM-DD HH:MM" +msgstr "B ujnftubnq jo uif gpsn ZZZZ-NN-EE II:NN" + +#: src/settings/setting_types.py:986 +#, possible-python-brace-format +msgctxt "settype:timestamp|parse|error:invalid" +msgid "" +"Could not parse `{provided}` as a timestamp. Please use `YYYY-MM-DD HH:MM` " +"format." +msgstr "" +"Dpvme opu qbstf `{provided}` bt b ujnftubnq. Qmfbtf vtf `ZZZZ-NN-EE II:NN` " +"gpsnbu." + +#: src/settings/setting_types.py:1017 +msgctxt "settype:raw|accepts" +msgid "Anything" +msgstr "Bozuijoh" + +#: src/settings/setting_types.py:1070 +msgctxt "settype:enum|accepts" +msgid "A valid option." +msgstr "B wbmje pqujpo." + +#: src/settings/setting_types.py:1120 +#, possible-python-brace-format +msgctxt "settype:enum|parse|error:not_found" +msgid "`{provided}` is not a valid option!" +msgstr "`{provided}` jt opu b wbmje pqujpo!" + +#: src/settings/setting_types.py:1168 +msgctxt "settype:duration|accepts" +msgid "A number of days, hours, minutes, and seconds, e.g. `2d 4h 10s`." +msgstr "B ovncfs pg ebzt, ipvst, njovuft, boe tfdpoet, f.h. `2e 4i 10t`." + +#: src/settings/setting_types.py:1349 +msgctxt "settype:channel_list|accepts" +msgid "Comma separated list of channel ids." +msgstr "Dpnnb tfqbsbufe mjtu pg diboofm jet." + +#: src/settings/setting_types.py:1360 +msgctxt "settype:role_list|accepts" +msgid "Comma separated list of role ids." +msgstr "Dpnnb tfqbsbufe mjtu pg spmf jet." + +#: src/settings/setting_types.py:1376 +msgctxt "settype:stringlist|accepts" +msgid "Comma separated strings." +msgstr "Dpnnb tfqbsbufe tusjoht." + +#: src/settings/setting_types.py:1387 +msgctxt "settype:guildidlist|accepts" +msgid "Comma separated list of guild ids." +msgstr "Dpnnb tfqbsbufe mjtu pg hvjme jet." diff --git a/locales/ceaser/LC_MESSAGES/shop.po b/locales/ceaser/LC_MESSAGES/shop.po new file mode 100644 index 00000000..eae30ea4 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/shop.po @@ -0,0 +1,627 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/shop/cog.py:108 +msgctxt "group:editshop" +msgid "editshop" +msgstr "fejutipq" + +#: src/modules/shop/cog.py:117 +msgctxt "cmd:shop" +msgid "shop" +msgstr "tipq" + +#: src/modules/shop/cog.py:118 +msgctxt "cmd:shop|desc" +msgid "Purchase coloures, roles, and other goodies with LionCoins." +msgstr "Qvsdibtf dpmpvsft, spmft, boe puifs hppejft xjui MjpoDpjot." + +#: src/modules/shop/cog.py:124 +msgctxt "cmd:shop_open" +msgid "open" +msgstr "pqfo" + +#: src/modules/shop/cog.py:125 +msgctxt "cmd:shop_open|desc" +msgid "Open the server shop." +msgstr "Pqfo uif tfswfs tipq." + +#: src/modules/shop/cog.py:151 +msgctxt "cmd:shop_open|error:no_shops" +msgid "There is nothing to buy!" +msgstr "Uifsf jt opuijoh up cvz!" + +#: src/modules/shop/cog.py:213 +msgctxt "ui:stores|button:close|label" +msgid "Close" +msgstr "Dmptf" + +#: src/modules/shop/cog.py:220 +msgctxt "ui:stores|button:close|response|title" +msgid "Shop Closed" +msgstr "Tipq Dmptfe" + +#: src/modules/shop/shops/colours.py:105 +#, possible-python-brace-format +msgctxt "ui:colourstore|menu:buycolours|label" +msgid "{name} ({price} LC)" +msgstr "{name} ({price} MD)" + +#: src/modules/shop/shops/colours.py:110 +#, possible-python-brace-format +msgctxt "ui:colourstore|menu:buycolours|label" +msgid "{name} (This is your colour!)" +msgstr "{name} (Uijt jt zpvs dpmpvs!)" + +#: src/modules/shop/shops/colours.py:115 +#, possible-python-brace-format +msgctxt "ui:colourstore|menu:buycolours|desc" +msgid "Colour: {colour}" +msgstr "Dpmpvs: {colour}" + +#: src/modules/shop/shops/colours.py:120 +msgctxt "ui:colourstore|menu:buycolours|desc" +msgid "Colour: Unknown" +msgstr "Dpmpvs: Volopxo" + +#: src/modules/shop/shops/colours.py:134 +msgctxt "shop:colours|name" +msgid "Colour Shop" +msgstr "Dpmpvs Tipq" + +#: src/modules/shop/shops/colours.py:173 +msgctxt "shop:colour|purchase|error:not_purchasable" +msgid "This item may not be purchased!" +msgstr "Uijt jufn nbz opu cf qvsdibtfe!" + +#: src/modules/shop/shops/colours.py:186 +msgctxt "shop:colour|purchase|error:no_guild" +msgid "Could not retrieve the server from Discord!" +msgstr "Dpvme opu sfusjfwf uif tfswfs gspn Ejtdpse!" + +#: src/modules/shop/shops/colours.py:196 +msgctxt "shop:colour|purchase|error:no_member" +msgid "Could not retrieve the member from Discord." +msgstr "Dpvme opu sfusjfwf uif nfncfs gspn Ejtdpse." + +#: src/modules/shop/shops/colours.py:206 +msgctxt "shop:colour|purchase|error:no_role" +msgid "This colour role could not be found in the server." +msgstr "Uijt dpmpvs spmf dpvme opu cf gpvoe jo uif tfswfs." + +#: src/modules/shop/shops/colours.py:215 +#, possible-python-brace-format +msgctxt "shop:colour|purchase|error:low_balance" +msgid "" +"This item costs {coin}{amount}!\n" +"Your balance is {coin}{balance}" +msgstr "" +"Uijt jufn dptut {coin}{amount}!\n" +"Zpvs cbmbodf jt {coin}{balance}" + +#: src/modules/shop/shops/colours.py:230 +msgctxt "shop:colour|purchase|error:owned" +msgid "You already own this item!" +msgstr "Zpv bmsfbez pxo uijt jufn!" + +#: src/modules/shop/shops/colours.py:264 +msgctxt "shop:colour|purchase|error:failed_no_role" +msgid "This colour role no longer exists!" +msgstr "Uijt dpmpvs spmf op mpohfs fyjtut!" + +#: src/modules/shop/shops/colours.py:271 +msgctxt "shop:colour|purchase|error:failed_permissions" +msgid "I do not have enough permissions to give you this colour role!" +msgstr "J ep opu ibwf fopvhi qfsnjttjpot up hjwf zpv uijt dpmpvs spmf!" + +#: src/modules/shop/shops/colours.py:278 +msgctxt "shop:colour|purchase|error:failed_unknown" +msgid "An unknown error occurred while giving you this colour role!" +msgstr "Bo volopxo fssps pddvssfe xijmf hjwjoh zpv uijt dpmpvs spmf!" + +#: src/modules/shop/shops/colours.py:348 +msgctxt "grp:editshop_colours" +msgid "colours" +msgstr "dpmpvst" + +#: src/modules/shop/shops/colours.py:353 +msgctxt "cmd:editshop_colours_create" +msgid "create" +msgstr "dsfbuf" + +#: src/modules/shop/shops/colours.py:356 +msgctxt "cmd:editshop_colours_create|desc" +msgid "Create a new colour role with the given colour." +msgstr "Dsfbuf b ofx dpmpvs spmf xjui uif hjwfo dpmpvs." + +#: src/modules/shop/shops/colours.py:360 +msgctxt "cmd:editshop_colours_create|param:colour" +msgid "colour" +msgstr "dpmpvs" + +#: src/modules/shop/shops/colours.py:361 +msgctxt "cmd:editshop_colours_create|param:name" +msgid "name" +msgstr "obnf" + +#: src/modules/shop/shops/colours.py:362 +msgctxt "cmd:editshop_colours_create|param:price" +msgid "price" +msgstr "qsjdf" + +#: src/modules/shop/shops/colours.py:367 +msgctxt "cmd:editshop_colours_create|param:colour|desc" +msgid "What colour should the role be? (As a hex code, e.g. #AB22AB)" +msgstr "Xibu dpmpvs tipvme uif spmf cf? (Bt b ify dpef, f.h. #BC22BC)" + +#: src/modules/shop/shops/colours.py:371 +msgctxt "cmd:editshop_colours_create|param:name|desc" +msgid "What should the colour role be called?" +msgstr "Xibu tipvme uif dpmpvs spmf cf dbmmfe?" + +#: src/modules/shop/shops/colours.py:375 +msgctxt "cmd:editshop_colours_create|param:price|desc" +msgid "How much should the colour role cost?" +msgstr "Ipx nvdi tipvme uif dpmpvs spmf dptu?" + +#: src/modules/shop/shops/colours.py:397 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_create|error:parse_colour" +msgid "" +"I could not extract a colour value from `{colour}`!\n" +"Please enter the colour as a hex string, e.g. `#FA0BC1`" +msgstr "" +"J dpvme opu fyusbdu b dpmpvs wbmvf gspn `{colour}`!\n" +"Qmfbtf foufs uif dpmpvs bt b ify tusjoh, f.h. `#GB0CD1`" + +#: src/modules/shop/shops/colours.py:407 +msgctxt "cmd:editshop_colours_create|error:perms" +msgid "" +"I do not have permission to create server roles!\n" +"Please either give me this permission, or create the role manually and use `/editshop colours add` instead." +msgstr "" +"J ep opu ibwf qfsnjttjpo up dsfbuf tfswfs spmft!\n" +"Qmfbtf fjuifs hjwf nf uijt qfsnjttjpo, ps dsfbuf uif spmf nbovbmmz boe vtf `/fejutipq dpmpvst bee` jotufbe." + +#: src/modules/shop/shops/colours.py:424 +msgctxt "cmd:editshop_colours_create|error:max_colours" +msgid "" +"This server already has the maximum of `25` colour roles!\n" +"Please remove some before adding or creating more." +msgstr "" +"Uijt tfswfs bmsfbez ibt uif nbyjnvn pg `25` dpmpvs spmft!\n" +"Qmfbtf sfnpwf tpnf cfgpsf beejoh ps dsfbujoh npsf." + +#: src/modules/shop/shops/colours.py:443 +msgctxt "cmd:editshop_colours_create|error:failed_unknown" +msgid "" +"An unknown Discord error occurred while creating your colour role!\n" +"Please try again in a few minutes." +msgstr "" +"Bo volopxo Ejtdpse fssps pddvssfe xijmf dsfbujoh zpvs dpmpvs spmf!\n" +"Qmfbtf usz bhbjo jo b gfx njovuft." + +#: src/modules/shop/shops/colours.py:493 +msgctxt "cmd:editshop_colours_create|resp:done|title" +msgid "Colour Role Created" +msgstr "Dpmpvs Spmf Dsfbufe" + +#: src/modules/shop/shops/colours.py:497 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_create|resp:done|desc" +msgid "" +"You have created the role {mention}, and added it to the colour shop for " +"{coin}**{price}**!" +msgstr "" +"Zpv ibwf dsfbufe uif spmf {mention}, boe beefe ju up uif dpmpvs tipq gps " +"{coin}**{price}**!" + +#: src/modules/shop/shops/colours.py:504 +msgctxt "cmd:editshop_colours_create|resp:done|field:position_note|value" +msgid "" +"The new colour role was added below all other roles. Remember a member's " +"active colour is determined by their highest coloured role!" +msgstr "" +"Uif ofx dpmpvs spmf xbt beefe cfmpx bmm puifs spmft. Sfnfncfs b nfncfs't " +"bdujwf dpmpvs jt efufsnjofe cz uifjs ijhiftu dpmpvsfe spmf!" + +#: src/modules/shop/shops/colours.py:508 +msgctxt "cmd:editshop_colours_create|resp:done|field:position_note|name" +msgid "Note" +msgstr "Opuf" + +#: src/modules/shop/shops/colours.py:517 +msgctxt "cmd:editshop_colours_edit" +msgid "edit" +msgstr "feju" + +#: src/modules/shop/shops/colours.py:520 +msgctxt "cmd:editshop_colours_edit|desc" +msgid "Edit the name, colour, or price of a colour role." +msgstr "Feju uif obnf, dpmpvs, ps qsjdf pg b dpmpvs spmf." + +#: src/modules/shop/shops/colours.py:524 +msgctxt "cmd:editshop_colours_edit|param:role" +msgid "role" +msgstr "spmf" + +#: src/modules/shop/shops/colours.py:525 +msgctxt "cmd:editshop_colours_edit|param:name" +msgid "name" +msgstr "obnf" + +#: src/modules/shop/shops/colours.py:526 +msgctxt "cmd:editshop_colours_edit|param:colour" +msgid "colour" +msgstr "dpmpvs" + +#: src/modules/shop/shops/colours.py:527 +msgctxt "cmd:editshop_colours_edit|param:price" +msgid "price" +msgstr "qsjdf" + +#: src/modules/shop/shops/colours.py:532 +msgctxt "cmd:editshop_colours_edit|param:role|desc" +msgid "Select a colour role to edit." +msgstr "Tfmfdu b dpmpvs spmf up feju." + +#: src/modules/shop/shops/colours.py:536 +msgctxt "cmd:editshop_colours_edit|param:name|desc" +msgid "New name to give the colour role." +msgstr "Ofx obnf up hjwf uif dpmpvs spmf." + +#: src/modules/shop/shops/colours.py:540 +msgctxt "cmd:editshop_colours_edit|param:colour|desc" +msgid "New colour for the colour role (as hex, e.g. #AB12AB)." +msgstr "Ofx dpmpvs gps uif dpmpvs spmf (bt ify, f.h. #BC12BC)." + +#: src/modules/shop/shops/colours.py:544 +msgctxt "cmd:editshop_colours_edit|param:price|desc" +msgid "New price for the colour role." +msgstr "Ofx qsjdf gps uif dpmpvs spmf." + +#: src/modules/shop/shops/colours.py:573 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_edit|error:invalid_role" +msgid "{mention} is not in the colour role shop!" +msgstr "{mention} jt opu jo uif dpmpvs spmf tipq!" + +#: src/modules/shop/shops/colours.py:587 +msgctxt "cmd:editshop_colours_edit|error:no_args" +msgid "You must give me one of `name`, `colour`, or `price` to update!" +msgstr "Zpv nvtu hjwf nf pof pg `obnf`, `dpmpvs`, ps `qsjdf` up vqebuf!" + +#: src/modules/shop/shops/colours.py:603 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_edit|error:parse_colour" +msgid "" +"I could not extract a colour value from `{colour}`!\n" +"Please enter the colour as a hex string, e.g. `#FA0BC1`" +msgstr "" +"J dpvme opu fyusbdu b dpmpvs wbmvf gspn `{colour}`!\n" +"Qmfbtf foufs uif dpmpvs bt b ify tusjoh, f.h. `#GB0CD1`" + +#: src/modules/shop/shops/colours.py:618 +msgctxt "cmd:editshop_colours_edit|error:perms" +msgid "I do not have sufficient server permissions to edit this role!" +msgstr "J ep opu ibwf tvggjdjfou tfswfs qfsnjttjpot up feju uijt spmf!" + +#: src/modules/shop/shops/colours.py:634 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_edit|resp:done|line:price" +msgid "{tick} Set price to {coin}**{price}**" +msgstr "{tick} Tfu qsjdf up {coin}**{price}**" + +#: src/modules/shop/shops/colours.py:651 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_edit|resp:done|line:role" +msgid "{tick} Updated role to {mention}" +msgstr "{tick} Vqebufe spmf up {mention}" + +#: src/modules/shop/shops/colours.py:661 +msgctxt "cmd:editshop_colours_edit|resp:done|embed:title" +msgid "Colour Role Updated" +msgstr "Dpmpvs Spmf Vqebufe" + +#: src/modules/shop/shops/colours.py:667 +msgctxt "cmd:editshop_colours_auto" +msgid "auto" +msgstr "bvup" + +#: src/modules/shop/shops/colours.py:668 +msgctxt "cmd:editshop_colours_auto|desc" +msgid "Automatically create a set of colour roles." +msgstr "Bvupnbujdbmmz dsfbuf b tfu pg dpmpvs spmft." + +#: src/modules/shop/shops/colours.py:677 +msgctxt "cmd:editshop_colours_add" +msgid "add" +msgstr "bee" + +#: src/modules/shop/shops/colours.py:680 +msgctxt "cmd:editshop_colours_add|desc" +msgid "Add an existing role to the colour shop." +msgstr "Bee bo fyjtujoh spmf up uif dpmpvs tipq." + +#: src/modules/shop/shops/colours.py:684 +msgctxt "cmd:editshop_colours_add|param:role" +msgid "role" +msgstr "spmf" + +#: src/modules/shop/shops/colours.py:685 +msgctxt "cmd:editshop_colours_add|param:price" +msgid "price" +msgstr "qsjdf" + +#: src/modules/shop/shops/colours.py:690 +msgctxt "cmd:editshop_colours_add|param:role|desc" +msgid "Select a role to add to the colour shop." +msgstr "Tfmfdu b spmf up bee up uif dpmpvs tipq." + +#: src/modules/shop/shops/colours.py:694 +msgctxt "cmd:editshop_colours_add|param:price|desc" +msgid "How much should this role cost?" +msgstr "Ipx nvdi tipvme uijt spmf dptu?" + +#: src/modules/shop/shops/colours.py:719 +msgctxt "cmd:editshop_colours_add|error:max_colours" +msgid "" +"This server already has the maximum of `25` colour roles!\n" +"Please remove some before adding or creating more." +msgstr "" +"Uijt tfswfs bmsfbez ibt uif nbyjnvn pg `25` dpmpvs spmft!\n" +"Qmfbtf sfnpwf tpnf cfgpsf beejoh ps dsfbujoh npsf." + +#: src/modules/shop/shops/colours.py:728 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_add|error:role_exists" +msgid "The role {mention} is already registered as a colour role!" +msgstr "Uif spmf {mention} jt bmsfbez sfhjtufsfe bt b dpmpvs spmf!" + +#: src/modules/shop/shops/colours.py:737 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_add|error:role_perms" +msgid "" +"I do not have enough permissions to assign the role {mention}! Please ensure" +" I have the `MANAGE_ROLES` permission, and that my top role is above this " +"role." +msgstr "" +"J ep opu ibwf fopvhi qfsnjttjpot up bttjho uif spmf {mention}! Qmfbtf fotvsf" +" J ibwf uif `NBOBHF_SPMFT` qfsnjttjpo, boe uibu nz upq spmf jt bcpwf uijt " +"spmf." + +#: src/modules/shop/shops/colours.py:748 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_add|error:caller_perms" +msgid "" +"You do not have sufficient server permissions to assign {mention} to the " +"shop! You must have `MANAGE_ROLES`, and your top role must be above this " +"role." +msgstr "" +"Zpv ep opu ibwf tvggjdjfou tfswfs qfsnjttjpot up bttjho {mention} up uif " +"tipq! Zpv nvtu ibwf `NBOBHF_SPMFT`, boe zpvs upq spmf nvtu cf bcpwf uijt " +"spmf." + +#: src/modules/shop/shops/colours.py:760 +msgctxt "cmd:editshop_colours_add|error:role_has_admin" +msgid "" +"I refuse to add an administrator role to the LionCoin shop. That is a really" +" bad idea." +msgstr "" +"J sfgvtf up bee bo benjojtusbups spmf up uif MjpoDpjo tipq. Uibu jt b sfbmmz" +" cbe jefb." + +#: src/modules/shop/shops/colours.py:781 +msgctxt "cmd:editshop_colours_add|resp:done|embed:title" +msgid "Colour Role Created" +msgstr "Dpmpvs Spmf Dsfbufe" + +#: src/modules/shop/shops/colours.py:784 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_add|resp:done|embed:desc" +msgid "You have added {mention} to the colour shop for {coin}**{price}**!" +msgstr "Zpv ibwf beefe {mention} up uif dpmpvs tipq gps {coin}**{price}**!" + +#: src/modules/shop/shops/colours.py:792 +msgctxt "cmd:editshop_colours_clear" +msgid "clear" +msgstr "dmfbs" + +#: src/modules/shop/shops/colours.py:795 +msgctxt "cmd:editshop_colours_clear|desc" +msgid "" +"Remove all the colour roles from the shop, and optionally delete the roles." +msgstr "" +"Sfnpwf bmm uif dpmpvs spmft gspn uif tipq, boe pqujpobmmz efmfuf uif spmft." + +#: src/modules/shop/shops/colours.py:799 +msgctxt "cmd:editshop_colours_clear|param:delete" +msgid "delete_roles" +msgstr "efmfuf_spmft" + +#: src/modules/shop/shops/colours.py:804 +msgctxt "cmd:editshop_colours_clear|param:delete|desc" +msgid "Also delete the associated roles." +msgstr "Bmtp efmfuf uif bttpdjbufe spmft." + +#: src/modules/shop/shops/colours.py:846 +msgctxt "cmd:editshop_colours_clear|error:no_colours" +msgid "There are no coloured roles to remove!" +msgstr "Uifsf bsf op dpmpvsfe spmft up sfnpwf!" + +#: src/modules/shop/shops/colours.py:890 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:clear" +msgid "{tick} Colour shop cleared." +msgstr "{tick} Dpmpvs tipq dmfbsfe." + +#: src/modules/shop/shops/colours.py:901 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:refunding" +msgid "{loading} Refunded **{count}/{total}** members." +msgstr "{loading} Sfgvoefe **{count}/{total}** nfncfst." + +#: src/modules/shop/shops/colours.py:907 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:refunded" +msgid "{tick} Refunded **{total}/{total}** members." +msgstr "{tick} Sfgvoefe **{total}/{total}** nfncfst." + +#: src/modules/shop/shops/colours.py:920 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted_failed" +msgid "" +"{emoji} Deleted **{count}/{total}** colour roles. (**{failed}** failed!)" +msgstr "" +"{emoji} Efmfufe **{count}/{total}** dpmpvs spmft. (**{failed}** gbjmfe!)" + +#: src/modules/shop/shops/colours.py:925 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted" +msgid "{emoji} Deleted **{count}/{total}** colour roles." +msgstr "{emoji} Efmfufe **{count}/{total}** dpmpvs spmft." + +#: src/modules/shop/shops/colours.py:974 +msgctxt "cmd:editshop_colours_remove" +msgid "remove" +msgstr "sfnpwf" + +#: src/modules/shop/shops/colours.py:977 +msgctxt "cmd:editshop_colours_remove|desc" +msgid "Remove a specific colour role from the shop." +msgstr "Sfnpwf b tqfdjgjd dpmpvs spmf gspn uif tipq." + +#: src/modules/shop/shops/colours.py:981 +msgctxt "cmd:editshop_colours_remove|param:role" +msgid "role" +msgstr "spmf" + +#: src/modules/shop/shops/colours.py:982 +msgctxt "cmd:editshop_colours_remove" +msgid "delete_role" +msgstr "efmfuf_spmf" + +#: src/modules/shop/shops/colours.py:987 +msgctxt "cmd:editshop_colours_remove|param:role|desc" +msgid "Select the colour role to remove." +msgstr "Tfmfdu uif dpmpvs spmf up sfnpwf." + +#: src/modules/shop/shops/colours.py:991 +msgctxt "cmd:editshop_colours_remove|param:delete_role|desc" +msgid "Whether to delete the associated role." +msgstr "Xifuifs up efmfuf uif bttpdjbufe spmf." + +#: src/modules/shop/shops/colours.py:1016 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_remove|error:not_colour" +msgid "{mention} is not in the colour role shop!" +msgstr "{mention} jt opu jo uif dpmpvs spmf tipq!" + +#: src/modules/shop/shops/colours.py:1034 +msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" +msgid "Successfully deleted the role." +msgstr "Tvddfttgvmmz efmfufe uif spmf." + +#: src/modules/shop/shops/colours.py:1039 +msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" +msgid "I do not have sufficient permissions to delete the role." +msgstr "J ep opu ibwf tvggjdjfou qfsnjttjpot up efmfuf uif spmf." + +#: src/modules/shop/shops/colours.py:1044 +msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" +msgid "Failed to delete the role for an unknown reason." +msgstr "Gbjmfe up efmfuf uif spmf gps bo volopxo sfbtpo." + +#: src/modules/shop/shops/colours.py:1049 +msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" +msgid "Could not find the role in order to delete it." +msgstr "Dpvme opu gjoe uif spmf jo psefs up efmfuf ju." + +#: src/modules/shop/shops/colours.py:1060 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_remove|resp:done|embed:desc" +msgid "" +"Removed {mention} from the colour shop.\n" +"{delete_line}" +msgstr "" +"Sfnpwfe {mention} gspn uif dpmpvs tipq.\n" +"{delete_line}" + +#: src/modules/shop/shops/colours.py:1138 +msgctxt "ui:colourstore|menu:buycolours|embed:error|title" +msgid "Purchase Failed!" +msgstr "Qvsdibtf Gbjmfe!" + +#: src/modules/shop/shops/colours.py:1149 +#, possible-python-brace-format +msgctxt "ui:colourstore|menu:buycolours|resp:done|desc" +msgid "{tick} You have purchased {mention}" +msgstr "{tick} Zpv ibwf qvsdibtfe {mention}" + +#: src/modules/shop/shops/colours.py:1184 +msgctxt "ui:colourstore|menu:buycolours|placeholder" +msgid "There are no colour roles available to purchase!" +msgstr "Uifsf bsf op dpmpvs spmft bwbjmbcmf up qvsdibtf!" + +#: src/modules/shop/shops/colours.py:1190 +msgctxt "ui:colourstore|menu:buycolours|placeholder" +msgid "Select a colour role to purchase!" +msgstr "Tfmfdu b dpmpvs spmf up qvsdibtf!" + +#: src/modules/shop/shops/colours.py:1236 +#, possible-python-brace-format +msgctxt "ui:colourstore|embed|line:owned_item" +msgid "`[{j:02}]` | `{price} LC` | {mention} (You own this!)" +msgstr "`[{j:02}]` | `{price} MD` | {mention} (Zpv pxo uijt!)" + +#: src/modules/shop/shops/colours.py:1241 +#, possible-python-brace-format +msgctxt "ui:colourstore|embed|line:item" +msgid "`[{j:02}]` | `{price} LC` | {mention}" +msgstr "`[{j:02}]` | `{price} MD` | {mention}" + +#: src/modules/shop/shops/colours.py:1248 +msgctxt "ui:colourstore|embed|desc" +msgid "No colour roles available for purchase!" +msgstr "Op dpmpvs spmft bwbjmbcmf gps qvsdibtf!" + +#: src/modules/shop/shops/colours.py:1251 +msgctxt "ui:colourstore|embed|title" +msgid "Colour Role Shop" +msgstr "Dpmpvs Spmf Tipq" + +#: src/modules/shop/shops/colours.py:1257 +#, possible-python-brace-format +msgctxt "ui:colourstore|embed|footer:paged" +msgid "Page {current}/{total}" +msgstr "Qbhf {current}/{total}" + +#: src/modules/shop/shops/colours.py:1264 +msgctxt "ui:colourstore|embed|field:warning|name" +msgid "Note!" +msgstr "Opuf!" + +#: src/modules/shop/shops/colours.py:1268 +#, possible-python-brace-format +msgctxt "ui:colourstore|embed|field:warning|value" +msgid "" +"Purchasing a new colour role will *replace* your currently colour {current} " +"without refund!" +msgstr "" +"Qvsdibtjoh b ofx dpmpvs spmf xjmm *sfqmbdf* zpvs dvssfoumz dpmpvs {current} " +"xjuipvu sfgvoe!" diff --git a/locales/ceaser/LC_MESSAGES/statistics.po b/locales/ceaser/LC_MESSAGES/statistics.po new file mode 100644 index 00000000..28d5c948 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/statistics.po @@ -0,0 +1,735 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/statistics/cog.py:42 +msgctxt "cmd:me" +msgid "me" +msgstr "nf" + +#: src/modules/statistics/cog.py:45 +msgctxt "cmd:me|desc" +msgid "Display your personal profile and summary statistics." +msgstr "Ejtqmbz zpvs qfstpobm qspgjmf boe tvnnbsz tubujtujdt." + +#: src/modules/statistics/cog.py:55 +msgctxt "cmd:stats" +msgid "stats" +msgstr "tubut" + +#: src/modules/statistics/cog.py:58 +msgctxt "cmd:stats|desc" +msgid "Weekly and monthly statistics for your recent activity." +msgstr "Xfflmz boe npouimz tubujtujdt gps zpvs sfdfou bdujwjuz." + +#: src/modules/statistics/cog.py:71 +msgctxt "cmd:leaderboard" +msgid "leaderboard" +msgstr "mfbefscpbse" + +#: src/modules/statistics/cog.py:74 +msgctxt "cmd:leaderboard|desc" +msgid "Server leaderboard." +msgstr "Tfswfs mfbefscpbse." + +#: src/modules/statistics/cog.py:89 +#, possible-python-brace-format +msgctxt "cmd:leaderboard|chunking|desc" +msgid "Requesting server member list from Discord, please wait {loading}" +msgstr "Sfrvftujoh tfswfs nfncfs mjtu gspn Ejtdpse, qmfbtf xbju {loading}" + +#: src/modules/statistics/cog.py:108 +msgctxt "cmd:configure_statistics" +msgid "statistics" +msgstr "tubujtujdt" + +#: src/modules/statistics/cog.py:109 +msgctxt "cmd:configure_statistics|desc" +msgid "Statistics configuration panel" +msgstr "Tubujtujdt dpogjhvsbujpo qbofm" + +#: src/modules/statistics/cog.py:112 +msgctxt "cmd:configure_statistics|param:season_start" +msgid "season_start" +msgstr "tfbtpo_tubsu" + +#: src/modules/statistics/cog.py:117 +msgctxt "cmd:configure_statistics|param:season_start|desc" +msgid "" +"Time from which to start counting activity for rank badges and season " +"leaderboards. (YYYY-MM-DD)" +msgstr "" +"Ujnf gspn xijdi up tubsu dpvoujoh bdujwjuz gps sbol cbehft boe tfbtpo " +"mfbefscpbset. (ZZZZ-NN-EE)" + +#: src/modules/statistics/settings.py:37 +msgctxt "settype:stat|output:voice" +msgid "`Voice`" +msgstr "`Wpjdf`" + +#: src/modules/statistics/settings.py:38 +msgctxt "settype:stat|output:text" +msgid "`Text`" +msgstr "`Ufyu`" + +#: src/modules/statistics/settings.py:39 +msgctxt "settype:stat|output:anki" +msgid "`Anki`" +msgstr "`Bolj`" + +#: src/modules/statistics/settings.py:42 +msgctxt "settype:stat|input_format:voice" +msgid "Voice" +msgstr "Wpjdf" + +#: src/modules/statistics/settings.py:43 +msgctxt "settype:stat|input_format:text" +msgid "Text" +msgstr "Ufyu" + +#: src/modules/statistics/settings.py:44 +msgctxt "settype:stat|input_format:anki" +msgid "Anki" +msgstr "Bolj" + +#: src/modules/statistics/settings.py:47 +msgctxt "settype:stat|input_pattern:voice" +msgid "voice|study" +msgstr "wpjdf|tuvez" + +#: src/modules/statistics/settings.py:48 +msgctxt "settype:stat|input_pattern:text" +msgid "text|messages" +msgstr "ufyu|nfttbhft" + +#: src/modules/statistics/settings.py:49 +msgctxt "settype:stat|input_pattern:anki" +msgid "anki" +msgstr "bolj" + +#: src/modules/statistics/settings.py:53 +msgctxt "settype:state|accepts" +msgid "Voice/Text/Anki" +msgstr "Wpjdf/Ufyu/Bolj" + +#: src/modules/statistics/settings.py:66 +msgctxt "userset:show_global_stats" +msgid "global_stats" +msgstr "hmpcbm_tubut" + +#: src/modules/statistics/settings.py:69 +msgctxt "userset:show_global_stats|desc" +msgid "Whether displayed statistics include all your servers." +msgstr "Xifuifs ejtqmbzfe tubujtujdt jodmvef bmm zpvs tfswfst." + +#: src/modules/statistics/settings.py:73 +msgctxt "userset:show_global_stats|long_desc" +msgid "" +"Whether statistics commands display combined stats for all servers or just " +"your current server." +msgstr "" +"Xifuifs tubujtujdt dpnnboet ejtqmbz dpncjofe tubut gps bmm tfswfst ps kvtu " +"zpvs dvssfou tfswfs." + +#: src/modules/statistics/settings.py:88 +msgctxt "guildset:season_start" +msgid "season_start" +msgstr "tfbtpo_tubsu" + +#: src/modules/statistics/settings.py:91 +msgctxt "guildset:season_start|desc" +msgid "Start of the current statistics season." +msgstr "Tubsu pg uif dvssfou tubujtujdt tfbtpo." + +#: src/modules/statistics/settings.py:95 +msgctxt "guildset:season_start|long_desc" +msgid "" +"Activity ranks will be determined based on tracked activity since this time, and the leaderboard will display activity since this time by default. Unset to disable seasons and use all-time statistics instead.\n" +"Provided dates and times are assumed to be in the guild `timezone`, so set this first!" +msgstr "" +"Bdujwjuz sbolt xjmm cf efufsnjofe cbtfe po usbdlfe bdujwjuz tjodf uijt ujnf, boe uif mfbefscpbse xjmm ejtqmbz bdujwjuz tjodf uijt ujnf cz efgbvmu. Votfu up ejtbcmf tfbtpot boe vtf bmm-ujnf tubujtujdt jotufbe.\n" +"Qspwjefe ebuft boe ujnft bsf bttvnfe up cf jo uif hvjme `ujnfapof`, tp tfu uijt gjstu!" + +#: src/modules/statistics/settings.py:102 +msgctxt "guildset:season_start|accepts" +msgid "The season start time in the form YYYY-MM-DD HH:MM" +msgstr "Uif tfbtpo tubsu ujnf jo uif gpsn ZZZZ-NN-EE II:NN" + +#: src/modules/statistics/settings.py:106 +msgctxt "guildset:season_start|notset" +msgid "Not Set (Using all-time statistics)" +msgstr "Opu Tfu (Vtjoh bmm-ujnf tubujtujdt)" + +#: src/modules/statistics/settings.py:125 +#, possible-python-brace-format +msgctxt "guildset:season_start|parse|error:future_time" +msgid "Provided season start time {timestamp} is in the future!" +msgstr "Qspwjefe tfbtpo tubsu ujnf {timestamp} jt jo uif gvuvsf!" + +#: src/modules/statistics/settings.py:137 +#, possible-python-brace-format +msgctxt "guildset:season_start|set_response|set" +msgid "" +"The leaderboard season and activity ranks will now count from {timestamp}. Member ranks will update when they are next active.\n" +"Use {rank_cmd} and press **Refresh Member Ranks** to refresh all ranks immediately." +msgstr "" +"Uif mfbefscpbse tfbtpo boe bdujwjuz sbolt xjmm opx dpvou gspn {timestamp}. Nfncfs sbolt xjmm vqebuf xifo uifz bsf ofyu bdujwf.\n" +"Vtf {rank_cmd} boe qsftt **Sfgsfti Nfncfs Sbolt** up sfgsfti bmm sbolt jnnfejbufmz." + +#: src/modules/statistics/settings.py:147 +#, possible-python-brace-format +msgctxt "guildset:season_start|set_response|unset" +msgid "" +"The leaderboard and activity ranks will now count all-time statistics. Member ranks will update when they are next active.\n" +"Use {rank_cmd} and press **Refresh Member Ranks** to refresh all ranks immediately." +msgstr "" +"Uif mfbefscpbse boe bdujwjuz sbolt xjmm opx dpvou bmm-ujnf tubujtujdt. Nfncfs sbolt xjmm vqebuf xifo uifz bsf ofyu bdujwf.\n" +"Vtf {rank_cmd} boe qsftt **Sfgsfti Nfncfs Sbolt** up sfgsfti bmm sbolt jnnfejbufmz." + +#: src/modules/statistics/settings.py:159 +msgctxt "guildset:unranked_roles" +msgid "unranked_roles" +msgstr "vosbolfe_spmft" + +#: src/modules/statistics/settings.py:162 +msgctxt "guildset:unranked_roles|desc" +msgid "Roles to exclude from the leaderboards." +msgstr "Spmft up fydmvef gspn uif mfbefscpbset." + +#: src/modules/statistics/settings.py:166 +msgctxt "guildset:unranked_roles|long_desc" +msgid "" +"When set, members with *any* of these roles will not appear on the " +"/leaderboard ranking list." +msgstr "" +"Xifo tfu, nfncfst xjui *boz* pg uiftf spmft xjmm opu bqqfbs po uif " +"/mfbefscpbse sboljoh mjtu." + +#: src/modules/statistics/settings.py:170 +msgctxt "guildset:unranked_roles|accepts" +msgid "Comma separated list of unranked role names or ids." +msgstr "Dpnnb tfqbsbufe mjtu pg vosbolfe spmf obnft ps jet." + +#: src/modules/statistics/settings.py:186 +msgctxt "guildset:unranked_roles|set_using" +msgid "Role selector below." +msgstr "Spmf tfmfdups cfmpx." + +#: src/modules/statistics/settings.py:196 +#, possible-python-brace-format +msgctxt "guildset:unranked_roles|set_response|set" +msgid "" +"Members of the following roles will not appear on the leaderboard: {roles}" +msgstr "" +"Nfncfst pg uif gpmmpxjoh spmft xjmm opu bqqfbs po uif mfbefscpbse: {roles}" + +#: src/modules/statistics/settings.py:203 +msgctxt "guildset:unranked_roles|set_response|unset" +msgid "You have cleared the unranked role list." +msgstr "Zpv ibwf dmfbsfe uif vosbolfe spmf mjtu." + +#: src/modules/statistics/settings.py:217 +msgctxt "guildset:visible_stats" +msgid "visible_stats" +msgstr "wjtjcmf_tubut" + +#: src/modules/statistics/settings.py:220 +msgctxt "guildset:visible_stats|desc" +msgid "Which statistics will be visible in the statistics commands." +msgstr "Xijdi tubujtujdt xjmm cf wjtjcmf jo uif tubujtujdt dpnnboet." + +#: src/modules/statistics/settings.py:224 +msgctxt "guildset:visible_stats|desc" +msgid "" +"Choose which statistics types to display in the leaderboard and statistics " +"commands." +msgstr "" +"Dipptf xijdi tubujtujdt uzqft up ejtqmbz jo uif mfbefscpbse boe tubujtujdt " +"dpnnboet." + +#: src/modules/statistics/settings.py:228 +msgctxt "guildset:visible_stats|accepts" +msgid "Voice, Text, Anki" +msgstr "Wpjdf, Ufyu, Bolj" + +#: src/modules/statistics/settings.py:249 +msgctxt "guildset:visible_stats|set_using" +msgid "Option menu below." +msgstr "Pqujpo nfov cfmpx." + +#: src/modules/statistics/settings.py:257 +#, possible-python-brace-format +msgctxt "guildset:visible_stats|set_response" +msgid "Members will be able to view the following statistics types: {types}" +msgstr "Nfncfst xjmm cf bcmf up wjfx uif gpmmpxjoh tubujtujdt uzqft: {types}" + +#: src/modules/statistics/settings.py:267 +msgctxt "guildset:default_stat" +msgid "default_stat" +msgstr "efgbvmu_tubu" + +#: src/modules/statistics/settings.py:270 +msgctxt "guildset:default_stat|desc" +msgid "Statistic type to display by default in setting dialogues." +msgstr "Tubujtujd uzqf up ejtqmbz cz efgbvmu jo tfuujoh ejbmphvft." + +#: src/modules/statistics/settings.py:274 +msgctxt "guildset:default_stat|long_desc" +msgid "Which statistic type to display by default in setting dialogues." +msgstr "Xijdi tubujtujd uzqf up ejtqmbz cz efgbvmu jo tfuujoh ejbmphvft." + +#: src/modules/statistics/settings.py:307 +msgctxt "ui:statistics_config|menu:unranked_roles|placeholder" +msgid "Select Unranked Roles" +msgstr "Tfmfdu Vosbolfe Spmft" + +#: src/modules/statistics/settings.py:331 +msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:voice" +msgid "Voice Activity" +msgstr "Wpjdf Bdujwjuz" + +#: src/modules/statistics/settings.py:336 +msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:study" +msgid "Study Statistics" +msgstr "Tuvez Tubujtujdt" + +#: src/modules/statistics/settings.py:346 +msgctxt "ui:statistics_config|menu:visible_stats|item:text" +msgid "Message Activity" +msgstr "Nfttbhf Bdujwjuz" + +#: src/modules/statistics/settings.py:354 +msgctxt "ui:statistics_config|menu:visible_stats|item:anki" +msgid "Anki Reviews" +msgstr "Bolj Sfwjfxt" + +#: src/modules/statistics/settings.py:365 +msgctxt "ui:statistics_config|menu:visible_stats|placeholder" +msgid "Select Visible Statistics" +msgstr "Tfmfdu Wjtjcmf Tubujtujdt" + +#: src/modules/statistics/settings.py:386 +msgctxt "ui:statistics_config|embed|title" +msgid "Statistics Configuration Panel" +msgstr "Tubujtujdt Dpogjhvsbujpo Qbofm" + +#: src/modules/statistics/settings.py:408 +msgctxt "dash:stats|title" +msgid "Activity Statistics Configuration ({commands[configure statistics]})" +msgstr "Bdujwjuz Tubujtujdt Dpogjhvsbujpo ({commands[configure statistics]})" + +#: src/modules/statistics/settings.py:412 +msgctxt "dash:stats|dropdown|placeholder" +msgid "Activity Statistics Panel" +msgstr "Bdujwjuz Tubujtujdt Qbofm" + +#: src/modules/statistics/ui/goals.py:92 +msgctxt "ui:MonthlyUI|name" +msgid "Monthly" +msgstr "Npouimz" + +#: src/modules/statistics/ui/goals.py:135 +msgctxt "ui:WeeklyUI|name" +msgid "Weekly" +msgstr "Xfflmz" + +#: src/modules/statistics/ui/summary.py:18 +msgctxt "ui:SummaryUI|name" +msgid "Summary" +msgstr "Tvnnbsz" + +#: src/modules/statistics/ui/weeklymonthly.py:96 +msgctxt "menu:stat_type|opt:weekly_voice|name" +msgid "Weekly Voice Statistics" +msgstr "Xfflmz Wpjdf Tubujtujdt" + +#: src/modules/statistics/ui/weeklymonthly.py:101 +msgctxt "menu:stat_type|opt:weekly_text|name" +msgid "Weekly Text Statistics" +msgstr "Xfflmz Ufyu Tubujtujdt" + +#: src/modules/statistics/ui/weeklymonthly.py:106 +msgctxt "menu:stat_type|opt:weekly_anki|name" +msgid "Weekly Anki Statistics" +msgstr "Xfflmz Bolj Tubujtujdt" + +#: src/modules/statistics/ui/weeklymonthly.py:112 +msgctxt "menu:stat_type|opt:monthly_voice|name" +msgid "Monthly Voice Statistics" +msgstr "Npouimz Wpjdf Tubujtujdt" + +#: src/modules/statistics/ui/weeklymonthly.py:117 +msgctxt "menu:stat_type|opt:monthly_text|name" +msgid "Monthly Text Statistics" +msgstr "Npouimz Ufyu Tubujtujdt" + +#: src/modules/statistics/ui/weeklymonthly.py:122 +msgctxt "menu:stat_type|opt:monthly_anki|name" +msgid "Monthly Anki Statistics" +msgstr "Npouimz Bolj Tubujtujdt" + +#: src/modules/statistics/ui/weeklymonthly.py:144 +msgctxt "modal:goal_editor|field:task_goal|label" +msgid "Task goal" +msgstr "Ubtl hpbm" + +#: src/modules/statistics/ui/weeklymonthly.py:148 +msgctxt "modal:goal_editor|field:task_goal|placeholder" +msgid "Enter the number of tasklist tasks you aim to do" +msgstr "Foufs uif ovncfs pg ubtlmjtu ubtlt zpv bjn up ep" + +#: src/modules/statistics/ui/weeklymonthly.py:159 +#, possible-python-brace-format +msgctxt "modal:goal_editor|field:task_goal|error:NAN" +msgid "The provided task goal `{input}` is not a number! Please try again." +msgstr "Uif qspwjefe ubtl hpbm `{input}` jt opu b ovncfs! Qmfbtf usz bhbjo." + +#: src/modules/statistics/ui/weeklymonthly.py:181 +msgctxt "modal:goal_editor|field:voice_goal|label" +msgid "Study time goal" +msgstr "Tuvez ujnf hpbm" + +#: src/modules/statistics/ui/weeklymonthly.py:185 +msgctxt "modal:goal_editor|field:voice_goal|placeholder" +msgid "Enter a number of hours of study to aim for." +msgstr "Foufs b ovncfs pg ipvst pg tuvez up bjn gps." + +#: src/modules/statistics/ui/weeklymonthly.py:190 +msgctxt "modal:goal_editor|field:text_goal|label" +msgid "Message goal" +msgstr "Nfttbhf hpbm" + +#: src/modules/statistics/ui/weeklymonthly.py:194 +msgctxt "modal:goal_editor|field:text_goal|placeholder" +msgid "Enter a message count to aim for." +msgstr "Foufs b nfttbhf dpvou up bjn gps." + +#: src/modules/statistics/ui/weeklymonthly.py:199 +msgctxt "modal:goal_editor|field:anki_goal|label" +msgid "Card goal" +msgstr "Dbse hpbm" + +#: src/modules/statistics/ui/weeklymonthly.py:203 +msgctxt "modal:goal_editor|field:anki_goal|label" +msgid "Enter a number of card revisions to aim for." +msgstr "Foufs b ovncfs pg dbse sfwjtjpot up bjn gps." + +#: src/modules/statistics/ui/weeklymonthly.py:216 +#, possible-python-brace-format +msgctxt "modal:goal_editor|field:voice_goal|error:NAN" +msgid "" +"The provided study time goal `{input}` is not a number! Please try again." +msgstr "" +"Uif qspwjefe tuvez ujnf hpbm `{input}` jt opu b ovncfs! Qmfbtf usz bhbjo." + +#: src/modules/statistics/ui/weeklymonthly.py:223 +#, possible-python-brace-format +msgctxt "modal:goal_editor|field:text_goal|error:NAN" +msgid "The provided message goal `{input}` is not a number! Please try again." +msgstr "" +"Uif qspwjefe nfttbhf hpbm `{input}` jt opu b ovncfs! Qmfbtf usz bhbjo." + +#: src/modules/statistics/ui/weeklymonthly.py:230 +#, possible-python-brace-format +msgctxt "modal:goal_editor|field:anki_goal|error:NAN" +msgid "The provided card goal `{input}` is not a number! Please try again." +msgstr "Uif qspwjefe dbse hpbm `{input}` jt opu b ovncfs! Qmfbtf usz bhbjo." + +#: src/modules/statistics/ui/weeklymonthly.py:252 +msgctxt "modal:goal_editor|field:weekly_task_editor|label" +msgid "Tasks to complete this week (one per line)" +msgstr "Ubtlt up dpnqmfuf uijt xffl (pof qfs mjof)" + +#: src/modules/statistics/ui/weeklymonthly.py:256 +msgctxt "modal:goal_editor|field:weekly_task_editor|placeholder" +msgid "" +"[ ] Write my biology essay\n" +"[x] Complete the second maths assignment\n" +msgstr "" +"[ ] Xsjuf nz cjpmphz fttbz\n" +"[y] Dpnqmfuf uif tfdpoe nbuit bttjhonfou\n" + +#: src/modules/statistics/ui/weeklymonthly.py:262 +msgctxt "modal:goal_editor|field:monthly_task_editor|label" +msgid "Tasks to complete this month (one per line)" +msgstr "Ubtlt up dpnqmfuf uijt npoui (pof qfs mjof)" + +#: src/modules/statistics/ui/weeklymonthly.py:266 +msgctxt "modal:goal_editor|field:monthly_task_editor|placeholder" +msgid "" +"[ ] Write my biology essay\n" +"[x] Complete the second maths assignment\n" +msgstr "" +"[ ] Xsjuf nz cjpmphz fttbz\n" +"[y] Dpnqmfuf uif tfdpoe nbuit bttjhonfou\n" + +#: src/modules/statistics/ui/weeklymonthly.py:284 +#, possible-python-brace-format +msgctxt "modal:goal_editor||field:task_editor|error:parse_general" +msgid "" +"Malformed task!\n" +"`{input}`" +msgstr "" +"Nbmgpsnfe ubtl!\n" +"`{input}`" + +#: src/modules/statistics/ui/weeklymonthly.py:301 +msgctxt "modal:goal_editor|title" +msgid "Weekly goal editor" +msgstr "Xfflmz hpbm fejups" + +#: src/modules/statistics/ui/weeklymonthly.py:306 +msgctxt "modal:goal_editor|monthly|title" +msgid "Monthly goal editor" +msgstr "Npouimz hpbm fejups" + +#: src/modules/statistics/ui/weeklymonthly.py:503 +msgctxt "ui:weeklymonthly|button:edit_goals|label" +msgid "Edit Goals" +msgstr "Feju Hpbmt" + +#: src/modules/statistics/ui/weeklymonthly.py:519 +#, possible-python-brace-format +msgctxt "ui:weeklymonthly|menu:period|monthly|label" +msgid "{month} {year}" +msgstr "{month} {year}" + +#: src/modules/statistics/ui/weeklymonthly.py:534 +#, possible-python-brace-format +msgctxt "ui:weeklymonthly|menu:period|weekly|label" +msgid "{year} W{week}" +msgstr "{year} X{week}" + +#: src/modules/statistics/ui/weeklymonthly.py:538 +#, possible-python-brace-format +msgctxt "ui:weeklymonthly|menu:period|weekly|desc" +msgid "" +"{start_day} {start_month} {start_year} to {end_day} {end_month} {end_year}" +msgstr "" +"{start_day} {start_month} {start_year} up {end_day} {end_month} {end_year}" + +#: src/modules/statistics/ui/weeklymonthly.py:616 +msgctxt "ui:weeklymonthly|button:period|close|label" +msgid "Close Selector" +msgstr "Dmptf Tfmfdups" + +#: src/modules/statistics/ui/weeklymonthly.py:621 +msgctxt "ui:weeklymonthly|button:period|weekly|label" +msgid "Select Week" +msgstr "Tfmfdu Xffl" + +#: src/modules/statistics/ui/weeklymonthly.py:626 +msgctxt "ui:weeklymonthly|button:period|monthly|label" +msgid "Select Month" +msgstr "Tfmfdu Npoui" + +#: src/modules/statistics/ui/weeklymonthly.py:691 +msgctxt "ui:weeklymonthly|menu:period|weekly|placeholder" +msgid "Select a week to display" +msgstr "Tfmfdu b xffl up ejtqmbz" + +#: src/modules/statistics/ui/weeklymonthly.py:696 +msgctxt "ui:weeklymonthly|menu:period|monthly|placeholder" +msgid "Select a month to display" +msgstr "Tfmfdu b npoui up ejtqmbz" + +#: src/modules/statistics/ui/weeklymonthly.py:718 +msgctxt "ui:WeeklyMonthly|button:global|resp:success" +msgid "" +"You will now see combined statistics from all your servers (where " +"applicable)! Press again to revert." +msgstr "" +"Zpv xjmm opx tff dpncjofe tubujtujdt gspn bmm zpvs tfswfst (xifsf " +"bqqmjdbcmf)! Qsftt bhbjo up sfwfsu." + +#: src/modules/statistics/ui/weeklymonthly.py:731 +msgctxt "ui:WeeklyMonthly|button:global|mode:local" +msgid "Server Statistics" +msgstr "Tfswfs Tubujtujdt" + +#: src/modules/statistics/ui/weeklymonthly.py:736 +msgctxt "ui:WeeklyMonthly|button:global|mode:global" +msgid "Global Statistics" +msgstr "Hmpcbm Tubujtujdt" + +#: src/modules/statistics/ui/profile.py:41 +msgctxt "modal:profile_editor|field:editor|label" +msgid "Profile Tags (One line per tag)" +msgstr "Qspgjmf Ubht (Pof mjof qfs ubh)" + +#: src/modules/statistics/ui/profile.py:45 +msgctxt "modal:profile_editor|field:editor|placeholder" +msgid "" +"Mathematician\n" +"Loves Cats" +msgstr "" +"Nbuifnbujdjbo\n" +"Mpwft Dbut" + +#: src/modules/statistics/ui/profile.py:53 +msgctxt "modal:profile_editor|title" +msgid "Profile Tag Editor" +msgstr "Qspgjmf Ubh Fejups" + +#: src/modules/statistics/ui/profile.py:71 +#, possible-python-brace-format +msgctxt "modal:profile_editor|error:too_many_tags" +msgid "Too many tags! You can have at most `{limit}` profile tags." +msgstr "Upp nboz ubht! Zpv dbo ibwf bu nptu `{limit}` qspgjmf ubht." + +#: src/modules/statistics/ui/profile.py:92 +msgctxt "menu:stat_type|opt:voice|name" +msgid "Voice Statistics" +msgstr "Wpjdf Tubujtujdt" + +#: src/modules/statistics/ui/profile.py:97 +msgctxt "menu:stat_type|opt:text|name" +msgid "Text Statistics" +msgstr "Ufyu Tubujtujdt" + +#: src/modules/statistics/ui/profile.py:102 +msgctxt "menu:stat_type|opt:anki|name" +msgid "Anki Statistics" +msgstr "Bolj Tubujtujdt" + +#: src/modules/statistics/ui/profile.py:190 +msgctxt "modal:profile_editor|resp:success" +msgid "Your profile has been updated!" +msgstr "Zpvs qspgjmf ibt cffo vqebufe!" + +#: src/modules/statistics/ui/profile.py:200 +msgctxt "ui:profile_card|button:edit|label" +msgid "Edit Profile Badges" +msgstr "Feju Qspgjmf Cbehft" + +#: src/modules/statistics/ui/profile.py:219 +msgctxt "ui:profile_card|button:statistics|label:hide" +msgid "Hide Statistics" +msgstr "Ijef Tubujtujdt" + +#: src/modules/statistics/ui/profile.py:224 +msgctxt "ui:profile_card|button:statistics|label:show" +msgid "Show Statistics" +msgstr "Tipx Tubujtujdt" + +#: src/modules/statistics/ui/profile.py:253 +msgctxt "ui:Profile|button:global|resp:success" +msgid "" +"You will now see statistics from all you servers (where applicable)! Press " +"again to revert." +msgstr "" +"Zpv xjmm opx tff tubujtujdt gspn bmm zpv tfswfst (xifsf bqqmjdbcmf)! Qsftt " +"bhbjo up sfwfsu." + +#: src/modules/statistics/ui/leaderboard.py:250 +msgctxt "ui:leaderboard|menu:stats|placeholder" +msgid "Select Activity Type" +msgstr "Tfmfdu Bdujwjuz Uzqf" + +#: src/modules/statistics/ui/leaderboard.py:259 +msgctxt "ui:leaderboard|menu:stats|item:voice" +msgid "Voice Activity" +msgstr "Wpjdf Bdujwjuz" + +#: src/modules/statistics/ui/leaderboard.py:270 +msgctxt "ui:leaderboard|menu:stats|item:study" +msgid "Study Statistics" +msgstr "Tuvez Tubujtujdt" + +#: src/modules/statistics/ui/leaderboard.py:281 +msgctxt "ui:leaderboard|menu:stats|item:message" +msgid "Message Activity" +msgstr "Nfttbhf Bdujwjuz" + +#: src/modules/statistics/ui/leaderboard.py:292 +msgctxt "ui:leaderboard|menu;stats|item:anki" +msgid "Anki Cards Reviewed" +msgstr "Bolj Dbset Sfwjfxfe" + +#: src/modules/statistics/ui/leaderboard.py:346 +msgctxt "ui:leaderboard|button:season|label" +msgid "This Season" +msgstr "Uijt Tfbtpo" + +#: src/modules/statistics/ui/leaderboard.py:350 +msgctxt "ui:leaderboard|button:day|label" +msgid "Today" +msgstr "Upebz" + +#: src/modules/statistics/ui/leaderboard.py:354 +msgctxt "ui:leaderboard|button:week|label" +msgid "This Week" +msgstr "Uijt Xffl" + +#: src/modules/statistics/ui/leaderboard.py:358 +msgctxt "ui:leaderboard|button:month|label" +msgid "This Month" +msgstr "Uijt Npoui" + +#: src/modules/statistics/ui/leaderboard.py:362 +msgctxt "ui:leaderboard|button:alltime|label" +msgid "All Time" +msgstr "Bmm Ujnf" + +#: src/modules/statistics/ui/leaderboard.py:366 +msgctxt "ui:leaderboard|button:jump|label" +msgid "Jump" +msgstr "Kvnq" + +#: src/modules/statistics/ui/leaderboard.py:381 +msgctxt "ui:leaderboard|button:jump|input:title" +msgid "Jump to page" +msgstr "Kvnq up qbhf" + +#: src/modules/statistics/ui/leaderboard.py:385 +msgctxt "ui:leaderboard|button:jump|input:question" +msgid "Page number to jump to" +msgstr "Qbhf ovncfs up kvnq up" + +#: src/modules/statistics/ui/leaderboard.py:396 +msgctxt "ui:leaderboard|button:jump|error:invalid_page" +msgid "Invalid page number, please try again!" +msgstr "Jowbmje qbhf ovncfs, qmfbtf usz bhbjo!" + +#: src/modules/statistics/ui/leaderboard.py:442 +#, possible-python-brace-format +msgctxt "ui:leaderboard|since" +msgid "Counting statistics since {timestamp}" +msgstr "Dpvoujoh tubujtujdt tjodf {timestamp}" + +#: src/modules/statistics/ui/leaderboard.py:453 +#, possible-python-brace-format +msgctxt "ui:leaderboard|mode:voice|message:empty|desc" +msgid "There has been no voice activity since {timestamp}" +msgstr "Uifsf ibt cffo op wpjdf bdujwjuz tjodf {timestamp}" + +#: src/modules/statistics/ui/leaderboard.py:458 +#, possible-python-brace-format +msgctxt "ui:leaderboard|mode:text|message:empty|desc" +msgid "There has been no message activity since {timestamp}" +msgstr "Uifsf ibt cffo op nfttbhf bdujwjuz tjodf {timestamp}" + +#: src/modules/statistics/ui/leaderboard.py:463 +#, possible-python-brace-format +msgctxt "ui:leaderboard|mode:anki|message:empty|desc" +msgid "There have been no Anki cards reviewed since {timestamp}" +msgstr "Uifsf ibwf cffo op Bolj dbset sfwjfxfe tjodf {timestamp}" + +#: src/modules/statistics/ui/leaderboard.py:472 +msgctxt "ui:leaderboard|message:empty|title" +msgid "Leaderboard Empty!" +msgstr "Mfbefscpbse Fnquz!" diff --git a/locales/ceaser/LC_MESSAGES/stats-gui.po b/locales/ceaser/LC_MESSAGES/stats-gui.po new file mode 100644 index 00000000..8ee6f542 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/stats-gui.po @@ -0,0 +1,139 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. First column +#: src/gui/cards/stats.py:72 +msgctxt "skin:stats|header:col1" +msgid "STATISTICS" +msgstr "TUBUJTUJDT" + +#: src/gui/cards/stats.py:75 +msgctxt "skin:stats|subheader:leaderboard" +msgid "LEADERBOARD POSITION" +msgstr "MFBEFSCPBSE QPTJUJPO" + +#: src/gui/cards/stats.py:79 +msgctxt "skin:stats|mode:study|subheader:study" +msgid "STUDY TIME" +msgstr "TUVEZ UJNF" + +#: src/gui/cards/stats.py:83 +msgctxt "skin:stats|mode:voice|subheader:study" +msgid "VOICE TIME" +msgstr "WPJDF UJNF" + +#: src/gui/cards/stats.py:87 +msgctxt "skin:stats|mode:text|subheader:study" +msgid "MESSAGES" +msgstr "NFTTBHFT" + +#: src/gui/cards/stats.py:91 +msgctxt "skin:stats|mode:anki|subheader:study" +msgid "CARDS REVIEWED" +msgstr "DBSET SFWJFXFE" + +#: src/gui/cards/stats.py:102 +msgctxt "skin:stats|subheader:workouts" +msgid "WORKOUTS" +msgstr "XPSLPVUT" + +#: src/gui/cards/stats.py:118 +msgctxt "skin:stats|field:daily" +msgid "DAILY" +msgstr "EBJMZ" + +#: src/gui/cards/stats.py:122 +msgctxt "skin:stats|field:weekly" +msgid "WEEKLY" +msgstr "XFFLMZ" + +#: src/gui/cards/stats.py:126 +msgctxt "skin:stats|field:monthly" +msgid "MONTHLY" +msgstr "NPOUIMZ" + +#: src/gui/cards/stats.py:130 +msgctxt "skin:stats|field:alltime" +msgid "ALL TIME" +msgstr "BMM UJNF" + +#: src/gui/cards/stats.py:134 +msgctxt "skin:stats|field:time" +msgid "TIME" +msgstr "UJNF" + +#: src/gui/cards/stats.py:138 +msgctxt "skin:stats|field:anki" +msgid "ANKI: COMING SOON" +msgstr "BOLJ: DPNJOH TPPO" + +#: src/gui/cards/stats.py:155 +msgctxt "skin:stats|mode:study|header:col2" +msgid "STUDY STREAK" +msgstr "TUVEZ TUSFBL" + +#: src/gui/cards/stats.py:159 +msgctxt "skin:stats|mode:voice|header:col2" +msgid "VOICE STREAK" +msgstr "WPJDF TUSFBL" + +#: src/gui/cards/stats.py:163 +msgctxt "skin:stats|mode:text|header:col2" +msgid "ACTIVITY STREAK" +msgstr "BDUJWJUZ TUSFBL" + +#: src/gui/cards/stats.py:167 +msgctxt "skin:stats|mode:anki|header:col2" +msgid "ANKI REVIEW STREAK" +msgstr "BOLJ SFWJFX TUSFBL" + +#: src/gui/cards/stats.py:180 +#, possible-python-brace-format +msgctxt "skin:stats|mode:study|field:col2_summary" +msgid "{amount} HRS" +msgstr "{amount} IST" + +#: src/gui/cards/stats.py:184 +#, possible-python-brace-format +msgctxt "skin:stats|mode:voice|field:col2_summary" +msgid "{amount} HRS" +msgstr "{amount} IST" + +#: src/gui/cards/stats.py:188 +#, possible-python-brace-format +msgctxt "skin:stats|mode:text|field:col2_summary" +msgid "{amount} XP" +msgstr "{amount} YQ" + +#: src/gui/cards/stats.py:192 +#, possible-python-brace-format +msgctxt "skin:stats|mode:anki|field:col2_summary" +msgid "{amount} CARDS" +msgstr "{amount} DBSET" + +#: src/gui/cards/stats.py:223 +msgctxt "skin:stats|cal|weekdays" +msgid "S,M,T,W,T,F,S" +msgstr "T,N,U,X,U,G,T" + +#: src/gui/cards/stats.py:227 +msgctxt "skin:stats|cal|months" +msgid "" +"JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER" +msgstr "" +"KBOVBSZ,GFCSVBSZ,NBSDI,BQSJM,NBZ,KVOF,KVMZ,BVHVTU,TFQUFNCFS,PDUPCFS,OPWFNCFS,EFDFNCFS" diff --git a/locales/ceaser/LC_MESSAGES/sysadmin.po b/locales/ceaser/LC_MESSAGES/sysadmin.po new file mode 100644 index 00000000..ef3778bc --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/sysadmin.po @@ -0,0 +1,199 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/sysadmin/presence.py:116 +msgctxt "botset:presence_status" +msgid "online_status" +msgstr "pomjof_tubuvt" + +#: src/modules/sysadmin/presence.py:117 +msgctxt "botset:presence_status|desc" +msgid "Bot status indicator" +msgstr "Cpu tubuvt joejdbups" + +#: src/modules/sysadmin/presence.py:120 +msgctxt "botset:presence_status|long_desc" +msgid "Whether the bot account displays as online, idle, dnd, or offline." +msgstr "Xifuifs uif cpu bddpvou ejtqmbzt bt pomjof, jemf, eoe, ps pggmjof." + +#: src/modules/sysadmin/presence.py:124 +msgctxt "botset:presence_status|accepts" +msgid "Online/Idle/Dnd/Offline" +msgstr "Pomjof/Jemf/Eoe/Pggmjof" + +#: src/modules/sysadmin/presence.py:133 +msgctxt "botset:presence_status|output:online" +msgid "**Online**" +msgstr "**Pomjof**" + +#: src/modules/sysadmin/presence.py:134 +msgctxt "botset:presence_status|output:idle" +msgid "**Idle**" +msgstr "**Jemf**" + +#: src/modules/sysadmin/presence.py:135 +msgctxt "botset:presence_status|output:dnd" +msgid "**Do Not Disturb**" +msgstr "**Ep Opu Ejtuvsc**" + +#: src/modules/sysadmin/presence.py:136 +msgctxt "botset:presence_status|output:offline" +msgid "**Offline**" +msgstr "**Pggmjof**" + +#: src/modules/sysadmin/presence.py:139 +msgctxt "botset:presence_status|input_format:online" +msgid "Online" +msgstr "Pomjof" + +#: src/modules/sysadmin/presence.py:140 +msgctxt "botset:presence_status|input_format:idle" +msgid "Idle" +msgstr "Jemf" + +#: src/modules/sysadmin/presence.py:141 +msgctxt "botset:presence_status|input_format:dnd" +msgid "DND" +msgstr "EOE" + +#: src/modules/sysadmin/presence.py:142 +msgctxt "botset:presence_status|input_format:offline" +msgid "Offline" +msgstr "Pggmjof" + +#: src/modules/sysadmin/presence.py:145 +msgctxt "botset:presence_status|input_pattern:online" +msgid "on|online" +msgstr "po|pomjof" + +#: src/modules/sysadmin/presence.py:146 +msgctxt "botset:presence_status|input_pattern:idle" +msgid "idle" +msgstr "jemf" + +#: src/modules/sysadmin/presence.py:147 +msgctxt "botset:presence_status|input_pattern:dnd" +msgid "do not disturb|dnd" +msgstr "ep opu ejtuvsc|eoe" + +#: src/modules/sysadmin/presence.py:148 +msgctxt "botset:presence_status|input_pattern:offline" +msgid "off|offline|invisible" +msgstr "pgg|pggmjof|jowjtjcmf" + +#: src/modules/sysadmin/presence.py:155 +msgctxt "botset:presence_type" +msgid "activity_type" +msgstr "bdujwjuz_uzqf" + +#: src/modules/sysadmin/presence.py:156 +msgctxt "botset:presence_type|desc" +msgid "Type of presence activity" +msgstr "Uzqf pg qsftfodf bdujwjuz" + +#: src/modules/sysadmin/presence.py:159 +msgctxt "botset:presence_type|long_desc" +msgid "" +"Whether the bot activity is shown as 'Listening', 'Playing', or 'Watching'." +msgstr "" +"Xifuifs uif cpu bdujwjuz jt tipxo bt 'Mjtufojoh', 'Qmbzjoh', ps 'Xbudijoh'." + +#: src/modules/sysadmin/presence.py:163 +msgctxt "botset:presence_type|accepts" +msgid "Listening/Playing/Watching/Streaming" +msgstr "Mjtufojoh/Qmbzjoh/Xbudijoh/Tusfbnjoh" + +#: src/modules/sysadmin/presence.py:172 +msgctxt "botset:presence_type|output:watching" +msgid "**Watching**" +msgstr "**Xbudijoh**" + +#: src/modules/sysadmin/presence.py:173 +msgctxt "botset:presence_type|output:listening" +msgid "**Listening**" +msgstr "**Mjtufojoh**" + +#: src/modules/sysadmin/presence.py:174 +msgctxt "botset:presence_type|output:playing" +msgid "**Playing**" +msgstr "**Qmbzjoh**" + +#: src/modules/sysadmin/presence.py:175 +msgctxt "botset:presence_type|output:streaming" +msgid "**Streaming**" +msgstr "**Tusfbnjoh**" + +#: src/modules/sysadmin/presence.py:178 +msgctxt "botset:presence_type|input_format:watching" +msgid "Watching" +msgstr "Xbudijoh" + +#: src/modules/sysadmin/presence.py:179 +msgctxt "botset:presence_type|input_format:listening" +msgid "Listening" +msgstr "Mjtufojoh" + +#: src/modules/sysadmin/presence.py:180 +msgctxt "botset:presence_type|input_format:playing" +msgid "Playing" +msgstr "Qmbzjoh" + +#: src/modules/sysadmin/presence.py:181 +msgctxt "botset:presence_type|input_format:streaming" +msgid "Streaming" +msgstr "Tusfbnjoh" + +#: src/modules/sysadmin/presence.py:184 +msgctxt "botset:presence_type|input_pattern:watching" +msgid "watching" +msgstr "xbudijoh" + +#: src/modules/sysadmin/presence.py:185 +msgctxt "botset:presence_type|input_pattern:listening" +msgid "listening" +msgstr "mjtufojoh" + +#: src/modules/sysadmin/presence.py:186 +msgctxt "botset:presence_type|input_pattern:playing" +msgid "playing" +msgstr "qmbzjoh" + +#: src/modules/sysadmin/presence.py:187 +msgctxt "botset:presence_type|input_pattern:streaming" +msgid "streaming" +msgstr "tusfbnjoh" + +#: src/modules/sysadmin/presence.py:194 +msgctxt "botset:presence_name" +msgid "activity_name" +msgstr "bdujwjuz_obnf" + +#: src/modules/sysadmin/presence.py:195 +msgctxt "botset:presence_name|desc" +msgid "Name of the presence activity" +msgstr "Obnf pg uif qsftfodf bdujwjuz" + +#: src/modules/sysadmin/presence.py:196 +msgctxt "botset:presence_name|long_desc" +msgid "Presence activity name." +msgstr "Qsftfodf bdujwjuz obnf." + +#: src/modules/sysadmin/presence.py:197 +msgctxt "botset:presence_name|accepts" +msgid "The name of the activity to show." +msgstr "Uif obnf pg uif bdujwjuz up tipx." diff --git a/locales/ceaser/LC_MESSAGES/tasklist.po b/locales/ceaser/LC_MESSAGES/tasklist.po new file mode 100644 index 00000000..0dd6ddcb --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/tasklist.po @@ -0,0 +1,866 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/tasklist/cog.py:35 +msgctxt "argtype:Before|opt:HOUR" +msgid "The last hour" +msgstr "Uif mbtu ipvs" + +#: src/modules/tasklist/cog.py:36 +msgctxt "argtype:Before|opt:HALFDAY" +msgid "The last 12 hours" +msgstr "Uif mbtu 12 ipvst" + +#: src/modules/tasklist/cog.py:37 +msgctxt "argtype:Before|opt:DAY" +msgid "The last 24 hours" +msgstr "Uif mbtu 24 ipvst" + +#: src/modules/tasklist/cog.py:38 +msgctxt "argtype:Before|opt:TODAY" +msgid "Today" +msgstr "Upebz" + +#: src/modules/tasklist/cog.py:39 +msgctxt "argtype:Before|opt:YESTERDAY" +msgid "Yesterday" +msgstr "Zftufsebz" + +#: src/modules/tasklist/cog.py:40 +msgctxt "argtype:Before|opt:Monday" +msgid "This Monday" +msgstr "Uijt Npoebz" + +#: src/modules/tasklist/cog.py:41 +msgctxt "argtype:Before|opt:THISMONTH" +msgid "This Month" +msgstr "Uijt Npoui" + +#: src/modules/tasklist/cog.py:205 +msgctxt "summon_tasklist|error:insufficient_perms|title" +msgid "Uh-Oh, I cannot do that here!" +msgstr "Vi-Pi, J dboopu ep uibu ifsf!" + +#: src/modules/tasklist/cog.py:209 +msgctxt "summon_tasklist|error:insufficient_perms|desc" +msgid "" +"This channel is configured as a tasklist channel, but I lack the " +"`EMBED_LINKS` or `SEND_MESSAGES` permission here! If you believe this is " +"unintentional, please contact a server administrator." +msgstr "" +"Uijt diboofm jt dpogjhvsfe bt b ubtlmjtu diboofm, cvu J mbdl uif " +"`FNCFE_MJOLT` ps `TFOE_NFTTBHFT` qfsnjttjpo ifsf! Jg zpv cfmjfwf uijt jt " +"vojoufoujpobm, qmfbtf dpoubdu b tfswfs benjojtusbups." + +#: src/modules/tasklist/cog.py:258 +msgctxt "cmd:tasklist" +msgid "tasklist" +msgstr "ubtlmjtu" + +#: src/modules/tasklist/cog.py:261 +msgctxt "cmd:tasklist|desc" +msgid "Open your tasklist." +msgstr "Pqfo zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:270 +msgctxt "group:tasks" +msgid "tasks" +msgstr "ubtlt" + +#: src/modules/tasklist/cog.py:271 +msgctxt "group:tasks|desc" +msgid "Base command group for tasklist commands." +msgstr "Cbtf dpnnboe hspvq gps ubtlmjtu dpnnboet." + +#: src/modules/tasklist/cog.py:293 +msgctxt "argtype:taskid|error:no_tasks" +msgid "Tasklist empty! No matching tasks." +msgstr "Ubtlmjtu fnquz! Op nbudijoh ubtlt." + +#: src/modules/tasklist/cog.py:330 +msgctxt "argtype:taskid|match:all" +msgid "All tasks" +msgstr "Bmm ubtlt" + +#: src/modules/tasklist/cog.py:348 +#, possible-python-brace-format +msgctxt "argtype:taskid|error:parse_multi" +msgid "(Warning: {error})" +msgstr "(Xbsojoh: {error})" + +#: src/modules/tasklist/cog.py:382 +#, possible-python-brace-format +msgctxt "argtype:taskid|error:no_matching" +msgid "No tasks matching '{partial}'!" +msgstr "Op ubtlt nbudijoh '{partial}'!" + +#: src/modules/tasklist/cog.py:402 +msgctxt "cmd:tasks_new" +msgid "new" +msgstr "ofx" + +#: src/modules/tasklist/cog.py:405 +msgctxt "cmd:tasks_new|desc" +msgid "Add a new task to your tasklist." +msgstr "Bee b ofx ubtl up zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:409 +msgctxt "cmd:tasks_new|param:content" +msgid "task" +msgstr "ubtl" + +#: src/modules/tasklist/cog.py:410 +msgctxt "cmd:tasks_new|param:parent" +msgid "parent" +msgstr "qbsfou" + +#: src/modules/tasklist/cog.py:413 +msgctxt "cmd:tasks_new|param:content|desc" +msgid "Content of your new task." +msgstr "Dpoufou pg zpvs ofx ubtl." + +#: src/modules/tasklist/cog.py:414 +msgctxt "cmd:tasks_new|param:parent" +msgid "Parent of this task." +msgstr "Qbsfou pg uijt ubtl." + +#: src/modules/tasklist/cog.py:434 +#, possible-python-brace-format +msgctxt "cmd:tasks_new|error:parse_parent" +msgid "Could not find parent task number `{input}` in your tasklist." +msgstr "Dpvme opu gjoe qbsfou ubtl ovncfs `{input}` jo zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:449 +#, possible-python-brace-format +msgctxt "cmd:tasks_new|resp:success" +msgid "{tick} Created task `{label}`." +msgstr "{tick} Dsfbufe ubtl `{label}`." + +#: src/modules/tasklist/cog.py:461 +msgctxt "cmd:tasks_upload" +msgid "upload" +msgstr "vqmpbe" + +#: src/modules/tasklist/cog.py:464 +msgctxt "cmd:tasks_upload|desc" +msgid "Upload a list of tasks to append to or replace your tasklist." +msgstr "Vqmpbe b mjtu pg ubtlt up bqqfoe up ps sfqmbdf zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:468 +msgctxt "cmd:tasks_upload|param:tasklist" +msgid "tasklist" +msgstr "ubtlmjtu" + +#: src/modules/tasklist/cog.py:469 +msgctxt "cmd:tasks_upload|param:append" +msgid "append" +msgstr "bqqfoe" + +#: src/modules/tasklist/cog.py:474 +msgctxt "cmd:tasks_upload|param:tasklist|desc" +msgid "" +"Text file containing a (standard markdown formatted) checklist of tasks to " +"add or append." +msgstr "" +"Ufyu gjmf dpoubjojoh b (tuboebse nbslepxo gpsnbuufe) difdlmjtu pg ubtlt up " +"bee ps bqqfoe." + +#: src/modules/tasklist/cog.py:478 +msgctxt "cmd:tasks_upload|param:append|desc" +msgid "" +"Whether to append the given tasks or replace your entire tasklist. Defaults " +"to True." +msgstr "" +"Xifuifs up bqqfoe uif hjwfo ubtlt ps sfqmbdf zpvs foujsf ubtlmjtu. Efgbvmut " +"up Usvf." + +#: src/modules/tasklist/cog.py:494 +msgctxt "cmd:tasks_upload|error:not_text" +msgid "The attached tasklist must be a text file!" +msgstr "Uif buubdife ubtlmjtu nvtu cf b ufyu gjmf!" + +#: src/modules/tasklist/cog.py:502 +msgctxt "cmd:tasks_upload|error:too_large" +msgid "The attached tasklist was too large!" +msgstr "Uif buubdife ubtlmjtu xbt upp mbshf!" + +#: src/modules/tasklist/cog.py:513 +msgctxt "cmd:tasks_upload|error:too_many_lines" +msgid "" +"Too many tasks! Refusing to process a tasklist with more than `1000` lines." +msgstr "" +"Upp nboz ubtlt! Sfgvtjoh up qspdftt b ubtlmjtu xjui npsf uibo `1000` mjoft." + +#: src/modules/tasklist/cog.py:519 +msgctxt "cmd:tasks_upload|error:decoding" +msgid "" +"Could not decode attached tasklist. Please make sure it is saved with the " +"`UTF-8` encoding." +msgstr "" +"Dpvme opu efdpef buubdife ubtlmjtu. Qmfbtf nblf tvsf ju jt tbwfe xjui uif " +"`VUG-8` fodpejoh." + +#: src/modules/tasklist/cog.py:566 +#, possible-python-brace-format +msgctxt "cmd:tasks_upload|resp:success" +msgid "{tick} Updated your tasklist." +msgstr "{tick} Vqebufe zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:578 +msgctxt "cmd:tasks_edit" +msgid "edit" +msgstr "feju" + +#: src/modules/tasklist/cog.py:581 +msgctxt "cmd:tasks_edit|desc" +msgid "Edit a task in your tasklist." +msgstr "Feju b ubtl jo zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:585 +msgctxt "cmd:tasks_edit|param:taskstr" +msgid "task" +msgstr "ubtl" + +#: src/modules/tasklist/cog.py:586 +msgctxt "cmd:tasks_edit|param:new_content" +msgid "new_task" +msgstr "ofx_ubtl" + +#: src/modules/tasklist/cog.py:587 +msgctxt "cmd:tasks_edit|param:new_parent" +msgid "new_parent" +msgstr "ofx_qbsfou" + +#: src/modules/tasklist/cog.py:590 +msgctxt "cmd:tasks_edit|param:taskstr|desc" +msgid "Which task do you want to update?" +msgstr "Xijdi ubtl ep zpv xbou up vqebuf?" + +#: src/modules/tasklist/cog.py:591 +msgctxt "cmd:tasks_edit|param:new_content|desc" +msgid "What do you want to change the task to?" +msgstr "Xibu ep zpv xbou up dibohf uif ubtl up?" + +#: src/modules/tasklist/cog.py:592 +msgctxt "cmd:tasks_edit|param:new_parent|desc" +msgid "Which task do you want to be the new parent?" +msgstr "Xijdi ubtl ep zpv xbou up cf uif ofx qbsfou?" + +#: src/modules/tasklist/cog.py:611 +#, possible-python-brace-format +msgctxt "cmd:tasks_edit|error:parse_taskstr" +msgid "Could not find target task number `{input}` in your tasklist." +msgstr "Dpvme opu gjoe ubshfu ubtl ovncfs `{input}` jo zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:627 +#, possible-python-brace-format +msgctxt "cmd:tasks_edit|error:parse_parent" +msgid "Could not find new parent task number `{input}` in your tasklist." +msgstr "Dpvme opu gjoe ofx qbsfou ubtl ovncfs `{input}` jo zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:646 +#, possible-python-brace-format +msgctxt "cmd:tasks_edit|resp:success|desc" +msgid "{tick} Task `{label}` updated." +msgstr "{tick} Ubtl `{label}` vqebufe." + +#: src/modules/tasklist/cog.py:668 +msgctxt "ui:tasklist_single_editor|title" +msgid "Edit Task" +msgstr "Feju Ubtl" + +#: src/modules/tasklist/cog.py:683 +msgctxt "cmd:tasks_clear" +msgid "clear" +msgstr "dmfbs" + +#: src/modules/tasklist/cog.py:684 +msgctxt "cmd:tasks_clear|desc" +msgid "Clear your tasklist." +msgstr "Dmfbs zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:694 +msgctxt "cmd:tasks_clear|resp:success" +msgid "Your tasklist has been cleared." +msgstr "Zpvs ubtlmjtu ibt cffo dmfbsfe." + +#: src/modules/tasklist/cog.py:702 +msgctxt "cmd:tasks_remove" +msgid "remove" +msgstr "sfnpwf" + +#: src/modules/tasklist/cog.py:705 +msgctxt "cmd:tasks_remove|desc" +msgid "" +"Remove tasks matching all the provided conditions. (E.g. remove tasks " +"completed before today)." +msgstr "" +"Sfnpwf ubtlt nbudijoh bmm uif qspwjefe dpoejujpot. (F.h. sfnpwf ubtlt " +"dpnqmfufe cfgpsf upebz)." + +#: src/modules/tasklist/cog.py:709 +msgctxt "cmd:tasks_remove|param:taskidstr" +msgid "tasks" +msgstr "ubtlt" + +#: src/modules/tasklist/cog.py:710 +msgctxt "cmd:tasks_remove|param:created_before" +msgid "created_before" +msgstr "dsfbufe_cfgpsf" + +#: src/modules/tasklist/cog.py:711 +msgctxt "cmd:tasks_remove|param:updated_before" +msgid "updated_before" +msgstr "vqebufe_cfgpsf" + +#: src/modules/tasklist/cog.py:712 +msgctxt "cmd:tasks_remove|param:completed" +msgid "completed" +msgstr "dpnqmfufe" + +#: src/modules/tasklist/cog.py:713 +msgctxt "cmd:tasks_remove|param:cascade" +msgid "cascade" +msgstr "dbtdbef" + +#: src/modules/tasklist/cog.py:718 +msgctxt "cmd:tasks_remove|param:taskidstr|desc" +msgid "" +"List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-), or `-`" +" to remove all." +msgstr "" +"Mjtu pg ubtl ovncfst ps sbohft up sfnpwf (f.h. 1, 2, 5-7, 8.1-3, 9-), ps `-`" +" up sfnpwf bmm." + +#: src/modules/tasklist/cog.py:722 +msgctxt "cmd:tasks_remove|param:created_before|desc" +msgid "Only delete tasks created before the selected time." +msgstr "Pomz efmfuf ubtlt dsfbufe cfgpsf uif tfmfdufe ujnf." + +#: src/modules/tasklist/cog.py:726 +msgctxt "cmd:tasks_remove|param:updated_before|desc" +msgid "" +"Only deleted tasks update (i.e. completed or edited) before the selected " +"time." +msgstr "" +"Pomz efmfufe ubtlt vqebuf (j.f. dpnqmfufe ps fejufe) cfgpsf uif tfmfdufe " +"ujnf." + +#: src/modules/tasklist/cog.py:730 +msgctxt "cmd:tasks_remove|param:completed" +msgid "Only delete tasks which are (not) complete." +msgstr "Pomz efmfuf ubtlt xijdi bsf (opu) dpnqmfuf." + +#: src/modules/tasklist/cog.py:734 +msgctxt "cmd:tasks_remove|param:cascade" +msgid "Whether to recursively remove subtasks of removed tasks." +msgstr "Xifuifs up sfdvstjwfmz sfnpwf tvcubtlt pg sfnpwfe ubtlt." + +#: src/modules/tasklist/cog.py:766 src/modules/tasklist/cog.py:861 +#: src/modules/tasklist/cog.py:936 +#, possible-python-brace-format +msgctxt "cmd:tasks_remove_cmd|error:no_matching" +msgid "No tasks on your tasklist match `{input}`" +msgstr "Op ubtlt po zpvs ubtlmjtu nbudi `{input}`" + +#: src/modules/tasklist/cog.py:790 +msgctxt "cmd:tasks_remove_cmd|error:no_matching" +msgid "No tasks on your tasklist matching all the given conditions!" +msgstr "Op ubtlt po zpvs ubtlmjtu nbudijoh bmm uif hjwfo dpoejujpot!" + +#: src/modules/tasklist/cog.py:803 +#, possible-python-brace-format +msgctxt "cmd:tasks_remove|resp:success" +msgid "{tick} Deleted task `{label}`" +msgid_plural "{tick} Deleted `{count}` tasks from your tasklist." +msgstr[0] "{tick} Efmfufe ubtl `{label}`" +msgstr[1] "{tick} Efmfufe `{count}` ubtlt gspn zpvs ubtlmjtu." + +#: src/modules/tasklist/cog.py:821 +msgctxt "cmd:tasks_tick" +msgid "tick" +msgstr "ujdl" + +#: src/modules/tasklist/cog.py:822 +msgctxt "cmd:tasks_tick|desc" +msgid "Mark the given tasks as completed." +msgstr "Nbsl uif hjwfo ubtlt bt dpnqmfufe." + +#: src/modules/tasklist/cog.py:825 +msgctxt "cmd:tasks_tick|param:taskidstr" +msgid "tasks" +msgstr "ubtlt" + +#: src/modules/tasklist/cog.py:826 +msgctxt "cmd:tasks_tick|param:cascade" +msgid "cascade" +msgstr "dbtdbef" + +#: src/modules/tasklist/cog.py:831 +msgctxt "cmd:tasks_tick|param:taskidstr|desc" +msgid "" +"List of task numbers or ranges to tick (e.g. 1, 2, 5-7, 8.1-3, 9-) or '-' to" +" tick all." +msgstr "" +"Mjtu pg ubtl ovncfst ps sbohft up ujdl (f.h. 1, 2, 5-7, 8.1-3, 9-) ps '-' up" +" ujdl bmm." + +#: src/modules/tasklist/cog.py:835 +msgctxt "cmd:tasks_tick|param:cascade|desc" +msgid "Whether to also mark all subtasks as complete." +msgstr "Xifuifs up bmtp nbsl bmm tvcubtlt bt dpnqmfuf." + +#: src/modules/tasklist/cog.py:879 +#, possible-python-brace-format +msgctxt "cmd:tasks_tick|resp:success" +msgid "{tick} Marked `{label}` as complete." +msgid_plural "{tick} Marked `{count}` tasks as complete." +msgstr[0] "{tick} Nbslfe `{label}` bt dpnqmfuf." +msgstr[1] "{tick} Nbslfe `{count}` ubtlt bt dpnqmfuf." + +#: src/modules/tasklist/cog.py:897 +msgctxt "cmd:tasks_untick" +msgid "untick" +msgstr "voujdl" + +#: src/modules/tasklist/cog.py:898 +msgctxt "cmd:tasks_untick|desc" +msgid "Mark the given tasks as incomplete." +msgstr "Nbsl uif hjwfo ubtlt bt jodpnqmfuf." + +#: src/modules/tasklist/cog.py:901 +msgctxt "cmd:tasks_untick|param:taskidstr" +msgid "taskids" +msgstr "ubtljet" + +#: src/modules/tasklist/cog.py:902 +msgctxt "cmd:tasks_untick|param:cascade" +msgid "cascade" +msgstr "dbtdbef" + +#: src/modules/tasklist/cog.py:907 +msgctxt "cmd:tasks_untick|param:taskidstr|desc" +msgid "" +"List of task numbers or ranges to untick (e.g. 1, 2, 5-7, 8.1-3, 9-) or '-' " +"to untick all." +msgstr "" +"Mjtu pg ubtl ovncfst ps sbohft up voujdl (f.h. 1, 2, 5-7, 8.1-3, 9-) ps '-' " +"up voujdl bmm." + +#: src/modules/tasklist/cog.py:911 +msgctxt "cmd:tasks_untick|param:cascade|desc" +msgid "Whether to also mark all subtasks as incomplete." +msgstr "Xifuifs up bmtp nbsl bmm tvcubtlt bt jodpnqmfuf." + +#: src/modules/tasklist/cog.py:952 +#, possible-python-brace-format +msgctxt "cmd:tasks_untick|resp:success" +msgid "{tick} Marked `{label}` as incomplete." +msgid_plural "{tick} Marked `{count}` tasks as incomplete." +msgstr[0] "{tick} Nbslfe `{label}` bt jodpnqmfuf." +msgstr[1] "{tick} Nbslfe `{count}` ubtlt bt jodpnqmfuf." + +#: src/modules/tasklist/cog.py:976 +msgctxt "cmd:configure_tasklist" +msgid "tasklist" +msgstr "ubtlmjtu" + +#: src/modules/tasklist/cog.py:977 +msgctxt "cmd:configure_tasklist|desc" +msgid "Tasklist configuration panel" +msgstr "Ubtlmjtu dpogjhvsbujpo qbofm" + +#: src/modules/tasklist/cog.py:980 +msgctxt "cmd:configure_tasklist|param:reward" +msgid "reward" +msgstr "sfxbse" + +#: src/modules/tasklist/cog.py:981 +msgctxt "cmd:configure_tasklist|param:reward_limit" +msgid "reward_limit" +msgstr "sfxbse_mjnju" + +#: src/modules/tasklist/cog.py:1017 +#, possible-python-brace-format +msgctxt "cmd:configure_tasklist|resp:success|desc" +msgid "" +"Members will now be rewarded {coin}**{amount}** for each task they complete " +"up to a maximum of `{limit}` tasks per 24h." +msgstr "" +"Nfncfst xjmm opx cf sfxbsefe {coin}**{amount}** gps fbdi ubtl uifz dpnqmfuf " +"vq up b nbyjnvn pg `{limit}` ubtlt qfs 24i." + +#: src/modules/tasklist/tasklist.py:267 +#, possible-python-brace-format +msgctxt "tasklist|parse:multi-range|error:parents_match" +msgid "Parents don't match in range `{range}`" +msgstr "Qbsfout epo'u nbudi jo sbohf `{range}`" + +#: src/modules/tasklist/tasklist.py:289 +#, possible-python-brace-format +msgctxt "tasklist|parse:multi-range|error:parse" +msgid "Could not parse `{range}` as a task number or range." +msgstr "Dpvme opu qbstf `{range}` bt b ubtl ovncfs ps sbohf." + +#: src/modules/tasklist/tasklist.py:320 +#, possible-python-brace-format +msgctxt "modal:tasklist_bulk_editor|error:parse_task" +msgid "" +"Malformed taskline!\n" +"`{input}`" +msgstr "" +"Nbmgpsnfe ubtlmjof!\n" +"`{input}`" + +#: src/modules/tasklist/tasklist.py:332 +msgctxt "modal:tasklist_bulk_editor|error:task_too_long" +msgid "Please keep your tasks under 100 characters!" +msgstr "Qmfbtf lffq zpvs ubtlt voefs 100 dibsbdufst!" + +#: src/modules/tasklist/ui.py:39 +msgctxt "ui:tasklist_caller|button:tasklist|label" +msgid "Open Tasklist" +msgstr "Pqfo Ubtlmjtu" + +#: src/modules/tasklist/ui.py:57 +msgctxt "modal:tasklist_single_editor|field:task|label" +msgid "Task content" +msgstr "Ubtl dpoufou" + +#: src/modules/tasklist/ui.py:69 +msgctxt "modal:tasklist_single_editor|field:parent|label" +msgid "Parent Task" +msgstr "Qbsfou Ubtl" + +#: src/modules/tasklist/ui.py:73 +msgctxt "modal:tasklist_single_editor|field:parent|placeholder" +msgid "Enter a task number, e.g. 2.1" +msgstr "Foufs b ubtl ovncfs, f.h. 2.1" + +#: src/modules/tasklist/ui.py:104 +msgctxt "modal:tasklist_bulk_editor|field:tasklist|label" +msgid "Tasklist" +msgstr "Ubtlmjtu" + +#: src/modules/tasklist/ui.py:108 +msgctxt "modal:tasklist_bulk_editor|field:tasklist|placeholder" +msgid "" +"- [ ] This is task 1, unfinished.\n" +"- [x] This is task 2, finished.\n" +" - [ ] This is subtask 2.1." +msgstr "" +"- [ ] Uijt jt ubtl 1, vogjojtife.\n" +"- [y] Uijt jt ubtl 2, gjojtife.\n" +" - [ ] Uijt jt tvcubtl 2.1." + +#: src/modules/tasklist/ui.py:130 +msgctxt "modal:tasklist_bulk_editor" +msgid "Tasklist Editor" +msgstr "Ubtlmjtu Fejups" + +#: src/modules/tasklist/ui.py:188 +msgctxt "ui:tasklist|menu:main|mode:toggle|placeholder" +msgid "Select to Toggle" +msgstr "Tfmfdu up Uphhmf" + +#: src/modules/tasklist/ui.py:192 +#, possible-python-brace-format +msgctxt "ui:tasklist|menu:sub|mode:toggle|placeholder" +msgid "Toggle from {label}.*" +msgstr "Uphhmf gspn {label}.*" + +#: src/modules/tasklist/ui.py:198 +msgctxt "ui:tasklist|menu:main|mode:edit|placeholder" +msgid "Select to Edit" +msgstr "Tfmfdu up Feju" + +#: src/modules/tasklist/ui.py:202 +#, possible-python-brace-format +msgctxt "ui:tasklist|menu:sub|mode:edit|placeholder" +msgid "Edit from {label}.*" +msgstr "Feju gspn {label}.*" + +#: src/modules/tasklist/ui.py:208 +msgctxt "ui:tasklist|menu:main|mode:delete|placeholder" +msgid "Select to Delete" +msgstr "Tfmfdu up Efmfuf" + +#: src/modules/tasklist/ui.py:212 +#, possible-python-brace-format +msgctxt "ui:tasklist|menu:sub|mode:delete|placeholder" +msgid "Delete from {label}.*" +msgstr "Efmfuf gspn {label}.*" + +#: src/modules/tasklist/ui.py:409 +#, possible-python-brace-format +msgctxt "ui:tasklist_single_editor|field:parent|error:parse_id" +msgid "" +"Could not find the given parent task number `{input}` in your tasklist." +msgstr "" +"Dpvme opu gjoe uif hjwfo qbsfou ubtl ovncfs `{input}` jo zpvs ubtlmjtu." + +#: src/modules/tasklist/ui.py:423 +#, possible-python-brace-format +msgctxt "ui:tasklist_single_editor|field:parent|error:multiple_matching" +msgid "" +"Multiple tasks matching given parent task `{input}`. Please use a task " +"number instead!" +msgstr "" +"Nvmujqmf ubtlt nbudijoh hjwfo qbsfou ubtl `{input}`. Qmfbtf vtf b ubtl " +"ovncfs jotufbe!" + +#: src/modules/tasklist/ui.py:430 +#, possible-python-brace-format +msgctxt "ui:tasklist_single_editor|field:parent|error:no_matching" +msgid "No tasks matching given parent task `{input}`." +msgstr "Op ubtlt nbudijoh hjwfo qbsfou ubtl `{input}`." + +#: src/modules/tasklist/ui.py:501 +msgctxt "ui:tasklist|menu:edit|modal:title" +msgid "Edit task" +msgstr "Feju ubtl" + +#: src/modules/tasklist/ui.py:596 +msgctxt "ui:tasklist_single_editor|title" +msgid "Add task" +msgstr "Bee ubtl" + +#: src/modules/tasklist/ui.py:629 +msgctxt "ui:tasklist|button:edit_mode|label" +msgid "Edit" +msgstr "Feju" + +#: src/modules/tasklist/ui.py:645 +msgctxt "ui:tasklist|button:delete_mode|label" +msgid "Delete" +msgstr "Efmfuf" + +#: src/modules/tasklist/ui.py:661 +msgctxt "ui:tasklist|button:toggle_mode|label" +msgid "Toggle" +msgstr "Uphhmf" + +#: src/modules/tasklist/ui.py:678 +msgctxt "ui:tasklist|button:edit_bulk|error:too_long" +msgid "" +"Your tasklist is too long to be edited in a Discord text input! Use the save" +" button and {cmds[tasks upload]} instead." +msgstr "" +"Zpvs ubtlmjtu jt upp mpoh up cf fejufe jo b Ejtdpse ufyu joqvu! Vtf uif tbwf" +" cvuupo boe {cmds[tasks upload]} jotufbe." + +#: src/modules/tasklist/ui.py:692 +msgctxt "ui:tasklist|button:edit_bulk|label" +msgid "Bulk Edit" +msgstr "Cvml Feju" + +#: src/modules/tasklist/ui.py:705 +msgctxt "ui:tasklist|button:clear|label" +msgid "Clear Tasklist" +msgstr "Dmfbs Ubtlmjtu" + +#: src/modules/tasklist/ui.py:724 +#, possible-python-brace-format +msgctxt "ui:tasklist|button:save|dm:contents" +msgid "Your tasklist as of {now} is attached. Click here to jump back: {jump}" +msgstr "" +"Zpvs ubtlmjtu bt pg {now} jt buubdife. Dmjdl ifsf up kvnq cbdl: {jump}" + +#: src/modules/tasklist/ui.py:737 +msgctxt "ui:tasklist|button:save|error:dms" +msgid "Could not DM you! Do you have me blocked? Tasklist attached below." +msgstr "Dpvme opu EN zpv! Ep zpv ibwf nf cmpdlfe? Ubtlmjtu buubdife cfmpx." + +#: src/modules/tasklist/ui.py:782 +msgctxt "ui:tasklist|error:wrong_user" +msgid "This is not your tasklist!" +msgstr "Uijt jt opu zpvs ubtlmjtu!" + +#: src/modules/tasklist/ui.py:824 +#, possible-python-brace-format +msgctxt "ui:tasklist|embed|author" +msgid "{name}'s tasklist ({completed}/{total} complete)" +msgstr "{name}'t ubtlmjtu ({completed}/{total} dpnqmfuf)" + +#: src/modules/tasklist/ui.py:846 +msgctxt "ui:tasklist|embed|description" +msgid "" +"**You have no tasks on your tasklist!**\n" +"Add a task with {cmds[tasks new]}, or by pressing the {new_button} button below." +msgstr "" +"**Zpv ibwf op ubtlt po zpvs ubtlmjtu!**\n" +"Bee b ubtl xjui {cmds[tasks new]}, ps cz qsfttjoh uif {new_button} cvuupo cfmpx." + +#: src/modules/tasklist/settings.py:33 +msgctxt "guildset:task_reward" +msgid "task_reward" +msgstr "ubtl_sfxbse" + +#: src/modules/tasklist/settings.py:36 +msgctxt "guildset:task_reward|desc" +msgid "Number of LionCoins given for each completed task." +msgstr "Ovncfs pg MjpoDpjot hjwfo gps fbdi dpnqmfufe ubtl." + +#: src/modules/tasklist/settings.py:40 +msgctxt "guildset:task_reward|long_desc" +msgid "" +"The number of coins members will be rewarded each time they complete a task " +"on their tasklist." +msgstr "" +"Uif ovncfs pg dpjot nfncfst xjmm cf sfxbsefe fbdi ujnf uifz dpnqmfuf b ubtl " +"po uifjs ubtlmjtu." + +#: src/modules/tasklist/settings.py:44 +msgctxt "guildset:task_reward|accepts" +msgid "The number of LionCoins to reward per task." +msgstr "Uif ovncfs pg MjpoDpjot up sfxbse qfs ubtl." + +#: src/modules/tasklist/settings.py:56 +#, possible-python-brace-format +msgctxt "guildset:task_reward|response" +msgid "" +"Members will now be rewarded {coin}**{amount}** for each completed task." +msgstr "" +"Nfncfst xjmm opx cf sfxbsefe {coin}**{amount}** gps fbdi dpnqmfufe ubtl." + +#: src/modules/tasklist/settings.py:65 +#, possible-python-brace-format +msgctxt "guildset:task_reward|formatted" +msgid "{coin}**{amount}** per task." +msgstr "{coin}**{amount}** qfs ubtl." + +#: src/modules/tasklist/settings.py:73 +msgctxt "guildset:task_reward_limit" +msgid "task_reward_limit" +msgstr "ubtl_sfxbse_mjnju" + +#: src/modules/tasklist/settings.py:76 +msgctxt "guildset:task_reward_limit|desc" +msgid "Maximum number of task rewards given per 24h." +msgstr "Nbyjnvn ovncfs pg ubtl sfxbset hjwfo qfs 24i." + +#: src/modules/tasklist/settings.py:80 +msgctxt "guildset:task_reward_limit|long_desc" +msgid "" +"Maximum number of times in each 24h period that members will be rewarded for" +" completing a task." +msgstr "" +"Nbyjnvn ovncfs pg ujnft jo fbdi 24i qfsjpe uibu nfncfst xjmm cf sfxbsefe gps" +" dpnqmfujoh b ubtl." + +#: src/modules/tasklist/settings.py:85 +msgctxt "guildset:task_reward_limit|accepts" +msgid "The maximum number of tasks to reward LC for per 24h." +msgstr "Uif nbyjnvn ovncfs pg ubtlt up sfxbse MD gps qfs 24i." + +#: src/modules/tasklist/settings.py:97 +#, possible-python-brace-format +msgctxt "guildset:task_reward_limit|response" +msgid "" +"Members will now be rewarded for task completion at most **{amount}** times " +"per 24h." +msgstr "" +"Nfncfst xjmm opx cf sfxbsefe gps ubtl dpnqmfujpo bu nptu **{amount}** ujnft " +"qfs 24i." + +#: src/modules/tasklist/settings.py:106 +#, possible-python-brace-format +msgctxt "guildset:task_reward_limit|formatted" +msgid "`{number}` per 24 hours." +msgstr "`{number}` qfs 24 ipvst." + +#: src/modules/tasklist/settings.py:113 +msgctxt "guildset:tasklist_channels" +msgid "tasklist_channels" +msgstr "ubtlmjtu_diboofmt" + +#: src/modules/tasklist/settings.py:116 +msgctxt "guildset:tasklist_channels|desc" +msgid "Channels in which to publicly display member tasklists." +msgstr "Diboofmt jo xijdi up qvcmjdmz ejtqmbz nfncfs ubtlmjtut." + +#: src/modules/tasklist/settings.py:120 +#, possible-python-brace-format +msgctxt "guildset:tasklist_channels|long_desc" +msgid "" +"A member's tasklist (from {cmds[tasklist]}) is usually only visible to the " +"member themselves. If set, tasklists opened in `tasklist_channels` will be " +"visible to all members, and the interface will have a much longer expiry " +"period. If a category is provided, this will apply to all channels under the" +" category." +msgstr "" +"B nfncfs't ubtlmjtu (gspn {cmds[tasklist]}) jt vtvbmmz pomz wjtjcmf up uif " +"nfncfs uifntfmwft. Jg tfu, ubtlmjtut pqfofe jo `ubtlmjtu_diboofmt` xjmm cf " +"wjtjcmf up bmm nfncfst, boe uif joufsgbdf xjmm ibwf b nvdi mpohfs fyqjsz " +"qfsjpe. Jg b dbufhpsz jt qspwjefe, uijt xjmm bqqmz up bmm diboofmt voefs uif" +" dbufhpsz." + +#: src/modules/tasklist/settings.py:127 +msgctxt "guildset:tasklist_channels|accepts" +msgid "Comma separated list of tasklist channel names or ids." +msgstr "Dpnnb tfqbsbufe mjtu pg ubtlmjtu diboofm obnft ps jet." + +#: src/modules/tasklist/settings.py:144 +#, possible-python-brace-format +msgctxt "guildset:tasklist_channels|set_response|set" +msgid "" +"Tasklists will now be publicly displayed in the following channels: " +"{channels}" +msgstr "" +"Ubtlmjtut xjmm opx cf qvcmjdmz ejtqmbzfe jo uif gpmmpxjoh diboofmt: " +"{channels}" + +#: src/modules/tasklist/settings.py:149 +msgctxt "guildset:tasklist_channels|set_response|unset" +msgid "Member tasklists will never be publicly displayed." +msgstr "Nfncfs ubtlmjtut xjmm ofwfs cf qvcmjdmz ejtqmbzfe." + +#: src/modules/tasklist/settings.py:158 +msgctxt "guildset:tasklist_channels|set_using" +msgid "Channel selector below." +msgstr "Diboofm tfmfdups cfmpx." + +#: src/modules/tasklist/settings.py:289 +msgctxt "ui:tasklist_config|button:close|label" +msgid "Close" +msgstr "Dmptf" + +#: src/modules/tasklist/settings.py:290 +msgctxt "ui:tasklist_config|button:reset|label" +msgid "Reset" +msgstr "Sftfu" + +#: src/modules/tasklist/settings.py:293 +msgctxt "ui:tasklist_config|menu:channels|placeholder" +msgid "Set Tasklist Channels" +msgstr "Tfu Ubtlmjtu Diboofmt" + +#: src/modules/tasklist/settings.py:311 +msgctxt "ui:tasklist_config|embed|title" +msgid "Tasklist Configuration Panel" +msgstr "Ubtlmjtu Dpogjhvsbujpo Qbofm" + +#: src/modules/tasklist/settings.py:320 +msgctxt "dash:tasklist|name" +msgid "Tasklist Configuration ({commands[configure tasklist]})" +msgstr "Ubtlmjtu Dpogjhvsbujpo ({commands[configure tasklist]})" + +#: src/modules/tasklist/settings.py:323 +msgctxt "dash:tasklist|dropdown|placeholder" +msgid "Tasklist Options Panel" +msgstr "Ubtlmjtu Pqujpot Qbofm" diff --git a/locales/ceaser/LC_MESSAGES/test.po b/locales/ceaser/LC_MESSAGES/test.po new file mode 100644 index 00000000..03a30e24 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/test.po @@ -0,0 +1,81 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/test/test.py:59 src/modules/test/test.py:66 +msgid "test" +msgstr "uftu" + +#: src/modules/test/test.py:67 +msgid "Test" +msgstr "Uftu" + +#: src/modules/test/test.py:74 +msgid "editor" +msgstr "fejups" + +#: src/modules/test/test.py:75 +msgid "Test message editor" +msgstr "Uftu nfttbhf fejups" + +#: src/modules/test/test.py:101 +msgid "test_ephemeral" +msgstr "uftu_fqifnfsbm" + +#: src/modules/test/test.py:102 +msgid "Test ephemeral delete and edit" +msgstr "Uftu fqifnfsbm efmfuf boe feju" + +#: src/modules/test/test.py:114 +msgid "colours" +msgstr "dpmpvst" + +#: src/modules/test/test.py:115 +msgid "Test Ansi colours" +msgstr "Uftu Botj dpmpvst" + +#: src/modules/test/test.py:135 +msgid "fail" +msgstr "gbjm" + +#: src/modules/test/test.py:143 +msgid "failui" +msgstr "gbjmvj" + +#: src/modules/test/test.py:150 +msgid "pager" +msgstr "qbhfs" + +#: src/modules/test/test.py:178 +msgid "pager2" +msgstr "qbhfs2" + +#: src/modules/test/test.py:209 +msgid "prettyusers" +msgstr "qsfuuzvtfst" + +#: src/modules/test/test.py:259 +msgid "dmview" +msgstr "enwjfx" + +#: src/modules/test/test.py:270 +msgid "multiview" +msgstr "nvmujwjfx" + +#: src/modules/test/test.py:287 +msgid "stats-card" +msgstr "tubut-dbse" diff --git a/locales/ceaser/LC_MESSAGES/text-tracker.po b/locales/ceaser/LC_MESSAGES/text-tracker.po new file mode 100644 index 00000000..8102edfa --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/text-tracker.po @@ -0,0 +1,253 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/tracking/text/cog.py:254 +msgctxt "cmd:configure_message_exp" +msgid "message_exp" +msgstr "nfttbhf_fyq" + +#: src/tracking/text/cog.py:257 +msgctxt "cmd:configure_message_exp|desc" +msgid "Configure Message Tracking & Experience" +msgstr "Dpogjhvsf Nfttbhf Usbdljoh & Fyqfsjfodf" + +#: src/tracking/text/cog.py:320 +msgctxt "cmd:leo_configure_exp_rates" +msgid "experience_rates" +msgstr "fyqfsjfodf_sbuft" + +#: src/tracking/text/cog.py:323 +msgctxt "cmd:leo_configure_exp_rates|desc" +msgid "Global experience rate configuration" +msgstr "Hmpcbm fyqfsjfodf sbuf dpogjhvsbujpo" + +#: src/tracking/text/ui.py:45 +msgctxt "ui:text_tracker_config|menu:untracked_channels|placeholder" +msgid "Select Untracked Channels" +msgstr "Tfmfdu Vousbdlfe Diboofmt" + +#: src/tracking/text/ui.py:52 +msgctxt "ui:text_tracker_config|embed|title" +msgid "Message Tracking Configuration Panel" +msgstr "Nfttbhf Usbdljoh Dpogjhvsbujpo Qbofm" + +#: src/tracking/text/ui.py:89 +msgctxt "dash:text_tracking|title" +msgid "Message XP configuration ({commands[configure message_exp]})" +msgstr "Nfttbhf YQ dpogjhvsbujpo ({commands[configure message_exp]})" + +#: src/tracking/text/ui.py:93 +msgctxt "dash:text_tracking|dropdown|placeholder" +msgid "Message XP Panel" +msgstr "Nfttbhf YQ Qbofm" + +#: src/tracking/text/settings.py:33 +msgctxt "guildset:xp_per_period" +msgid "xp_per_5min" +msgstr "yq_qfs_5njo" + +#: src/tracking/text/settings.py:36 +msgctxt "guildset:xp_per_period|desc" +msgid "" +"How much XP members will be given every 5 minute period they are active." +msgstr "" +"Ipx nvdi YQ nfncfst xjmm cf hjwfo fwfsz 5 njovuf qfsjpe uifz bsf bdujwf." + +#: src/tracking/text/settings.py:40 +msgctxt "guildset:xp_per_period|long_desc" +msgid "" +"Amount of message XP to give members for each 5 minute period in which they " +"are active (send a message). Note that this XP is only given *once* per " +"period." +msgstr "" +"Bnpvou pg nfttbhf YQ up hjwf nfncfst gps fbdi 5 njovuf qfsjpe jo xijdi uifz " +"bsf bdujwf (tfoe b nfttbhf). Opuf uibu uijt YQ jt pomz hjwfo *podf* qfs " +"qfsjpe." + +#: src/tracking/text/settings.py:45 +msgctxt "guildset:xp_per_period|accepts" +msgid "Number of message XP to reward per 5 minute active period." +msgstr "Ovncfs pg nfttbhf YQ up sfxbse qfs 5 njovuf bdujwf qfsjpe." + +#: src/tracking/text/settings.py:57 +#, possible-python-brace-format +msgctxt "guildset:xp_per_period|set_response" +msgid "" +"For every **5** minutes they are active (i.e. in which they send a message)," +" members will now be given **{amount}** XP." +msgstr "" +"Gps fwfsz **5** njovuft uifz bsf bdujwf (j.f. jo xijdi uifz tfoe b nfttbhf)," +" nfncfst xjmm opx cf hjwfo **{amount}** YQ." + +#: src/tracking/text/settings.py:65 +msgctxt "guildset:word_xp" +msgid "xp_per_100words" +msgstr "yq_qfs_100xpset" + +#: src/tracking/text/settings.py:68 +msgctxt "guildset:word_xp|desc" +msgid "How much XP members will be given per hundred words they write." +msgstr "Ipx nvdi YQ nfncfst xjmm cf hjwfo qfs ivoesfe xpset uifz xsjuf." + +#: src/tracking/text/settings.py:72 +msgctxt "guildset:word_xp|long_desc" +msgid "" +"Amount of message XP to be given (additionally to the XP per period) for " +"each hundred words. Useful for rewarding communication." +msgstr "" +"Bnpvou pg nfttbhf YQ up cf hjwfo (beejujpobmmz up uif YQ qfs qfsjpe) gps " +"fbdi ivoesfe xpset. Vtfgvm gps sfxbsejoh dpnnvojdbujpo." + +#: src/tracking/text/settings.py:77 +msgctxt "guildset:word_xp|accepts" +msgid "Number of XP to reward per hundred words sent." +msgstr "Ovncfs pg YQ up sfxbse qfs ivoesfe xpset tfou." + +#: src/tracking/text/settings.py:89 +#, possible-python-brace-format +msgctxt "guildset:word_xp|set_response" +msgid "" +"For every **100** words they send, members will now be rewarded an " +"additional **{amount}** XP." +msgstr "" +"Gps fwfsz **100** xpset uifz tfoe, nfncfst xjmm opx cf sfxbsefe bo " +"beejujpobm **{amount}** YQ." + +#: src/tracking/text/settings.py:95 +msgctxt "guildset:untracked_text_channels" +msgid "untracked_text_channels" +msgstr "vousbdlfe_ufyu_diboofmt" + +#: src/tracking/text/settings.py:98 +msgctxt "guildset:untracked_text_channels|desc" +msgid "Channels in which Message XP will not be given." +msgstr "Diboofmt jo xijdi Nfttbhf YQ xjmm opu cf hjwfo." + +#: src/tracking/text/settings.py:102 +msgctxt "guildset:untracked_text_channels|long_desc" +msgid "" +"Messages sent in these channels will not count towards a member's message " +"XP. If a category is selected, then all channels under the category will " +"also be untracked." +msgstr "" +"Nfttbhft tfou jo uiftf diboofmt xjmm opu dpvou upxbset b nfncfs't nfttbhf " +"YQ. Jg b dbufhpsz jt tfmfdufe, uifo bmm diboofmt voefs uif dbufhpsz xjmm " +"bmtp cf vousbdlfe." + +#: src/tracking/text/settings.py:107 +msgctxt "guildset:untracked_text_channels|accepts" +msgid "Comma separated list of untracked text channel names or ids." +msgstr "Dpnnb tfqbsbufe mjtu pg vousbdlfe ufyu diboofm obnft ps jet." + +#: src/tracking/text/settings.py:111 +msgctxt "guildset:untracked_text_channels|notset" +msgid "Not Set (all text channels will be tracked.)" +msgstr "Opu Tfu (bmm ufyu diboofmt xjmm cf usbdlfe.)" + +#: src/tracking/text/settings.py:128 +#, possible-python-brace-format +msgctxt "guildset:untracked_text_channels|set_response|set" +msgid "" +"Messages in or under the following channels will be ignored: {channels}" +msgstr "" +"Nfttbhft jo ps voefs uif gpmmpxjoh diboofmt xjmm cf jhopsfe: {channels}" + +#: src/tracking/text/settings.py:133 +msgctxt "guildset:untracked_text_channels|set_response|notset" +msgid "Message XP will now be tracked in every channel." +msgstr "Nfttbhf YQ xjmm opx cf usbdlfe jo fwfsz diboofm." + +#: src/tracking/text/settings.py:142 +msgctxt "guildset:untracked_text_channels|set_using" +msgid "Channel selector below" +msgstr "Diboofm tfmfdups cfmpx" + +#: src/tracking/text/settings.py:173 +msgctxt "botset:xp_per_period" +msgid "xp_per_5min" +msgstr "yq_qfs_5njo" + +#: src/tracking/text/settings.py:176 +msgctxt "botset:xp_per_period|desc" +msgid "" +"How much global XP members will be given every 5 minute period they are " +"active." +msgstr "" +"Ipx nvdi hmpcbm YQ nfncfst xjmm cf hjwfo fwfsz 5 njovuf qfsjpe uifz bsf " +"bdujwf." + +#: src/tracking/text/settings.py:180 +msgctxt "botset:xp_per_period|long_desc" +msgid "" +"Amount of global message XP to give members for each 5 minute period in " +"which they are active (send a message). Note that this XP is only given " +"*once* per period." +msgstr "" +"Bnpvou pg hmpcbm nfttbhf YQ up hjwf nfncfst gps fbdi 5 njovuf qfsjpe jo " +"xijdi uifz bsf bdujwf (tfoe b nfttbhf). Opuf uibu uijt YQ jt pomz hjwfo " +"*podf* qfs qfsjpe." + +#: src/tracking/text/settings.py:186 +msgctxt "botset:xp_per_period|accepts" +msgid "Number of message XP to reward per 5 minute active period." +msgstr "Ovncfs pg nfttbhf YQ up sfxbse qfs 5 njovuf bdujwf qfsjpe." + +#: src/tracking/text/settings.py:198 +#, possible-python-brace-format +msgctxt "leoset:xp_per_period|set_response" +msgid "" +"For every **5** minutes they are active (i.e. in which they send a message)," +" all users will now be given **{amount}** global XP." +msgstr "" +"Gps fwfsz **5** njovuft uifz bsf bdujwf (j.f. jo xijdi uifz tfoe b nfttbhf)," +" bmm vtfst xjmm opx cf hjwfo **{amount}** hmpcbm YQ." + +#: src/tracking/text/settings.py:206 +msgctxt "botset:word_xp" +msgid "xp_per_100words" +msgstr "yq_qfs_100xpset" + +#: src/tracking/text/settings.py:209 +msgctxt "botset:word_xp|desc" +msgid "How much global XP members will be given per hundred words they write." +msgstr "" +"Ipx nvdi hmpcbm YQ nfncfst xjmm cf hjwfo qfs ivoesfe xpset uifz xsjuf." + +#: src/tracking/text/settings.py:213 +msgctxt "botset:word_xp|long_desc" +msgid "" +"Amount of global message XP to be given (additionally to the XP per period) " +"for each hundred words. Useful for rewarding communication." +msgstr "" +"Bnpvou pg hmpcbm nfttbhf YQ up cf hjwfo (beejujpobmmz up uif YQ qfs qfsjpe) " +"gps fbdi ivoesfe xpset. Vtfgvm gps sfxbsejoh dpnnvojdbujpo." + +#: src/tracking/text/settings.py:218 +msgctxt "botset:word_xp|accepts" +msgid "Number of XP to reward per hundred words sent." +msgstr "Ovncfs pg YQ up sfxbse qfs ivoesfe xpset tfou." + +#: src/tracking/text/settings.py:230 +#, possible-python-brace-format +msgctxt "leoset:word_xp|set_response" +msgid "" +"For every **100** words they send, users will now be rewarded an additional " +"**{amount}** global XP." +msgstr "" +"Gps fwfsz **100** xpset uifz tfoe, vtfst xjmm opx cf sfxbsefe bo beejujpobm " +"**{amount}** hmpcbm YQ." diff --git a/locales/ceaser/LC_MESSAGES/timer-gui.po b/locales/ceaser/LC_MESSAGES/timer-gui.po new file mode 100644 index 00000000..8461f2bd --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/timer-gui.po @@ -0,0 +1,32 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/cards/timer.py:73 +msgctxt "skin:timer|field:date_text" +msgid "Use /now to show what you are working on!" +msgstr "Vtf /opx up tipx xibu zpv bsf xpsljoh po!" + +#: src/gui/cards/timer.py:89 +msgctxt "skin:timer|stage:focus|field:stage_text" +msgid "FOCUS" +msgstr "GPDVT" + +#: src/gui/cards/timer.py:103 +msgctxt "skin:timer|stage:break|field:stage_text" +msgid "BREAK" +msgstr "CSFBL" diff --git a/locales/ceaser/LC_MESSAGES/user_config.po b/locales/ceaser/LC_MESSAGES/user_config.po new file mode 100644 index 00000000..9612aa8a --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/user_config.po @@ -0,0 +1,102 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/user_config/cog.py:38 +msgctxt "userset:timezone" +msgid "timezone" +msgstr "ujnfapof" + +#: src/modules/user_config/cog.py:41 +msgctxt "userset:timezone|desc" +msgid "Timezone in which to display statistics." +msgstr "Ujnfapof jo xijdi up ejtqmbz tubujtujdt." + +#: src/modules/user_config/cog.py:45 +msgctxt "userset:timezone|long_desc" +msgid "" +"All personal time-related features of StudyLion will use this timezone for " +"you, including personal statistics. Note that leaderboards will still be " +"shown in the server's own timezone." +msgstr "" +"Bmm qfstpobm ujnf-sfmbufe gfbuvsft pg TuvezMjpo xjmm vtf uijt ujnfapof gps " +"zpv, jodmvejoh qfstpobm tubujtujdt. Opuf uibu mfbefscpbset xjmm tujmm cf " +"tipxo jo uif tfswfs't pxo ujnfapof." + +#: src/modules/user_config/cog.py:60 +#, possible-python-brace-format +msgctxt "userset:timezone|response:set" +msgid "Your personal timezone has been set to `{timezone}`." +msgstr "Zpvs qfstpobm ujnfapof ibt cffo tfu up `{timezone}`." + +#: src/modules/user_config/cog.py:65 +msgctxt "userset:timezone|response:unset" +msgid "" +"You have unset your timezone. Statistics will be displayed in the server " +"timezone." +msgstr "" +"Zpv ibwf votfu zpvs ujnfapof. Tubujtujdt xjmm cf ejtqmbzfe jo uif tfswfs " +"ujnfapof." + +#: src/modules/user_config/cog.py:81 +msgctxt "cmd:userconfig" +msgid "my" +msgstr "nz" + +#: src/modules/user_config/cog.py:82 +msgctxt "cmd:userconfig|desc" +msgid "User configuration commands." +msgstr "Vtfs dpogjhvsbujpo dpnnboet." + +#: src/modules/user_config/cog.py:89 +msgctxt "cmd:userconfig_timezone" +msgid "timezone" +msgstr "ujnfapof" + +#: src/modules/user_config/cog.py:92 +msgctxt "cmd:userconfig_timezone|desc" +msgid "" +"Set your personal timezone, used for displaying stats and setting reminders." +msgstr "" +"Tfu zpvs qfstpobm ujnfapof, vtfe gps ejtqmbzjoh tubut boe tfuujoh sfnjoefst." + +#: src/modules/user_config/cog.py:96 +msgctxt "cmd:userconfig_timezone|param:timezone" +msgid "timezone" +msgstr "ujnfapof" + +#: src/modules/user_config/cog.py:101 +msgctxt "cmd:userconfig_timezone|param:timezone|desc" +msgid "What timezone are you in? Try typing your country or continent." +msgstr "Xibu ujnfapof bsf zpv jo? Usz uzqjoh zpvs dpvousz ps dpoujofou." + +#: src/modules/user_config/cog.py:117 +#, possible-python-brace-format +msgctxt "cmd:userconfig_timezone|response:set" +msgid "Your timezone is currently set to {timezone}" +msgstr "Zpvs ujnfapof jt dvssfoumz tfu up {timezone}" + +#: src/modules/user_config/cog.py:121 +msgctxt "cmd:userconfig_timezone|button:reset|label" +msgid "Reset" +msgstr "Sftfu" + +#: src/modules/user_config/cog.py:133 +#, possible-python-brace-format +msgctxt "cmd:userconfig_timezone|response:unset" +msgid "Your timezone is not set. Using the server timezone `{timezone}`." +msgstr "Zpvs ujnfapof jt opu tfu. Vtjoh uif tfswfs ujnfapof `{timezone}`." diff --git a/locales/ceaser/LC_MESSAGES/utils.po b/locales/ceaser/LC_MESSAGES/utils.po new file mode 100644 index 00000000..b27fe91f --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/utils.po @@ -0,0 +1,528 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/utils/cog.py:18 +msgctxt "cmd:page" +msgid "page" +msgstr "qbhf" + +#: src/utils/cog.py:21 +msgctxt "cmd:page|desc" +msgid "" +"Jump to a given page of the ouput of a previous command in this channel." +msgstr "" +"Kvnq up b hjwfo qbhf pg uif pvqvu pg b qsfwjpvt dpnnboe jo uijt diboofm." + +#: src/utils/cog.py:34 +msgctxt "cmd:page|error:no_pager" +msgid "No pager listening in this channel!" +msgstr "Op qbhfs mjtufojoh jo uijt diboofm!" + +#: src/utils/cog.py:45 +msgctxt "cmd:page_next" +msgid "next" +msgstr "ofyu" + +#: src/utils/cog.py:46 +msgctxt "cmd:page_next|desc" +msgid "Jump to the next page of output." +msgstr "Kvnq up uif ofyu qbhf pg pvuqvu." + +#: src/utils/cog.py:52 +msgctxt "cmd:page_prev" +msgid "prev" +msgstr "qsfw" + +#: src/utils/cog.py:53 +msgctxt "cmd:page_prev|desc" +msgid "Jump to the previous page of output." +msgstr "Kvnq up uif qsfwjpvt qbhf pg pvuqvu." + +#: src/utils/cog.py:59 +msgctxt "cmd:page_first" +msgid "first" +msgstr "gjstu" + +#: src/utils/cog.py:60 +msgctxt "cmd:page_first|desc" +msgid "Jump to the first page of output." +msgstr "Kvnq up uif gjstu qbhf pg pvuqvu." + +#: src/utils/cog.py:66 +msgctxt "cmd:page_last" +msgid "last" +msgstr "mbtu" + +#: src/utils/cog.py:67 +msgctxt "cmd:page_last|desc" +msgid "Jump to the last page of output." +msgstr "Kvnq up uif mbtu qbhf pg pvuqvu." + +#: src/utils/cog.py:73 +msgctxt "cmd:page_select" +msgid "select" +msgstr "tfmfdu" + +#: src/utils/cog.py:74 +msgctxt "cmd:page_select|desc" +msgid "Select a page of the output to jump to." +msgstr "Tfmfdu b qbhf pg uif pvuqvu up kvnq up." + +#: src/utils/cog.py:77 +msgctxt "cmd:page_select|param:page" +msgid "page" +msgstr "qbhf" + +#: src/utils/cog.py:80 +msgctxt "cmd:page_select|param:page|desc" +msgid "The page name or number to jump to." +msgstr "Uif qbhf obnf ps ovncfs up kvnq up." + +#: src/utils/cog.py:86 +msgctxt "cmd:page_select|error:no_pager" +msgid "No pager listening in this channel!" +msgstr "Op qbhfs mjtufojoh jo uijt diboofm!" + +#: src/utils/cog.py:97 +msgctxt "cmd:page_select|acmpl|error:no_pager" +msgid "No active pagers in this channel!" +msgstr "Op bdujwf qbhfst jo uijt diboofm!" + +#: src/utils/transformers.py:45 +#, possible-python-brace-format +msgctxt "utils:parse_dur|error" +msgid "Cannot parse `{value}` as a duration." +msgstr "Dboopu qbstf `{value}` bt b evsbujpo." + +#: src/utils/transformers.py:71 +#, possible-python-brace-format +msgctxt "util:Duration|acmpl|error" +msgid "Cannot extract duration from \"{partial}\"" +msgstr "Dboopu fyusbdu evsbujpo gspn \"{partial}\"" + +#: src/utils/lib.py:678 +msgctxt "util:parse_dur|regex:day" +msgid "(?P\\d+)\\s*(?:(d)|(day))" +msgstr "" + +#: src/utils/lib.py:685 +msgctxt "util:parse_dur|regex:hour" +msgid "(?P\\d+)\\s*(?:(h)|(hour))" +msgstr "" + +#: src/utils/lib.py:692 +msgctxt "util:parse_dur|regex:minute" +msgid "(?P\\d+)\\s*(?:(m)|(min))" +msgstr "" + +#: src/utils/lib.py:699 +msgctxt "util:parse_dur|regex:second" +msgid "(?P\\d+)\\s*(?:(s)|(sec))" +msgstr "" + +#: src/utils/ui/config.py:35 +msgctxt "ui:configui|modal:edit|title" +msgid "Setting Editor" +msgstr "Tfuujoh Fejups" + +#: src/utils/ui/config.py:75 +msgctxt "ui:configui|check|not_permitted" +msgid "You have insufficient server permissions to use this UI!" +msgstr "Zpv ibwf jotvggjdjfou tfswfs qfsnjttjpot up vtf uijt VJ!" + +#: src/utils/ui/config.py:153 +msgctxt "ui:configui|button:edit|label" +msgid "Edit" +msgstr "Feju" + +#: src/utils/ui/config.py:192 +msgctxt "ui:guild_config_base|button:reset|label" +msgid "Reset" +msgstr "Sftfu" + +#: src/utils/ui/config.py:327 +msgctxt "ui:dashboard|error:section_too_long" +msgid "" +"Oops, the settings in this configuration section are too large, and I can " +"not display them here! Please view the settings in the linked configuration " +"panel instead." +msgstr "" +"Ppqt, uif tfuujoht jo uijt dpogjhvsbujpo tfdujpo bsf upp mbshf, boe J dbo " +"opu ejtqmbz uifn ifsf! Qmfbtf wjfx uif tfuujoht jo uif mjolfe dpogjhvsbujpo " +"qbofm jotufbe." + +#. List of valid keys indicating movement to the next page +#: src/utils/ui/pagers.py:50 +msgctxt "cmd:page|pager:Pager|options:next" +msgid "n, nxt, next, forward, +" +msgstr "o, oyu, ofyu, gpsxbse, +" + +#. List of valid keys indicating movement to the previous page +#: src/utils/ui/pagers.py:53 +msgctxt "cmd:page|pager:Pager|options:prev" +msgid "p, prev, back, -" +msgstr "q, qsfw, cbdl, -" + +#. List of valid keys indicating movement to the first page +#: src/utils/ui/pagers.py:56 +msgctxt "cmd:page|pager:Pager|options:first" +msgid "f, first, one, start" +msgstr "g, gjstu, pof, tubsu" + +#. List of valid keys indicating movement to the last page +#: src/utils/ui/pagers.py:59 +msgctxt "cmd:page|pager:Pager|options:last" +msgid "l, last, end" +msgstr "m, mbtu, foe" + +#: src/utils/ui/pagers.py:273 +#, possible-python-brace-format +msgctxt "cmd:page|pager:Pager|error:parse" +msgid "Could not understand page specification `{value}`." +msgstr "Dpvme opu voefstuboe qbhf tqfdjgjdbujpo `{value}`." + +#: src/utils/ui/pagers.py:302 +#, possible-python-brace-format +msgctxt "cmd:page|acmpl|pager:Pager|choice:last" +msgid "Last: Page {page}/{total}" +msgstr "Mbtu: Qbhf {page}/{total}" + +#: src/utils/ui/pagers.py:307 +#, possible-python-brace-format +msgctxt "cmd:page|acmpl|pager:Pager|choice:current" +msgid "Current: Page {page}/{total}" +msgstr "Dvssfou: Qbhf {page}/{total}" + +#: src/utils/ui/pagers.py:319 +#, possible-python-brace-format +msgctxt "cmd:page|acmpl|pager:Pager|choice:general" +msgid "Page {page}" +msgstr "Qbhf {page}" + +#: src/utils/ui/pagers.py:353 +#, possible-python-brace-format +msgctxt "cmd:page|acmpl|pager:Page|choice:select" +msgid "Selected: Page {page}/{total}" +msgstr "Tfmfdufe: Qbhf {page}/{total}" + +#: src/utils/ui/pagers.py:363 +msgctxt "cmd:page|acmpl|pager:Page|error:parse" +msgid "No matching pages!" +msgstr "Op nbudijoh qbhft!" + +#: src/utils/ui/msgeditor.py:75 +msgctxt "ui:msg_editor|error:empty" +msgid "Rendering failed! The message content and embed cannot both be empty." +msgstr "Sfoefsjoh gbjmfe! Uif nfttbhf dpoufou boe fncfe dboopu cpui cf fnquz." + +#: src/utils/ui/msgeditor.py:86 +#, possible-python-brace-format +msgctxt "ui:msg_editor|error:embed_failed" +msgid "" +"Rendering failed! Could not parse the embed.\n" +"Error: {error}" +msgstr "" +"Sfoefsjoh gbjmfe! Dpvme opu qbstf uif fncfe.\n" +"Fssps: {error}" + +#: src/utils/ui/msgeditor.py:104 +#, possible-python-brace-format +msgctxt "ui:msg_editor|error:invalid_change" +msgid "" +"Rendering failed! The message was not modified.\n" +"Error: `{text}`" +msgstr "" +"Sfoefsjoh gbjmfe! Uif nfttbhf xbt opu npejgjfe.\n" +"Fssps: `{text}`" + +#: src/utils/ui/msgeditor.py:123 +msgctxt "ui:msg_editor|modal:content|field:content|label" +msgid "Message Content" +msgstr "Nfttbhf Dpoufou" + +#: src/utils/ui/msgeditor.py:132 +msgctxt "ui:msg_editor|modal:content|title" +msgid "Content Editor" +msgstr "Dpoufou Fejups" + +#: src/utils/ui/msgeditor.py:150 +msgctxt "ui:msg_editor|button:edit|label" +msgid "Edit Content" +msgstr "Feju Dpoufou" + +#: src/utils/ui/msgeditor.py:162 +msgctxt "ui:msg_editor|button:add_embed|sample_embed|title" +msgid "Title Placeholder" +msgstr "Ujumf Qmbdfipmefs" + +#: src/utils/ui/msgeditor.py:163 +msgctxt "ui:msg_editor|button:add_embed|sample_embed|description" +msgid "Description Placeholder" +msgstr "Eftdsjqujpo Qmbdfipmefs" + +#: src/utils/ui/msgeditor.py:174 +msgctxt "ui:msg_editor|button:add_embed|label" +msgid "Add Embed" +msgstr "Bee Fncfe" + +#: src/utils/ui/msgeditor.py:192 +msgctxt "ui:msg_editor|modal:body|field:content|label" +msgid "Message Content" +msgstr "Nfttbhf Dpoufou" + +#: src/utils/ui/msgeditor.py:203 +msgctxt "ui:msg_editor|modal:body|field:desc|label" +msgid "Embed Description" +msgstr "Fncfe Eftdsjqujpo" + +#: src/utils/ui/msgeditor.py:214 +msgctxt "ui:msg_editor|modal:body|field:title|label" +msgid "Embed Title" +msgstr "Fncfe Ujumf" + +#: src/utils/ui/msgeditor.py:225 +msgctxt "ui:msg_editor|modal:body|field:colour|label" +msgid "Embed Colour" +msgstr "Fncfe Dpmpvs" + +#: src/utils/ui/msgeditor.py:240 +msgctxt "ui:msg_editor|modal:body|title" +msgid "Message Body Editor" +msgstr "Nfttbhf Cpez Fejups" + +#: src/utils/ui/msgeditor.py:265 +msgctxt "ui:msg_editor|button:body|error:invalid_colour" +msgid "" +"Invalid colour format! Please enter colours as hex codes, e.g. `#E67E22`" +msgstr "" +"Jowbmje dpmpvs gpsnbu! Qmfbtf foufs dpmpvst bt ify dpeft, f.h. `#F67F22`" + +#: src/utils/ui/msgeditor.py:285 +msgctxt "ui:msg_editor|button:body|label" +msgid "Body" +msgstr "Cpez" + +#: src/utils/ui/msgeditor.py:302 +msgctxt "ui:msg_editor|modal:author|field:name|label" +msgid "Author Name" +msgstr "Bvuips Obnf" + +#: src/utils/ui/msgeditor.py:313 +msgctxt "ui:msg_editor|modal:author|field:link|label" +msgid "Author URL" +msgstr "Bvuips VSM" + +#: src/utils/ui/msgeditor.py:323 +msgctxt "ui:msg_editor|modal:author|field:image|label" +msgid "Author Image URL" +msgstr "Bvuips Jnbhf VSM" + +#: src/utils/ui/msgeditor.py:334 +msgctxt "ui:msg_editor|modal:author|title" +msgid "Embed Author Editor" +msgstr "Fncfe Bvuips Fejups" + +#: src/utils/ui/msgeditor.py:360 +msgctxt "ui:msg_editor|button:author|label" +msgid "Author" +msgstr "Bvuips" + +#: src/utils/ui/msgeditor.py:377 +msgctxt "ui:msg_editor|modal:footer|field:text|label" +msgid "Footer Text" +msgstr "Gppufs Ufyu" + +#: src/utils/ui/msgeditor.py:388 +msgctxt "ui:msg_editor|modal:footer|field:image|label" +msgid "Footer Image URL" +msgstr "Gppufs Jnbhf VSM" + +#: src/utils/ui/msgeditor.py:398 +msgctxt "ui:msg_editor|modal:footer|field:timestamp|label" +msgid "Embed Timestamp (in ISO format)" +msgstr "Fncfe Ujnftubnq (jo JTP gpsnbu)" + +#: src/utils/ui/msgeditor.py:410 +msgctxt "ui:msg_editor|modal:footer|title" +msgid "Embed Footer Editor" +msgstr "Fncfe Gppufs Fejups" + +#: src/utils/ui/msgeditor.py:429 +msgctxt "ui:msg_editor|button:footer|error:invalid_timestamp" +msgid "Invalid timestamp! Please enter the timestamp in ISO format." +msgstr "Jowbmje ujnftubnq! Qmfbtf foufs uif ujnftubnq jo JTP gpsnbu." + +#: src/utils/ui/msgeditor.py:449 +msgctxt "ui:msg_editor|button:footer|label" +msgid "Footer" +msgstr "Gppufs" + +#: src/utils/ui/msgeditor.py:467 +msgctxt "ui:msg_editor|modal:images|field:thumb|label" +msgid "Thumbnail Image URL" +msgstr "Uivncobjm Jnbhf VSM" + +#: src/utils/ui/msgeditor.py:477 +msgctxt "ui:msg_editor|modal:images|field:image|label" +msgid "Embed Image URL" +msgstr "Fncfe Jnbhf VSM" + +#: src/utils/ui/msgeditor.py:487 +msgctxt "ui:msg_editor|modal:images|title" +msgid "Embed images Editor" +msgstr "Fncfe jnbhft Fejups" + +#: src/utils/ui/msgeditor.py:517 +msgctxt "ui:msg_editor|button:images|label" +msgid "Images" +msgstr "Jnbhft" + +#: src/utils/ui/msgeditor.py:535 +msgctxt "ui:msg_editor|modal:add_field|field:position|label" +msgid "Field number to insert at" +msgstr "Gjfme ovncfs up jotfsu bu" + +#: src/utils/ui/msgeditor.py:545 +msgctxt "ui:msg_editor|modal:add_field|field:name|label" +msgid "Field name" +msgstr "Gjfme obnf" + +#: src/utils/ui/msgeditor.py:555 +msgctxt "ui:msg_editor|modal:add_field|field:value|label" +msgid "Field value" +msgstr "Gjfme wbmvf" + +#: src/utils/ui/msgeditor.py:565 +msgctxt "ui:msg_editor|modal:add_field|field:inline|label" +msgid "Whether the field is inline" +msgstr "Xifuifs uif gjfme jt jomjof" + +#: src/utils/ui/msgeditor.py:569 +msgctxt "ui:msg_editor|modal:add_field|field:inline|placeholder" +msgid "True/False" +msgstr "Usvf/Gbmtf" + +#: src/utils/ui/msgeditor.py:582 +msgctxt "ui:msg_editor|modal:add_field|title" +msgid "Add Embed Field" +msgstr "Bee Fncfe Gjfme" + +#: src/utils/ui/msgeditor.py:602 +msgctxt "ui:msg_editor|modal:add_field|error:position_not_int" +msgid "The field position must be an integer!" +msgstr "Uif gjfme qptjujpo nvtu cf bo joufhfs!" + +#: src/utils/ui/msgeditor.py:621 +msgctxt "ui:msg_editor|button:add_field|label" +msgid "Add Field" +msgstr "Bee Gjfme" + +#: src/utils/ui/msgeditor.py:637 +msgctxt "ui:msg_editor|format_field|name_placeholder" +msgid "-" +msgstr "-" + +#: src/utils/ui/msgeditor.py:666 +msgctxt "ui:msg_editor|modal:edit_field|field:name|label" +msgid "Field name" +msgstr "Gjfme obnf" + +#: src/utils/ui/msgeditor.py:677 +msgctxt "ui:msg_editor|modal:edit_field|field:value|label" +msgid "Field value" +msgstr "Gjfme wbmvf" + +#: src/utils/ui/msgeditor.py:688 +msgctxt "ui:msg_editor|modal:edit_field|field:inline|label" +msgid "Whether the field is inline" +msgstr "Xifuifs uif gjfme jt jomjof" + +#: src/utils/ui/msgeditor.py:692 +msgctxt "ui:msg_editor|modal:edit_field|field:inline|placeholder" +msgid "True/False" +msgstr "Usvf/Gbmtf" + +#: src/utils/ui/msgeditor.py:704 +msgctxt "ui:msg_editor|modal:edit_field|title" +msgid "Edit Embed Field" +msgstr "Feju Fncfe Gjfme" + +#: src/utils/ui/msgeditor.py:733 +msgctxt "ui:msg_editor|menu:edit_field|placeholder" +msgid "Edit Embed Field" +msgstr "Feju Fncfe Gjfme" + +#: src/utils/ui/msgeditor.py:772 +msgctxt "ui:msg_deleteor|menu:delete_field|placeholder" +msgid "Remove Embed Field" +msgstr "Sfnpwf Fncfe Gjfme" + +#: src/utils/ui/msgeditor.py:808 +msgctxt "ui:msg_editor|button:save|label" +msgid "Save" +msgstr "Tbwf" + +#: src/utils/ui/msgeditor.py:833 +msgctxt "ui:msg_editor|button:download|label" +msgid "Download" +msgstr "Epxompbe" + +#: src/utils/ui/msgeditor.py:852 +msgctxt "ui:msg_editor|button:undo|label" +msgid "Undo" +msgstr "Voep" + +#: src/utils/ui/msgeditor.py:872 +msgctxt "ui:msg_editor|button:redo|label" +msgid "Redo" +msgstr "Sfep" + +#: src/utils/ui/msgeditor.py:891 +msgctxt "ui:msg_editor|button:quit|confirm" +msgid "You have unsaved changes! Are you sure you want to quit?" +msgstr "Zpv ibwf votbwfe dibohft! Bsf zpv tvsf zpv xbou up rvju?" + +#: src/utils/ui/msgeditor.py:896 +msgctxt "ui:msg_editor|button:quit|confirm|button:yes" +msgid "Yes, Quit Now" +msgstr "Zft, Rvju Opx" + +#: src/utils/ui/msgeditor.py:902 +msgctxt "ui:msg_editor|button:quit|confirm|button:no" +msgid "No, Go Back" +msgstr "Op, Hp Cbdl" + +#: src/utils/ui/msgeditor.py:996 +msgctxt "ui:msg_editor|timeout_warning|title" +msgid "Warning!" +msgstr "Xbsojoh!" + +#: src/utils/ui/msgeditor.py:1000 +#, possible-python-brace-format +msgctxt "ui:msg_editor|timeout_warning|desc" +msgid "" +"This interface will time out {timestamp}. Press 'Continue' below to keep " +"editing." +msgstr "" +"Uijt joufsgbdf xjmm ujnf pvu {timestamp}. Qsftt 'Dpoujovf' cfmpx up lffq " +"fejujoh." + +#: src/utils/ui/msgeditor.py:1009 +msgctxt "ui:msg_editor|timeout_warning|continue" +msgid "Continue" +msgstr "Dpoujovf" diff --git a/locales/ceaser/LC_MESSAGES/video.po b/locales/ceaser/LC_MESSAGES/video.po new file mode 100644 index 00000000..16bcdf9d --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/video.po @@ -0,0 +1,366 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/modules/video_channels/settingui.py:57 +msgctxt "ui:video_config|menu:channels|placeholder" +msgid "Select Video Channels" +msgstr "Tfmfdu Wjefp Diboofmt" + +#: src/modules/video_channels/settingui.py:82 +msgctxt "ui:video_config|menu:exempt|placeholder" +msgid "Select Exempt Roles" +msgstr "Tfmfdu Fyfnqu Spmft" + +#: src/modules/video_channels/settingui.py:109 +msgctxt "ui:video_config|menu:video_blacklist|placeholder" +msgid "Select Blacklist Role" +msgstr "Tfmfdu Cmbdlmjtu Spmf" + +#: src/modules/video_channels/settingui.py:117 +msgctxt "ui:video_config|embed|title" +msgid "Video Channel Configuration Panel" +msgstr "Wjefp Diboofm Dpogjhvsbujpo Qbofm" + +#: src/modules/video_channels/settingui.py:156 +msgctxt "dash:video|title" +msgid "Video Channel Settings ({commands[configure video_channels]})" +msgstr "Wjefp Diboofm Tfuujoht ({commands[configure video_channels]})" + +#: src/modules/video_channels/settingui.py:160 +msgctxt "dash:video|option|name" +msgid "Video Channel Panel" +msgstr "Wjefp Diboofm Qbofm" + +#: src/modules/video_channels/cog.py:229 +msgctxt "video_watchdog|kick_blacklisted_member|audit_reason" +msgid "Removing video blacklisted member from a video channel." +msgstr "Sfnpwjoh wjefp cmbdlmjtufe nfncfs gspn b wjefp diboofm." + +#: src/modules/video_channels/cog.py:246 +msgctxt "video_watchdog|kick_blacklisted_member|notification|title" +msgid "You have been disconnected." +msgstr "Zpv ibwf cffo ejtdpoofdufe." + +#: src/modules/video_channels/cog.py:250 +#, possible-python-brace-format +msgctxt "video_watchdog|kick_blacklisted_member|notification|desc" +msgid "" +"You were disconnected from the video channel {channel} because you are " +"blacklisted from video channels in **{server}**." +msgstr "" +"Zpv xfsf ejtdpoofdufe gspn uif wjefp diboofm {channel} cfdbvtf zpv bsf " +"cmbdlmjtufe gspn wjefp diboofmt jo **{server}**." + +#: src/modules/video_channels/cog.py:290 +#, possible-python-brace-format +msgctxt "video_watchdog|join_task|jump_field" +msgid "[Click to jump back]({link})" +msgstr "[Dmjdl up kvnq cbdl]({link})" + +#: src/modules/video_channels/cog.py:297 +msgctxt "video_watchdog|join_task|initial_request:title" +msgid "Please enable your video!" +msgstr "Qmfbtf fobcmf zpvs wjefp!" + +#: src/modules/video_channels/cog.py:301 +#, possible-python-brace-format +msgctxt "video_watchdog|join_task|initial_request:description" +msgid "" +"**You have joined the video channel {channel}!**\n" +"Please **enable your video** or **leave the channel** or you will be disconnected {timestamp} and potentially **blacklisted**." +msgstr "" +"**Zpv ibwf kpjofe uif wjefp diboofm {channel}!**\n" +"Qmfbtf **fobcmf zpvs wjefp** ps **mfbwf uif diboofm** ps zpv xjmm cf ejtdpoofdufe {timestamp} boe qpufoujbmmz **cmbdlmjtufe**." + +#: src/modules/video_channels/cog.py:316 +msgctxt "video_watchdog|join_task|thanks:title" +msgid "Thanks for enabling your video!" +msgstr "Uibolt gps fobcmjoh zpvs wjefp!" + +#: src/modules/video_channels/cog.py:323 +msgctxt "video_watchdog|join_task|bye:title" +msgid "Thanks for leaving the channel promptly!" +msgstr "Uibolt gps mfbwjoh uif diboofm qspnqumz!" + +#: src/modules/video_channels/cog.py:367 +msgctxt "video_watchdog|join_task|kick_after_grace|audit_reason" +msgid "Member never enabled their video in video channel." +msgstr "Nfncfs ofwfs fobcmfe uifjs wjefp jo wjefp diboofm." + +#: src/modules/video_channels/cog.py:385 +#, possible-python-brace-format +msgctxt "video_watchdog|join_task|kick_after_grace|ticket_reason" +msgid "Failed to enable their video in time in the video channel {channel}" +msgstr "Gbjmfe up fobcmf uifjs wjefp jo ujnf jo uif wjefp diboofm {channel}" + +#: src/modules/video_channels/cog.py:403 +msgctxt "video_watchdog|join_task|kick_after_grace|warning|title" +msgid "You have received a warning!" +msgstr "Zpv ibwf sfdfjwfe b xbsojoh!" + +#: src/modules/video_channels/cog.py:407 +#, possible-python-brace-format +msgctxt "video_watchdog|join_task|kick_after_grace|warning|desc" +msgid "" +"**You must enable your camera in camera-only rooms.**\n" +"You have been disconnected from the video {channel} for not enabling your camera." +msgstr "" +"**Zpv nvtu fobcmf zpvs dbnfsb jo dbnfsb-pomz sppnt.**\n" +"Zpv ibwf cffo ejtdpoofdufe gspn uif wjefp {channel} gps opu fobcmjoh zpvs dbnfsb." + +#: src/modules/video_channels/cog.py:422 +msgctxt "video_watchdog|join_task|kick_after_grace|blacklist|title" +msgid "You have been blacklisted!" +msgstr "Zpv ibwf cffo cmbdlmjtufe!" + +#: src/modules/video_channels/cog.py:426 +msgctxt "video_watchdog|join_task|kick_after_grace|blacklist|desc" +msgid "You have been blacklisted from the video channels in this server." +msgstr "Zpv ibwf cffo cmbdlmjtufe gspn uif wjefp diboofmt jo uijt tfswfs." + +#: src/modules/video_channels/cog.py:459 +#, possible-python-brace-format +msgctxt "video_watchdog|disabled_video_kick|audit_reason" +msgid "" +"Disconnected for disabling video for more than {number} seconds in video " +"channel." +msgstr "" +"Ejtdpoofdufe gps ejtbcmjoh wjefp gps npsf uibo {number} tfdpoet jo wjefp " +"diboofm." + +#: src/modules/video_channels/cog.py:474 +msgctxt "video_watchdog|disabled_video_kick|notification|title" +msgid "You have been disconnected." +msgstr "Zpv ibwf cffo ejtdpoofdufe." + +#: src/modules/video_channels/cog.py:478 +#, possible-python-brace-format +msgctxt "video_watchdog|disabled_video_kick|notification|desc" +msgid "" +"You were disconnected from the video channel {channel} because you disabled your video.\n" +"Please keep your video on at all times, and leave the channel if you need to disable it!" +msgstr "" +"Zpv xfsf ejtdpoofdufe gspn uif wjefp diboofm {channel} cfdbvtf zpv ejtbcmfe zpvs wjefp.\n" +"Qmfbtf lffq zpvs wjefp po bu bmm ujnft, boe mfbwf uif diboofm jg zpv offe up ejtbcmf ju!" + +#: src/modules/video_channels/cog.py:510 +msgctxt "cmd:configure_video" +msgid "video_channels" +msgstr "wjefp_diboofmt" + +#: src/modules/video_channels/cog.py:512 +msgctxt "cmd:configure_video|desc" +msgid "Configure video-only channels and blacklisting." +msgstr "Dpogjhvsf wjefp-pomz diboofmt boe cmbdlmjtujoh." + +#: src/modules/video_channels/settings.py:29 +msgctxt "guildset:video_channels" +msgid "video_channels" +msgstr "wjefp_diboofmt" + +#: src/modules/video_channels/settings.py:32 +msgctxt "guildset:video_channels|desc" +msgid "List of voice channels and categories in which to enforce video." +msgstr "Mjtu pg wpjdf diboofmt boe dbufhpsjft jo xijdi up fogpsdf wjefp." + +#: src/modules/video_channels/settings.py:36 +msgctxt "guildset:video_channels|long_desc" +msgid "" +"Member will be required to turn on their video in these channels.\n" +"If they do not enable their video with `15` seconds of joining, they will be asked to enable it through a notification in direct messages or the `alert_channel`. If they still have not enabled it after the `video_grace_period` has passed, they will be kicked from the channel. Further, after the first offence (which is considered a warning), they will be given the `video_blacklist` role, if configured, which will stop them from joining video channels.\n" +"As usual, if a category is configured, this will apply to all voice channels under the category." +msgstr "" +"Nfncfs xjmm cf sfrvjsfe up uvso po uifjs wjefp jo uiftf diboofmt.\n" +"Jg uifz ep opu fobcmf uifjs wjefp xjui `15` tfdpoet pg kpjojoh, uifz xjmm cf btlfe up fobcmf ju uispvhi b opujgjdbujpo jo ejsfdu nfttbhft ps uif `bmfsu_diboofm`. Jg uifz tujmm ibwf opu fobcmfe ju bgufs uif `wjefp_hsbdf_qfsjpe` ibt qbttfe, uifz xjmm cf ljdlfe gspn uif diboofm. Gvsuifs, bgufs uif gjstu pggfodf (xijdi jt dpotjefsfe b xbsojoh), uifz xjmm cf hjwfo uif `wjefp_cmbdlmjtu` spmf, jg dpogjhvsfe, xijdi xjmm tupq uifn gspn kpjojoh wjefp diboofmt.\n" +"Bt vtvbm, jg b dbufhpsz jt dpogjhvsfe, uijt xjmm bqqmz up bmm wpjdf diboofmt voefs uif dbufhpsz." + +#: src/modules/video_channels/settings.py:50 +msgctxt "guildset:video_channels|accepts" +msgid "Comma separated channel ids or names." +msgstr "Dpnnb tfqbsbufe diboofm jet ps obnft." + +#: src/modules/video_channels/settings.py:67 +#, possible-python-brace-format +msgctxt "guildset:video_channels|set_response:set" +msgid "" +"Members will be asked to turn on their video in the following channels: " +"{channels}" +msgstr "" +"Nfncfst xjmm cf btlfe up uvso po uifjs wjefp jo uif gpmmpxjoh diboofmt: " +"{channels}" + +#: src/modules/video_channels/settings.py:72 +msgctxt "guildset:video_channels|set_response:unset" +msgid "Members will not be asked to turn on their video in any channels." +msgstr "Nfncfst xjmm opu cf btlfe up uvso po uifjs wjefp jo boz diboofmt." + +#: src/modules/video_channels/settings.py:105 +msgctxt "guildset:video_blacklist" +msgid "video_blacklist" +msgstr "wjefp_cmbdlmjtu" + +#: src/modules/video_channels/settings.py:108 +msgctxt "guildset:video_blacklist|desc" +msgid "Role given when members are blacklisted from video channels." +msgstr "Spmf hjwfo xifo nfncfst bsf cmbdlmjtufe gspn wjefp diboofmt." + +#: src/modules/video_channels/settings.py:112 +msgctxt "guildset:video_blacklist|long_desc" +msgid "" +"This role will be automatically given after a member has failed to keep their video enabled in a video channel (see above).\n" +"Members who have this role will not be able to join configured video channels. The role permissions may be freely configured by server admins to place further restrictions on the offender.\n" +"The role may also be manually assigned, to the same effect.\n" +"If this role is not set, no video blacklist will occur, and members will only be kicked from the channel and warned." +msgstr "" +"Uijt spmf xjmm cf bvupnbujdbmmz hjwfo bgufs b nfncfs ibt gbjmfe up lffq uifjs wjefp fobcmfe jo b wjefp diboofm (tff bcpwf).\n" +"Nfncfst xip ibwf uijt spmf xjmm opu cf bcmf up kpjo dpogjhvsfe wjefp diboofmt. Uif spmf qfsnjttjpot nbz cf gsffmz dpogjhvsfe cz tfswfs benjot up qmbdf gvsuifs sftusjdujpot po uif pggfoefs.\n" +"Uif spmf nbz bmtp cf nbovbmmz bttjhofe, up uif tbnf fggfdu.\n" +"Jg uijt spmf jt opu tfu, op wjefp cmbdlmjtu xjmm pddvs, boe nfncfst xjmm pomz cf ljdlfe gspn uif diboofm boe xbsofe." + +#: src/modules/video_channels/settings.py:123 +msgctxt "guildset:video_blacklist|accepts" +msgid "Blacklist role name or id." +msgstr "Cmbdlmjtu spmf obnf ps je." + +#: src/modules/video_channels/settings.py:138 +#, possible-python-brace-format +msgctxt "guildset:video_blacklist|set_response:set" +msgid "Members who fail to keep their video on will be given {role}" +msgstr "Nfncfst xip gbjm up lffq uifjs wjefp po xjmm cf hjwfo {role}" + +#: src/modules/video_channels/settings.py:143 +msgctxt "guildset:video_blacklist|set_response:unset" +msgid "" +"Members will no longer be automatically blacklisted from video channels." +msgstr "" +"Nfncfst xjmm op mpohfs cf bvupnbujdbmmz cmbdlmjtufe gspn wjefp diboofmt." + +#: src/modules/video_channels/settings.py:155 +msgctxt "guildset:video_blacklist|formatted:unset" +msgid "Not Set. (Members will not be automatically blacklisted.)" +msgstr "Opu Tfu. (Nfncfst xjmm opu cf bvupnbujdbmmz cmbdlmjtufe.)" + +#: src/modules/video_channels/settings.py:162 +msgctxt "guildset:video_durations" +msgid "video_blacklist_durations" +msgstr "wjefp_cmbdlmjtu_evsbujpot" + +#: src/modules/video_channels/settings.py:165 +msgctxt "guildset:video_durations|desc" +msgid "Sequence of durations for automatic video blacklists." +msgstr "Tfrvfodf pg evsbujpot gps bvupnbujd wjefp cmbdlmjtut." + +#: src/modules/video_channels/settings.py:169 +msgctxt "guildset:video_durations|long_desc" +msgid "" +"When `video_blacklist` is set and members fail to turn on their video within the configured `video_grace_period`, they will be automatically blacklisted (i.e. given the `video_blacklist` role).\n" +"This setting describes *how long* the member will be blacklisted for, for each offence.\n" +"E.g. if this is set to `1d, 7d, 30d`, then on the first offence the member will be blacklisted for 1 day, on the second for 7 days, and on the third for 30 days. A subsequent offence will result in an infinite blacklist." +msgstr "" +"Xifo `wjefp_cmbdlmjtu` jt tfu boe nfncfst gbjm up uvso po uifjs wjefp xjuijo uif dpogjhvsfe `wjefp_hsbdf_qfsjpe`, uifz xjmm cf bvupnbujdbmmz cmbdlmjtufe (j.f. hjwfo uif `wjefp_cmbdlmjtu` spmf).\n" +"Uijt tfuujoh eftdsjcft *ipx mpoh* uif nfncfs xjmm cf cmbdlmjtufe gps, gps fbdi pggfodf.\n" +"F.h. jg uijt jt tfu up `1e, 7e, 30e`, uifo po uif gjstu pggfodf uif nfncfs xjmm cf cmbdlmjtufe gps 1 ebz, po uif tfdpoe gps 7 ebzt, boe po uif uijse gps 30 ebzt. B tvctfrvfou pggfodf xjmm sftvmu jo bo jogjojuf cmbdlmjtu." + +#: src/modules/video_channels/settings.py:181 +msgctxt "guildset:video_durations|accepts" +msgid "Comma separated list of durations." +msgstr "Dpnnb tfqbsbufe mjtu pg evsbujpot." + +#: src/modules/video_channels/settings.py:208 +#, possible-python-brace-format +msgctxt "guildset:video_durations|set_response:set" +msgid "Members will be automatically blacklisted for: {durations}" +msgstr "Nfncfst xjmm cf bvupnbujdbmmz cmbdlmjtufe gps: {durations}" + +#: src/modules/video_channels/settings.py:213 +msgctxt "guildset:video_durations|set_response:unset" +msgid "Video blacklists are now always permanent." +msgstr "Wjefp cmbdlmjtut bsf opx bmxbzt qfsnbofou." + +#: src/modules/video_channels/settings.py:221 +msgctxt "guildset:video_grace_period" +msgid "video_grace_period" +msgstr "wjefp_hsbdf_qfsjpe" + +#: src/modules/video_channels/settings.py:224 +msgctxt "guildset:video_grace_period|desc" +msgid "" +"How long to wait (in seconds) before kicking/blacklist members who don't " +"enable their video." +msgstr "" +"Ipx mpoh up xbju (jo tfdpoet) cfgpsf ljdljoh/cmbdlmjtu nfncfst xip epo'u " +"fobcmf uifjs wjefp." + +#: src/modules/video_channels/settings.py:228 +msgctxt "guildset:video_grace_period|long_desc" +msgid "" +"The length of time a member has to enable their video after joining a video " +"channel. After this time, if they have not enabled their video, they will be" +" kicked from the channel and potentially blacklisted from video channels." +msgstr "" +"Uif mfohui pg ujnf b nfncfs ibt up fobcmf uifjs wjefp bgufs kpjojoh b wjefp " +"diboofm. Bgufs uijt ujnf, jg uifz ibwf opu fobcmfe uifjs wjefp, uifz xjmm cf" +" ljdlfe gspn uif diboofm boe qpufoujbmmz cmbdlmjtufe gspn wjefp diboofmt." + +#: src/modules/video_channels/settings.py:234 +msgctxt "guildset:video_grace_period|accepts" +msgid "How many seconds to wait for a member to enable video." +msgstr "Ipx nboz tfdpoet up xbju gps b nfncfs up fobcmf wjefp." + +#: src/modules/video_channels/settings.py:248 +#, possible-python-brace-format +msgctxt "guildset:video_grace_period|set_response:set" +msgid "Members will now have **{duration}** to enable their video." +msgstr "Nfncfst xjmm opx ibwf **{duration}** up fobcmf uifjs wjefp." + +#: src/modules/video_channels/settings.py:256 +msgctxt "guildset:video_exempt" +msgid "video_exempt" +msgstr "wjefp_fyfnqu" + +#: src/modules/video_channels/settings.py:259 +msgctxt "guildset:video_exempt|desc" +msgid "List of roles which are exempt from video channels." +msgstr "Mjtu pg spmft xijdi bsf fyfnqu gspn wjefp diboofmt." + +#: src/modules/video_channels/settings.py:263 +msgctxt "guildset:video_exempt|long_desc" +msgid "" +"Members who have **any** of these roles will not be required to enable their" +" video in the `video_channels`. This also overrides the `video_blacklist` " +"role." +msgstr "" +"Nfncfst xip ibwf **boz** pg uiftf spmft xjmm opu cf sfrvjsfe up fobcmf uifjs" +" wjefp jo uif `wjefp_diboofmt`. Uijt bmtp pwfssjeft uif `wjefp_cmbdlmjtu` " +"spmf." + +#: src/modules/video_channels/settings.py:269 +msgctxt "guildset:video_exempt|accepts" +msgid "List of exempt role names or ids." +msgstr "Mjtu pg fyfnqu spmf obnft ps jet." + +#: src/modules/video_channels/settings.py:284 +#, possible-python-brace-format +msgctxt "guildset:video_exempt|set_response:set" +msgid "The following roles will now be exempt from video channels: {roles}" +msgstr "Uif gpmmpxjoh spmft xjmm opx cf fyfnqu gspn wjefp diboofmt: {roles}" + +#: src/modules/video_channels/settings.py:289 +msgctxt "guildset:video_exempt|set_response:unset" +msgid "No members will be exempt from video channel requirements." +msgstr "Op nfncfst xjmm cf fyfnqu gspn wjefp diboofm sfrvjsfnfout." diff --git a/locales/ceaser/LC_MESSAGES/voice-tracker.po b/locales/ceaser/LC_MESSAGES/voice-tracker.po new file mode 100644 index 00000000..06dd88b4 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/voice-tracker.po @@ -0,0 +1,419 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/tracking/voice/cog.py:649 +msgctxt "cmd:now" +msgid "now" +msgstr "opx" + +#: src/tracking/voice/cog.py:652 +msgctxt "cmd:now|desc" +msgid "" +"Describe what you are working on, or see what your friends are working on!" +msgstr "" +"Eftdsjcf xibu zpv bsf xpsljoh po, ps tff xibu zpvs gsjfoet bsf xpsljoh po!" + +#: src/tracking/voice/cog.py:656 +msgctxt "cmd:now|param:tag" +msgid "tag" +msgstr "ubh" + +#: src/tracking/voice/cog.py:657 +msgctxt "cmd:now|param:user" +msgid "user" +msgstr "vtfs" + +#: src/tracking/voice/cog.py:658 +msgctxt "cmd:now|param:clear" +msgid "clear" +msgstr "dmfbs" + +#: src/tracking/voice/cog.py:663 +msgctxt "cmd:now|param:tag|desc" +msgid "Describe what you are working on in 10 characters or less!" +msgstr "Eftdsjcf xibu zpv bsf xpsljoh po jo 10 dibsbdufst ps mftt!" + +#: src/tracking/voice/cog.py:667 +msgctxt "cmd:now|param:user|desc" +msgid "Check what a friend is working on." +msgstr "Difdl xibu b gsjfoe jt xpsljoh po." + +#: src/tracking/voice/cog.py:671 +msgctxt "cmd:now|param:clear|desc" +msgid "Unset your activity tag (or the target user's tag, for moderators)." +msgstr "Votfu zpvs bdujwjuz ubh (ps uif ubshfu vtfs't ubh, gps npefsbupst)." + +#: src/tracking/voice/cog.py:698 +msgctxt "cmd:now|target:self|error:target_inactive" +msgid "" +"You have no running session! Join a tracked voice channel to start a " +"session." +msgstr "" +"Zpv ibwf op svoojoh tfttjpo! Kpjo b usbdlfe wpjdf diboofm up tubsu b " +"tfttjpo." + +#: src/tracking/voice/cog.py:707 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|error:target_inactive" +msgid "{mention} has no running session!" +msgstr "{mention} ibt op svoojoh tfttjpo!" + +#: src/tracking/voice/cog.py:722 +msgctxt "cmd:now|target:self|mode:clear|success|title" +msgid "Session Tag Cleared" +msgstr "Tfttjpo Ubh Dmfbsfe" + +#: src/tracking/voice/cog.py:726 +msgctxt "cmd:now|target:self|mode:clear|success|desc" +msgid "Successfully unset your session tag." +msgstr "Tvddfttgvmmz votfu zpvs tfttjpo ubh." + +#: src/tracking/voice/cog.py:735 +msgctxt "cmd:now|target:other|mode:clear|error:perms|title" +msgid "You can't do that!" +msgstr "Zpv dbo'u ep uibu!" + +#: src/tracking/voice/cog.py:739 +msgctxt "cmd:now|target:other|mode:clear|error:perms|desc" +msgid "You need to be a moderator to set or clear someone else's session tag." +msgstr "" +"Zpv offe up cf b npefsbups up tfu ps dmfbs tpnfpof fmtf't tfttjpo ubh." + +#: src/tracking/voice/cog.py:749 +msgctxt "cmd:now|target:other|mode:clear|success|title" +msgid "Session Tag Cleared!" +msgstr "Tfttjpo Ubh Dmfbsfe!" + +#: src/tracking/voice/cog.py:753 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|mode:clear|success|desc" +msgid "Cleared {target}'s session tag." +msgstr "Dmfbsfe {target}'t tfttjpo ubh." + +#: src/tracking/voice/cog.py:765 +msgctxt "cmd:now|target:self|mode:set|success|title" +msgid "Session Tag Set!" +msgstr "Tfttjpo Ubh Tfu!" + +#: src/tracking/voice/cog.py:769 +#, possible-python-brace-format +msgctxt "cmd:now|target:self|mode:set|success|desc" +msgid "You are now working on `{new_tag}`. Good luck!" +msgstr "Zpv bsf opx xpsljoh po `{new_tag}`. Hppe mvdl!" + +#: src/tracking/voice/cog.py:778 +msgctxt "cmd:now|target:other|mode:set|error:perms|title" +msgid "You can't do that!" +msgstr "Zpv dbo'u ep uibu!" + +#: src/tracking/voice/cog.py:782 +msgctxt "cmd:now|target:other|mode:set|error:perms|desc" +msgid "You need to be a moderator to set or clear someone else's session tag!" +msgstr "" +"Zpv offe up cf b npefsbups up tfu ps dmfbs tpnfpof fmtf't tfttjpo ubh!" + +#: src/tracking/voice/cog.py:792 +msgctxt "cmd:now|target:other|mode:set|success|title" +msgid "Session Tag Set!" +msgstr "Tfttjpo Ubh Tfu!" + +#: src/tracking/voice/cog.py:796 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|mode:set|success|desc" +msgid "Set {target}'s session tag to `{new_tag}`." +msgstr "Tfu {target}'t tfttjpo ubh up `{new_tag}`." + +#: src/tracking/voice/cog.py:805 +#, possible-python-brace-format +msgctxt "cmd:now|target:self|mode:show_with_tag|desc" +msgid "You have been working on **`{tag}`** in {channel} since {time}!" +msgstr "Zpv ibwf cffo xpsljoh po **`{tag}`** jo {channel} tjodf {time}!" + +#: src/tracking/voice/cog.py:810 +#, possible-python-brace-format +msgctxt "cmd:now|target:self|mode:show_without_tag|desc" +msgid "" +"You have been working in {channel} since {time}!\n" +"\n" +"Use `/now ` to set what you are working on." +msgstr "" +"Zpv ibwf cffo xpsljoh jo {channel} tjodf {time}!\n" +"\n" +"Vtf `/opx ` up tfu xibu zpv bsf xpsljoh po." + +#: src/tracking/voice/cog.py:817 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|mode:show_with_tag|desc" +msgid "" +"{target} is current working in {channel}!\n" +"They have been working on **{tag}** since {time}." +msgstr "" +"{target} jt dvssfou xpsljoh jo {channel}!\n" +"Uifz ibwf cffo xpsljoh po **{tag}** tjodf {time}." + +#: src/tracking/voice/cog.py:823 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|mode:show_without_tag|desc" +msgid "{target} has been working in {channel} since {time}!" +msgstr "{target} ibt cffo xpsljoh jo {channel} tjodf {time}!" + +#: src/tracking/voice/cog.py:846 +msgctxt "cmd:configure_voice_rates" +msgid "voice_rewards" +msgstr "wpjdf_sfxbset" + +#: src/tracking/voice/cog.py:849 +msgctxt "cmd:configure_voice_rates|desc" +msgid "Configure Voice tracking rewards and experience" +msgstr "Dpogjhvsf Wpjdf usbdljoh sfxbset boe fyqfsjfodf" + +#: src/tracking/voice/cog.py:906 +#, possible-python-brace-format +msgctxt "cmd:configure_voice_tracking|mode:voice|resp:success|desc" +msgid "" +"Members will now be rewarded {coin}**{base} (+ {bonus})** per hour they " +"spend (live) in a voice channel, up to a total of **{cap}** hours per server" +" day." +msgstr "" +"Nfncfst xjmm opx cf sfxbsefe {coin}**{base} (+ {bonus})** qfs ipvs uifz " +"tqfoe (mjwf) jo b wpjdf diboofm, vq up b upubm pg **{cap}** ipvst qfs tfswfs" +" ebz." + +#: src/tracking/voice/cog.py:917 +#, possible-python-brace-format +msgctxt "cmd:configure_voice_tracking|mode:study|resp:success|desc" +msgid "" +"Members will now be rewarded {coin}**{base}** per hour of study in this " +"server, with a bonus of {coin}**{bonus}** if they stream of display video, " +"up to a total of **{cap}** hours per server day." +msgstr "" +"Nfncfst xjmm opx cf sfxbsefe {coin}**{base}** qfs ipvs pg tuvez jo uijt " +"tfswfs, xjui b cpovt pg {coin}**{bonus}** jg uifz tusfbn pg ejtqmbz wjefp, " +"vq up b upubm pg **{cap}** ipvst qfs tfswfs ebz." + +#: src/tracking/voice/settings.py:40 +msgctxt "guildset:untracked_channels" +msgid "untracked_channels" +msgstr "vousbdlfe_diboofmt" + +#: src/tracking/voice/settings.py:43 +msgctxt "guildset:untracked_channels|desc" +msgid "Channels which will be ignored for statistics tracking." +msgstr "Diboofmt xijdi xjmm cf jhopsfe gps tubujtujdt usbdljoh." + +#: src/tracking/voice/settings.py:47 +msgctxt "guildset:untracked_channels|long_desc" +msgid "" +"Activity in these channels will not count towards a member's statistics. If " +"a category is selected, all channels under the category will be untracked." +msgstr "" +"Bdujwjuz jo uiftf diboofmt xjmm opu dpvou upxbset b nfncfs't tubujtujdt. Jg " +"b dbufhpsz jt tfmfdufe, bmm diboofmt voefs uif dbufhpsz xjmm cf vousbdlfe." + +#: src/tracking/voice/settings.py:52 +msgctxt "guildset:untracked_channels|accepts" +msgid "Comma separated list of untracked channel name/ids." +msgstr "Dpnnb tfqbsbufe mjtu pg vousbdlfe diboofm obnf/jet." + +#: src/tracking/voice/settings.py:56 +msgctxt "guildset:untracked_channels|notset" +msgid "Not Set (all voice channels will be tracked.)" +msgstr "Opu Tfu (bmm wpjdf diboofmt xjmm cf usbdlfe.)" + +#: src/tracking/voice/settings.py:73 +msgctxt "guildset:untracked_channels|set" +msgid "Channel selector below." +msgstr "Diboofm tfmfdups cfmpx." + +#: src/tracking/voice/settings.py:82 +#, possible-python-brace-format +msgctxt "guildset:untracked_channels|set_response|set" +msgid "Activity in the following channels will now be ignored: {channels}" +msgstr "Bdujwjuz jo uif gpmmpxjoh diboofmt xjmm opx cf jhopsfe: {channels}" + +#: src/tracking/voice/settings.py:89 +msgctxt "guildset:untracked_channels|set_response|unset" +msgid "All voice channels will now be tracked." +msgstr "Bmm wpjdf diboofmt xjmm opx cf usbdlfe." + +#: src/tracking/voice/settings.py:117 +msgctxt "guildset:hourly_reward" +msgid "hourly_reward" +msgstr "ipvsmz_sfxbse" + +#: src/tracking/voice/settings.py:120 +msgctxt "guildset:hourly_reward|mode:voice|desc" +msgid "LionCoins given per hour in a voice channel." +msgstr "MjpoDpjot hjwfo qfs ipvs jo b wpjdf diboofm." + +#: src/tracking/voice/settings.py:124 +msgctxt "guildset:hourly_reward|mode:voice|long_desc" +msgid "" +"Number of LionCoins to each member per hour that they stay in a tracked " +"voice channel." +msgstr "" +"Ovncfs pg MjpoDpjot up fbdi nfncfs qfs ipvs uibu uifz tubz jo b usbdlfe " +"wpjdf diboofm." + +#: src/tracking/voice/settings.py:128 +msgctxt "guildset:hourly_reward|accepts" +msgid "Number of coins to reward per hour in voice." +msgstr "Ovncfs pg dpjot up sfxbse qfs ipvs jo wpjdf." + +#: src/tracking/voice/settings.py:144 +#, possible-python-brace-format +msgctxt "guildset:hourly_reward|formatted" +msgid "{coin}**{amount}** per hour." +msgstr "{coin}**{amount}** qfs ipvs." + +#: src/tracking/voice/settings.py:159 +#, possible-python-brace-format +msgctxt "guildset:hourly_reward|mode:voice|response" +msgid "Members will be given {coin}**{amount}** per hour in a voice channel!" +msgstr "Nfncfst xjmm cf hjwfo {coin}**{amount}** qfs ipvs jo b wpjdf diboofm!" + +#: src/tracking/voice/settings.py:171 +msgctxt "guildset:hourly_reward|mode:study|desc" +msgid "LionCoins given per hour of study." +msgstr "MjpoDpjot hjwfo qfs ipvs pg tuvez." + +#: src/tracking/voice/settings.py:175 +msgctxt "guildset:hourly_reward|mode:study|long_desc" +msgid "Number of LionCoins given per hour of study, up to the daily hour cap." +msgstr "" +"Ovncfs pg MjpoDpjot hjwfo qfs ipvs pg tuvez, vq up uif ebjmz ipvs dbq." + +#: src/tracking/voice/settings.py:183 +#, possible-python-brace-format +msgctxt "guildset:hourly_reward|mode:study|response" +msgid "Members will be given {coin}**{amount}** per hour that they study!" +msgstr "Nfncfst xjmm cf hjwfo {coin}**{amount}** qfs ipvs uibu uifz tuvez!" + +#: src/tracking/voice/settings.py:197 +msgctxt "guildset:hourly_live_bonus" +msgid "hourly_live_bonus" +msgstr "ipvsmz_mjwf_cpovt" + +#: src/tracking/voice/settings.py:200 +msgctxt "guildset:hourly_live_bonus|desc" +msgid "Bonus Lioncoins given per hour when a member streams or video-chats." +msgstr "Cpovt Mjpodpjot hjwfo qfs ipvs xifo b nfncfs tusfbnt ps wjefp-dibut." + +#: src/tracking/voice/settings.py:205 +msgctxt "guildset:hourly_live_bonus|long_desc" +msgid "" +"When a member streams or video-chats in a channel they will be given this " +"bonus *additionally* to the `hourly_reward`." +msgstr "" +"Xifo b nfncfs tusfbnt ps wjefp-dibut jo b diboofm uifz xjmm cf hjwfo uijt " +"cpovt *beejujpobmmz* up uif `ipvsmz_sfxbse`." + +#: src/tracking/voice/settings.py:210 +msgctxt "guildset:hourly_live_bonus|accepts" +msgid "Number of bonus coins to reward per hour when live." +msgstr "Ovncfs pg cpovt dpjot up sfxbse qfs ipvs xifo mjwf." + +#: src/tracking/voice/settings.py:226 +#, possible-python-brace-format +msgctxt "guildset:hourly_live_bonus|formatted" +msgid "{coin}**{amount}** bonus per hour when live." +msgstr "{coin}**{amount}** cpovt qfs ipvs xifo mjwf." + +#: src/tracking/voice/settings.py:237 +#, possible-python-brace-format +msgctxt "guildset:hourly_live_bonus|response" +msgid "" +"Live members will now *additionally* be given {coin}**{amount}** per hour." +msgstr "" +"Mjwf nfncfst xjmm opx *beejujpobmmz* cf hjwfo {coin}**{amount}** qfs ipvs." + +#: src/tracking/voice/settings.py:248 +msgctxt "guildset:daily_voice_cap" +msgid "daily_voice_cap" +msgstr "ebjmz_wpjdf_dbq" + +#: src/tracking/voice/settings.py:251 +msgctxt "guildset:daily_voice_cap|desc" +msgid "Maximum number of hours per day to count for each member." +msgstr "Nbyjnvn ovncfs pg ipvst qfs ebz up dpvou gps fbdi nfncfs." + +#: src/tracking/voice/settings.py:255 +msgctxt "guildset:daily_voice_cap|long_desc" +msgid "" +"Time spend in voice channels over this amount will not be tracked towards " +"the member's statistics. Tracking will resume at the start of the next day. " +"The start of the day is determined by the configured guild timezone." +msgstr "" +"Ujnf tqfoe jo wpjdf diboofmt pwfs uijt bnpvou xjmm opu cf usbdlfe upxbset " +"uif nfncfs't tubujtujdt. Usbdljoh xjmm sftvnf bu uif tubsu pg uif ofyu ebz. " +"Uif tubsu pg uif ebz jt efufsnjofe cz uif dpogjhvsfe hvjme ujnfapof." + +#: src/tracking/voice/settings.py:261 +msgctxt "guildset:daily_voice_cap|accepts" +msgid "The maximum number of voice hours to track per day." +msgstr "Uif nbyjnvn ovncfs pg wpjdf ipvst up usbdl qfs ebz." + +#: src/tracking/voice/settings.py:277 +#, possible-python-brace-format +msgctxt "guildset:daily_voice_cap|response" +msgid "" +"Members will be tracked for at most {duration} per day. (**NOTE:** This will" +" not affect members currently in voice channels.)" +msgstr "" +"Nfncfst xjmm cf usbdlfe gps bu nptu {duration} qfs ebz. (**OPUF:** Uijt xjmm" +" opu bggfdu nfncfst dvssfoumz jo wpjdf diboofmt.)" + +#: src/tracking/voice/settings.py:335 +msgctxt "ui:voice_tracker_config|button:close|label" +msgid "Close" +msgstr "Dmptf" + +#: src/tracking/voice/settings.py:349 +msgctxt "ui:voice_tracker_config|button:reset|label" +msgid "Reset" +msgstr "Sftfu" + +#: src/tracking/voice/settings.py:362 +msgctxt "ui:voice_tracker_config|menu:untracked_channels|placeholder" +msgid "Set Untracked Channels" +msgstr "Tfu Vousbdlfe Diboofmt" + +#: src/tracking/voice/settings.py:428 src/tracking/voice/settings.py:482 +msgctxt "ui:voice_tracker_config|mode:voice|embed|title" +msgid "Voice Tracker Configuration Panel" +msgstr "Wpjdf Usbdlfs Dpogjhvsbujpo Qbofm" + +#: src/tracking/voice/settings.py:433 src/tracking/voice/settings.py:487 +msgctxt "ui:voice_tracker_config|mode:study|embed|title" +msgid "Study Tracker Configuration Panel" +msgstr "Tuvez Usbdlfs Dpogjhvsbujpo Qbofm" + +#: src/tracking/voice/settings.py:472 +msgctxt "ui:voice_tracker_config|menu:untracked_channels|placeholder" +msgid "Select Untracked Channels" +msgstr "Tfmfdu Vousbdlfe Diboofmt" + +#: src/tracking/voice/settings.py:528 +msgctxt "dash:voice_tracker|title" +msgid "Voice Tracker Configuration ({commands[configure voice_rewards]})" +msgstr "Wpjdf Usbdlfs Dpogjhvsbujpo ({commands[configure voice_rewards]})" + +#: src/tracking/voice/settings.py:532 +msgctxt "dash:voice_tracking|dropdown|placeholder" +msgid "Voice Activity Panel" +msgstr "Wpjdf Bdujwjuz Qbofm" diff --git a/locales/ceaser/LC_MESSAGES/wards.po b/locales/ceaser/LC_MESSAGES/wards.po new file mode 100644 index 00000000..fc9515f9 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/wards.po @@ -0,0 +1,90 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/wards.py:79 +msgctxt "ward:sys_admin|failed" +msgid "You must be a bot owner to do this!" +msgstr "Zpv nvtu cf b cpu pxofs up ep uijt!" + +#: src/wards.py:95 +msgctxt "ward:high_management|failed" +msgid "" +"You must have the `ADMINISTRATOR` permission in this server to do this!" +msgstr "" +"Zpv nvtu ibwf uif `BENJOJTUSBUPS` qfsnjttjpo jo uijt tfswfs up ep uijt!" + +#: src/wards.py:111 +msgctxt "ward:low_management|failed" +msgid "You must have the `MANAGE_GUILD` permission in this server to do this!" +msgstr "" +"Zpv nvtu ibwf uif `NBOBHF_HVJME` qfsnjttjpo jo uijt tfswfs up ep uijt!" + +#: src/wards.py:123 +msgctxt "ward:moderator|failed" +msgid "" +"You must have the configured moderator role, or `MANAGE_GUILD` permissions " +"to do this." +msgstr "" +"Zpv nvtu ibwf uif dpogjhvsfe npefsbups spmf, ps `NBOBHF_HVJME` qfsnjttjpot " +"up ep uijt." + +#: src/wards.py:149 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:bot_managed" +msgid "I cannot manage {role} because it is managed by another bot!" +msgstr "J dboopu nbobhf {role} cfdbvtf ju jt nbobhfe cz bopuifs cpu!" + +#: src/wards.py:156 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:integration" +msgid "I cannot manage {role} because it is managed by a server integration." +msgstr "J dboopu nbobhf {role} cfdbvtf ju jt nbobhfe cz b tfswfs joufhsbujpo." + +#: src/wards.py:163 +msgctxt "ward:equippable_role|error:default_role" +msgid "I cannot manage the server's default role." +msgstr "J dboopu nbobhf uif tfswfs't efgbvmu spmf." + +#: src/wards.py:170 +msgctxt "ward:equippable_role|error:no_perms" +msgid "I need the `MANAGE_ROLES` permission before I can manage roles!" +msgstr "J offe uif `NBOBHF_SPMFT` qfsnjttjpo cfgpsf J dbo nbobhf spmft!" + +#: src/wards.py:177 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:my_top_role" +msgid "I cannot assign or remove {role} because it is above my top role!" +msgstr "J dboopu bttjho ps sfnpwf {role} cfdbvtf ju jt bcpwf nz upq spmf!" + +#: src/wards.py:184 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:not_assignable" +msgid "I don't have sufficient permissions to assign or remove {role}." +msgstr "J epo'u ibwf tvggjdjfou qfsnjttjpot up bttjho ps sfnpwf {role}." + +#: src/wards.py:192 +msgctxt "ward:equippable_role|error:actor_perms" +msgid "You need the `MANAGE_ROLES` permission before you can configure roles!" +msgstr "" +"Zpv offe uif `NBOBHF_SPMFT` qfsnjttjpo cfgpsf zpv dbo dpogjhvsf spmft!" + +#: src/wards.py:199 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:actor_top_role" +msgid "You cannot configure {role} because it is above your top role!" +msgstr "Zpv dboopu dpogjhvsf {role} cfdbvtf ju jt bcpwf zpvs upq spmf!" diff --git a/locales/ceaser/LC_MESSAGES/weekly-gui.po b/locales/ceaser/LC_MESSAGES/weekly-gui.po new file mode 100644 index 00000000..17bd8c66 --- /dev/null +++ b/locales/ceaser/LC_MESSAGES/weekly-gui.po @@ -0,0 +1,96 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: 1.0\n" +"Report-Msgid-Bugs-To: you@example.com\n" +"POT-Creation-Date: 2007-10-18 14:00+0100\n" +"PO-Revision-Date: 2007-10-18 14:00+0100\n" +"Last-Translator: you \n" +"Language-Team: English \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/gui/cards/weekly.py:52 +msgctxt "skin:weeklystats|mode:study|title" +msgid "STUDY HOURS" +msgstr "TUVEZ IPVST" + +#: src/gui/cards/weekly.py:56 +msgctxt "skin:weeklystats|mode:voice|title" +msgid "VOICE CHANNEL ACTIVITY" +msgstr "WPJDF DIBOOFM BDUJWJUZ" + +#: src/gui/cards/weekly.py:60 +msgctxt "skin:weeklystats|mode:text|title" +msgid "MESSAGE ACTIVITY" +msgstr "NFTTBHF BDUJWJUZ" + +#: src/gui/cards/weekly.py:64 +msgctxt "skin::weeklystats|mode:anki|title" +msgid "CARDS REVIEWED" +msgstr "DBSET SFWJFXFE" + +#: src/gui/cards/weekly.py:137 +msgctxt "skin:weeklystats|weekdays" +msgid "M,T,W,T,F,S,S" +msgstr "N,U,X,U,G,T,T" + +#: src/gui/cards/weekly.py:207 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:study|summary:this_week" +msgid "THIS WEEK: {amount} HOURS" +msgstr "UIJT XFFL: {amount} IPVST" + +#: src/gui/cards/weekly.py:211 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:voice|summary:this_week" +msgid "THIS WEEK: {amount} HOURS" +msgstr "UIJT XFFL: {amount} IPVST" + +#: src/gui/cards/weekly.py:215 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:text|summary:this_week" +msgid "THIS WEEK: {amount} MESSAGES" +msgstr "UIJT XFFL: {amount} NFTTBHFT" + +#: src/gui/cards/weekly.py:219 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:text|summary:this_week" +msgid "THIS WEEK: {amount} CARDS" +msgstr "UIJT XFFL: {amount} DBSET" + +#: src/gui/cards/weekly.py:240 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:study|summary:last_week" +msgid "LAST WEEK: {amount} HOURS" +msgstr "MBTU XFFL: {amount} IPVST" + +#: src/gui/cards/weekly.py:244 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:voice|summary:last_week" +msgid "LAST WEEK: {amount} HOURS" +msgstr "MBTU XFFL: {amount} IPVST" + +#: src/gui/cards/weekly.py:248 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:text|summary:last_week" +msgid "LAST WEEK: {amount} MESSAGES" +msgstr "MBTU XFFL: {amount} NFTTBHFT" + +#: src/gui/cards/weekly.py:252 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:text|summary:last_week" +msgid "LAST WEEK: {amount} CARDS" +msgstr "MBTU XFFL: {amount} DBSET" + +#: src/gui/cards/weekly.py:272 +#, possible-python-brace-format +msgctxt "skin:weeklystats|footer" +msgid "Weekly Statistics • As of {day} {month} • {name} {discrim}" +msgstr "Xfflmz Tubujtujdt • Bt pg {day} {month} • {name} {discrim}" diff --git a/locales/he_IL/LC_MESSAGES/Pomodoro.po b/locales/he_IL/LC_MESSAGES/Pomodoro.po new file mode 100644 index 00000000..41125542 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/Pomodoro.po @@ -0,0 +1,867 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/pomodoro/timer.py:50 +msgctxt "timer|stage:break|name" +msgid "BREAK" +msgstr "הפסקה" + +#: src/modules/pomodoro/timer.py:51 +msgctxt "timer|stage:focus|name" +msgid "FOCUS" +msgstr "פוקוס" + +#: src/modules/pomodoro/timer.py:155 +#, possible-python-brace-format +msgctxt "timer|webhook|name" +msgid "{bot_name} Pomodoro" +msgstr "{bot_name} פומודורו" + +#: src/modules/pomodoro/timer.py:159 +msgctxt "timer|webhook|audit_reason" +msgid "Pomodoro Notifications" +msgstr "התראות פומודורו" + +#: src/modules/pomodoro/timer.py:170 +msgctxt "timer|webhook|error:insufficient_permissions" +msgid "" +"I require the `MANAGE_WEBHOOKS` permission to send pomodoro notifications " +"here!" +msgstr "אני צריך את ההרשאה `MANAGE_WEBHOOKS` כדי לשלוח התראות פומודורו פה!" + +#: src/modules/pomodoro/timer.py:229 +#, possible-python-brace-format +msgctxt "timer|default_base_name" +msgid "Timer {pattern}" +msgstr "טיימר {pattern}" + +#: src/modules/pomodoro/timer.py:403 +#, possible-python-brace-format +msgctxt "timer|kicked_message" +msgid "" +"{mentions} was removed from {channel} because they were inactive! Remember " +"to press {tick} to register your presence every stage." +msgid_plural "" +"{mentions} were removed from {channel} because they were inactive! Remember " +"to press {tick} to register your presence every stage." +msgstr[0] "" +"{mentions} הוסר מ {channel} מאחר והם לא היו פעילים! זכרו ללחוץ על {tick} על " +"מנת לרשום נוכחות בכל שלב." +msgstr[1] "" +"{mentions} הוסרו מ {channel} מאחר והם לא היו פעילים! זכרו ללחוץ על {tick} על" +" מנת לרשום נוכחות בכל שלב." +msgstr[2] "" +"{mentions} הוסרו מ {channel} מאחר והם לא היו פעילים! זכרו ללחוץ על {tick} על" +" מנת לרשום נוכחות בכל שלב." +msgstr[3] "" +"{mentions} הוסרו מ {channel} מאחר והם לא היו פעילים! זכרו ללחוץ על {tick} על" +" מנת לרשום נוכחות בכל שלב." + +#: src/modules/pomodoro/timer.py:496 +#, possible-python-brace-format +msgctxt "timer|status|stage:focus|statusline" +msgid "{channel} is now in **FOCUS**! Good luck, **BREAK** starts {timestamp}" +msgstr "{channel} עכשיו בפוקוס! בהצלחה! ההפסקה תתחיל ב {timestamp}" + +#: src/modules/pomodoro/timer.py:501 +#, possible-python-brace-format +msgctxt "timer|status|stage:break|statusline" +msgid "" +"{channel} is now on **BREAK**! Take a rest, **FOCUS** starts {timestamp}" +msgstr "{channel} עכשיו בהפסקה! הסשן יתחיל ב {timestamp}" + +#: src/modules/pomodoro/timer.py:533 +#, possible-python-brace-format +msgctxt "timer|status|warningline" +msgid "" +"**Warning:** {mentions}, please press {tick} to avoid being removed on the " +"next stage." +msgstr "" +"**זהירות:** {mentions}, אל תשכחו ללחוץ על ה{tick} על מנת להימנע מלהתנתק בשלב" +" הבא." + +#: src/modules/pomodoro/timer.py:552 +#, possible-python-brace-format +msgctxt "timer|status|stopped:auto" +msgid "Timer stopped! Join {channel} to start the timer." +msgstr "השעון נעצר! הצטרף אל {channel} על מנת להתחיל את השעון מחדש." + +#: src/modules/pomodoro/timer.py:557 +msgctxt "timer|status|stopped:manual" +msgid "Timer stopped! Press `Start` to restart the timer." +msgstr "השעון נעצר! לחץ על \"התחל\" כדי להתחיל את השעון מחדש." + +#: src/modules/pomodoro/settingui.py:39 +msgctxt "ui:timer_config|menu:channels|placeholder" +msgid "Select Pomodoro Notification Channel" +msgstr "בחר ערוץ התראות לטיימרים של הפומודורו" + +#: src/modules/pomodoro/settingui.py:47 +msgctxt "ui:timer_config|embed|title" +msgid "Timer Configuration Panel" +msgstr "תפריט הגדרות טיימרים פומודורו" + +#: src/modules/pomodoro/settingui.py:81 +msgctxt "dash:pomodoro|title" +msgid "Pomodoro Configuration ({commands[configure pomodoro]})" +msgstr "תפריט הגדרות טיימרים ({commands[configure pomodoro]})" + +#: src/modules/pomodoro/settingui.py:85 +msgctxt "dash:stats|dropdown|placeholder" +msgid "Pomodoro Timer Panel" +msgstr "תפריט טיימרים" + +#: src/modules/pomodoro/cog.py:83 +msgctxt "cmd_check:ready|failed" +msgid "" +"I am currently restarting! The Pomodoro timers will be unavailable until I " +"have restarted. Thank you for your patience!" +msgstr "" +"אני כרגע מתחיל מחדש, מצטער, עוד כמה דקות והטיימרים יחזרו מבטיחים! תודה על " +"הסבלנות." + +#: src/modules/pomodoro/cog.py:321 +msgctxt "cmd:pomodoro" +msgid "timers" +msgstr "טיימרים" + +#: src/modules/pomodoro/cog.py:322 +msgctxt "cmd:pomodoro|desc" +msgid "Base group for all pomodoro timer commands." +msgstr "קבוצת בסיס לכל הפקודות של הטיימר." + +#: src/modules/pomodoro/cog.py:330 +msgctxt "cmd:pomodoro_status" +msgid "show" +msgstr "הצג" + +#: src/modules/pomodoro/cog.py:331 +msgctxt "cmd:pomodoro_status|desc" +msgid "Display the status of a single pomodoro timer." +msgstr "הצג את הסטטוס של הטיימר פומודורו היחיד." + +#: src/modules/pomodoro/cog.py:334 +msgctxt "cmd:pomodoro_status|param:channel" +msgid "timer_channel" +msgstr "ערוץ_טיימר" + +#: src/modules/pomodoro/cog.py:339 +msgctxt "cmd:pomodoro_status|param:channel|desc" +msgid "The channel for which you want to view the timer." +msgstr "הערוץ שבו תרצה לראות את הטיימר." + +#: src/modules/pomodoro/cog.py:357 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_status|error:no_timer" +msgid "The channel {channel} does not have a timer set up!" +msgstr "אין שעון ב{channel}!" + +#: src/modules/pomodoro/cog.py:367 +msgctxt "cmd:pomodoro_list" +msgid "list" +msgstr "רשימה" + +#: src/modules/pomodoro/cog.py:368 +msgctxt "cmd:pomodoro_list|desc" +msgid "List the available pomodoro timers." +msgstr "הצג את השעונים הזמינים." + +#: src/modules/pomodoro/cog.py:391 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_list|error:no_timers" +msgid "" +"No timers have been setup in this server!\n" +"You can ask an admin to create one with {command}, or rent a private room and create one yourself!" +msgstr "" +"אין טיימרים בסרבר הזה!\n" +"אתם יכולים לבקש מהבעלים של השרת להפעיל כמה באמצעות {command}." + +#: src/modules/pomodoro/cog.py:404 +msgctxt "cmd:pomodoro_list|error:no_visible_timers" +msgid "There are no timers you can join in this server!" +msgstr "אין טיימרים ציבוריים בסרבר הזה." + +#: src/modules/pomodoro/cog.py:414 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_list|embed:timer_list|title" +msgid "Pomodoro Timers in **{guild}**" +msgstr "טיימרי פומודורו בשרת **{guild}**" + +#: src/modules/pomodoro/cog.py:423 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_list|status:stopped_auto" +msgid "" +"`{pattern}` timer is stopped with no members!\n" +"Join {channel} to restart it." +msgstr "" +"`{pattern}` נעצר ללא משתמשים!\n" +"הצטרף אל {channel} על מנת לאפס אותו." + +#: src/modules/pomodoro/cog.py:428 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_list|status:stopped_manual" +msgid "" +"`{pattern}` timer is stopped with `{members}` members!\n" +"Join {channel} and press `Start` to start it!" +msgstr "" +"`{pattern}` נעצר עם `{members}` משתמשים!\n" +"הצטרף אל {channel} ולחץ \"התחל\" על מנת לאפס אותו." + +#: src/modules/pomodoro/cog.py:435 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_list|status:running_focus" +msgid "" +"`{pattern}` timer is running with `{members}` members!\n" +"Currently **focusing**, with break starting {timestamp}" +msgstr "" +"`{pattern}` טיימר רץ עם `{members}` משתמשים!\n" +"כרגע בפוקוס, עם הפסקה שתתחיל ב{timestamp}" + +#: src/modules/pomodoro/cog.py:441 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_list|status:running_break" +msgid "" +"`{pattern}` timer is running with `{members}` members!\n" +"Currently **resting**, with focus starting {timestamp}" +msgstr "" +"`{pattern}` טיימר רץ עם `{members}` משתמשים!\n" +"כרגע בהפסקה, עם פוקוס שיתחיל ב{timestamp}" + +#: src/modules/pomodoro/cog.py:455 +msgctxt "cmd:pomodoro_admin" +msgid "admin" +msgstr "אדמין" + +#: src/modules/pomodoro/cog.py:456 +msgctxt "cmd:pomodoro_admin|desc" +msgid "Command group for pomodoro admin controls." +msgstr "קבוצת פקודות עבור אדמין פומודורו" + +#: src/modules/pomodoro/cog.py:462 +msgctxt "cmd:pomodoro_create" +msgid "create" +msgstr "צור" + +#: src/modules/pomodoro/cog.py:465 +msgctxt "cmd:pomodoro_create|desc" +msgid "Create a new Pomodoro timer. Requires admin permissions." +msgstr "צור שעון פומודורו חדש. הרשאות אדמין נחוצות על מנת לעשות זאת." + +#: src/modules/pomodoro/cog.py:469 +msgctxt "cmd:pomodoro_create|param:channel" +msgid "timer_channel" +msgstr "ערוץ_טיימר" + +#: src/modules/pomodoro/cog.py:475 +msgctxt "cmd:pomodoro_create|param:channel|desc" +msgid "" +"Voice channel to create the timer in. (Defaults to your current channel, or " +"makes a new one.)" +msgstr "" +"הערוץ הקולי שתרצו ליצור בו טיימר. (ברירת מחדל היא הערוץ שאתם נמצאים בו " +"כרגע.)" + +#: src/modules/pomodoro/cog.py:504 +msgctxt "cmd:pomodoro_create|error:insufficient_perms" +msgid "Only server administrators can create timers!" +msgstr "רק אדמינים יכולים ליצור טיימרים." + +#: src/modules/pomodoro/cog.py:531 +msgctxt "cmd:pomodoro_create|error:channel_create_failed|title" +msgid "Could not create pomodoro voice channel!" +msgstr "לא הצלחתי ליצור ערוץ פומודורו!" + +#: src/modules/pomodoro/cog.py:535 +msgctxt "cmd:pomodoro_create|error:channel_create|desc" +msgid "" +"Failed to create a new pomodoro voice channel due to an unknown Discord " +"communication error. Please try creating the channel manually and pass it to" +" the `timer_channel` argument of this command." +msgstr "נכשל ביצירת טיימר בעקבות שגיאה בצד של דיסקורד. אנא נסה שוב." + +#: src/modules/pomodoro/cog.py:549 +msgctxt "cmd:pomodoro_create|error:channel_create_permissions|title" +msgid "Could not create pomodoro voice channel!" +msgstr "לא הצלחתי ליצור ערוץ פומודורו!" + +#: src/modules/pomodoro/cog.py:553 +msgctxt "cmd:pomodoro_create|error:channel_create_permissions|desc" +msgid "" +"No `timer_channel` was provided, and I lack the `MANAGE_CHANNELS` permission" +" needed to create a new voice channel." +msgstr "" +"אין ערוץ טיימר שהוגדר, וגם חסרים לי הרשאות כדי ליצור אחד, אנא הוסף אותי לשרת" +" שוב עם ההרשאות הנכונות (`MANAGE_CHANNELS`)" + +#: src/modules/pomodoro/cog.py:567 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_create|error:timer_exists" +msgid "" +"A timer already exists in {channel}! Use `/pomodoro admin edit` to modify " +"it." +msgstr "" +"טיימר כבר קיים בערוץ {channel}! השתמש ב`/pomodoro admin edit` כדי לערוך " +"אותו." + +#: src/modules/pomodoro/cog.py:606 +msgctxt "cmd:pomodoro_create|response:success|content" +msgid "Timer created successfully! Use the panel below to reconfigure." +msgstr "הטיימר נבנה בהצלחה! השתמש בפאנל בתחתית כדי לשנות אותו." + +#: src/modules/pomodoro/cog.py:612 +msgctxt "cmd:pomodoro_destroy" +msgid "destroy" +msgstr "השמד" + +#: src/modules/pomodoro/cog.py:615 +msgctxt "cmd:pomodoro_destroy|desc" +msgid "" +"Delete a pomodoro timer from a voice channel. Requires admin permissions." +msgstr "מחק טיימר מערוץ מסויים. הרשאות אדמין נחוצות." + +#: src/modules/pomodoro/cog.py:619 +msgctxt "cmd:pomodoro_destroy|param:channel" +msgid "timer_channel" +msgstr "ערוץ_טיימר" + +#: src/modules/pomodoro/cog.py:622 +msgctxt "cmd:pomodoro_destroy|param:channel" +msgid "Channel with the timer to delete." +msgstr "הערוץ עם הטיימר שמיועד למחיקה." + +#: src/modules/pomodoro/cog.py:640 +msgctxt "cmd:pomodoro_destroy|error:no_timer" +msgid "This channel doesn't have an attached pomodoro timer!" +msgstr "בערוץ הזה לא קיימים שום טיימרים!" + +#: src/modules/pomodoro/cog.py:655 +msgctxt "cmd:pomodoro_destroy|error:insufficient_perms|owned" +msgid "" +"You need to be an administrator or own this channel to remove this timer!" +msgstr "" +"אתם צריכים הרשאות אדמין או להיות הבעלים של הערוץ הקולי הזה כדי למחוק את " +"הטיימר הזה!" + +#: src/modules/pomodoro/cog.py:665 +msgctxt "cmd:pomodoro_destroy|error:insufficient_perms|notowned" +msgid "You need to be a server administrator to remove this timer!" +msgstr "אתם צריכים להיות האדמין של הסרבר כדי למחוק את הטיימר הזה!" + +#: src/modules/pomodoro/cog.py:677 +#, possible-python-brace-format +msgctxt "cmd:pomdoro_destroy|response:success|description" +msgid "Timer successfully removed from {channel}." +msgstr "הטיימר הוסר בהצלחה מ {channel}." + +#: src/modules/pomodoro/cog.py:683 +msgctxt "cmd:pomodoro_edit" +msgid "edit" +msgstr "ערוך" + +#: src/modules/pomodoro/cog.py:686 +msgctxt "cmd:pomodoro_edit|desc" +msgid "Edit a Timer" +msgstr "ערוך טיימר" + +#: src/modules/pomodoro/cog.py:690 +msgctxt "cmd:pomodoro_edit|param:channel" +msgid "timer_channel" +msgstr "ערוץ_טיימר" + +#: src/modules/pomodoro/cog.py:696 +msgctxt "cmd:pomodoro_edit|param:channel|desc" +msgid "Channel holding the timer to edit." +msgstr "הערוץ שבו יש את הטיימר לעריכה." + +#: src/modules/pomodoro/cog.py:737 +msgctxt "cmd:pomodoro_edit|error:no_timer" +msgid "This channel doesn't have an attached pomodoro timer to edit!" +msgstr "בערוץ הזה לא קיימים שום טיימרים!" + +#: src/modules/pomodoro/cog.py:750 +msgctxt "cmd:pomodoro_edit|error:insufficient_perms|role:other" +msgid "" +"Insufficient permissions to modifiy this timer!\n" +"You need to be a server administrator, own this channel, or have the timer manager role." +msgstr "" +"הרשאות לא מספקות כדי לערוך את הטיימר!\n" +"אתה צריך להיות סרבר אדמין, להיו תהבעלים של הערוץ או להיות בעל רול של ניהול טיימרים בשרת כדי לגשת לטיימר הזה." + +#: src/modules/pomodoro/cog.py:771 +msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:admin" +msgid "You need to be a guild admin to modify this option!" +msgstr "אתה צריך להיות האדמין של השרת כדי לערוך את האופציה הזו!" + +#: src/modules/pomodoro/cog.py:776 +msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:owner" +msgid "You need to be a channel owner or guild admin to modify this option!" +msgstr "" +"אתה צרריך להיות הבעלים של הערוץ או האדמין של השרת כדי לערוך את האופציה הזו!" + +#: src/modules/pomodoro/cog.py:781 +msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:manager" +msgid "" +"You need to be a guild admin or have the manager role to modify this option!" +msgstr "אתה צריך להיות האדמין של השרת או להיות מנהל כדי לערוך את האופציה הזו!" + +#: src/modules/pomodoro/cog.py:817 +msgctxt "cmd:configure_pomodoro" +msgid "pomodoro" +msgstr "פומודורו" + +#: src/modules/pomodoro/cog.py:818 +msgctxt "cmd:configure_pomodoro|desc" +msgid "Configure Pomodoro Timer System" +msgstr "נהל את מערכת הטיימרים" + +#: src/modules/pomodoro/lib.py:19 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:remaining" +msgid "{remaining}" +msgstr "{נותר}" + +#: src/modules/pomodoro/lib.py:20 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:stage" +msgid "{stage}" +msgstr "{שלב}" + +#: src/modules/pomodoro/lib.py:21 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:members" +msgid "{members}" +msgstr "{משתמשים}" + +#: src/modules/pomodoro/lib.py:22 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:name" +msgid "{name}" +msgstr "{שם}" + +#: src/modules/pomodoro/lib.py:23 +#, possible-python-brace-format +msgctxt "formatstring:channel_name|key:pattern" +msgid "{pattern}" +msgstr "{תבנית}" + +#: src/modules/pomodoro/options.py:32 +msgctxt "timerset:voice_channel" +msgid "channel" +msgstr "ערוץ" + +#: src/modules/pomodoro/options.py:35 +msgctxt "timerset:voice_channel|desc" +msgid "Channel in which to track timer members and send alerts." +msgstr "הערוץ שבו אשלח התראות בנוגע לטיימרים." + +#: src/modules/pomodoro/options.py:45 +msgctxt "timerset:notification_channel" +msgid "notification_channel" +msgstr "ערוץ_התראות" + +#: src/modules/pomodoro/options.py:48 +msgctxt "timerset:notification_channel|desc" +msgid "Channel to which to send timer status cards and notifications." +msgstr "ערוץ שבו אשלח את הטיימרים והתראות." + +#: src/modules/pomodoro/options.py:68 +#, possible-python-brace-format +msgctxt "timerset:notification_channel|format:notset" +msgid "Not Set (Using {channel})" +msgstr "לא הופעל (Using {channel})" + +#: src/modules/pomodoro/options.py:78 +msgctxt "timerset:inactivity_threshold|inactivity_threshold" +msgid "inactivity_threshold" +msgstr "מגבלת_חוסר_פעילות" + +#: src/modules/pomodoro/options.py:81 +msgctxt "timerset:inactivity_threshold|desc" +msgid "" +"Number of inactive focus+break stages before a member is removed from the " +"timer." +msgstr "מספר הסבבים (פוקוס+הפסקה) לפני שמשתמש מוסר מהטיימר" + +#: src/modules/pomodoro/options.py:85 +msgctxt "timerset:inactivity_threshold|desc" +msgid "How many timer cycles before kicking inactive members." +msgstr "כמה סבבים לפני שאנתק משתמשים לא פעילים." + +#: src/modules/pomodoro/options.py:101 +msgctxt "timerset:manager_role" +msgid "manager_role" +msgstr "רול_מנהל" + +#: src/modules/pomodoro/options.py:104 +msgctxt "timerset:manager_role|desc" +msgid "Role allowed to start, stop, and edit the focus/break lengths." +msgstr "הרול רשאי להתחיל, לעצור, ולערוך טיימרים." + +#: src/modules/pomodoro/options.py:116 +msgctxt "timerset:manager_role|format:notset" +msgid "Not Set (Only Admins may start/stop or edit pattern)" +msgstr "לא הופעל (רק אדמינים יכולים לערוך טיימרים)" + +#: src/modules/pomodoro/options.py:126 +msgctxt "timerset:voice_alerts" +msgid "voice_alerts" +msgstr "התראות_קוליות" + +#: src/modules/pomodoro/options.py:129 +msgctxt "timerset:voice_alerts|desc" +msgid "Whether to join the voice channel and announce focus and break stages." +msgstr "האם תרצה שאצטרף לערוץ להכריז את ההפסקות והפוקוס" + +#: src/modules/pomodoro/options.py:140 +msgctxt "timerset:base_name" +msgid "name" +msgstr "שם" + +#: src/modules/pomodoro/options.py:143 +msgctxt "timerset:base_name|desc" +msgid "Timer name, as shown on the timer card." +msgstr "השם של הטיימר שיהיה כתוב על הכרטיס עצמו." + +#: src/modules/pomodoro/options.py:147 +msgctxt "timerset:base_name|accepts" +msgid "Any short name, shown on the timer card." +msgstr "שם קצר שיהיה כתוב על הכרטיס עצמו." + +#: src/modules/pomodoro/options.py:161 +msgctxt "timerset:channel_name_format" +msgid "channel_name" +msgstr "שם_ערוץ" + +#: src/modules/pomodoro/options.py:164 +#, possible-python-brace-format +msgctxt "timerset:channel_name_format|desc" +msgid "" +"Auto-updating voice channel name, accepting {remaining}, {name}, {pattern}, " +"and {stage} keys." +msgstr "" +"השם של הערוץ שמתעדכן אוטומטית ביחד עם הטיימר עצמו, השתמשו ב {remaining}, " +"{name}, {pattern}, {stage} בשם." + +#: src/modules/pomodoro/options.py:168 +#, possible-python-brace-format +msgctxt "timerset:channel_name|accepts" +msgid "" +"Timer channel name, with keys {remaining}, {name}, {pattern}, and {stage}." +msgstr "" +"השם של הערוץ שמתעדכן אוטומטית ביחד עם הטיימר עצמו, השתמשו ב {remaining}, " +"{name}, {pattern}, {stage} בשם." + +#: src/modules/pomodoro/options.py:180 +msgctxt "timerset:focus_length" +msgid "focus_length" +msgstr "אורך_פוקוס" + +#: src/modules/pomodoro/options.py:183 +msgctxt "timerset:focus_length|desc" +msgid "Length of the focus stage of the timer in minutes." +msgstr "האורך של הזמן למידה בדקות." + +#: src/modules/pomodoro/options.py:188 +msgctxt "timerset:focus_length|accepts" +msgid "A positive integer number of minutes." +msgstr "מספר שלם עבור מספר דקות." + +#: src/modules/pomodoro/options.py:212 +msgctxt "timerset:focus_length|desc" +msgid "Please enter a positive number of minutes." +msgstr "אנא ציין מספר שלם של דקות." + +#: src/modules/pomodoro/options.py:220 +msgctxt "timerset:break_length" +msgid "break_length" +msgstr "אורך_הפסקה" + +#: src/modules/pomodoro/options.py:223 +msgctxt "timerset:break_length|desc" +msgid "Length of the break stage of the timer in minutes." +msgstr "האורך של הזמן הפסקה בדקות." + +#: src/modules/pomodoro/options.py:228 +msgctxt "timerset:break_length|accepts" +msgid "A positive integer number of minutes." +msgstr "מספר שלם של דקות." + +#: src/modules/pomodoro/options.py:252 +msgctxt "timerset:break_length|desc" +msgid "Please enter a positive number of minutes." +msgstr "אנא ציין מספר שלם של דקות." + +#: src/modules/pomodoro/settings.py:19 +msgctxt "guildset:pomodoro_channel" +msgid "pomodoro_channel" +msgstr "ערוץ_פומודורו" + +#: src/modules/pomodoro/settings.py:22 +msgctxt "guildset:pomodoro_channel|desc" +msgid "Default central notification channel for pomodoro timers." +msgstr "ערוץ התראות מרכזי לטיימרים של הפומודורו." + +#: src/modules/pomodoro/settings.py:26 +msgctxt "guildset:pomodoro_channel|long_desc" +msgid "" +"Pomodoro timers which do not have a custom notification channel set will " +"send timer notifications in this channel. If this setting is not set, " +"pomodoro notifications will default to the timer voice channel itself." +msgstr "" +"טיימרים שאין להם ערוץ ספציפי שמוגדר להם ישלחו את ההתראות שלהם לערוץ הזה. אם " +"ההגדרה הזו לא הופעלה, ההתראות ישלחו לצאט של הערוץ הקולי עצמו (מומלץ להפעיל)." + +#: src/modules/pomodoro/settings.py:33 +msgctxt "guildset:pomodoro_channel|formatted|notset" +msgid "Not Set (Will use timer voice channel.)" +msgstr "לא מופעל (התראות ישלחו לערוץ עצמו)" + +#: src/modules/pomodoro/settings.py:37 +msgctxt "guildset:pomodoro_channel|accepts" +msgid "Timer notification channel name or id." +msgstr "שם או מספר זהות של הערוץ התראות" + +#: src/modules/pomodoro/settings.py:51 +#, possible-python-brace-format +msgctxt "guildset:pomodoro_channel|set_response|set" +msgid "Pomodoro timer notifications will now default to {channel}" +msgstr "ההתראות ברירת מחדל עכשיו יופנו אל {channel}" + +#: src/modules/pomodoro/settings.py:56 +msgctxt "guildset:pomodoro_channel|set_response|unset" +msgid "Pomodoro timer notifications will now default to their voice channel." +msgstr "ההתראות ברירת מחדל עכשיו יופנו אל הערוץ הקולי שלהם." + +#: src/modules/pomodoro/settings.py:66 +#, possible-python-brace-format +msgctxt "guildset:pomdoro_channel|set_using" +msgid "{cmd} or channel selector below." +msgstr "{cmd} או בחירת ערוצים בתחתית." + +#: src/modules/pomodoro/ui/edit.py:63 +msgctxt "modal:timer_editor|title" +msgid "Timer Option Editor" +msgstr "עורך הגדרות טיימר" + +#: src/modules/pomodoro/ui/status.py:61 +msgctxt "ui:timer_status|button:present|ack" +msgid "" +"Thank you for marking your presence.\n" +"Good luck and stay productive!" +msgstr "" +"תודה שסימת נוכחות!\n" +"בהצלחה ותישאר פרודקטיבי!" + +#: src/modules/pomodoro/ui/status.py:72 +#, possible-python-brace-format +msgctxt "ui:timer_status|button:present|error:not_in_timer" +msgid "" +"You are not in this timer! Join the timer channel by pressing {channel}." +msgstr "אתה לא בטיימר הזה! תצטרף אליו על ידי לחיצה על: {channel}." + +#: src/modules/pomodoro/ui/status.py:82 +msgctxt "ui:timer_status|button:present|label" +msgid "Present" +msgstr "נוכח" + +#: src/modules/pomodoro/ui/status.py:106 +msgctxt "ui:timer_status|button:edit|error:no_permissions" +msgid "" +"Configuring this timer requires `MANAGE_CHANNEL` permissions on the timer " +"channel, or the configured manager role!" +msgstr "כדי לערוך את הטיימר הזה נדרשות הרשאות מנהל או אדמין." + +#: src/modules/pomodoro/ui/status.py:119 +msgctxt "ui:timer_status|button:edit|label" +msgid "Options" +msgstr "הגדרות" + +#: src/modules/pomodoro/ui/status.py:138 +msgctxt "ui:timer_status|button:start|error:already_running" +msgid "Cannot start a timer that is already running!" +msgstr "לא ניתן להתחיל טיימר שכבר רץ!" + +#: src/modules/pomodoro/ui/status.py:154 +msgctxt "ui:timer_status|button:start|error:not_manager|title" +msgid "Insufficient permissions!" +msgstr "אין לי או לך מספיק הראשות בשרת כדי לעשות את זה!" + +#: src/modules/pomodoro/ui/status.py:158 +msgctxt "ui:timer_status|button:start|error:not_manager|desc" +msgid "" +"Starting this timer requires `MANAGE_CHANNEL` permissions on the timer " +"channel, or the configured `manager_role`!" +msgstr "כדי לערוך את הטיימר הזה נדרשות הרשאות מנהל או אדמין." + +#: src/modules/pomodoro/ui/status.py:168 +msgctxt "ui:timer_status|button:start|label" +msgid "Start" +msgstr "התחל" + +#: src/modules/pomodoro/ui/status.py:190 +msgctxt "ui:timer_status|button:stop|error:not_manager|title" +msgid "Insufficient permissions!" +msgstr "אין לי או לך מספיק הראשות בשרת כדי לעשות את זה!" + +#: src/modules/pomodoro/ui/status.py:194 +msgctxt "ui:timer_status|button:stop|error:not_manager|desc" +msgid "" +"Stopping this timer requires `MANAGE_CHANNEL` permissions on the timer " +"channel, or the configured `manager_role`!" +msgstr "כדי לערוך את הטיימר הזה נדרשות הרשאות מנהל או אדמין." + +#: src/modules/pomodoro/ui/status.py:204 +msgctxt "ui:timer_status|button:stop|label" +msgid "Stop" +msgstr "עצור" + +#: src/modules/pomodoro/ui/config.py:51 +msgctxt "ui:timer_options|button:edit|label" +msgid "Edit" +msgstr "ערוך" + +#: src/modules/pomodoro/ui/config.py:67 +msgctxt "ui:timer_options|button:voice_alerts|label" +msgid "Voice Alerts" +msgstr "התראות קוליות" + +#: src/modules/pomodoro/ui/config.py:88 +msgctxt "ui:timer_options|button:delete|success|title" +msgid "Timer Deleted" +msgstr "הטיימר נמחק" + +#: src/modules/pomodoro/ui/config.py:92 +#, possible-python-brace-format +msgctxt "ui:timer_options|button:delete|success|description" +msgid "The timer in {channel} has been removed." +msgstr "הטיימר של החדר {channel} נמחק." + +#: src/modules/pomodoro/ui/config.py:100 +msgctxt "ui:timer_options|button:delete|label" +msgid "Delete" +msgstr "מחק" + +#: src/modules/pomodoro/ui/config.py:119 +msgctxt "ui:timer_options|menu:voice_channel|placeholder" +msgid "Set Voice Channel" +msgstr "בחר ערוץ קולי" + +#: src/modules/pomodoro/ui/config.py:142 +msgctxt "ui:timer_options|menu:notification_channel|placeholder" +msgid "Set Notification Channel" +msgstr "בחר ערוץ התראות" + +#: src/modules/pomodoro/ui/config.py:157 +msgctxt "ui:timer_options|menu:manager_role|placeholder" +msgid "Set Manager Role" +msgstr "בחר רול מנהל" + +#: src/modules/pomodoro/ui/config.py:166 +#, possible-python-brace-format +msgctxt "ui:timer_options|embed|title" +msgid "Timer Control Panel for {channel}" +msgstr "לוח שליטה של הטיימר של {channel}" + +#: src/modules/pomodoro/ui/config.py:173 +msgctxt "ui:timer_options|embed|footer" +msgid "Hover over the option names to view descriptions." +msgstr "רחף מעל השמות כדי לקרוא את התיאור שלהם" + +#: src/modules/pomodoro/ui/config.py:185 +msgctxt "ui:timer_options|embed|field:pattern|name" +msgid "Pattern" +msgstr "תבנית" + +#: src/modules/pomodoro/ui/config.py:188 +#, possible-python-brace-format +msgctxt "ui:timer_options|embed|field:pattern|value" +msgid "" +"**`{focus_len} minutes`** focus\n" +"**`{break_len} minutes`** break" +msgstr "" +"**`{focus_len} דקות`** פוקוס\n" +"**`{break_len} דקות`** הפסקה" + +#: src/modules/pomodoro/ui/config.py:199 +msgctxt "ui:timer_options|embed|field:channel_name|name" +msgid "Channel Name Preview" +msgstr "תצוגה מקדימה של השם ערוץ" + +#: src/modules/pomodoro/ui/config.py:203 +#, possible-python-brace-format +msgctxt "ui:timer_options|embed|field:channel_name|value" +msgid "" +"**`{name}`**\n" +"(The actual channel name may not match due to ratelimits.)" +msgstr "" +"**`{name}`**\n" +"(השם של החדר לא ישונה בזמן אמת מאחר ודיסקורד מגבילים אותנו מלעשות יותר מידי שינויים)" + +#: src/modules/pomodoro/ui/config.py:213 +msgctxt "ui:timer_options|embed|field:issues|name" +msgid "Issues" +msgstr "בעיות" + +#: src/modules/pomodoro/ui/config.py:231 +msgctxt "ui:timer_options|issue:no_voice_channel" +msgid "The configured voice channel does not exist! Please update it below." +msgstr "הערוץ הקולי לא קיים! אנא עדכנו אותו בתחתית" + +#: src/modules/pomodoro/ui/config.py:242 +#, possible-python-brace-format +msgctxt "ui:timer_options|issue:cannot_speak" +msgid "" +"Voice alerts are on, but I don't have speaking permissions in {channel}" +msgstr "הגדרות קוליות הופעלו, אבל אין לי הרשאות לדבר ב{channel}" + +#: src/modules/pomodoro/ui/config.py:249 +#, possible-python-brace-format +msgctxt "ui:timer_options|issue:cannot_change_name" +msgid "" +"I cannot update the name of {channel}! (Needs `MANAGE_CHANNELS` permission)" +msgstr "" +"אין לי הרשאות עבור {channel} על מנת לשנות את השם שלו. אני צריך " +"`MANAGE_CHANNELS`" + +#: src/modules/pomodoro/ui/config.py:260 +msgctxt "ui:timer_options|issue:notif_channel_dne" +msgid "Configured notification channel does not exist!" +msgstr "ערוץ ההתראות לא קיים!" + +#: src/modules/pomodoro/ui/config.py:269 +#, possible-python-brace-format +msgctxt "ui:timer_options|issue:notif_channel_write" +msgid "" +"I cannot attach files (`ATTACH_FILES`) or send embeds (`EMBED_LINKS`) in " +"{channel}" +msgstr "" +"אני לא יכול להעלות תמונות ל{channel}, אין לי את ההרשאות הנכונות ! " +"(`ATTACH_FILES, EMBED_LINKS`)" + +#: src/modules/pomodoro/ui/config.py:277 +#, possible-python-brace-format +msgctxt "ui:timer_options|issues:cannot_make_webhooks" +msgid "" +"I cannot create the notification webhook (`MANAGE_WEBHOOKS`) in {channel}" +msgstr "" +"אני לא יכול לשלוח התראות בערוץ {channel}, חסרה לי ההרשאה `MANAGE_WEBHOOKS`" diff --git a/locales/he_IL/LC_MESSAGES/babel.po b/locales/he_IL/LC_MESSAGES/babel.po new file mode 100644 index 00000000..f30732fc --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/babel.po @@ -0,0 +1,393 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/babel/settingui.py:40 +msgctxt "ui:locale_config|button:force|label" +msgid "Toggle Force" +msgstr "הפעל כוח" + +#: src/babel/settingui.py:49 +msgctxt "ui:locale_config|embed|title" +msgid "Language Configuration Panel" +msgstr "תפריט שפה" + +#: src/babel/settingui.py:83 +msgctxt "dash:locale|title" +msgid "Server Language Configuration ({commands[configure language]})" +msgstr "ניהול שפת שרת ({commands[configure language]})" + +#: src/babel/settingui.py:87 +msgctxt "dash:locale|dropdown|placeholder" +msgid "Server Language Panel" +msgstr "לוח שפות של השרת" + +#: src/babel/cog.py:99 +msgctxt "cmd:configure_language" +msgid "language" +msgstr "שפה" + +#: src/babel/cog.py:101 +msgctxt "cmd:configure_language|desc" +msgid "Configure the default language I will use in this server." +msgstr "קבעו באיזו שפה אשתמש בשרת" + +#: src/babel/cog.py:147 +#, possible-python-brace-format +msgctxt "cmd:configure_language|error" +msgid "" +"You cannot enable `{force_setting}` without having a configured language!" +msgstr "אתם לא יכולים להשתמש ב `{force_setting}` מבלי לקבוע שפה לשרת!" + +#: src/babel/cog.py:167 +msgctxt "cmd:configure_language|success" +msgid "Language settings updated!" +msgstr "הגדרות שפה עודכנו!" + +#: src/babel/cog.py:183 +msgctxt "cmd:userconfig_language" +msgid "language" +msgstr "שפה" + +#: src/babel/cog.py:186 +msgctxt "cmd:userconfig_language|desc" +msgid "Set your preferred interaction language." +msgstr "קבעו את השפה המועדפת עליכם." + +#: src/babel/cog.py:190 +msgctxt "cmd:userconfig_language|param:language" +msgid "language" +msgstr "שפה" + +#: src/babel/cog.py:195 +msgctxt "cmd:userconfig_language|param:language|desc" +msgid "Which language do you want me to respond in?" +msgstr "באיזו שפה תרצה שאגיב?" + +#: src/babel/cog.py:211 +msgctxt "cmd:userconfig_language|button:reset|label" +msgid "Reset" +msgstr "אפס" + +#: src/babel/cog.py:251 +#, possible-python-brace-format +msgctxt "acmpl:language|no_match" +msgid "No supported languages matching {partial}" +msgstr "אין שפות שמתאימות {partial}" + +#: src/babel/utils.py:9 +msgctxt "utils|months" +msgid "" +"January,February,March,April,May,June,July,August,September,October,November,December" +msgstr "" +"ינואר,פבואר,מרץ,אפריל,מאי,יוני,יולי,אוגוסט,ספטמבר,אוקטובר,נובמבר,דצמבר" + +#: src/babel/utils.py:14 +msgctxt "utils|short_months" +msgid "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec" +msgstr "יאנ,פאב,מרץ,אפר,מאי,יונ,יולי,אוג,ספט,אוק,נוב,דצמ" + +#: src/babel/settings.py:23 +msgctxt "settype:locale|accepts" +msgid "Enter a supported language (e.g. 'en-GB')." +msgstr "הכניסו שפה נתמכת (לדוגמא \"en-GB\")" + +#: src/babel/settings.py:34 +msgctxt "settype:locale|summary_table|field:supported|key" +msgid "Supported" +msgstr "נתמך" + +#: src/babel/settings.py:44 +msgctxt "settype:locale|formatted:unset" +msgid "Unset" +msgstr "לא נקבע" + +#: src/babel/settings.py:60 +#, possible-python-brace-format +msgctxt "settype:locale|error" +msgid "Sorry, we do not support the language `{lang}` at this time!" +msgstr "" +"סליחה, עוד לא הוספנו את השפה `{lang}`! תרצו לעזור לנו להוסיף אותה? הצטרפו " +"לשרת הראשי לעוד פרטים." + +#: src/babel/settings.py:75 +msgctxt "userset:locale" +msgid "language" +msgstr "שפה" + +#: src/babel/settings.py:76 +msgctxt "userset:locale|desc" +msgid "Your preferred language for interacting with me." +msgstr "השפה המועדפת לאינטרקציה איתי" + +#: src/babel/settings.py:79 +msgctxt "userset:locale|long_desc" +msgid "" +"The language you would prefer me to respond to commands and interactions in." +" Servers may be configured to override this with their own language." +msgstr "" +"השפה שהייתם מעדיפים שאגיב לפקודות והאינטרקציות איתי. שרתים אחרים יכולים לבקש" +" לשנות את השפה שלי לכל המשתמשים שלהם." + +#: src/babel/settings.py:90 +msgctxt "userset:locale|response" +msgid "You have unset your language." +msgstr "ביטלת את בחירת השפה שלך." + +#: src/babel/settings.py:92 +#, possible-python-brace-format +msgctxt "userset:locale|response" +msgid "You have set your language to {lang}." +msgstr "קבעת שהשפה שלך תהייה {lang}." + +#: src/babel/settings.py:110 +msgctxt "guildset:force_locale" +msgid "force_language" +msgstr "תכריח_שפה" + +#: src/babel/settings.py:112 +msgctxt "guildset:force_locale|desc" +msgid "" +"Whether to force all members to use the configured guild language when " +"interacting with me." +msgstr "מאפשר להכריח את כל המשתמשים בשרת להשתמש בשפה אחת." + +#: src/babel/settings.py:115 +msgctxt "guildset:force_locale|long_desc" +msgid "" +"When enabled, commands in this guild will always use the configured guild " +"language, regardless of the member's personally configured language." +msgstr "" +"כאשר מופעל, כל הפקודות בשרת תמיד יהיו בשפה של השרת, בלי קשר לשפה שהמשתמשים " +"בחרו לעצמם." + +#: src/babel/settings.py:119 +msgctxt "guildset:force_locale|output" +msgid "Enabled (members will be forced to use the server language)" +msgstr "מופעל (המשתמשים חייבים להשתמש בשפה של השרת)" + +#: src/babel/settings.py:120 +msgctxt "guildset:force_locale|output" +msgid "Disabled (members may set their own language)" +msgstr "מבוטל (המשתמשים לא חייבים להשתמש בשפה של השרת)" + +#: src/babel/settings.py:134 +msgctxt "guildset:force_locale|response" +msgid "I will always use the set language in this server." +msgstr "אני תמיד אשתמש בשפה שהוגדרה לשרת." + +#: src/babel/settings.py:139 +msgctxt "guildset:force_locale|response" +msgid "I will now allow the members to set their own language here." +msgstr "מעכשיו ארשה למשתמשים לקבוע לעצמם את השפה המועדפת עליהם." + +#: src/babel/settings.py:156 +msgctxt "guildset:locale" +msgid "language" +msgstr "שפה" + +#: src/babel/settings.py:157 +msgctxt "guildset:locale|desc" +msgid "Your preferred language for interacting with me." +msgstr "השפה המועדפת לאינטרקציה איתי" + +#: src/babel/settings.py:160 +msgctxt "guildset:locale|long_desc" +msgid "" +"The default language to use for responses and interactions in this server. " +"Member's own configured language will override this for their commands " +"unless `force_language` is enabled." +msgstr "" +"הברירת מחדל בה אשתמש בפקודות ואניטרקציות בשרת. משתמשים יכולים להגדיר את השפה" +" של עצמם, אלא אם \"הכרח_שפה\" מופעל." + +#: src/babel/settings.py:172 +msgctxt "guildset:locale|response" +msgid "You have unset the guild language." +msgstr "ביטלת את השפה של השרת." + +#: src/babel/settings.py:174 +#, possible-python-brace-format +msgctxt "guildset:locale|response" +msgid "You have set the guild language to {lang}." +msgstr "קבעת שהשפה של השרת תהייה {lang}." + +#: src/babel/enums.py:42 +msgctxt "localenames|locale:en-US" +msgid "American English" +msgstr "אנגלית אמריקאית" + +#: src/babel/enums.py:43 +msgctxt "localenames|locale:en-GB" +msgid "British English" +msgstr "אנגלית בריטית" + +#: src/babel/enums.py:44 +msgctxt "localenames|locale:bg" +msgid "Bulgarian" +msgstr "בולגרית" + +#: src/babel/enums.py:45 +msgctxt "localenames|locale:zh-CN" +msgid "Chinese" +msgstr "סינית" + +#: src/babel/enums.py:46 +msgctxt "localenames|locale:zh-TW" +msgid "Taiwan Chinese" +msgstr "סינית טויאן" + +#: src/babel/enums.py:47 +msgctxt "localenames|locale:hr" +msgid "Croatian" +msgstr "קרואטית" + +#: src/babel/enums.py:48 +msgctxt "localenames|locale:cs" +msgid "Czech" +msgstr "צ'כית" + +#: src/babel/enums.py:49 +msgctxt "localenames|locale:da" +msgid "Danish" +msgstr "דנית" + +#: src/babel/enums.py:50 +msgctxt "localenames|locale:nl" +msgid "Dutch" +msgstr "הולנדית" + +#: src/babel/enums.py:51 +msgctxt "localenames|locale:fi" +msgid "Finnish" +msgstr "פינית" + +#: src/babel/enums.py:52 +msgctxt "localenames|locale:fr" +msgid "French" +msgstr "צרפתית" + +#: src/babel/enums.py:53 +msgctxt "localenames|locale:de" +msgid "German" +msgstr "גרמנית" + +#: src/babel/enums.py:54 +msgctxt "localenames|locale:el" +msgid "Greek" +msgstr "יוונית" + +#: src/babel/enums.py:55 +msgctxt "localenames|locale:hi" +msgid "Hindi" +msgstr "הודית" + +#: src/babel/enums.py:56 +msgctxt "localenames|locale:hu" +msgid "Hungarian" +msgstr "הונגרית" + +#: src/babel/enums.py:57 +msgctxt "localenames|locale:it" +msgid "Italian" +msgstr "איטלקית" + +#: src/babel/enums.py:58 +msgctxt "localenames|locale:ja" +msgid "Japanese" +msgstr "יפנית" + +#: src/babel/enums.py:59 +msgctxt "localenames|locale:ko" +msgid "Korean" +msgstr "קוראנית" + +#: src/babel/enums.py:60 +msgctxt "localenames|locale:lt" +msgid "Lithuanian" +msgstr "ליטאית" + +#: src/babel/enums.py:61 +msgctxt "localenames|locale:no" +msgid "Norwegian" +msgstr "נורווגית" + +#: src/babel/enums.py:62 +msgctxt "localenames|locale:pl" +msgid "Polish" +msgstr "פוליש" + +#: src/babel/enums.py:63 +msgctxt "localenames|locale:pt-BR" +msgid "Brazil Portuguese" +msgstr "פורטוגזית" + +#: src/babel/enums.py:64 +msgctxt "localenames|locale:ro" +msgid "Romanian" +msgstr "רומנית" + +#: src/babel/enums.py:65 +msgctxt "localenames|locale:ru" +msgid "Russian" +msgstr "רוסית" + +#: src/babel/enums.py:66 +msgctxt "localenames|locale:es-ES" +msgid "Spain Spanish" +msgstr "ספרדית" + +#: src/babel/enums.py:67 +msgctxt "localenames|locale:sv-SE" +msgid "Swedish" +msgstr "שוודית" + +#: src/babel/enums.py:68 +msgctxt "localenames|locale:th" +msgid "Thai" +msgstr "תאילנדית" + +#: src/babel/enums.py:69 +msgctxt "localenames|locale:tr" +msgid "Turkish" +msgstr "טורקית" + +#: src/babel/enums.py:70 +msgctxt "localenames|locale:uk" +msgid "Ukrainian" +msgstr "אוקראינית" + +#: src/babel/enums.py:71 +msgctxt "localenames|locale:vi" +msgid "Vietnamese" +msgstr "ויאטנמית" + +#: src/babel/enums.py:72 +msgctxt "localenames|locale:he" +msgid "Hebrew" +msgstr "עברית" + +#: src/babel/enums.py:73 +msgctxt "localenames|locale:he_IL" +msgid "Hebrew (Israel)" +msgstr "עברית (ישראל)" diff --git a/locales/he_IL/LC_MESSAGES/base.po b/locales/he_IL/LC_MESSAGES/base.po new file mode 100644 index 00000000..f672056d --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/base.po @@ -0,0 +1,38 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-11-22 13:17+0200\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: bot/modules/sysadmin/exec_cog.py:70 +msgid "You cannot use this interface!" +msgstr "אתם לא יכולים להשתמש בתפריט הזה." + +#: bot/modules/sysadmin/exec_cog.py:252 bot/modules/sysadmin/exec_cog.py:254 +msgid "async" +msgstr "אסינכרוני" + +#: bot/modules/sysadmin/exec_cog.py:253 bot/modules/sysadmin/exec_cog.py:255 +msgid "Execute arbitrary code with Exec" +msgstr "הרץ קוד ארביטררי עם אקסק" + +#: bot/modules/sysadmin/exec_cog.py:265 +msgid "eval" +msgstr "eval" diff --git a/locales/he_IL/LC_MESSAGES/config.po b/locales/he_IL/LC_MESSAGES/config.po new file mode 100644 index 00000000..914b9ae2 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/config.po @@ -0,0 +1,90 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/config/general.py:41 +msgctxt "guildset:timezone" +msgid "timezone" +msgstr "אזור זמן" + +#: src/modules/config/general.py:44 +msgctxt "guildset:timezone|desc" +msgid "Guild timezone for statistics display." +msgstr "אזור הזמן של השרת להצגת סטטיסטיקות למשתמשים" + +#: src/modules/config/general.py:48 +msgctxt "guildset:timezone|long_desc" +msgid "" +"Guild-wide timezone. Used to determine start of the day for the " +"leaderboards, and as the default statistics timezone for members who have " +"not set one." +msgstr "" +"אזור זמן מועדף לכל המשתמשים בשרת. משומש כדי לקבוע זמן התחלה ללוח תוצאות, " +"התחלת היום, ואזור זמן לאנשים שמשתמשים בשרת אבל לא קבעו לעצמם אזור זמן." + +#: src/modules/config/general.py:62 +#, possible-python-brace-format +msgctxt "guildset:timezone|response" +msgid "The guild timezone has been set to `{timezone}`." +msgstr "אזור הזמן של השרת נקבע ל`{timezone}`." + +#: src/modules/config/general.py:94 +msgctxt "cmd:configure_general" +msgid "general" +msgstr "כללי" + +#: src/modules/config/general.py:95 +msgctxt "cmd:configure_general|desc" +msgid "General configuration panel" +msgstr "תפריט הגדרות כלליות" + +#: src/modules/config/general.py:129 +msgctxt "cmd:configure_general|parse_failure:timezone" +msgid "Could not set the timezone!" +msgstr "לא הצלחתי לקבוע אזור זמן!" + +#: src/modules/config/general.py:150 +msgctxt "cmd:configure_general|success" +msgid "Settings Updated!" +msgstr "ההגדרות עודכנו!" + +#: src/modules/config/general.py:165 +msgctxt "cmd:configure_general|panel|title" +msgid "General Configuration Panel" +msgstr "תפריט הגדרות כלליות" + +#: src/modules/config/dashboard.py:98 +#, possible-python-brace-format +msgctxt "ui:dashboard|title" +msgid "Guild Dashboard (Page {page}/{total})" +msgstr "תפריט שרת (עמוד {page}/{total})" + +#: src/modules/config/dashboard.py:109 +msgctxt "ui:dashboard|footer" +msgid "Hover over setting names for a brief description" +msgstr "רחף מעל השמות כדי לקרוא את התיאור שלהם" + +#: src/modules/config/dashboard.py:172 +msgctxt "ui:dashboard|menu:config|placeholder" +msgid "Open Configuration Panel" +msgstr "פתח את התפריט הגדרות" diff --git a/locales/he_IL/LC_MESSAGES/core_config.po b/locales/he_IL/LC_MESSAGES/core_config.po new file mode 100644 index 00000000..78cc3cc9 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/core_config.po @@ -0,0 +1,27 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/core/config.py:28 +msgctxt "group:configure" +msgid "configure" +msgstr "הגדר" diff --git a/locales/he_IL/LC_MESSAGES/economy.po b/locales/he_IL/LC_MESSAGES/economy.po new file mode 100644 index 00000000..5e05cbd7 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/economy.po @@ -0,0 +1,542 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/economy/settingui.py:33 +msgctxt "ui:economy_config|embed|title" +msgid "Economy Configuration Panel" +msgstr "תפריט ניהול כלכלה" + +#: src/modules/economy/settingui.py:68 +msgctxt "dash:economy|title" +msgid "Economy Configuration ({commands[configure economy]})" +msgstr "תפריט כלכלה ({commands[configure economy]})" + +#: src/modules/economy/settingui.py:72 +msgctxt "dash:economy|dropdown|placeholder" +msgid "Economy Panel" +msgstr "תפריט כלכלה" + +#. ----- Economy group commands ----- +#: src/modules/economy/cog.py:86 +msgctxt "cmd:economy" +msgid "economy" +msgstr "כלכלה" + +#: src/modules/economy/cog.py:92 +msgctxt "cmd:economy_balance" +msgid "balance" +msgstr "מאזן" + +#: src/modules/economy/cog.py:95 +msgctxt "cmd:economy_balance|desc" +msgid "Display or modify LionCoin balance for members and roles." +msgstr "נהל מאזן מטבעות למשתמשים ספציפיים או רולים." + +#: src/modules/economy/cog.py:99 +msgctxt "cmd:economy_balance|param:target" +msgid "target" +msgstr "מטרה" + +#: src/modules/economy/cog.py:100 +msgctxt "cmd:economy_balance|param:add" +msgid "add" +msgstr "הוסף" + +#: src/modules/economy/cog.py:101 +msgctxt "cmd:economy_balance|param:set" +msgid "set" +msgstr "בחר" + +#: src/modules/economy/cog.py:106 +msgctxt "cmd:economy_balance|param:target|desc" +msgid "" +"Target user or role to view or update. Use @everyone to update the entire " +"guild." +msgstr "" +"בחר משתמש או רול כדי לנהל. תשתמש ב@everyone כדי לעדכן את כל השרת בבת אחת." + +#: src/modules/economy/cog.py:110 +msgctxt "cmd:economy_balance|param:add|desc" +msgid "" +"Number of LionCoins to add to the target member's balance. May be negative " +"to remove." +msgstr "מספר מטבעות כדי להוסיף למטרה. בחר במספר שלילי כדי להחסיר מטבעות." + +#: src/modules/economy/cog.py:114 +msgctxt "cmd:economy_balance|param:set|set" +msgid "New balance to set the target's balance to." +msgstr "מאזן חדש שיקבע אצל המטרה." + +#: src/modules/economy/cog.py:152 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|error:no_target" +msgid "" +"There are no valid members in {role.mention}! It has a total of `0` LC." +msgstr "אין משתמשים ישימים ב{role.mention}! יש להם 0 מטבעות." + +#: src/modules/economy/cog.py:163 +msgctxt "cmd:economy_balance|error:target_is_bot" +msgid "Bots cannot have coin balances!" +msgstr "בוטים לא יכולים לקבל מטבעות." + +#: src/modules/economy/cog.py:174 +msgctxt "cmd:economy_balance|error:args" +msgid "You cannot simultaneously `set` and `add` member balances!" +msgstr "אתם לא יכולים להוסיף ולקבוע מאזנים בו זמנית." + +#: src/modules/economy/cog.py:223 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success|affected" +msgid "One user was affected." +msgid_plural "**{count}** users were affected." +msgstr[0] "משתמש אחד שונה." +msgstr[1] "שני משתמשים שונו." +msgstr[2] "המון משתמשים שונו." +msgstr[3] "**{count}** משתמשים שונו." + +#: src/modules/economy/cog.py:229 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm|affected" +msgid "One user will be affected." +msgid_plural "**{count}** users will be affected." +msgstr[0] "משתמש אחד יעבור שינוי." +msgstr[1] "שני משתמשים יעברו שינוי." +msgstr[2] "הרבה משתמשים יעברו שינוי." +msgstr[3] "**{count}** משתמשים יעברו שינוי." + +#: src/modules/economy/cog.py:236 +msgctxt "cmd:economy_balance|confirm|button:confirm" +msgid "Yes, adjust balances" +msgstr "כן, שנה מאזנים" + +#: src/modules/economy/cog.py:240 +msgctxt "cmd:economy_balance|confirm|button:cancel" +msgid "No, cancel" +msgstr "לא, בטל" + +#: src/modules/economy/cog.py:247 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_set|desc" +msgid "" +"All members of **{guild_name}** have had their balance set to " +"{coin_emoji}**{amount}**." +msgstr "" +"כל המשתמשים ב**{guild_name}** עברו שינוי ועכשיו המאזנים של כולם שווים ל " +"{coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:256 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm_set|desc" +msgid "" +"Are you sure you want to set everyone's balance to {coin_emoji}**{amount}**?" +msgstr "" +"אתם בטוחים שאתם רוצים לשנות את המאזנים של כולם ל{coin_emoji}**{amount}**?" + +#: src/modules/economy/cog.py:264 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_set|desc" +msgid "" +"All members of {role_mention} have had their balance set to " +"{coin_emoji}**{amount}**." +msgstr "" +"כל המאזנים של המשתמשים תחת הרול {role_mention} שונו ל " +"{coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:273 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm_set|desc" +msgid "" +"Are you sure you want to set the balance of everyone with {role_mention} to " +"{coin_emoji}**{amount}**?" +msgstr "" +"אתם בטוחים שאתם רוצים לקבוע את המאזנים של כל מי שיש לו את הרול " +"{role_mention} ל{coin_emoji}**{amount}**?" + +#: src/modules/economy/cog.py:290 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_set|desc" +msgid "{user_mention} now has a balance of {coin_emoji}**{amount}**." +msgstr "ל{user_mention}  יש עכשיו {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:306 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_add|desc" +msgid "" +"All members of **{guild_name}** have been given {coin_emoji}**{amount}**." +msgstr "כל המשתמשים בשרת **{guild_name}** קיבלו {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:315 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm_add|desc" +msgid "Are you sure you want to add **{amount}** to everyone's balance?" +msgstr "אתם בטוחים שאתם רוצים להוסיף **{amount}** מטבעות לכולם?" + +#: src/modules/economy/cog.py:323 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_add|desc" +msgid "" +"All members of {role_mention} have been given {coin_emoji}**{amount}**." +msgstr "כל המשתמשים עם הרול {role_mention} קיבלו {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:332 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|confirm_add|desc" +msgid "" +"Are you sure you want to add {coin_emoji}**{amount}** to everyone in " +"{role_mention}?" +msgstr "" +"אתם בטוחים שאתם רוצים להוסיף {coin_emoji}**{amount}** לכל מי שיש לו את הרול" +" {role_mention}?" + +#: src/modules/economy/cog.py:354 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:success_add|desc" +msgid "" +"{user_mention} was given {coin_emoji}**{amount}**, and now has a balance of " +"{coin_emoji}**{new_amount}**." +msgstr "" +"{user_mention} קיבל {coin_emoji}**{amount}**, ועכשיו יש להם " +"{coin_emoji}**{new_amount}**." + +#: src/modules/economy/cog.py:365 +msgctxt "cmd:economy_balance|embed:success|title" +msgid "Account successfully updated." +msgid_plural "Accounts successfully updated." +msgstr[0] "המשתמש עודכן בהצלחה." +msgstr[1] "שני משתמשים עודכנו בהצלחה." +msgstr[2] "הרבה משתמשים עודכנו בהצלחה." +msgstr[3] "המשתמשים עודכנו בהצלחה." + +#: src/modules/economy/cog.py:394 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|author" +msgid "Balance sheet for {name}" +msgstr "מאזן של {name}" + +#: src/modules/economy/cog.py:400 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|header" +msgid "This server has a total balance of {coin_emoji}**{total}**." +msgstr "לכל מהשתמשים בשרת יש ביחד {coin_emoji}**{total}**." + +#: src/modules/economy/cog.py:408 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|header" +msgid "" +"{role_mention} has `{count}` members with non-zero balance, with a total " +"balance of {coin_emoji}**{total}**." +msgstr "" +"ל{role_mention} יש `{count}` משתמשים עם מאזן גדול מ-0, לכולם יחד יש " +"{coin_emoji}**{total}**." + +#: src/modules/economy/cog.py:420 +msgctxt "cmd:economy_balance|embed:role_lb|row_format" +msgid "`[{pos:>{numwidth}}]` | `{coins:>{coinwidth}} LC` | {mention}" +msgstr "`[{pos:>{numwidth}}]` | `{coins:>{coinwidth}} LC` | {mention}" + +#: src/modules/economy/cog.py:448 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|footer" +msgid "Page {page}/{total}" +msgstr "עמוד {page}/{total}" + +#: src/modules/economy/cog.py:458 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|header" +msgid "This server has a total balance of {coin_emoji}**0**." +msgstr "אין לאף אחד בשרת מטבעות." + +#: src/modules/economy/cog.py:465 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:role_lb|header" +msgid "The role {role_mention} has a total balance of {coin_emoji}**0**." +msgstr "לרול {role_mention} אין מטבעות." + +#: src/modules/economy/cog.py:485 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:single|desc" +msgid "{mention} currently owns {coin_emoji} {coins}." +msgstr "ל{mention} יש כרגע {coin_emoji} {coins}." + +#: src/modules/economy/cog.py:495 +#, possible-python-brace-format +msgctxt "cmd:economy_balance|embed:single|author" +msgid "Balance statement for {user}" +msgstr "המאזן של {user}" + +#: src/modules/economy/cog.py:504 +msgctxt "cmd:economy_reset" +msgid "reset" +msgstr "אפס" + +#: src/modules/economy/cog.py:507 +msgctxt "cmd:economy_reset|desc" +msgid "" +"Reset the coin balance for a target user or role. (See also \"economy " +"balance\".)" +msgstr "אפס את מאזן המטבעות של משתמש ספציפי או של רול. (קרא עוד ב\"מאזן כלכלה\")" + +#: src/modules/economy/cog.py:511 +msgctxt "cmd:economy_reset|param:target" +msgid "target" +msgstr "מטרה" + +#: src/modules/economy/cog.py:516 +msgctxt "cmd:economy_reset|param:target|desc" +msgid "" +"Target user or role to view or update. Use @everyone to reset the entire " +"guild." +msgstr "" +"בחר משתמש או רול כדי לנהל. השתמש ב@everyone כדי לבחור את כל השרת בבת אחת." + +#: src/modules/economy/cog.py:543 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|confirm:reset_guild|desc" +msgid "" +"Are you sure you want to reset the coin balance for everyone in **{guild_name}**?\n" +"*This is not reversible!*" +msgstr "" +"אתם בטוחים שאתם רוצים לאפס את המטבעות של כולם בשרת **{guild_name}**?\n" +"*המטבעות יאבדו לנצח ולא יהיה ניתן לשחזר אותם!*" + +#: src/modules/economy/cog.py:551 +msgctxt "cmd:economy_reset|confirm:reset_guild|button:confirm" +msgid "Yes, reset the economy" +msgstr "כן, אפס את הכלכלה" + +#: src/modules/economy/cog.py:555 +msgctxt "cmd:economy_reset|confirm:reset_guild|button:cancel" +msgid "Cancel reset" +msgstr "בטל את האיפוס" + +#: src/modules/economy/cog.py:571 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|embed:success_guild|desc" +msgid "" +"Everyone in **{guild_name}** has had their balance reset to " +"{coin_emoji}**{amount}**." +msgstr "כולם בשרת **{guild_name}** עברו איפוס ל {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:588 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|error:no_target|desc" +msgid "The role {mention} has no members to reset!" +msgstr "לרול {mention} אין משתמשים לאפס!" + +#: src/modules/economy/cog.py:598 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|confirm:reset_role|desc" +msgid "" +"Are you sure you want to reset the balance for everyone in {mention}?\n" +"**{count}** members will be affected." +msgstr "" +"אתם בטוחים שאתם רוצים לאפס את המאזנים של כולם תחת הרול {mention}?\n" +"**{count}** יעברו שינוי." + +#: src/modules/economy/cog.py:607 +msgctxt "cmd:economy_reset|confirm:reset_role|button:confirm" +msgid "Yes, complete economy reset" +msgstr "כן, השלם את איפוס הכלכלה" + +#: src/modules/economy/cog.py:611 +msgctxt "cmd:economy_reset|confirm:reset_role|button:cancel" +msgid "Cancel" +msgstr "בטל" + +#: src/modules/economy/cog.py:628 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|embed:success_role|desc" +msgid "" +"Everyone in {role_mention} has had their coin balance reset to " +"{coin_emoji}**{amount}**." +msgstr "כולם תחת הרול {role_mention} עברו איפוס ל{coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:650 +#, possible-python-brace-format +msgctxt "cmd:economy_reset|embed:success_user|desc" +msgid "{mention}'s balance has been reset to {coin_emoji}**{amount}**." +msgstr "המאזן של {mention} אופס ל {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:660 +msgctxt "cmd:send" +msgid "send" +msgstr "שלח" + +#: src/modules/economy/cog.py:663 +msgctxt "cmd:send|desc" +msgid "Gift the target user a certain number of LionCoins." +msgstr "שלח מטבעות במתנה למטרה שתרצה" + +#: src/modules/economy/cog.py:667 +msgctxt "cmd:send|param:target" +msgid "target" +msgstr "מטרה" + +#: src/modules/economy/cog.py:668 +msgctxt "cmd:send|param:amount" +msgid "amount" +msgstr "כמות" + +#: src/modules/economy/cog.py:669 +msgctxt "cmd:send|param:note" +msgid "note" +msgstr "פתקית" + +#: src/modules/economy/cog.py:672 +msgctxt "cmd:send|param:target|desc" +msgid "User to send the gift to" +msgstr "המשתמש שאליו תשלחו את המתנה" + +#: src/modules/economy/cog.py:673 +msgctxt "cmd:send|param:amount|desc" +msgid "Number of coins to send" +msgstr "כמות המטבעות שתרצו לשלוח" + +#: src/modules/economy/cog.py:674 +msgctxt "cmd:send|param:note|desc" +msgid "Optional note to add to the gift." +msgstr "פתקית שתרצו להוסיף למתנה." + +#: src/modules/economy/cog.py:698 +msgctxt "cmd:send|error:not_allowed" +msgid "Sorry, this server has disabled LionCoin transfers!" +msgstr "מצטערים, אבל מנהל השרת בחר שלא לאפשר מסחר מטבעות." + +#: src/modules/economy/cog.py:723 +#, possible-python-brace-format +msgctxt "cmd:send|error:insufficient" +msgid "" +"You do not have enough lioncoins to do this!\n" +"`Current Balance:` {coin_emoji}{balance}" +msgstr "" +"אין לך מספיק מטבעות כדי לעשות את זה!\n" +"`מאזן נוכחי:` {coin_emoji}{balance}" + +#: src/modules/economy/cog.py:744 +#, possible-python-brace-format +msgctxt "cmd:send|embed:gift|title" +msgid "{user} sent you a gift!" +msgstr "{user} שלח לך מתנה!" + +#: src/modules/economy/cog.py:748 +#, possible-python-brace-format +msgctxt "cmd:send|embed:gift|desc" +msgid "{mention} sent you {coin_emoji}**{amount}**." +msgstr "{mention} שלח לך {coin_emoji}**{amount}**." + +#: src/modules/economy/cog.py:773 +#, possible-python-brace-format +msgctxt "cmd:send|embed:ack|desc" +msgid "" +"**{coin_emoji}{amount}** has been deducted from your balance and sent to " +"{mention}!" +msgstr "**{coin_emoji}{amount}** הוסרו מהמאזן שלך ונשלחו ל{mention}!" + +#: src/modules/economy/cog.py:783 +msgctxt "cmd:send|embed:ack|desc|error:unreachable" +msgid "" +"Unfortunately, I was not able to message the recipient. Perhaps they have me" +" blocked?" +msgstr "" +"לצערי לא הצלחתי לשלוח הודעה פרטית למטרה. סביר להניח שהם חסמו את ההודעות " +"הפרטיות שלהם. " + +#: src/modules/economy/cog.py:795 +msgctxt "cmd:configure_economy" +msgid "economy" +msgstr "כלכלה" + +#: src/modules/economy/cog.py:798 +msgctxt "cmd:configure_economy|desc" +msgid "Configure LionCoin Economy" +msgstr "הגדרות כלכלה של מטבעות" + +#: src/modules/economy/settings.py:35 +msgctxt "guildset:coins_per_xp" +msgid "coins_per_100xp" +msgstr "מטבעות_כל_100_נקודות_ניסיון" + +#: src/modules/economy/settings.py:38 +msgctxt "guildset:coins_per_xp|desc" +msgid "How many LionCoins to reward members per 100 XP they earn." +msgstr "כמות המטבעות שאתן לכל משתמש שמשיג 100 נקודות ניסיון." + +#: src/modules/economy/settings.py:42 +msgctxt "guildset:coins_per_xp|long_desc" +msgid "" +"Members will be rewarded with this many LionCoins for every 100 XP they " +"earn." +msgstr "" +"זו הכמות מטבעות שהמשתמשים בשרת יקבלו כל פעם שהם משיגים 100 נקודות ניסיון." + +#: src/modules/economy/settings.py:46 +msgctxt "guildset:coins_per_xp|long_desc" +msgid "The number of coins to reward per 100 XP." +msgstr "כמות המטבעות שאתן כל 100 נקודות ניסיון." + +#: src/modules/economy/settings.py:59 +#, possible-python-brace-format +msgctxt "guildset:coins_per_xp|set_response" +msgid "" +"For every **100** XP they earn, members will now be given " +"{coin}**{amount}**." +msgstr "כל 100 נקודות ניסיון, המשתמשים יקבלו {coin}**{amount}**." + +#: src/modules/economy/settings.py:70 +msgctxt "guildset:allow_transfers" +msgid "allow_transfers" +msgstr "הרשה_מסחר" + +#: src/modules/economy/settings.py:73 +msgctxt "guildset:allow_transfers|desc" +msgid "Whether to allow members to transfer LionCoins to each other." +msgstr "האם להרשות מסחר מטבעות או לא בשרת הזה." + +#: src/modules/economy/settings.py:77 +msgctxt "guildset:allow_transfers|long_desc" +msgid "" +"If disabled, members will not be able to transfer LionCoins to each other." +msgstr "אם האופציה הזו לא פעילה, משתמשים לא יוכלו להעביר בניהם מטבעות. " + +#: src/modules/economy/settings.py:85 +msgctxt "guildset:allow_transfers|outputs:true" +msgid "Enabled (Coin transfers allowed.)" +msgstr "מופעל (מסחר מטבעות אפשרי בשרת.)" + +#: src/modules/economy/settings.py:86 +msgctxt "guildset:allow_transfers|outputs:false" +msgid "Disabled (Coin transfers not allowed.)" +msgstr "מבוטל (לא ניתן לסחור במטבעות.)" + +#: src/modules/economy/settings.py:102 +#, possible-python-brace-format +msgctxt "guildset:allow_transfers|set_response|set:true" +msgid "Members will now be able to use {send_cmd} to transfer {coin}" +msgstr "המשתמשים יוכלו להשתמש ב{send_cmd} כדי לשלוח {coin}" + +#: src/modules/economy/settings.py:107 +#, possible-python-brace-format +msgctxt "guildset:allow_transfers|set_response|set:false" +msgid "Members will not be able to use {send_cmd} to transfer {coin}" +msgstr "המשתמשים לא יוכלו להשתמש ב{send_cmd} כדי לשלוח {coin}" diff --git a/locales/he_IL/LC_MESSAGES/exec.po b/locales/he_IL/LC_MESSAGES/exec.po new file mode 100644 index 00000000..c585d3f3 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/exec.po @@ -0,0 +1,91 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/sysadmin/exec_cog.py:257 +msgctxt "ward:sys_admin|failed" +msgid "You must be a bot owner to do this!" +msgstr "אתה צריך להיות הבעלים של הבוט כדי לעשות את זה!" + +#: src/modules/sysadmin/exec_cog.py:262 +msgid "async" +msgstr "אסינכרוני" + +#: src/modules/sysadmin/exec_cog.py:263 +msgid "Execute arbitrary code with Exec" +msgstr "הרץ קוד ארביטררי עם אקסק" + +#: src/modules/sysadmin/exec_cog.py:272 +msgctxt "command" +msgid "eval" +msgstr "eval" + +#: src/modules/sysadmin/exec_cog.py:273 +msgctxt "command:eval" +msgid "Execute arbitrary code with Eval" +msgstr "Execute arbitrary code with Eval" + +#: src/modules/sysadmin/exec_cog.py:276 +msgctxt "command:eval|param:string" +msgid "Code to evaluate." +msgstr "Code to evaluate." + +#: src/modules/sysadmin/exec_cog.py:283 +msgctxt "command" +msgid "asyncall" +msgstr "asyncall" + +#: src/modules/sysadmin/exec_cog.py:284 +msgctxt "command:asyncall|desc" +msgid "Execute arbitrary code on all shards." +msgstr "Execute arbitrary code on all shards." + +#: src/modules/sysadmin/exec_cog.py:287 +msgctxt "command:asyncall|param:string" +msgid "Cross-shard code to execute. Cannot reference ctx!" +msgstr "Cross-shard code to execute. Cannot reference ctx!" + +#: src/modules/sysadmin/exec_cog.py:288 +msgctxt "command:asyncall|param:target" +msgid "Target shard app name, see autocomplete for options." +msgstr "Target shard app name, see autocomplete for options." + +#: src/modules/sysadmin/exec_cog.py:343 +msgid "reload" +msgstr "טען מחדש" + +#: src/modules/sysadmin/exec_cog.py:344 +msgid "Reload a given LionBot extension. Launches an ExecUI." +msgstr "Reload a given LionBot extension. Launches an ExecUI." + +#: src/modules/sysadmin/exec_cog.py:347 +msgid "Name of the extesion to reload. See autocomplete for options." +msgstr "Name of the extesion to reload. See autocomplete for options." + +#: src/modules/sysadmin/exec_cog.py:379 +msgid "shutdown" +msgstr "כבה" + +#: src/modules/sysadmin/exec_cog.py:380 +msgid "Shutdown (or restart) the client." +msgstr "Shutdown (or restart) the client." diff --git a/locales/he_IL/LC_MESSAGES/goals-gui.po b/locales/he_IL/LC_MESSAGES/goals-gui.po new file mode 100644 index 00000000..6887e9bf --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/goals-gui.po @@ -0,0 +1,107 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/gui/cards/goals.py:95 +msgctxt "skin:goals|goal:tasks|name" +msgid "TASKS DONE" +msgstr "משימות שהשולמו" + +#: src/gui/cards/goals.py:99 +msgctxt "skin:goals|goal:tasks|goal" +msgid "GOAL: " +msgstr "מטרה" + +#: src/gui/cards/goals.py:125 +msgctxt "skin:goals|goal:attendance|name" +msgid "" +"ATTENDANCE\n" +"RATE" +msgstr "" +"אחוז\n" +"נוכחות" + +#: src/gui/cards/goals.py:139 +msgctxt "skin:goals|mode:study|goal:middle|above" +msgid "STUDIED" +msgstr "נלמד" + +#: src/gui/cards/goals.py:143 +msgctxt "skin:goals|mode:study|goal:middle|below" +msgid "HOURS" +msgstr "שעות" + +#: src/gui/cards/goals.py:147 +msgctxt "skin:goals|mode:voice|goal:middle|above" +msgid "CHATTED" +msgstr "הודעות" + +#: src/gui/cards/goals.py:151 +msgctxt "skin:goals|mode:voice|goal:middle|below" +msgid "HOURS" +msgstr "שעות" + +#: src/gui/cards/goals.py:155 +msgctxt "skin:goals|mode:text|goal:middle|above" +msgid "SENT" +msgstr "נשלחו" + +#: src/gui/cards/goals.py:159 +msgctxt "skin:goals|mode:text|goal:middle|below" +msgid "MESSAGES" +msgstr "הודעות" + +#: src/gui/cards/goals.py:163 +msgctxt "skin:goals|mode:anki|goal:middle|above" +msgid "REVIEWED" +msgstr "הושלמו" + +#: src/gui/cards/goals.py:167 +msgctxt "skin:goals|mode:anki|goal:middle|below" +msgid "CARDS" +msgstr "קלפים" + +#: src/gui/cards/goals.py:228 +#, possible-python-brace-format +msgctxt "skin:goals|footer" +msgid "As of {day} {month} • {name}" +msgstr "נכון ליום {day} {month} • {name}" + +#: src/gui/cards/goals.py:240 +msgctxt "ui:goals|weekly|title" +msgid "WEEKLY STATISTICS" +msgstr "סטטיסטיקות שבועיות" + +#: src/gui/cards/goals.py:244 +msgctxt "ui:goals|weekly|task_header" +msgid "GOALS OF THE WEEK" +msgstr "מטרות שבועיות" + +#: src/gui/cards/goals.py:254 +msgctxt "ui:goals|monthly|title" +msgid "MONTHLY STATISTICS" +msgstr "סטטיסטיקה חודשית" + +#: src/gui/cards/goals.py:258 +msgctxt "ui:goals|monthly|task_header" +msgid "GOALS OF THE MONTH" +msgstr "מטרות חודשיות" diff --git a/locales/he_IL/LC_MESSAGES/leaderboard-gui.po b/locales/he_IL/LC_MESSAGES/leaderboard-gui.po new file mode 100644 index 00000000..2a63abce --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/leaderboard-gui.po @@ -0,0 +1,96 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/gui/cards/leaderboard.py:69 +msgctxt "skin:leaderboard|mode:study|header_text" +msgid "STUDY TIME LEADERBOARD" +msgstr "זמן למידה לוח השגים" + +#: src/gui/cards/leaderboard.py:73 +msgctxt "skin:leaderboard|mode:text|header_text" +msgid "MESSAGE LEADERBOARD" +msgstr "הודעות לוח השגים" + +#: src/gui/cards/leaderboard.py:77 +msgctxt "skin:leaderboard|mode:voice|header_text" +msgid "VOICE LEADERBOARD" +msgstr "זמן בחדרי קול לוח השגים" + +#: src/gui/cards/leaderboard.py:81 +msgctxt "skin:leaderboard|mode:anki|header_text" +msgid "ANKI REVIEW LEADERBOARD" +msgstr "אנקי לוח השגים" + +#: src/gui/cards/leaderboard.py:99 +msgctxt "skin:leaderboard|field:subheader_text" +msgid "SERVER: " +msgstr "שרת:" + +#: src/gui/cards/leaderboard.py:129 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:study|top_hours_text" +msgid "{amount} hours" +msgstr "{count} שעות" + +#: src/gui/cards/leaderboard.py:133 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:text|top_hours_text" +msgid "{amount} XP" +msgstr "{amount} נקודות" + +#: src/gui/cards/leaderboard.py:137 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:voice|top_hours_text" +msgid "{amount} hours" +msgstr "{amount} שעות" + +#: src/gui/cards/leaderboard.py:141 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:anki|top_hours_text" +msgid "{amount} cards" +msgstr "{amount} קלפים" + +#: src/gui/cards/leaderboard.py:168 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:study|entry_hours_text" +msgid "{HH:02d}:{MM:02d}" +msgstr "{HH:02d}:{MM:02d}" + +#: src/gui/cards/leaderboard.py:172 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:text|entry_hours_text" +msgid "{amount} XP" +msgstr "{amount} נקודות" + +#: src/gui/cards/leaderboard.py:176 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:voice|entry_hours_text" +msgid "{HH:02d}:{MM:02d}" +msgstr "{HH:02d}:{MM:02d}" + +#: src/gui/cards/leaderboard.py:180 +#, possible-python-brace-format +msgctxt "skin:leaderboard|mode:anki|entry_hours_text" +msgid "{amount} cards" +msgstr "{amount} קלפים" diff --git a/locales/he_IL/LC_MESSAGES/lion-core.po b/locales/he_IL/LC_MESSAGES/lion-core.po new file mode 100644 index 00000000..40268b8e --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/lion-core.po @@ -0,0 +1,134 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/core/setting_types.py:31 +msgctxt "settype:coin|accepts" +msgid "A positive integral number of coins." +msgstr "מספר מלא וחיובי של מספר מטבעות." + +#: src/core/setting_types.py:47 +msgctxt "settype:coin|parse|error:notinteger" +msgid "The coin quantity must be a positive integer!" +msgstr "כמות המטבעות חייבת להיות מספר שלם וחיובי!" + +#: src/core/setting_types.py:54 +msgctxt "settype:coin|parse|error:too_large" +msgid "Provided number of coins was too high!" +msgstr "המספר שניתן גבוה מידי!" + +#: src/core/setting_types.py:60 +msgctxt "settype:coin|parse|error:too_large" +msgid "Provided number of coins was too low!" +msgstr "המספר שניתן נמוך מידי!" + +#: src/core/setting_types.py:71 +#, possible-python-brace-format +msgctxt "settype:coin|formatted" +msgid "{coin}**{amount}**" +msgstr "{coin}**{amount}**" + +#: src/core/setting_types.py:87 +msgctxt "settype:message|accepts" +msgid "JSON formatted raw message data" +msgstr "מסמך נא בפורמט JSON " + +#: src/core/setting_types.py:102 +msgctxt "settype:message|download|error:not_json" +msgid "The attached message data is not a JSON file!" +msgstr "המסמך שהוספת הוא לא בפורמט JSON!" + +#: src/core/setting_types.py:107 +msgctxt "settype:message|download|error:size" +msgid "The attached message data is too large!" +msgstr "המסמך שהוספת גדול מידי!" + +#: src/core/setting_types.py:116 +msgctxt "settype:message|download|error:decoding" +msgid "" +"Could not decode the message data. Please ensure it is saved with the " +"`UTF-8` encoding." +msgstr "" +"לא הצלחתי לקרוא את המסמך שלך. אתה בטוח ששמרת אותו בתור `UTF-8` encoding?" + +#: src/core/setting_types.py:173 +#, possible-python-brace-format +msgctxt "settype:message|error_suffix" +msgid "" +"You can view, test, and fix your embed using the online [embed " +"builder]({link})." +msgstr "" +"אתה יכול לראות, לערוץ ולתקן את הembed באמצעות [embed builder]({link})." + +#: src/core/setting_types.py:185 +#, possible-python-brace-format +msgctxt "settype:message|error:invalid_json" +msgid "" +"The provided message data was not a valid JSON document!\n" +"`{error}`" +msgstr "" +"המסמך שהוצמד אינו מסמך JSON\n" +"`{error}`" + +#: src/core/setting_types.py:193 +msgctxt "settype:message|error:json_missing_keys" +msgid "" +"Message data must be a JSON object with at least one of the following " +"fields: `content`, `embed`, `embeds`" +msgstr "" +"המסמך חייב להיות JSON אם לפחות אחד מהאזורים הבאים: `content`, `embed`, " +"`embeds`" + +#: src/core/setting_types.py:202 +msgctxt "settype:message|error:json_embed_type" +msgid "`embed` field must be a valid JSON object." +msgstr "הembed חייב להיות מסמך JSON" + +#: src/core/setting_types.py:210 +msgctxt "settype:message|error:json_embeds_type" +msgid "`embeds` field must be a list." +msgstr "הembed חייב להיות רשימה." + +#: src/core/setting_types.py:217 +msgctxt "settype:message|error:json_embed_embeds" +msgid "Message data cannot include both `embed` and `embeds`." +msgstr "תוכן ההודעה לא יכול להכיל `embed` וגם `embeds`." + +#: src/core/setting_types.py:225 +msgctxt "settype:message|error:json_content_type" +msgid "`content` field must be a string." +msgstr "האזור של התוכן חייב להכין טקסט." + +#: src/core/setting_types.py:241 +#, possible-python-brace-format +msgctxt "ui:settype:message|error:embed_conversion" +msgid "" +"Could not parse the message embed data.\n" +"**Error:** `{exception}`" +msgstr "" +"לא הצלחתי להבין את הembed\n" +"**Error:** `{exception}`" + +#: src/core/setting_types.py:269 +msgctxt "settype:message|format:too_long" +msgid "Too long to display! See Preview." +msgstr "ארוך מידי כדי להראות! בדוק תצוגה מקדימה." diff --git a/locales/he_IL/LC_MESSAGES/member_admin.po b/locales/he_IL/LC_MESSAGES/member_admin.po new file mode 100644 index 00000000..a8f10ff9 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/member_admin.po @@ -0,0 +1,436 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/member_admin/settingui.py:57 +msgctxt "ui:memberadmin|menu:greetch|placeholder" +msgid "Select Greeting Channel" +msgstr "בחר ערוץ שלומות" + +#: src/modules/member_admin/settingui.py:86 +msgctxt "ui:memberadmin|menu:autoroles|placeholder" +msgid "Select Autoroles" +msgstr "בחר רולים אוטומטיים" + +#: src/modules/member_admin/settingui.py:115 +msgctxt "ui:memberadmin|menu:bot_autoroles|placeholder" +msgid "Select Bot Autoroles" +msgstr "בחר רולים אוטומטיים של בוטים" + +#: src/modules/member_admin/settingui.py:156 +msgctxt "ui:member_admin|button:greet_msg|label" +msgid "Greeting Msg" +msgstr "הודעת ברוכים הבאים" + +#: src/modules/member_admin/settingui.py:205 +msgctxt "ui:memberadmin|button:return_msg|label" +msgid "Returning Msg" +msgstr "הודעת חזרה לשרת" + +#: src/modules/member_admin/settingui.py:213 +msgctxt "ui:memberadmin|embed|title" +msgid "Member Admin Configuration Panel" +msgstr "אדמין משתמשים לוח בקרה" + +#: src/modules/member_admin/settingui.py:257 +msgctxt "dash:member_admin|title" +msgid "Greetings and Initial Roles ({commands[configure welcome]})" +msgstr "ברוכים הבאים ורולים ראשונים ({commands[configure welcome]})" + +#: src/modules/member_admin/settingui.py:261 +msgctxt "dash:member_admin|dropdown|placeholder" +msgid "Greetings and Initial Roles Panel" +msgstr "לוח בקרה של \"ברוכים הבאים\" ורולים ראשונים" + +#: src/modules/member_admin/settingui.py:281 +msgctxt "dash:member_admin|section:greeting_messages|name" +msgid "Greeting Messages ({commands[configure welcome]})" +msgstr "ברוכים הבאים ({commands[configure welcome]})" + +#: src/modules/member_admin/settingui.py:292 +msgctxt "dash:member_admin|section:initial_roles|name" +msgid "Initial Roles ({commands[configure welcome]})" +msgstr "רולים ראשוניים ({commands[configure welcome]})" + +#: src/modules/member_admin/cog.py:234 +msgctxt "cmd:resetmember" +msgid "resetmember" +msgstr "אפס משתמש" + +#: src/modules/member_admin/cog.py:237 +msgctxt "cmd:resetmember|desc" +msgid "Reset (server-associated) member data for the target member or user." +msgstr "אפס נתוני שרת עבור משתמש ספציפי" + +#: src/modules/member_admin/cog.py:241 +msgctxt "cmd:resetmember|param:target" +msgid "member_to_reset" +msgstr "משתמשים_לאיפוס" + +#: src/modules/member_admin/cog.py:242 +msgctxt "cmd:resetmember|param:saved_roles" +msgid "saved_roles" +msgstr "רולים_שמורים" + +#: src/modules/member_admin/cog.py:247 +msgctxt "cmd:resetmember|param:target|desc" +msgid "Choose the member (current or past) you want to reset." +msgstr "בחר את המשתמש (עכשווי או בעבר) שאתה רוצה לאפס." + +#: src/modules/member_admin/cog.py:251 +msgctxt "cmd:resetmember|param:saved_roles|desc" +msgid "" +"Clear the saved roles for this member, so their past roles are not restored " +"on rejoin." +msgstr "" +"מחק את הרולים השמורים עבור המשתמש הזה, הרולים הקודמים שלהם לא ישוחזרו כשהוא " +"יצטרך מחדש." + +#: src/modules/member_admin/cog.py:278 +#, possible-python-brace-format +msgctxt "cmd:resetmember|reset:saved_roles|success" +msgid "" +"The saved roles for {target} have been reset. They will not regain their " +"roles if they rejoin." +msgstr "" +"הרולים השמורים עבור {target} אופסו. הם לא יקבלו את הרולים שלהם שוב בחזרה " +"לשרת." + +#: src/modules/member_admin/cog.py:286 +msgctxt "cmd:resetmember|error:nothing_to_do" +msgid "No reset operation selected, nothing to do." +msgstr "איפוס לא נבחר, אין לי מה לעשות." + +#: src/modules/member_admin/cog.py:302 +msgctxt "cmd:configure_welcome" +msgid "welcome" +msgstr "ברוכים הבאים" + +#: src/modules/member_admin/cog.py:305 +msgctxt "cmd:configure_welcome|desc" +msgid "Configure new member greetings and roles." +msgstr "הגדר רולים והודעת שלומות למשתמש חדש" + +#: src/modules/member_admin/settings.py:20 +msgctxt "guildset:greeting_message|formatkey:mention" +msgid "Mention the new member." +msgstr "מתייג את המשתמש החדש." + +#: src/modules/member_admin/settings.py:22 +msgctxt "guildset:greeting_message|formatkey:user_name" +msgid "Display name of the new member." +msgstr "הצג את השם של המשתמש החדש." + +#: src/modules/member_admin/settings.py:24 +msgctxt "guildset:greeting_message|formatkey:user_avatar" +msgid "Avatar url of the new member." +msgstr "הלינק של המשתמש החדש." + +#: src/modules/member_admin/settings.py:26 +msgctxt "guildset:greeting_message|formatkey:guild_name" +msgid "Name of this server." +msgstr "השם של השרת." + +#: src/modules/member_admin/settings.py:28 +msgctxt "guildset:greeting_message|formatkey:guild_icon" +msgid "Server icon url." +msgstr "לינק לתמונת השרת." + +#: src/modules/member_admin/settings.py:30 +msgctxt "guildset:greeting_message|formatkey:studying_count" +msgid "Number of current voice channel members." +msgstr "משתמש אנשים בערוצי קול ברגע נתון." + +#: src/modules/member_admin/settings.py:32 +msgctxt "guildset:greeting_message|formatkey:member_count" +msgid "Number of members in the server." +msgstr "מספר משתמשים בשרת." + +#: src/modules/member_admin/settings.py:40 +msgctxt "guildset:greeting_channel" +msgid "welcome_channel" +msgstr "ערוץ_שלומות" + +#: src/modules/member_admin/settings.py:43 +msgctxt "guildset:greeting_channel|desc" +msgid "Channel in which to welcome new members to the server." +msgstr "ערוץ שבו אשלח \"שלומות\" (ברוכים הבאים) לאנשים שיצטרפו לשרת." + +#: src/modules/member_admin/settings.py:47 +msgctxt "guildset:greeting_channel|long_desc" +msgid "" +"New members will be sent the configured `welcome_message` in this channel, " +"and returning members will be sent the configured `returning_message`. Unset" +" to send these message via direct message." +msgstr "" +"משתמשים חדשים יקבלו את ההודעה שערכתם בערוץ הזה, ואנשים שחזרו יקבלו את הודעה " +"החזרה שערכתם (אם ערכתם אחת). ניתן לבטל את הערוץ ואז ההודעות ישלחו למשתמשים " +"בפרטי." + +#: src/modules/member_admin/settings.py:53 +msgctxt "guildset:greeting_channel|accepts" +msgid "Name or id of the greeting channel, or 0 for DM." +msgstr "" +"שם או מספר מזהה של הערוץ ברוכים הבאים, או 0 ואשלח להם את ההודעה בפרטי." + +#: src/modules/member_admin/settings.py:67 +msgctxt "guildset:greeting_channel|set_response:unset" +msgid "Welcome messages will now be sent via direct message." +msgstr "הודעות ברוכים הבאים ישלחו עכשיו בפרטי." + +#: src/modules/member_admin/settings.py:72 +#, possible-python-brace-format +msgctxt "guildset:greeting_channel|set_response:set" +msgid "Welcome messages will now be sent to {channel}" +msgstr "הערוץ ברוכים הבאים נקבע ל{channel}" + +#: src/modules/member_admin/settings.py:84 +msgctxt "guildset:greeting_channel|formmatted:unset" +msgid "Direct Message" +msgstr "הודעת פרטית" + +#: src/modules/member_admin/settings.py:91 +msgctxt "guildset:greeting_message" +msgid "welcome_message" +msgstr "הודעת_ברוכים_הבאים" + +#: src/modules/member_admin/settings.py:95 +msgctxt "guildset:greeting_message|desc" +msgid "Custom message used to greet new members when they join the server." +msgstr "הודעה מותאמת אישית שהמטרה שלה לקבל בברכה אנשים חדשים בשרת שלכם." + +#: src/modules/member_admin/settings.py:99 +msgctxt "guildset:greeting_message|long_desc" +msgid "" +"When set, this message will be sent to the `welcome_channel` when a *new* " +"member joins the server. If not set, no message will be sent." +msgstr "" +"כאשר מופעל, ההודעה תשלח לערוץ הודעות ברוכים הבאים כאשר משתמש חדש מצטרף לשרת." +" " + +#: src/modules/member_admin/settings.py:104 +msgctxt "guildset:greeting_message|accepts" +msgid "JSON formatted greeting message data" +msgstr "הודעת הברוכים הבאים בפורמט JSON" + +#: src/modules/member_admin/settings.py:108 +msgctxt "guildset:greeting_message|default" +msgid "" +"\n" +" {\n" +" \"embed\": {\n" +" \"title\": \"Welcome {user_name}!\",\n" +" \"thumbnail\": {\"url\": \"{user_avatar}\"},\n" +" \"description\": \"Welcome to **{guild_name}**!\",\n" +" \"footer\": {\n" +" \"text\": \"You are the {member_count}th member!\"\n" +" },\n" +" \"color\": 15695665\n" +" }\n" +" }\n" +" " +msgstr "" +"\n" +" {\n" +" \"embed\": {\n" +" \"title\": \"Welcome {user_name}!\",\n" +" \"thumbnail\": {\"url\": \"{user_avatar}\"},\n" +" \"description\": \"Welcome to **{guild_name}**!\",\n" +" \"footer\": {\n" +" \"text\": \"You are the {member_count}th member!\"\n" +" },\n" +" \"color\": 15695665\n" +" }\n" +" }\n" +" " + +#: src/modules/member_admin/settings.py:136 +msgctxt "guildset:greeting_message|set_response:unset" +msgid "Welcome message unset! New members will not be greeted." +msgstr "הודעת הברוכים הבאים בוטלה! לא אגיד שלום לאנשים חדשים." + +#: src/modules/member_admin/settings.py:141 +msgctxt "guildset:greeting_message|set_response:set" +msgid "The welcome message has been updated." +msgstr "הודעת הברוכים הבאים עודכנה" + +#: src/modules/member_admin/settings.py:153 +msgctxt "guildset:greeting_message|formmatted:unset" +msgid "Not set, members will not be welcomed." +msgstr "לא נקבע, משתמשים חדשים לא יקבלו הודעת ברוכים הבאים." + +#: src/modules/member_admin/settings.py:200 +msgctxt "guildset:greeting_message|embed_field|formatkeys|explanation" +msgid "The following placeholders will be substituted with their values." +msgstr "תופסי המקום הבאים יוחלפו עם הערך האמיתי שלהם." + +#: src/modules/member_admin/settings.py:203 +msgctxt "guildset:greeting_message|embed_field|formatkeys|name" +msgid "Placeholders" +msgstr "תופסי מקום" + +#: src/modules/member_admin/settings.py:213 +msgctxt "guildset:returning_message" +msgid "returning_message" +msgstr "הודעת_ברוכים_השבים" + +#: src/modules/member_admin/settings.py:217 +msgctxt "guildset:returning_message|desc" +msgid "" +"Custom message used to greet returning members when they rejoin the server." +msgstr "הודעה מותאמת אישית שהמטרה שלה לקבל בברכה אנשים שחזרו לשרת שלכם." + +#: src/modules/member_admin/settings.py:221 +msgctxt "guildset:returning_message|long_desc" +msgid "" +"When set, this message will be sent to the `welcome_channel` when a member " +"*returns* to the server. If not set, no message will be sent." +msgstr "" +"כאשר מופעל, אני אשלח הודעה לערוץ שקבעתם כשמשתמש *ישן* חוזר לשרת. אם לא " +"הפעלתם את האופציה הזאתי, לא אשלח שום הודעה." + +#: src/modules/member_admin/settings.py:226 +msgctxt "guildset:returning_message|accepts" +msgid "JSON formatted returning message data" +msgstr "הודעת הברוכים השבים בפורמט JSON" + +#: src/modules/member_admin/settings.py:230 +msgctxt "guildset:returning_message|default" +msgid "" +"\n" +" {\n" +" \"embed\": {\n" +" \"title\": \"Welcome Back {user_name}!\",\n" +" \"thumbnail\": {\"url\": \"{User_avatar}\"},\n" +" \"description\": \"Welcome back to **{guild_name}**!\\nYou were last seen .\",\n" +" \"color\": 15695665\n" +" }\n" +" }\n" +" " +msgstr "" +"\n" +" {\n" +" \"embed\": {\n" +" \"title\": \"Welcome Back {user_name}!\",\n" +" \"thumbnail\": {\"url\": \"{User_avatar}\"},\n" +" \"description\": \"Welcome back to **{guild_name}**!\\nYou were last seen .\",\n" +" \"color\": 15695665\n" +" }\n" +" }\n" +" " + +#: src/modules/member_admin/settings.py:247 +msgctxt "guildset:returning_message|formatkey:last_time" +msgid "Unix timestamp of the last time the member was seen in the server." +msgstr "חותמת זמן שבה המשתמש נראה לאחרונה בשרת." + +#: src/modules/member_admin/settings.py:258 +msgctxt "guildset:returning_message|set_response:unset" +msgid "Returning member greeting unset! Will use `welcome_message` if set." +msgstr "הודעת \"ברוכים השבים\" הוסרה! אשתמש בהודעה הרגילה של \"ברוכים הבאים\"" + +#: src/modules/member_admin/settings.py:263 +msgctxt "guildset:greeting_message|set_response:set" +msgid "The returning member greeting has been updated." +msgstr "הודעת ה\"ברוכים השבים\" עודכנה בהצלחה." + +#: src/modules/member_admin/settings.py:275 +msgctxt "guildset:greeting_message|formmatted:unset" +msgid "Not set, will use the `welcome_message` if set." +msgstr "לא נקבע, אני אשתמש ב\"הודעת ברוכים הבאים\" אם קבעתם אחת." + +#: src/modules/member_admin/settings.py:325 +msgctxt "guildset:returning_message|embed_field|formatkeys|explanation" +msgid "In *addition* to the placeholders supported by `welcome_message`" +msgstr "בנוסף לתופסי המקום שנתמכים בהודעת הברוכים הבאים" + +#: src/modules/member_admin/settings.py:328 +msgctxt "guildset:returning_message|embed_field|formatkeys|" +msgid "Placeholders" +msgstr "תופסי מקום" + +#: src/modules/member_admin/settings.py:339 +msgctxt "guildset:autoroles" +msgid "autoroles" +msgstr "רולים אוטומטיים" + +#: src/modules/member_admin/settings.py:343 +msgctxt "guildset:autoroles|desc" +msgid "Roles given to new members when they join the server." +msgstr "רולים שמשתמש חדש יקבל כשהוא יצטרף לשרת." + +#: src/modules/member_admin/settings.py:347 +msgctxt "guildset:autoroles|long_desc" +msgid "" +"These roles will be given when a member joins the server. If " +"`role_persistence` is enabled, these roles will *not* be given to a " +"returning member." +msgstr "" +"אלו הרולים שניתנים לכל משתמש חדש שמצטרף לשרת. אם הצמדת_רולים פעיל, אני לא " +"אתן את הרולים האלו לאנשים שעזבו וחזרו לשרת, אלא אשחזר את הרולים המקוריים " +"שלהם." + +#: src/modules/member_admin/settings.py:361 +msgctxt "guildset:bot_autoroles" +msgid "bot_autoroles" +msgstr "רולים_אוטומטיים_בוט" + +#: src/modules/member_admin/settings.py:365 +msgctxt "guildset:bot_autoroles|desc" +msgid "Roles given to new bots when they join the server." +msgstr "רולים שבוטים יקבלו אוטומטית כשתוסיפו אותם לשרת." + +#: src/modules/member_admin/settings.py:369 +msgctxt "guildset:bot_autoroles|long_desc" +msgid "These roles will be given when a bot joins the server." +msgstr "הרולים האלו יתנו לבוט כאשר הוא מצורף לשרת." + +#: src/modules/member_admin/settings.py:382 +msgctxt "guildset:role_persistence" +msgid "role_persistence" +msgstr "הצמדת_רולים" + +#: src/modules/member_admin/settings.py:385 +msgctxt "guildset:role_persistence|desc" +msgid "Whether member roles should be restored on rejoin." +msgstr "האם או לא להשאיר את הרולים אצל משתמש גם אם הם עזבו וחזרו לשרת." + +#: src/modules/member_admin/settings.py:389 +msgctxt "guildset:role_persistence|long_desc" +msgid "" +"If enabled, member roles will be stored when they leave the server, and then" +" restored when they rejoin (instead of giving `autoroles`). Note that this " +"may conflict with other bots who manage join roles." +msgstr "" +"אם אופציה זו עובדת, שאשר משתמש עוזר וחוזר לשרת, במקום לאפס את הרולים שלו, " +"אני אחזיר לו את הרולים שהיו לו בעבר ואצמיד אותם חזרה אליו." + +#: src/modules/member_admin/settings.py:405 +msgctxt "guildset:role_persistence|set_response:off" +msgid "Roles will not be restored when members rejoin." +msgstr "רולים לא ישוחזרו כאשר משתמש חזור לשרת." + +#: src/modules/member_admin/settings.py:410 +msgctxt "guildset:greeting_message|set_response:on" +msgid "Roles will now be restored when members rejoin." +msgstr "הרולים מעכשיו ישוחזרו למשתמשים שעזבו וחזרו לשרת." diff --git a/locales/he_IL/LC_MESSAGES/meta.po b/locales/he_IL/LC_MESSAGES/meta.po new file mode 100644 index 00000000..8f81c404 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/meta.po @@ -0,0 +1,146 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/meta/cog.py:23 +msgctxt "cmd:help" +msgid "help" +msgstr "עזרה" + +#: src/modules/meta/cog.py:26 +msgctxt "cmd:help|desc" +msgid "See a brief summary of my commands and features." +msgstr "ראה הסבר קצר של רשימת הפקודות שלי!" + +#: src/modules/meta/help_sections.py:40 +#, possible-python-brace-format +msgctxt "helptext|level:member|mode:study" +msgid "" +"\n" +" {config_emoji} Personal Configuration\n" +" *View or adjust personal settings with the {cmd_my} command.*\n" +" {cmd_my_timezone}: Timezone used to display your stats and set reminders.\n" +" {cmd_my_language}: Your preferred language for commands and interactions.\n" +"\n" +"\n" +" {stats_emoji} Statistics\n" +" *Study in voice channels to earn activity ranks and compete on the leaderboard!*\n" +" {cmd_me}: View your personal study profile and set your profile tags.\n" +" {cmd_stats}: View study statistics for the current and past weeks or months.\n" +" {cmd_ranks}: See the list of activity ranks.\n" +" {cmd_leaderboard}: Compete with other members on the server leaderboards.\n" +"\n" +"\n" +" {coin} Economy\n" +" *Earn coins through studying, then spend them on some well deserved rewards!*\n" +" {cmd_send}: Send your {coin} to another member.\n" +" {cmd_shop}: Purchase server roles with your {coin}.\n" +" {cmd_room}: Rent a private voice channel for you and your friends.\n" +"\n" +"\n" +" {utility_emoji} Utilities\n" +" *Some other utilities to help you stay productive while studying!*\n" +" {cmd_reminders}: Ask me to remind you about that important task!\n" +" {cmd_tasklist}: Create tasks and feel the satisfaction of checking them off.\n" +" {cmd_timers}: Stay productive using the classic *pomodoro technique*!\n" +" {cmd_schedule}: Schedule a shared study session and keep yourself accountable!\n" +" " +msgstr "" +"\n" +" {config_emoji} לוח בקרה אישי\n" +" {cmd_my} פתיחת התפריט האישי שלכם.\n" +" {cmd_my_timezone}: ניהול וקביעת אזור זמן.\n" +" {cmd_my_language}: ניהול וקביעת שפה אישית של התפריטים.\n" +"\n" +"\n" +" {stats_emoji} סטטיסטיקות\n" +" *הצטרף לערוץ קולי בזמן שאתה לומד על מנת לעקוב אחרי זמן הלמידה שלף!*\n" +" {cmd_me}: צפו בפרופיל האישי שלכם ובכרטיס הלימוד!\n" +" {cmd_stats}: בדקו את הסטטיסטיקות היומיות והחודשיות שלכם.\n" +" {cmd_ranks}: צפו בדרגות הזמינות בשרת הזה.\n" +" {cmd_leaderboard}: בדקו את ההשיגים שלכם ביחד לחברי השרת והקהילה העולמית!\n" +"\n" +"\n" +" {coin} כלכלה\n" +" *מרוויחים מטבעות על ידי למידה, שליחת הודעות, ותרומה לקהילה!*\n" +" {cmd_send}: שלח מטבעות לחבר!\n" +" {cmd_shop}: קנו רולים שונים וצבעים שהשרת הזה מציע!\n" +" {cmd_room}: צור חדר פרטי לך ולחבריך!\n" +"\n" +"\n" +" {utility_emoji} כלים שימושיים\n" +" *כלים שעוזרים לכם להיות יותר פרודקטיביים!*\n" +" {cmd_reminders}: בקש ממני להזכיר לך משהו חשוב!\n" +" {cmd_tasklist}: צור ונהל את רשימת המטלות שלך\n" +" {cmd_timers}: השתמש בטיימרים שונים ביחד עם אנשים (פומודורו)\n" +" {cmd_schedule}: קבע שעה ספציפית להיפגש ללמוד ביחד עם כמה חברים!\n" +" " + +#: src/modules/meta/help_sections.py:73 +#, possible-python-brace-format +msgctxt "helptext|page:admin" +msgid "" +"\n" +" Use {cmd_dashboard} to see an overview of the server configuration, and quickly jump to the feature configuration panels to modify settings.\n" +"\n" +" Configuration panels are also accessible directly through the `/configure` commands and most features may be configured through these commands.\n" +"\n" +" Other relevant commands for guild configuration below:\n" +" `/editshop`: Add/Edit/Remove colour roles from the {coin} shop.\n" +" `/ranks`: Add/Edit/Remove activity ranks.\n" +" `/timer admin`: Add/Edit/Remove Pomodoro timers in voice channels.\n" +" `/rolemenus`: Allow members to equip roles from customisable messages.\n" +" `/economy balance`: Display and modify LionCoin balance for members and roles.\n" +" " +msgstr "" +"\n" +"השתמש ב {cmd_dashboard} כדי לראות תיאור מקוצר של כל ההגדרות של הערוץ ובכדי לקפוץ לתפריטים השונים. \n" +"\n" +"התפריטים נגישים גם על ידי הפקודות הישירות, לדוגמא `/configure`\n" +"\n" +"עוד פקודות חשובות יוכלו להימצא פה:\n" +" `/editshop`: כדי לשלוט בחנות צבעים של השרת.\n" +" `/ranks`: כדי להכין דרגות עבור אנשים בשרת.\n" +"`/timer admin`: כדי להכין טיימרים בשרת.\n" +" `/rolemenus`: כדי להכין הודעות שאנשים יוכלו ללחוץ עליהן ולקבל רולים שונים.\n" +"`/economy balance`: לשלוח במטבעות ובכלכלת השרת." + +#: src/modules/meta/help_sections.py:112 +msgctxt "helptext|level:member|title" +msgid "Command Summary (for members)" +msgstr "סיכום פקודות (עבור משתמשים)" + +#: src/modules/meta/help_sections.py:140 +msgctxt "helptext|level:admin|title" +msgid "Command Summary (for server admins)" +msgstr "סיכום פקודות (עבור אדמינים)" + +#: src/modules/meta/helpui.py:47 +msgctxt "ui:help|button:member_page|label" +msgid "Member Page" +msgstr "עמוד למשתמשים רגילים" + +#: src/modules/meta/helpui.py:59 +msgctxt "ui:help|button:admin_page|label" +msgid "Admin Page" +msgstr "עמוד לאדמינים" diff --git a/locales/he_IL/LC_MESSAGES/moderation.po b/locales/he_IL/LC_MESSAGES/moderation.po new file mode 100644 index 00000000..62c14845 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/moderation.po @@ -0,0 +1,275 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/moderation/settingui.py:53 +msgctxt "ui:moderation_config|menu:ticket_log|placeholder" +msgid "Select Ticket Log" +msgstr "בחר ערוץ מעקב כרטיסים" + +#: src/modules/moderation/settingui.py:78 +msgctxt "ui:moderation_config|menu:alert_channel|placeholder" +msgid "Select Alert Channel" +msgstr "בחר ערוץ התראות" + +#: src/modules/moderation/settingui.py:103 +msgctxt "ui:moderation_config|menu:modrole|placeholder" +msgid "Select Moderator Role" +msgstr "בחר רול למנהלים" + +#: src/modules/moderation/settingui.py:111 +msgctxt "ui:moderation_config|embed|title" +msgid "Moderation Configuration Panel" +msgstr "תפריט הגדרות ניהול שרת" + +#: src/modules/moderation/settingui.py:150 +msgctxt "dash:moderation|title" +msgid "Moderation Settings ({commands[configure moderation]})" +msgstr "הגדרות ניהול ({commands[configure moderation]})" + +#: src/modules/moderation/settingui.py:154 +msgctxt "dash:moderation|dropdown|placeholder" +msgid "Moderation Panel" +msgstr "תפריט ניהול" + +#: src/modules/moderation/cog.py:136 +msgctxt "cmd:configure_moderation" +msgid "moderation" +msgstr "ניהול" + +#: src/modules/moderation/cog.py:139 +msgctxt "cmd:configure_moderation|desc" +msgid "Configure general moderation settings." +msgstr "בחר הגדרות ניהול כלליות." + +#: src/modules/moderation/ticket.py:147 +#, possible-python-brace-format +msgctxt "ticket|title:auto" +msgid "Ticket #{ticketid} | {state} | {type}[Auto] | {name}" +msgstr "כרטיס #{ticketid} | {state} | {type}[Auto] | {name}" + +#: src/modules/moderation/ticket.py:152 +#, possible-python-brace-format +msgctxt "ticket|title:manual" +msgid "Ticket #{ticketid} | {state} | {type} | {name}" +msgstr "כרטיס #{ticketid} | {state} | {type} | {name}" + +#: src/modules/moderation/ticket.py:168 +msgctxt "ticket|field:target|name" +msgid "Target" +msgstr "מטרה" + +#: src/modules/moderation/ticket.py:173 +msgctxt "ticket|field:moderator|name" +msgid "Moderator" +msgstr "מנהל" + +#: src/modules/moderation/ticket.py:180 +msgctxt "ticket|field:expiry|mode:expiring|name" +msgid "Expires At" +msgstr "תקף עד" + +#: src/modules/moderation/ticket.py:183 +#, possible-python-brace-format +msgctxt "ticket|field:expiry|mode:expiring|value" +msgid "" +"{timestamp}\n" +"Duration: `{duration}`" +msgstr "" +"{timestamp}\n" +"זמן `{duration}`" + +#: src/modules/moderation/ticket.py:191 +msgctxt "ticket|field:expiry|mode:expired|name" +msgid "Expired" +msgstr "פג תוקף" + +#: src/modules/moderation/ticket.py:194 +#, possible-python-brace-format +msgctxt "ticket|field:expiry|mode:expired|value" +msgid "{timestamp}" +msgstr "{timestamp}" + +#: src/modules/moderation/ticket.py:201 +msgctxt "ticket|field:expiry|mode:open|name" +msgid "Expiry" +msgstr "תוקף" + +#: src/modules/moderation/ticket.py:204 +#, possible-python-brace-format +msgctxt "ticket|field:expiry|mode:open|value" +msgid "{timestamp}" +msgstr "{timestamp}" + +#: src/modules/moderation/ticket.py:212 +msgctxt "ticket|field:context|name" +msgid "Context" +msgstr "קונטקסט" + +#: src/modules/moderation/ticket.py:219 +msgctxt "ticket|field:notes|name" +msgid "Notes" +msgstr "פתקיות" + +#: src/modules/moderation/ticket.py:226 +msgctxt "ticket|field:pardoned|name" +msgid "Pardoned" +msgstr "נסלחו" + +#: src/modules/moderation/ticket.py:229 +#, possible-python-brace-format +msgctxt "ticket|field:pardoned|value" +msgid "" +"Pardoned by <&{moderator}> at {timestamp}.\n" +"{reason}" +msgstr "" +"נסלח על ידי <&{moderator}> at {timestamp}.\n" +"{reason}" + +#: src/modules/moderation/settings.py:20 +msgctxt "guildset:ticket_log" +msgid "ticket_log" +msgstr "לוג_כרטיסים" + +#: src/modules/moderation/settings.py:23 +msgctxt "guildset:ticket_log|desc" +msgid "Private moderation log to send tickets and moderation events." +msgstr "" +"לוח כרטיסים פרטי כדי לעדכן את כל המנהלים בנוגע לאירועים האחרונים שבוצעו על " +"ידי מנהלים אחרים." + +#: src/modules/moderation/settings.py:27 +msgctxt "guildset:ticket_log|long_desc" +msgid "" +"Warnings, notes, video blacklists, and other moderation events will be " +"posted as numbered tickets with context to this log." +msgstr "" +"אזהרות, פתקיות, רשימות שחורות של וידאו, ואירועי ניהול אחרים יפורסמו בלוח " +"הזה." + +#: src/modules/moderation/settings.py:32 +msgctxt "guildset:ticket_log|accepts" +msgid "Ticket channel name or id." +msgstr "שם או מספר זהות של לוח הכרטיסים." + +#: src/modules/moderation/settings.py:46 +#, possible-python-brace-format +msgctxt "guildset:ticket_log|set_response:set" +msgid "Moderation tickets will be sent to {channel}" +msgstr "כרטיסי ניהול ישלחו אל {channel}" + +#: src/modules/moderation/settings.py:51 +msgctxt "guildset:ticket_log|set_response:unset" +msgid "Moderation tickets will not be logged to a channel." +msgstr "כרטיסי ניהול יפסיקו להישלח אל הערוץ." + +#: src/modules/moderation/settings.py:63 +msgctxt "guildset:ticket_log|formatted:unset" +msgid "Not Set." +msgstr "לא נקבע." + +#: src/modules/moderation/settings.py:70 +msgctxt "guildset:alert_channel" +msgid "alert_channel" +msgstr "ערוץ_התראות" + +#: src/modules/moderation/settings.py:73 +msgctxt "guildset:alert_channel|desc" +msgid "Moderation notification channel for members with DMs disabled." +msgstr "ערוץ התראות ציבורי למשתמשים שסגרו את ההודעות הפרטיות שלהם." + +#: src/modules/moderation/settings.py:77 +msgctxt "guildset:alert_channel|long_desc" +msgid "" +"When I need to send a member a moderation-related notification (e.g. asking " +"them to enable their video in a video channel) from this server, I will try " +"to send it via direct messages. If this fails, I will instead mention the " +"user in this channel." +msgstr "" +"כשאני צריך לשלוח למשתמש התראות ניהול (לדוגמא כשאני צריך לבקש מהם לפתוח את " +"המצלמה בערוץ קולי), אנסה לשלוח להם הודעות בפרטי. אם לא אצליח, אשלח להם " +"הודעות לערוץ הזה." + +#: src/modules/moderation/settings.py:84 +msgctxt "guildset:alert_channel|accepts" +msgid "Alert channel name or id." +msgstr "שם או מספר זהות של לוח התראות." + +#: src/modules/moderation/settings.py:99 +#, possible-python-brace-format +msgctxt "guildset:alert_channel|set_response:set" +msgid "Moderation alerts will be sent to {channel}" +msgstr "התראות ניהול ישלחו אל {channel}" + +#: src/modules/moderation/settings.py:104 +msgctxt "guildset:alert_channel|set_response:unset" +msgid "Moderation alerts will be ignored if the member cannot be reached." +msgstr "התראות ניהול יתעלמו אם לא יהיה ניתן להגיע אל המשתמש." + +#: src/modules/moderation/settings.py:116 +msgctxt "guildset:alert_channel|formatted:unset" +msgid "Not Set (Only alert via direct message.)" +msgstr "לא נקבע (התראות ישלחו רק בהודעה פרטית)" + +#: src/modules/moderation/settings.py:123 +msgctxt "guildset:mod_role" +msgid "mod_role" +msgstr "רול_מנהלים" + +#: src/modules/moderation/settings.py:126 +msgctxt "guildset:mod_role|desc" +msgid "" +"Guild role permitted to view configuration and perform moderation tasks." +msgstr "רול שמאפשר למשתמשים לראות את התפריט הזה ולבצע פעולות ניהול שונות." + +#: src/modules/moderation/settings.py:130 +msgctxt "guildset:mod_role|long_desc" +msgid "" +"Members with the set role will be able to access my configuration panels, " +"and perform some moderation tasks, such us setting up pomodoro timers. " +"Moderators cannot reconfigure most bot configuration, or perform operations " +"they do not already have permission for in Discord." +msgstr "" +"משתמשים עם הרול הזה יוכלו לגשת תפריטים השונים, ולבצע פעולות ניהול כמו להקים " +"טיימרים. מנהלים לא יכולים לשנות את ההגדרות הבסיסיות של הבוט עצמו. הם בגדול " +"יכולים לבצע פעולות שהם גם ככה יכולים לעשות בדיסקורד בתור המנהלים שלכם." + +#: src/modules/moderation/settings.py:137 +msgctxt "guildset:mod_role|accepts" +msgid "Moderation role name or id." +msgstr "רול את מספר זהות של מנהלים." + +#: src/modules/moderation/settings.py:151 +#, possible-python-brace-format +msgctxt "guildset:mod_role|set_response:set" +msgid "Members with the {role} will be considered moderators." +msgstr "משתמשים עם {role} יחשבו מנהלי שרת." + +#: src/modules/moderation/settings.py:156 +msgctxt "guildset:mod_role|set_response:unset" +msgid "No members will be given moderation privileges." +msgstr "שום משתמש יקבל הרשאות מנהלים." + +#: src/modules/moderation/settings.py:168 +msgctxt "guildset:mod_role|formatted:unset" +msgid "Not Set." +msgstr "לא נקבע." diff --git a/locales/he_IL/LC_MESSAGES/monthly-gui.po b/locales/he_IL/LC_MESSAGES/monthly-gui.po new file mode 100644 index 00000000..8acd8101 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/monthly-gui.po @@ -0,0 +1,169 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/gui/cards/monthly.py:40 +msgctxt "skin:monthlystats|mode:study|title" +msgid "STUDY HOURS" +msgstr "שעות למידה" + +#: src/gui/cards/monthly.py:44 +msgctxt "skin:monthlystats|mode:voice|title" +msgid "VOICE CHANNEL ACTIVITY" +msgstr "פעילות בחדרי קול" + +#: src/gui/cards/monthly.py:48 +msgctxt "skin:monthlystats|mode:text|title" +msgid "MESSAGE ACTIVITY" +msgstr "פעילות הודעות" + +#: src/gui/cards/monthly.py:52 +msgctxt "skin::monthlystats|mode:anki|title" +msgid "CARDS REVIEWED" +msgstr "קלפים שנעשו" + +#: src/gui/cards/monthly.py:119 +#, possible-python-brace-format +msgctxt "ui:monthlystats|mode:study|bar_value" +msgid "{value} H" +msgstr "{value} " + +#: src/gui/cards/monthly.py:123 +#, possible-python-brace-format +msgctxt "ui:monthlystats|mode:voice|bar_value" +msgid "{value} H" +msgstr "{value}" + +#: src/gui/cards/monthly.py:127 +#, possible-python-brace-format +msgctxt "ui:monthlystats|mode:text|bar_value" +msgid "{value} M" +msgstr "{value} " + +#: src/gui/cards/monthly.py:131 +#, possible-python-brace-format +msgctxt "ui:monthlystats|mode:anki|bar_value" +msgid "{value} C" +msgstr "{value}" + +#: src/gui/cards/monthly.py:153 +msgctxt "skin:monthlystats|weekdays" +msgid "M,T,W,T,F,S,S" +msgstr "ש,ש,ר,ח,ש,ש,ר" + +#: src/gui/cards/monthly.py:163 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:study|summary:this_month" +msgid "THIS MONTH: {amount} HOURS" +msgstr "החודש הנוכחי: {amount} שעות" + +#: src/gui/cards/monthly.py:167 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:voice|summary:this_month" +msgid "THIS MONTH: {amount} HOURS" +msgstr "החודש הנוכחי: {amount} שעות" + +#: src/gui/cards/monthly.py:171 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:text|summary:this_month" +msgid "THIS MONTH: {amount} MESSAGES" +msgstr "החודש הנוכחי: {amount} הודעות" + +#: src/gui/cards/monthly.py:175 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:text|summary:this_month" +msgid "THIS MONTH: {amount} CARDS" +msgstr "החודש הנוכחי {amount} קלפים" + +#: src/gui/cards/monthly.py:197 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:study|summary:last_month" +msgid "LAST MONTH: {amount} HOURS" +msgstr "החודש הקודם {amount} שעות" + +#: src/gui/cards/monthly.py:201 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:voice|summary:last_month" +msgid "LAST MONTH: {amount} HOURS" +msgstr "החודש הנוכחי {amount} שעות" + +#: src/gui/cards/monthly.py:205 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:text|summary:last_month" +msgid "LAST MONTH: {amount} MESSAGES" +msgstr "החודש הקודם {amount} הודעות" + +#: src/gui/cards/monthly.py:209 +#, possible-python-brace-format +msgctxt "skin:monthlystats|mode:text|summary:last_month" +msgid "LAST MONTH: {amount} CARDS" +msgstr "החודש הקודם {amount} קלפים" + +#: src/gui/cards/monthly.py:300 +msgctxt "ui:monthlystats|stats:current_streak|key" +msgid "Current Streak:" +msgstr "רצף נוכחי" + +#: src/gui/cards/monthly.py:304 +#, possible-python-brace-format +msgctxt "ui:monthlystats|stats:current_streak|value" +msgid "{count} days" +msgstr "{count} ימים" + +#: src/gui/cards/monthly.py:308 +msgctxt "ui:monthlystats|stats:longest_streak|key" +msgid "Longest Streak:" +msgstr "רצף שיא" + +#: src/gui/cards/monthly.py:312 +#, possible-python-brace-format +msgctxt "ui:monthlystats|stats:longest_streak|value" +msgid "{count} days" +msgstr "{count} ימים" + +#: src/gui/cards/monthly.py:316 +msgctxt "ui:monthlystats|stats:daily_average|key" +msgid "Daily Average:" +msgstr "ממוצע יומי" + +#: src/gui/cards/monthly.py:320 +#, possible-python-brace-format +msgctxt "ui:monthlystats|stats:daily_average|value" +msgid "{count} hours" +msgstr "{count} שעות" + +#: src/gui/cards/monthly.py:324 +msgctxt "ui:monthlystats|stats:days_active|key" +msgid "Days Active:" +msgstr "פעילות" + +#: src/gui/cards/monthly.py:328 +#, possible-python-brace-format +msgctxt "ui:monthlystats|stats:days_active|value" +msgid "{count} days" +msgstr "{count} ימים" + +#: src/gui/cards/monthly.py:341 +#, possible-python-brace-format +msgctxt "skin:monthlystats|footer" +msgid "Monthly Statistics • As of {day} {month} • {name} {discrim}" +msgstr "סטטיסטיקה חודשית • מתאריך {day} {month} • {name} {discrim}" diff --git a/locales/he_IL/LC_MESSAGES/profile-gui.po b/locales/he_IL/LC_MESSAGES/profile-gui.po new file mode 100644 index 00000000..5268e461 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/profile-gui.po @@ -0,0 +1,53 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/gui/cards/profile.py:79 +msgctxt "skin:profile|header:profile" +msgid "PROFILE" +msgstr "פרופיל" + +#: src/gui/cards/profile.py:83 +msgctxt "skin:profile|header:achievements" +msgid "ACHIEVEMENTS" +msgstr "השגים" + +#: src/gui/cards/profile.py:134 +msgctxt "skin:profile|field:rank_unranked_text" +msgid "UNRANKED" +msgstr "ללא דרגה" + +#: src/gui/cards/profile.py:138 +#, possible-python-brace-format +msgctxt "skin:profile|field:rank_nextrank_text" +msgid "NEXT RANK: {name} {rangestr}" +msgstr "הדרגה הבאה: {name} {rangestr}" + +#: src/gui/cards/profile.py:142 +msgctxt "skin:profile|field:rank_noranks_text" +msgid "NO RANKS AVAILABLE" +msgstr "אין דרגות זמינות" + +#: src/gui/cards/profile.py:146 +msgctxt "skin:profile|field:rank_maxrank_text" +msgid "YOU HAVE REACHED THE MAXIMUM RANK" +msgstr "הגעת לדרגה המקסימלית" diff --git a/locales/he_IL/LC_MESSAGES/ranks.po b/locales/he_IL/LC_MESSAGES/ranks.po new file mode 100644 index 00000000..1cc80aac --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/ranks.po @@ -0,0 +1,889 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/ranks/cog.py:73 +msgctxt "cmd:configure_ranks|param:rank_type|choice:voice" +msgid "Voice" +msgstr "קול" + +#: src/modules/ranks/cog.py:74 +msgctxt "cmd:configure_ranks|param:rank_type|choice:xp" +msgid "XP" +msgstr "נקודות ניסיון" + +#: src/modules/ranks/cog.py:75 +msgctxt "cmd:configure_ranks|param:rank_type|choice:message" +msgid "Message" +msgstr "הודעה" + +#: src/modules/ranks/cog.py:383 +msgctxt "event:rank_update|embed:notify" +msgid "New Activity Rank Attained!" +msgstr "הגעת לדרגה חדשה!" + +#: src/modules/ranks/cog.py:494 +msgctxt "rank_refresh|error:roles_dne|desc" +msgid "Some ranks have invalid or deleted roles! Please remove them first." +msgstr "כמה דרגות לא זמינות או נמחקו! אנא מחק אותם קודם." + +#: src/modules/ranks/cog.py:504 +#, possible-python-brace-format +msgctxt "rank_refresh|error:unassignable_roles|desc" +msgid "" +"I have insufficient permissions to assign the following role(s):\n" +"{roles}" +msgstr "" +"אין לי מספיק הרשאות כדי לתת את הרולים הבאים:\n" +"{roles}" + +#: src/modules/ranks/cog.py:574 +msgctxt "rank_refresh|remove_roles|audit" +msgid "Removing invalid rank role." +msgstr "מוחק דרגות לא זמינות." + +#: src/modules/ranks/cog.py:588 +#, possible-python-brace-format +msgctxt "rank_refresh|remove_roles|small_error" +msgid "*Could not remove ranks from {member}*" +msgstr "*לא הצלחתי למחוק את הדרגה מ{member}*" + +#: src/modules/ranks/cog.py:595 +msgctxt "rank_refresh|remove_roles|error:too_many_issues" +msgid "" +"Too many issues occurred while removing ranks! Please check my permissions " +"and try again in a few minutes." +msgstr "" +"יותר מידי בעיות קרו כשניסיתי למחוק את הדרגות! אנא בדוק את ההרשאות שלי ונסה " +"שוב בעוד כמה דקות." + +#: src/modules/ranks/cog.py:609 +msgctxt "rank_refresh|add_roles|audit" +msgid "Adding rank role from refresh" +msgstr "מוסיף דרגות מאופציית הרענון" + +#: src/modules/ranks/cog.py:623 +#, possible-python-brace-format +msgctxt "rank_refresh|add_roles|small_error" +msgid "*Could not add {role} to {member}*" +msgstr "*לא הצלחתי להוסיף את {role} ל{member}*" + +#: src/modules/ranks/cog.py:630 +msgctxt "rank_refresh|add_roles|error:too_many_issues" +msgid "" +"Too many issues occurred while adding ranks! Please check my permissions and" +" try again in a few minutes." +msgstr "" +"יותר מידי בעיות קרו כשניסיתי להוסיף את הדרגות! אנא בדוק את ההרשאות שלי ונסה " +"שוב בעוד כמה דקות." + +#. ---------- Commands ---------- +#: src/modules/ranks/cog.py:655 +msgctxt "cmd:ranks" +msgid "ranks" +msgstr "דרגה" + +#: src/modules/ranks/cog.py:687 +msgctxt "cmd:configure_ranks" +msgid "ranks" +msgstr "דרגות" + +#: src/modules/ranks/cog.py:688 +msgctxt "cmd:configure_ranks|desc" +msgid "Configure Activity Ranks" +msgstr "הגדר דרגות פעילות" + +#: src/modules/ranks/cog.py:748 +#, possible-python-brace-format +msgctxt "" +"cmd:configure_ranks|response:updated|setting:notification|withdm_withchannel" +msgid "" +"Rank update notifications will be sent via **direct message** when possible," +" otherwise to {channel}" +msgstr "" +"כמשתמש יקבל דרגה אני אשלח את ההתראות בהודעה פרטית, אם לא הצלחתי, אשלח אותה " +"אל {channel}" + +#: src/modules/ranks/cog.py:754 +msgctxt "" +"cmd:configure_ranks|response:updated|setting:notification|withdm_nochannel" +msgid "Rank update notifications will be sent via **direct message**." +msgstr "עדכון ההתראות ישלח ב**הודעה פרטית.**" + +#: src/modules/ranks/cog.py:760 +#, possible-python-brace-format +msgctxt "" +"cmd:configure_ranks|response:updated|setting:notification|nodm_withchannel" +msgid "Rank update notifications will be sent to {channel}." +msgstr "התראות בנוגע לדרגות ישלחו אל {channel}." + +#: src/modules/ranks/cog.py:765 +msgctxt "" +"cmd:configure_ranks|response:updated|setting:notification|nodm_nochannel" +msgid "Members will not be notified when their activity rank updates." +msgstr "משתמשים לא יקבלו עדכון כשהם מקבלים דרגה חדשה." + +#: src/modules/ranks/utils.py:13 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:role_name" +msgid "{role_name}" +msgstr "{שם_רול}" + +#: src/modules/ranks/utils.py:14 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:guild_name" +msgid "{guild_name}" +msgstr "{שם_שרת}" + +#: src/modules/ranks/utils.py:15 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:user_name" +msgid "{user_name}" +msgstr "{שם_משתמש}" + +#: src/modules/ranks/utils.py:16 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:role_id" +msgid "{role_id}" +msgstr "{רול_מספרזהות}" + +#: src/modules/ranks/utils.py:17 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:guild_id" +msgid "{guild_id}" +msgstr "{מספרזהות_שרת}" + +#: src/modules/ranks/utils.py:18 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:user_id" +msgid "{user_id}" +msgstr "{מספרזהות_משתמש}" + +#: src/modules/ranks/utils.py:19 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:role_mention" +msgid "{role_mention}" +msgstr "{תיוג_רול}" + +#: src/modules/ranks/utils.py:20 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:user_mention" +msgid "{user_mention}" +msgstr "{תיוג_משתמש}" + +#: src/modules/ranks/utils.py:21 +#, possible-python-brace-format +msgctxt "formatstring:rank_message|key:requires" +msgid "{rank_requires}" +msgstr "{דרגה_דרושה}" + +#: src/modules/ranks/settings.py:26 +msgctxt "guildset:rank_type|output:voice" +msgid "`Voice`" +msgstr "`קול`" + +#: src/modules/ranks/settings.py:27 +msgctxt "guildset:rank_type|output:xp" +msgid "`Exp`" +msgstr "נקודות ניסיון" + +#: src/modules/ranks/settings.py:28 +msgctxt "guildset:rank_type|output:message" +msgid "`Messages`" +msgstr "הודעות" + +#: src/modules/ranks/settings.py:31 +msgctxt "guildset:rank_type|input_format:voice" +msgid "Voice" +msgstr "קול" + +#: src/modules/ranks/settings.py:32 +msgctxt "guildset:rank_type|input_format:xp" +msgid "Exp" +msgstr "נקודות ניסיון" + +#: src/modules/ranks/settings.py:33 +msgctxt "guildset:rank_type|input_format:message" +msgid "Messages" +msgstr "הודעות" + +#: src/modules/ranks/settings.py:36 +msgctxt "guildset:rank_type|input_pattern:voice" +msgid "voice|study" +msgstr "קול|למידה" + +#: src/modules/ranks/settings.py:37 +msgctxt "guildset:rank_type|input_pattern:voice" +msgid "text|message|messages" +msgstr "טקסט|הודעה|הודעות" + +#: src/modules/ranks/settings.py:38 +msgctxt "guildset:rank_type|input_pattern:xp" +msgid "xp|exp|experience" +msgstr "נק|נקודות|נקודות ניסיון" + +#: src/modules/ranks/settings.py:45 +msgctxt "guildset:rank_type" +msgid "rank_type" +msgstr "סוג_דרגה" + +#: src/modules/ranks/settings.py:48 +msgctxt "guildset:rank_type|desc" +msgid "" +"The type of statistic (messages | xp | voice hours) used to determine " +"activity ranks." +msgstr "" +"סוג הסטטיסטיקה (הודעות | נקודות ניסיון | שעות קול) שמשומש כדי לקבוע את " +"הדרגות." + +#: src/modules/ranks/settings.py:52 +msgctxt "guildset:rank_type|long_desc" +msgid "" +"Which statistic is used to reward activity ranks.\n" +"`Voice` is the number of hours active in tracked voice channels, `Exp` is a measure of message activity, and `Message` is a simple count of messages sent." +msgstr "" +"איזה סוג סטטיסטיקה אשתמש כדי לקבוע דרגות עבור המשתמשים שלכם!\n" +"לדוגמא, `קול` יתן לאנשים דרגות לפי כמה זמן הם נמצאים בחדרי קול, `נקודות ניסיון` הם מדד של המילים שהם שולחים בשרת, ב`הודעות` זה פשוט כמה הודעות משתמש שלח בשרת בלי קשר לכמות המילים." + +#: src/modules/ranks/settings.py:59 +msgctxt "guildset:rank_type|accepts" +msgid "Voice/Exp/Messages" +msgstr "קול|נקודות|הודעות" + +#: src/modules/ranks/settings.py:71 +msgctxt "guildset:rank_type|set_response|type:voice" +msgid "Members will be awarded activity ranks based on `Voice Activity`." +msgstr "משתמשים יקבלו דרגות בהתאם לכמות הזמן שהם מבלים בחדרים הקוליים." + +#: src/modules/ranks/settings.py:76 +msgctxt "guildset:rank_type|set_response|type:messages" +msgid "Members will be awarded activity ranks based on `Messages Sent`." +msgstr "משתמשים יקבלו דרגות בהתאם לכמות ההודעות שהם שולחים בשרת." + +#: src/modules/ranks/settings.py:81 +msgctxt "guildset:rank_type|set_response|type:xp" +msgid "Members will be awarded activity ranks based on `Message XP Earned`." +msgstr "משתמשים יקבלו דרגות בהתאם לכמות ו**איכות** ההודעות שהם שולחים בשרת." + +#: src/modules/ranks/settings.py:91 +#, possible-python-brace-format +msgctxt "guildset:rank_channel|set_using" +msgid "{cmd} or option menu below." +msgstr "{cmd} או תפריט הבחירה למטה." + +#: src/modules/ranks/settings.py:103 +msgctxt "guildset:rank_channel" +msgid "rank_channel" +msgstr "ערוץ_דרגות" + +#: src/modules/ranks/settings.py:106 +msgctxt "guildset:rank_channel|desc" +msgid "The channel in which to send rank update notifications." +msgstr "הערוץ שבו אשלח התראות בנוגע לעדכוני דרגות." + +#: src/modules/ranks/settings.py:110 +msgctxt "guildset:rank_channel|long_desc" +msgid "" +"Whenever a user advances a rank, a congratulatory message will be sent in " +"this channel, if set. If `dm_ranks` is enabled, this channel will only be " +"used when the user has opted not to receive DM notifications, or is " +"otherwise unreachable." +msgstr "" +"אם כשמשתמש עולה דרגה, הודעת איחולים תישלח לערוץ הזה, אם הפעלתם את האופציה " +"הזאתי. אם הפעלתם דרגות_הודעה_פרטית, הערוץ הזה רק ישומש כשמשתמש בחר לא לקבל " +"הודעות פרטיות." + +#: src/modules/ranks/settings.py:116 +msgctxt "guildset:rank_channel|accepts" +msgid "Rank notification channel name or id." +msgstr "שם או מספר זהות של הערוץ התראות." + +#: src/modules/ranks/settings.py:128 +#, possible-python-brace-format +msgctxt "guildset:rank_channel|set_response|set" +msgid "Rank update messages will be sent to {channel}." +msgstr "התראות בנוגע לדרגות ישלחו אל {channel}." + +#: src/modules/ranks/settings.py:133 +msgctxt "guildset:rank_channel|set_response|unset" +msgid "" +"Rank update messages will be ignored or sent via DM (if `dm_ranks` is " +"enabled)." +msgstr "" +"התראות דרגה לא יקבלו התראה או פשוט ישלחו בהודעה פרטית אם הפעלתם את " +"`דרגות_הודעה_פרטית`" + +#: src/modules/ranks/settings.py:143 +#, possible-python-brace-format +msgctxt "guildset:rank_channel|set_using" +msgid "{cmd} or channel selector below." +msgstr "{cmd} או בחירת ערוצים בתחתית." + +#: src/modules/ranks/settings.py:153 +msgctxt "guildset:dm_ranks" +msgid "dm_ranks" +msgstr "דרגות_הודעה_פרטית" + +#: src/modules/ranks/settings.py:156 +msgctxt "guildset:dm_ranks|desc" +msgid "" +"Whether to send rank advancement notifications through direct messages." +msgstr "האם או לא לשלוח התראות בנוגע להתקדמות בדרגות בהודעה פרטית." + +#: src/modules/ranks/settings.py:160 +msgctxt "guildset:dm_ranks|long_desc" +msgid "" +"If enabled, congratulatory messages for rank advancement will be direct " +"messaged to the user, instead of being sent to the configured " +"`rank_channel`." +msgstr "אם מופעל, הודעת איחולים תישלח למשתמש בהודעה פרטית כמשתמש עולה בדרגה." + +#: src/modules/ranks/settings.py:174 +msgctxt "guildset:dm_ranks|response:true" +msgid "I will direct message members upon rank advancement." +msgstr "אני אשלח למשתמש הודעה פרטית שהוא עולה דרגה." + +#: src/modules/ranks/settings.py:179 +msgctxt "guildset:dm_ranks|response:false" +msgid "I will never direct message members upon rank advancement." +msgstr "אני *לעולם לא* אשלח למשתמש הודעה פרטית שהוא עולה דרגה." + +#: src/modules/ranks/ui/preview.py:74 +msgctxt "ui:rank_preview|button:edit|error:role_deleted" +msgid "" +"The role underlying this rank no longer exists! Please select a new role " +"from the role menu." +msgstr "" +"הרול הקשור לדרגה הזו נמחק או כבר לא קיים! בבקשה תבחרו רול חדש כדי לשייך " +"לדרגה הזו דרך התפריט רולים." + +#: src/modules/ranks/ui/preview.py:81 +msgctxt "ui:rank_preview|button:edit|error:role_not_assignable" +msgid "" +"I do not have permission to edit the underlying role! Please select a new " +"role from the role menu, or ensure my top role is above the selected role." +msgstr "" +"אין לי מספיק הרשאות לערוך את הרול הזה! אנא בחרו רול מהתפריט אחרי שווידאתם " +"שהרול שלי נמצא בחלק העליון של הרשימת רולים של השרת שלכם." + +#: src/modules/ranks/ui/preview.py:90 +msgctxt "ui:rank_preview|button:edit|error|title" +msgid "Failed to edit rank!" +msgstr "לא הצלחתי לערוך את הדרגה!" + +#: src/modules/ranks/ui/preview.py:108 +msgctxt "ui:rank_preview|button:edit|label" +msgid "Edit" +msgstr "ערוך" + +#: src/modules/ranks/ui/preview.py:139 +#, possible-python-brace-format +msgctxt "ui:rank_preview|button:delete|response:success|description|with_role" +msgid "" +"You have deleted the rank {mention}. Press the button below to also delete " +"the role." +msgstr "" +"מחקתם את הדרגה {mention}. לחץ על הכפתור בתחתית כדי למחוק את הרול שהיה קשור " +"אליה." + +#: src/modules/ranks/ui/preview.py:144 +#, possible-python-brace-format +msgctxt "ui:rank_preview|button:delete|response:success|description|no_role" +msgid "You have deleted the rank {mention}." +msgstr "מחקתם את הדרגה {mention}." + +#: src/modules/ranks/ui/preview.py:150 +msgctxt "ui:rank_preview|button:delete|response:success|title" +msgid "Rank Deleted" +msgstr "רול נמחק" + +#: src/modules/ranks/ui/preview.py:160 +msgctxt "" +"ui:rank_preview|button:delete|response:success|button:delete_role|label" +msgid "Delete Role" +msgstr "מחק רול" + +#: src/modules/ranks/ui/preview.py:176 +#, possible-python-brace-format +msgctxt "" +"ui:rank_preview|button:delete|response:success|button:delete_role|response:errored|desc" +msgid "" +"You have deleted the rank **{name}**! Could not delete the role due to an " +"unknown error." +msgstr "" +"מחקתם את הדרגה **{name}**! לא הצלחתי למחוק את הרול הקשור אליו בעקבות שגיאה " +"לא ידועה." + +#: src/modules/ranks/ui/preview.py:182 +#, possible-python-brace-format +msgctxt "" +"ui:rank_preview|button:delete|response:success|button:delete_role|response:success|desc" +msgid "You have deleted the rank **{name}** along with the underlying role." +msgstr "מחקתם את הדרגה **{name}** ביחד עם הרול שהיה קשור אליה." + +#: src/modules/ranks/ui/preview.py:199 +msgctxt "ui:rank_preview|button:delete|label" +msgid "Delete Rank" +msgstr "מחק דרגה" + +#: src/modules/ranks/ui/preview.py:219 +#, possible-python-brace-format +msgctxt "ui:rank_preview|menu:roles|error:above_caller" +msgid "" +"You have insufficient permissions to assign {mention} as a rank role! You " +"may only manage roles below your top role." +msgstr "" +"אין לך מספיק הראשות כדי להוסיף את {mention} בתור דרגה! אתה יכול לנהל דרגות " +"רק אם הרולים שלך נמצאים מתחת לרול שאתה רוצה לנהל ברשימה של הרולים בדיסקורד." + +#: src/modules/ranks/ui/preview.py:225 +msgctxt "ui:rank_preview|menu:roles|error:above_caller|title" +msgid "Insufficient permissions!" +msgstr "אין לי או לך מספיק הראשות בשרת כדי לעשות את זה!" + +#: src/modules/ranks/ui/preview.py:241 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|suberror:is_default" +msgid "The @everyone role cannot be removed, and cannot be a rank!" +msgstr "הרול @everyone לא יכול להיות דרגה ולא יכול להמחק." + +#: src/modules/ranks/ui/preview.py:246 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|suberror:is_managed" +msgid "" +"The role is managed by another application or integration, and cannot be a " +"rank!" +msgstr "הרול הזה מנוהל על ידי בוט אחר ואני לא יכול לגשת אליו." + +#: src/modules/ranks/ui/preview.py:251 +msgctxt "" +"ui:rank_preview|menu:roles|error:not_assignable|suberror:no_permissions" +msgid "" +"I do not have the `MANAGE_ROLES` permission in this server, so I cannot " +"manage ranks!" +msgstr "" +"אין לי את ההרשאה `MANAGE_ROLES` בשרת הזה. אנא הוסף אותי שוב עם ההרשאות " +"הנכונות." + +#: src/modules/ranks/ui/preview.py:256 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|suberror:above_me" +msgid "" +"This role is above my top role in the role hierarchy, so I cannot add or " +"remove it!" +msgstr "הרול הזה נמצא מעליי ברשימה של הרולים של השרת אז אין לי איך לגשת אליו." + +#: src/modules/ranks/ui/preview.py:262 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|suberror:other" +msgid "I am not able to manage the selected role, so it cannot be a rank!" +msgstr "אני לא יכול לגשת לרול שבחרת, ולכן הוא לא יכול להיות דרגה בשרת." + +#: src/modules/ranks/ui/preview.py:268 +msgctxt "ui:rank_preview|menu:roles|error:not_assignable|title" +msgid "Could not update rank!" +msgstr "לא הצלחתי לעדכן את הדרגה!" + +#: src/modules/ranks/ui/preview.py:278 +msgctxt "ui:rank_preview|menu:roles|placeholder" +msgid "Update Rank Role" +msgstr "עדכון רול דרגה" + +#: src/modules/ranks/ui/preview.py:290 +msgctxt "ui:rank_preview|embed|title" +msgid "Rank Information" +msgstr "מידע על דרגה" + +#: src/modules/ranks/ui/preview.py:297 +msgctxt "ui:rank_preview|embed|field:role|name" +msgid "Role" +msgstr "רול" + +#: src/modules/ranks/ui/preview.py:304 +msgctxt "ui:rank_preview|embed|field:required|name" +msgid "Required" +msgstr "נחוץ" + +#: src/modules/ranks/ui/preview.py:311 +msgctxt "ui:rank_preview|embed|field:reward|name" +msgid "Reward" +msgstr "פרס" + +#: src/modules/ranks/ui/preview.py:320 +msgctxt "ui:rank_preview|embed|field:message" +msgid "Congratulatory Message" +msgstr "הודעה מברכת" + +#: src/modules/ranks/ui/refresh.py:125 +msgctxt "ui:refresh_ranks|embed|title:errored" +msgid "Could not refresh the server ranks!" +msgstr "לא הצלחתי לרענן את הדרגות בשרת הזה!" + +#: src/modules/ranks/ui/refresh.py:133 +msgctxt "ui:refresh_ranks|embed|title:done" +msgid "Rank refresh complete!" +msgstr "הרענון דרגות הושלם בהצלחה!" + +#: src/modules/ranks/ui/refresh.py:139 +msgctxt "ui:refresh_ranks|embed|title:working" +msgid "Refreshing your server ranks, please wait." +msgstr "מרענן את הדרגות למשתמשים בשרת, חכו בסבלנות." + +#: src/modules/ranks/ui/refresh.py:157 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:ranks" +msgid "**Loading server ranks:** {emoji}" +msgstr "**טוען דרגות:**{emoji}" + +#: src/modules/ranks/ui/refresh.py:167 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:members" +msgid "**Loading server members:** {emoji}" +msgstr "**טוען משתמשים:** {emoji}" + +#: src/modules/ranks/ui/refresh.py:177 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:roles" +msgid "**Loading rank roles:** {emoji}" +msgstr "**טוען רולים שקשורים לדרגות:** {emoji}" + +#: src/modules/ranks/ui/refresh.py:187 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:compute" +msgid "**Computing correct ranks:** {emoji}" +msgstr "**מחשב דרגות נכונות:**{emoji}" + +#: src/modules/ranks/ui/refresh.py:198 +msgctxt "ui:refresh_ranks|embed|field:remove|name" +msgid "Removing invalid rank roles from members" +msgstr "מוחק דרגות לא זמינות ממשתמשים בשרת." + +#: src/modules/ranks/ui/refresh.py:202 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|field:remove|value" +msgid "0 {progress} {total}" +msgstr "0 {progress} {total}" + +#: src/modules/ranks/ui/refresh.py:212 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:remove" +msgid "**Removed invalid ranks:** {done}/{target}" +msgstr "**דרגות לא קשורות שנמחקו:** {done}/{target}" + +#: src/modules/ranks/ui/refresh.py:220 +msgctxt "ui:refresh_ranks|embed|field:add|name" +msgid "Giving members their rank roles" +msgstr "נותן למשתמשים את הרולי דרגות שלהם" + +#: src/modules/ranks/ui/refresh.py:224 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|field:add|value" +msgid "0 {progress} {total}" +msgstr "0 {progress} {total}" + +#: src/modules/ranks/ui/refresh.py:234 +#, possible-python-brace-format +msgctxt "ui:refresh_ranks|embed|line:add" +msgid "**Updated member ranks:** {done}/{target}" +msgstr "**דרגות שעודכנו:** {done}/{target}" + +#: src/modules/ranks/ui/config.py:42 +msgctxt "ui:rankconfigui|check|not_permitted" +msgid "You have insufficient server permissions to use this UI!" +msgstr "אין לך הרשאות מתאימות בשרת עצמו כדי להשתמש בתפריט הזה!" + +#: src/modules/ranks/ui/config.py:64 +msgctxt "ui:rank_config|button:overview|label" +msgid "Edit Ranks" +msgstr "ערוך דרגות" + +#: src/modules/ranks/ui/config.py:82 +msgctxt "ui:rank_config|menu:types|placeholder" +msgid "Select Statistic Type" +msgstr "בחר סוג סטטיסטיקה" + +#: src/modules/ranks/ui/config.py:90 +msgctxt "ui:rank_config|menu:types|option:voice" +msgid "Voice Activity" +msgstr "פעילות חדרי קול" + +#: src/modules/ranks/ui/config.py:98 +msgctxt "ui:rank_config|menu:types|option:xp" +msgid "XP Earned" +msgstr "רווח נקודות ניסיון " + +#: src/modules/ranks/ui/config.py:106 +msgctxt "ui:rank_config|menu:types|option:messages" +msgid "Messages Sent" +msgstr "הודעות שנשלחו" + +#: src/modules/ranks/ui/config.py:126 +msgctxt "ui:rank_config|menu:channels|placeholder" +msgid "Select Rank Notification Channel" +msgstr "בחר בערוץ התראות לעדכוני דרגות" + +#: src/modules/ranks/ui/config.py:134 +msgctxt "ui:rank_config|embed|title" +msgid "Ranks Configuration Panel" +msgstr "תפריט עריכת דרגות" + +#: src/modules/ranks/ui/config.py:171 +msgctxt "dash:rank|title" +msgid "Rank Configuration ({commands[configure ranks]})" +msgstr "עריכת דרגות ({commands[configure ranks]})" + +#: src/modules/ranks/ui/config.py:175 +msgctxt "dash:rank|dropdown|placeholder" +msgid "Activity Rank Panel" +msgstr "תפריט דרגות פעילות" + +#: src/modules/ranks/ui/overview.py:92 +msgctxt "ui:rank_overview|button:auto|label" +msgid "Auto Create" +msgstr "צור באופן אוטומטי" + +#: src/modules/ranks/ui/overview.py:107 +msgctxt "ui:rank_overview|button:refresh|label" +msgid "Refresh Member Ranks" +msgstr "רענן דרגות משתמשים" + +#: src/modules/ranks/ui/overview.py:123 +msgctxt "ui:rank_overview|button:clear|label" +msgid "Clear Ranks" +msgstr "אפס דרגות" + +#: src/modules/ranks/ui/overview.py:153 +msgctxt "ui:rank_overview|button:create|label" +msgid "Create Rank" +msgstr "צור דרגה!" + +#: src/modules/ranks/ui/overview.py:169 +#, possible-python-brace-format +msgctxt "ui:rank_overview|menu:roles|error:above_caller" +msgid "" +"You have insufficient permissions to assign {mention} as a rank role! You " +"may only manage roles below your top role." +msgstr "" +"אין לך מספיק הראשות כדי להוסיף את {mention} בתור דרגה! אתה יכול לנהל דרגות " +"רק אם הרולים שלך נמצאים מתחת לרול שאתה רוצה לנהל ברשימה של הרולים בדיסקורד." + +#: src/modules/ranks/ui/overview.py:175 +msgctxt "ui:rank_overview|menu:roles|error:above_caller|title" +msgid "Insufficient permissions!" +msgstr "אין לי או לך מספיק הראשות בשרת כדי לעשות את זה!" + +#: src/modules/ranks/ui/overview.py:208 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:is_default" +msgid "The @everyone role cannot be removed, and cannot be a rank!" +msgstr "הרול @everyone לא יכול להיות דרגה ולא יכול להמחק." + +#: src/modules/ranks/ui/overview.py:213 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:is_managed" +msgid "" +"The role is managed by another application or integration, and cannot be a " +"rank!" +msgstr "הרול הזה מנוהל על ידי בוט אחר ואני לא יכול לגשת אליו." + +#: src/modules/ranks/ui/overview.py:218 +msgctxt "" +"ui:rank_overview|menu:roles|error:not_assignable|suberror:no_permissions" +msgid "" +"I do not have the `MANAGE_ROLES` permission in this server, so I cannot " +"manage ranks!" +msgstr "" +"אין לי את ההרשאה `MANAGE_ROLES` בשרת הזה. אנא הוסף אותי שוב עם ההרשאות " +"הנכונות." + +#: src/modules/ranks/ui/overview.py:223 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:above_me" +msgid "" +"This role is above my top role in the role hierarchy, so I cannot add or " +"remove it!" +msgstr "הרול הזה נמצא מעליי ברשימה של הרולים של השרת אז אין לי איך לגשת אליו." + +#: src/modules/ranks/ui/overview.py:229 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:other" +msgid "I am not able to manage the selected role, so it cannot be a rank!" +msgstr "אני לא יכול לגשת לרול שבחרת, ולכן הוא לא יכול להיות דרגה בשרת." + +#: src/modules/ranks/ui/overview.py:235 +msgctxt "ui:rank_overview|menu:roles|error:not_assignable|title" +msgid "Could not create rank!" +msgstr "לא הצלחתי ליצור דרגה!" + +#: src/modules/ranks/ui/overview.py:259 +msgctxt "ui:rank_overview|menu:roles|placeholder" +msgid "Create from role" +msgstr "צור מרול ספציפי" + +#: src/modules/ranks/ui/overview.py:276 +msgctxt "ui:rank_overview|menu:ranks|placeholder" +msgid "View or edit rank" +msgstr "צפה או ערוך דרגה" + +#: src/modules/ranks/ui/overview.py:362 +msgctxt "ui:rank_overview|embed:noranks|desc" +msgid "" +"No activity ranks have been set up!\n" +"Press 'AUTO' to automatically create a standard heirachy of voice | text | xp ranks, or select a role or press Create below!" +msgstr "" +"דרגות לא הוגדרו עבור השרת הזה!\n" +"לחץ על \"צור באופן אוטומטי\" על מנת ליצור דרגות סטנדרטיות, או בחר ברול ספציפי וצור אחד בעצמך!" + +#: src/modules/ranks/ui/overview.py:370 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|title|type:voice" +msgid "Voice Ranks in {guild_name}" +msgstr "דרגות פעילות בחדרי קול ב {guild_name}" + +#: src/modules/ranks/ui/overview.py:375 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|title|type:xp" +msgid "XP ranks in {guild_name}" +msgstr "דרגות לפי נקודות ניסיון ב {guild_name}" + +#: src/modules/ranks/ui/overview.py:380 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|title|type:message" +msgid "Message ranks in {guild_name}" +msgstr "דרגות לפי כמות הודעות ב {guild_name}" + +#: src/modules/ranks/ui/editor.py:33 +msgctxt "ui:rank_editor|input:role_name|label" +msgid "Role Name" +msgstr "השם של הרול" + +#: src/modules/ranks/ui/editor.py:37 +msgctxt "ui:rank_editor|input:role_name|placeholder" +msgid "Name of the awarded guild role" +msgstr "השם של הרול שניתן בתור פרס" + +#: src/modules/ranks/ui/editor.py:53 +msgctxt "ui:rank_editor|input:role_colour|label" +msgid "Role Colour" +msgstr "הצבע של הרול" + +#: src/modules/ranks/ui/editor.py:57 +msgctxt "ui:rank_editor|input:role_colour|placeholder" +msgid "Colour of the awarded guild role, e.g. #AB1321" +msgstr "הצבע באמצעות Hex של הרול שניתן למשתמש" + +#: src/modules/ranks/ui/editor.py:69 +msgctxt "ui:rank_editor|input:role_colour|error:parse" +msgid "" +"`role_colour`: Could not parse colour! Please use `#` format e.g. " +"`#AB1325`." +msgstr "לא הבנתי! תוודאו שהערך שהכנסתם הוא בhex" + +#: src/modules/ranks/ui/editor.py:88 +msgctxt "ui:rank_editor|type:voice|input:requires|label" +msgid "Required Voice Hours" +msgstr "שעות נחוצות בחדר הקולי" + +#: src/modules/ranks/ui/editor.py:92 +msgctxt "ui:rank_editor|type:voice|input:requires|placeholder" +msgid "Number of voice hours before awarding this rank" +msgstr "מספר שעות קוליות לפני שמקבלים את הדרגה" + +#: src/modules/ranks/ui/editor.py:97 +msgctxt "ui:rank_editor|type:xp|input:requires|label" +msgid "Required XP" +msgstr "נקודות ניסיון נחוצות" + +#: src/modules/ranks/ui/editor.py:101 +msgctxt "ui:rank_editor|type:xp|input:requires|placeholder" +msgid "Amount of XP needed before obtaining this rank" +msgstr "כמות נקודות הניסיון הנחוצה כדי לקבל את הדרגה הזו" + +#: src/modules/ranks/ui/editor.py:106 +msgctxt "ui:rank_editor|type:message|input:requires|label" +msgid "Required Message Count" +msgstr "כמות הודעות נחוצה" + +#: src/modules/ranks/ui/editor.py:110 +msgctxt "ui:rank_editor|type:message|input:requires|placeholder" +msgid "Number of messages needed before awarding rank" +msgstr "מספר הודעות נחוצות לפני שמקבלים את הדרגה הזו" + +#: src/modules/ranks/ui/editor.py:126 +msgctxt "ui:rank_editor|type:voice|input:requires|error:parse" +msgid "" +"`requires`: Could not parse provided minimum time! Please write a number of " +"hours." +msgstr "`דרוש`: לא הצלחתי להבין את הזמן המינימלי! אנא ציין את מספר השעות." + +#: src/modules/ranks/ui/editor.py:137 +msgctxt "ui:rank_editor|type:message|input:requires|error:parse" +msgid "" +"`requires`: Could not parse provided minimum message count! Please enter an " +"integer." +msgstr "`דרוש`: לא הצלחתי להבין את כמות ההודעות המינימלית! אנא ציין את המספר." + +#: src/modules/ranks/ui/editor.py:148 +msgctxt "ui:rank_editor|type:xp|input:requires|error:parse" +msgid "" +"`requires`: Could not parse provided minimum XP! Please enter an integer." +msgstr "" +"`דרוש`: לא הצלחתי להבין את כמות נקודות הניסיון המינימליות! אנא ציין את " +"המספר." + +#: src/modules/ranks/ui/editor.py:162 +msgctxt "ui:rank_editor|input:reward|label" +msgid "LionCoins awarded upon achieving this rank" +msgstr "מטבעות יתנו כשמגיעים לדרגה הזו" + +#: src/modules/ranks/ui/editor.py:166 +msgctxt "ui:rank_editor|input:reward|placeholder" +msgid "LionCoins awarded upon achieving this rank" +msgstr "מטבעות יתנו כשמגיעים לדרגה הזו" + +#: src/modules/ranks/ui/editor.py:181 +msgctxt "ui:rank_editor|input:reward|error:parse" +msgid "`reward`: Please enter an integer number of LionCoins." +msgstr "`פרס`: אנא הכנס מספר שלם של מטבעות." + +#: src/modules/ranks/ui/editor.py:197 +msgctxt "ui:rank_editor|input:message|label" +msgid "Rank Message" +msgstr "דרגה הודעות" + +#: src/modules/ranks/ui/editor.py:201 +msgctxt "ui:rank_editor|input:message|placeholder" +msgid "Congratulatory message sent to the user upon achieving this rank." +msgstr "הודעת איחולים תישלח למשתמש כשהוא יגיע לדרגה הזו." + +#: src/modules/ranks/ui/editor.py:207 +#, possible-python-brace-format +msgctxt "ui:rank_editor|input:message|default|type:voice" +msgid "" +"Congratulations {user_mention}!\n" +"For working hard for **{requires}**, you have achieved the rank of **{role_name}** in **{guild_name}**! Keep up the good work." +msgstr "" +"כל הכבוד על העבודה הקשה {user_mention}!\n" +"עבדתם קשה והצלחתם להגיע אל **{requires}**, מאחר ועבדתם כל כך קשה, הצלחתם להשיג את **{role_name}** בשרת **{guild_name}**! בהצלחה בהמשך!" + +#: src/modules/ranks/ui/editor.py:262 +msgctxt "ui:rank_editor|mode:edit|title" +msgid "Rank Editor" +msgstr "עורך דרגה" + +#: src/modules/ranks/ui/editor.py:317 +msgctxt "ui:rank_editor|mode:create|title" +msgid "Rank Creator" +msgstr "יוצר דרגה" diff --git a/locales/he_IL/LC_MESSAGES/reminders.po b/locales/he_IL/LC_MESSAGES/reminders.po new file mode 100644 index 00000000..5d9e714f --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/reminders.po @@ -0,0 +1,379 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/reminders/cog.py:93 +msgctxt "reminder|embed" +msgid "You asked me to remind you!" +msgstr "ביקשת ממני להזכיר לך!" + +#: src/modules/reminders/cog.py:101 +msgctxt "reminder|embed" +msgid "Context?" +msgstr "קונטקסט?" + +#: src/modules/reminders/cog.py:103 +msgctxt "reminder|embed" +msgid "Click Here" +msgstr "לחץ פה" + +#: src/modules/reminders/cog.py:110 +msgctxt "reminder|embed" +msgid "Next reminder" +msgstr "התזכיר הבא" + +#: src/modules/reminders/cog.py:134 +#, possible-python-brace-format +msgctxt "reminder|formatted|interval" +msgid "Every day" +msgid_plural "Every `{days}` days" +msgstr[0] "כל יום אחד" +msgstr[1] "כל יומיים" +msgstr[2] "כל `{days}` ימים" +msgstr[3] "כל `{days}` ימים" + +#: src/modules/reminders/cog.py:143 +#, possible-python-brace-format +msgctxt "reminder|formatted|interval" +msgid "Every hour" +msgid_plural "Every `{hours}` hours" +msgstr[0] "כל שעה אחת" +msgstr[1] "כל `{hours}` שעות" +msgstr[2] "כל `{hours}` שעות" +msgstr[3] "כל `{hours}` שעות" + +#: src/modules/reminders/cog.py:152 +#, possible-python-brace-format +msgctxt "reminder|formatted|interval" +msgid "Every `{duration}`" +msgstr "כל `{duration}`" + +#: src/modules/reminders/cog.py:352 +msgctxt "cmd:reminders" +msgid "reminders" +msgstr "תזכירים" + +#. No help string +#: src/modules/reminders/cog.py:359 +msgctxt "cmd:reminders_show" +msgid "show" +msgstr "הצג" + +#: src/modules/reminders/cog.py:362 +msgctxt "cmd:reminders_show|desc" +msgid "Display your current reminders." +msgstr "הצג את התזכירים הנוכחיים שלך." + +#: src/modules/reminders/cog.py:378 +msgctxt "cmd:reminders_show|close_elsewhere" +msgid "Closing since the list was opened elsewhere." +msgstr "נסגר מאחר והרשימה נפתחה במקום אחר." + +#: src/modules/reminders/cog.py:390 +msgctxt "cmd:reminders_clear" +msgid "clear" +msgstr "נקה" + +#: src/modules/reminders/cog.py:393 +msgctxt "cmd:reminders_clear|desc" +msgid "Clear your reminder list." +msgstr "נקה את רשימת התזכירים שלך." + +#: src/modules/reminders/cog.py:411 +msgctxt "cmd:reminders_clear|error:no_reminders" +msgid "You have no reminders to clear!" +msgstr "אין לך תזכירים לנקות!" + +#: src/modules/reminders/cog.py:420 +msgctxt "cmd:reminders_clear|confirm|title" +msgid "Are You Sure?" +msgstr "אתם בטוחים?" + +#: src/modules/reminders/cog.py:423 +#, possible-python-brace-format +msgctxt "cmd:reminders_clear|confirm|desc" +msgid "Are you sure you want to delete your `{count}` reminder?" +msgid_plural "Are you sure you want to clear your `{count}` reminders?" +msgstr[0] "אתם בטוחים שאתם רוצים לנקות את התזכור?" +msgstr[1] "אתם בטוחים שאתם רוצים לנקות שני תזכורים?" +msgstr[2] "אתם בטוחים שאתם רוצים לנקות `{count}` תזכורים?" +msgstr[3] "אתם בטוחים שאתם רוצים לנקות `{count}` תזכורים?" + +#: src/modules/reminders/cog.py:429 +msgctxt "cmd:reminders_clear|confirm|button:yes" +msgid "Yes, clear my reminders" +msgstr "כן, נקה את התזכירים שלי" + +#: src/modules/reminders/cog.py:438 +msgctxt "cmd:reminders_clear|success|desc" +msgid "Your reminders have been cleared!" +msgstr "רשמית התזכורים שלך נוקתה בהצלחה." + +#: src/modules/reminders/cog.py:447 +msgctxt "cmd:reminders_clear|confirm|button:cancel" +msgid "Cancel" +msgstr "בטל" + +#: src/modules/reminders/cog.py:457 +msgctxt "cmd:reminders_cancel" +msgid "cancel" +msgstr "בטל" + +#: src/modules/reminders/cog.py:460 +msgctxt "cmd:reminders_cancel|desc" +msgid "" +"Cancel a single reminder. Use the menu in \"reminder show\" to cancel " +"multiple reminders." +msgstr "" +"בטל תזכור בודד. השתמש בתפריט ב \"הצג תזכורים\" כדי לבטל כמה תזכירים בבת " +"אחת." + +#: src/modules/reminders/cog.py:464 +msgctxt "cmd:reminders_cancel|param:reminder" +msgid "reminder" +msgstr "תזכיר" + +#: src/modules/reminders/cog.py:469 +msgctxt "cmd:reminders_cancel|param:reminder|desc" +msgid "Start typing, then select a reminder to cancel." +msgstr "התחל להקליד, ואז תבחר את התזכור הרלוונטי שתרצה לבטל." + +#: src/modules/reminders/cog.py:488 +msgctxt "cmd:reminders_cancel|error:no_reminders" +msgid "There are no reminders to cancel!" +msgstr "אין שום תזכירים לבטל!" + +#: src/modules/reminders/cog.py:512 +msgctxt "cmd:reminders_cancel|error:no_match" +msgid "" +"I am not sure which reminder you want to cancel. Please try again, selecting" +" a reminder from the list of choices." +msgstr "" +"לא הצלחתי להבין איזה תזכיר אתה רוצה לבטל. אנא נסה שוב, תבחר את התזכיר " +"מהרשימה של האופציות למטה." + +#: src/modules/reminders/cog.py:525 +msgctxt "cmd:reminders_cancel|embed:success|desc" +msgid "Reminder successfully cancelled." +msgstr "התזכור בוטל בהצלחה." + +#: src/modules/reminders/cog.py:542 +msgctxt "cmd:reminders_cancel|acmpl:reminder|error:no_reminders" +msgid "There are no reminders to cancel!" +msgstr "אין שום תזכירים לבטל!" + +#: src/modules/reminders/cog.py:572 +#, possible-python-brace-format +msgctxt "cmd:reminders_cancel|acmpl:reminder|error:no_matches" +msgid "You do not have any reminders matching \"{partial}\"" +msgstr "אין לכם שום תזכורים שמתאימים ל \"{partial}\"" + +#: src/modules/reminders/cog.py:580 +msgctxt "cmd:remindme" +msgid "remindme" +msgstr "הזכרלי" + +#: src/modules/reminders/cog.py:587 +msgctxt "cmd:remindme_at" +msgid "at" +msgstr "ב" + +#: src/modules/reminders/cog.py:590 +msgctxt "cmd:remindme_at|desc" +msgid "Schedule a reminder for a particular time." +msgstr "קבע תזכור לזמן ספציפי." + +#: src/modules/reminders/cog.py:594 +msgctxt "cmd:remindme_at|param:time" +msgid "time" +msgstr "זמן" + +#: src/modules/reminders/cog.py:595 +msgctxt "cmd:remindme_at|param:reminder" +msgid "reminder" +msgstr "תזכיר" + +#: src/modules/reminders/cog.py:596 +msgctxt "cmd:remindme_at|param:every" +msgid "repeat_every" +msgstr "חזור_כל" + +#: src/modules/reminders/cog.py:599 +msgctxt "cmd:remindme_at|param:time|desc" +msgid "When you want to be reminded. (E.g. `4pm` or `16:00`)." +msgstr "הזמן שבו תרצה את התזכור (באנגלית) לדוגמא: 4PM או 16:00" + +#: src/modules/reminders/cog.py:600 +msgctxt "cmd:remindme_at|param:reminder|desc" +msgid "What should the reminder be?" +msgstr "מה התזכיר צריך להיות?" + +#: src/modules/reminders/cog.py:601 +msgctxt "cmd:remindme_at|param:every|desc" +msgid "How often to repeat this reminder." +msgstr "באיזו תדירות שבה תרצה לקבל את התזכור הזה" + +#: src/modules/reminders/cog.py:619 +msgctxt "cmd_remindme_at|error:too_many|desc" +msgid "Sorry, you have reached the maximum of `25` reminders!" +msgstr "סליחה, הגעת למגבלה של 25 תזכירים!" + +#: src/modules/reminders/cog.py:623 +msgctxt "cmd_remindme_at|error:too_many|title" +msgid "Could not create reminder!" +msgstr "לא הצלחתי ליצור את התזכיר!" + +#: src/modules/reminders/cog.py:636 +msgctxt "cmd_remindme_at|error:too_fast|desc" +msgid "" +"You cannot set a repeating reminder with a period less than 10 minutes." +msgstr "אתה לא יכול ליצור תזכיר עם אינטרבל של פחות מ10 דקות." + +#: src/modules/reminders/cog.py:640 +msgctxt "cmd_remindme_at|error:too_fast|title" +msgid "Could not create reminder!" +msgstr "לא הצלחתי ליצור את התזכיר!" + +#: src/modules/reminders/cog.py:658 +#, possible-python-brace-format +msgctxt "cmd:remindme_at|error:parse_time|desc" +msgid "" +"Could not parse provided time `{given}`. Try entering e.g. `4 pm` or " +"`16:00`." +msgstr "" +"לא הצלחתי להבין את `{given}`. נסה להכניס את הערך באנגלית. `4 pm` או " +"`16:00`." + +#: src/modules/reminders/cog.py:662 +msgctxt "cmd:remindme_at|error:parse_time|title" +msgid "Could not create reminder!" +msgstr "לא הצלחתי ליצור את התזכיר!" + +#: src/modules/reminders/cog.py:673 +msgctxt "cmd:remindme_at|error:past_time|desc" +msgid "Provided time is in the past!" +msgstr "הזמן שנתת לי הוא בעבר." + +#: src/modules/reminders/cog.py:677 +msgctxt "cmd:remindme_at|error:past_time|title" +msgid "Could not create reminder!" +msgstr "לא הצלחתי ליצור את התזכיר!" + +#: src/modules/reminders/cog.py:702 +#, possible-python-brace-format +msgctxt "cmd:remindme_in|success|title" +msgid "Reminder Set at {timestamp}" +msgstr "תזכיר נקבע ל {timestamp}" + +#: src/modules/reminders/cog.py:713 +msgctxt "cmd:remindme_in" +msgid "in" +msgstr "ב" + +#: src/modules/reminders/cog.py:716 +msgctxt "cmd:remindme_in|desc" +msgid "Schedule a reminder for a given amount of time in the future." +msgstr "קבע תזכיר זמן מסויים לתוך העתיד." + +#: src/modules/reminders/cog.py:720 +msgctxt "cmd:remindme_in|param:time" +msgid "time" +msgstr "זמן" + +#: src/modules/reminders/cog.py:721 +msgctxt "cmd:remindme_in|param:reminder" +msgid "reminder" +msgstr "תזכיר" + +#: src/modules/reminders/cog.py:722 +msgctxt "cmd:remindme_in|param:every" +msgid "repeat_every" +msgstr "חזור_כל" + +#: src/modules/reminders/cog.py:725 +msgctxt "cmd:remindme_in|param:time|desc" +msgid "How far into the future to set the reminder (e.g. 1 day 10h 5m)." +msgstr "עוד כמה זמן תרצו לקבל את התזכיר הזה? (e.g. 1 day 10h 5m)." + +#: src/modules/reminders/cog.py:726 +msgctxt "cmd:remindme_in|param:reminder|desc" +msgid "What should the reminder be?" +msgstr "מה התזכיר צריך להיות?" + +#: src/modules/reminders/cog.py:727 +msgctxt "cmd:remindme_in|param:every|desc" +msgid "How often to repeat this reminder. (e.g. 1 day, or 2h)" +msgstr "עד מתי תרצו לקבל את התזכיר הזה? (e.g. 1 day, or 2h)" + +#: src/modules/reminders/cog.py:745 +msgctxt "cmd_remindme_in|error:too_many|desc" +msgid "Sorry, you have reached the maximum of `25` reminders!" +msgstr "סליחה, הגעת למגבלה של 25 תזכירים!" + +#: src/modules/reminders/cog.py:749 +msgctxt "cmd_remindme_in|error:too_many|title" +msgid "Could not create reminder!" +msgstr "לא הצלחתי ליצור את התזכיר!" + +#: src/modules/reminders/cog.py:762 +msgctxt "cmd_remindme_in|error:too_fast|desc" +msgid "" +"You cannot set a repeating reminder with a period less than 10 minutes." +msgstr "אתה לא יכול ליצור תזכיר עם אינטרבל של פחות מ10 דקות." + +#: src/modules/reminders/cog.py:766 +msgctxt "cmd_remindme_in|error:too_fast|title" +msgid "Could not create reminder!" +msgstr "לא הצלחתי ליצור את התזכיר!" + +#: src/modules/reminders/cog.py:792 +#, possible-python-brace-format +msgctxt "cmd:remindme_in|success|title" +msgid "Reminder Set {timestamp}" +msgstr "תזכיר נקבע {timestamp}" + +#: src/modules/reminders/cog.py:853 +msgctxt "ui:reminderlist|select:remove|placeholder" +msgid "Select to cancel." +msgstr "בחר כדי לבטל." + +#: src/modules/reminders/cog.py:929 +#, possible-python-brace-format +msgctxt "ui:reminderlist|embed:list|author" +msgid "{name}'s reminders" +msgstr "התזכורים של {name}" + +#: src/modules/reminders/cog.py:935 +msgctxt "ui:reminderlist|embed:list|footer" +msgid "Click a reminder twice to jump to the context!" +msgstr "לחץ על תזכיר כדי לקפוץ לקונטקסט שלו!" + +#: src/modules/reminders/cog.py:942 +#, possible-python-brace-format +msgctxt "ui:reminderlist|embed:no_reminders|desc" +msgid "" +"You have no reminders to display!\n" +"Use {remindme} to create a new reminder." +msgstr "" +"אין לך תזכורים להראות!\n" +"השתמש ב {remindme} כדי ליצור תזכור חדש!" diff --git a/locales/he_IL/LC_MESSAGES/rolemenus.po b/locales/he_IL/LC_MESSAGES/rolemenus.po new file mode 100644 index 00000000..b9c14084 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/rolemenus.po @@ -0,0 +1,1543 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/rolemenus/cog.py:41 +msgctxt "argtype:menu_style|opt:reaction" +msgid "Reaction Roles" +msgstr "רולים שמקבלים עם ריאקציות" + +#: src/modules/rolemenus/cog.py:45 +msgctxt "argtype:menu_style|opt:button" +msgid "Button Menu" +msgstr "תפריט עם כפתורים" + +#: src/modules/rolemenus/cog.py:49 +msgctxt "argtype:menu_style|opt:dropdown" +msgid "Dropdown Menu" +msgstr "תפריט נפתח" + +#: src/modules/rolemenus/cog.py:68 +msgctxt "ctxcmd:rolemenu" +msgid "Role Menu Editor" +msgstr "עורך תפריט רולים" + +#: src/modules/rolemenus/cog.py:81 +msgctxt "ctxcmd:rolemenu|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to manage the server role " +"menus." +msgstr "אתה צריך את ההרשאה `MANAGE_ROLES` כדי לערוך את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:88 +msgctxt "ctxcmd:rolemenus|error:my_perms" +msgid "" +"I lack the `MANAGE_ROLES` permission required to offer roles from role " +"menus." +msgstr "אין לי את ההרשאה `MANAGE_ROLES` כדי לערוך את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:300 +msgctxt "parse:message_link|suberror:message_dne" +msgid "Could not find the linked message, has it been deleted?" +msgstr "לא הצלחתי למצוא את ההודעה הקשורה, האם היא נמחקה במקרה?" + +#: src/modules/rolemenus/cog.py:305 +#, possible-python-brace-format +msgctxt "parse:message_link|suberror:no_perms" +msgid "" +"Insufficient permissions! I need the `MESSAGE_HISTORY` permission in " +"{channel}." +msgstr "" +"אין לי מספיק הרשאות! אני צריך את ההרשאה `MESSAGE_HISTORY` בערוץ {channel}." + +#: src/modules/rolemenus/cog.py:310 +#, possible-python-brace-format +msgctxt "parse:message_link|suberror:channel_dne" +msgid "The channel `{channelid}` could not be found in this server." +msgstr "הערוץ `{channelid}` לא נמצא בשרת הזה." + +#: src/modules/rolemenus/cog.py:315 +msgctxt "parse:message_link|suberror:malformed_link" +msgid "" +"Malformed message link. Please copy the link by right clicking the target " +"message." +msgstr "הלינק לא תקין. אנא העתק את הלינק הנכון." + +#: src/modules/rolemenus/cog.py:322 +#, possible-python-brace-format +msgctxt "parse:message_link|error" +msgid "" +"Failed to resolve the provided message link.\n" +"**ERROR:** {error}" +msgstr "" +"קיבלתי שגיאה, לא הצלחתי לא הבין את הלינק\n" +"שגיאה: {error}" + +#: src/modules/rolemenus/cog.py:434 +msgctxt "cmd:rolemenus" +msgid "rolemenus" +msgstr "תפריטירולים" + +#: src/modules/rolemenus/cog.py:437 +msgctxt "cmd:rolemenus|desc" +msgid "View and configure the role menus in this server." +msgstr "הצג ונהל את התפריטי רולים של השרת הזה." + +#: src/modules/rolemenus/cog.py:454 +msgctxt "cmd:rolemenus|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to manage the server role " +"menus." +msgstr "אתה צריך את ההרשאה `MANAGE_ROLES` כדי לערוך את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:461 +msgctxt "cmd:rolemenus|error:my_perms" +msgid "" +"I lack the `MANAGE_ROLES` permission required to offer roles from role " +"menus." +msgstr "אין לי את ההרשאה `MANAGE_ROLES` כדי לערוך את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:496 +#, possible-python-brace-format +msgctxt "acmpl:menus|choice:no_choices|name" +msgid "No role menus matching '{partial}'" +msgstr "אין תפריטים שמתאימים ל'{partial}'!" + +#: src/modules/rolemenus/cog.py:515 +msgctxt "acmpl:menuroles|param:menu|keyname" +msgid "menu" +msgstr "תפריט" + +#: src/modules/rolemenus/cog.py:521 +msgctxt "acmpl:menuroles|choice:no_menu|name" +msgid "Please select a menu first" +msgstr "אנא בחר תפריט קודם" + +#: src/modules/rolemenus/cog.py:545 +#, possible-python-brace-format +msgctxt "acmpl:menuroles|choice:invalid_menu|name" +msgid "Menu '{name}' does not exist!" +msgstr "התפריט '{name}' לא קיים!" + +#: src/modules/rolemenus/cog.py:574 +#, possible-python-brace-format +msgctxt "acmpl:menuroles|choice:no_matching|name" +msgid "No roles in this menu matching '{partial}'" +msgstr "אין רולים בתפריטים הללו שמתאימים ל'{partial}'!" + +#: src/modules/rolemenus/cog.py:581 +msgctxt "group:rolemenu" +msgid "rolemenu" +msgstr "תפריטרולים" + +#: src/modules/rolemenus/cog.py:584 +msgctxt "group:rolemenu|desc" +msgid "Base command group for role menu configuration." +msgstr "קבוצת פקודות בסיס לניהול הגדרות התפריטים." + +#: src/modules/rolemenus/cog.py:593 +msgctxt "cmd:rolemenu_create" +msgid "newmenu" +msgstr "תפריטחדש" + +#: src/modules/rolemenus/cog.py:596 +msgctxt "cmd:rolemenu_create|desc" +msgid "Create a new role menu (optionally using an existing message)" +msgstr "צור תפריט חדש (ניתן להשתמש גם בהודעה קיימת)" + +#: src/modules/rolemenus/cog.py:610 +msgctxt "cmd:rolemenu_create|param:message" +msgid "message_link" +msgstr "קישור_הודעה" + +#: src/modules/rolemenus/cog.py:611 +msgctxt "cmd:rolemenu_create|param:menu_style" +msgid "menu_style" +msgstr "סגנון_תפריט" + +#: src/modules/rolemenus/cog.py:612 +msgctxt "cmd:rolemenu_create|param:remplate" +msgid "template" +msgstr "תבנית" + +#: src/modules/rolemenus/cog.py:613 +msgctxt "cmd:rolemenu_create|param:rawmessage" +msgid "custom_message" +msgstr "הודעה_מותאמת_אישית" + +#: src/modules/rolemenus/cog.py:623 +msgctxt "cmd:rolemenu_create|param:message|desc" +msgid "Link to an existing message to turn it into a (reaction) role menu" +msgstr "לינק להודעה שכבר קיימת כדי להפוך אותה להודעת תפריטים" + +#: src/modules/rolemenus/cog.py:627 +msgctxt "cmd:rolemenu_create|param:menu_style" +msgid "Selection style for this menu (using buttons, dropdowns, or reactions)" +msgstr "סגנון בחירה לתפריט הזה (כפתורים, תפריט נופל או ריאקציות)" + +#: src/modules/rolemenus/cog.py:631 +msgctxt "cmd:rolemenu_create|param:template" +msgid "Template to use for the menu message body" +msgstr "תבנית שבה אשתמש בגוף התפריט" + +#: src/modules/rolemenus/cog.py:635 +msgctxt "cmd:rolemenu_create|param:rawmessage" +msgid "Attach a custom menu message to use" +msgstr "הוסף הודעה מותאמת אישית שאשתמש" + +#: src/modules/rolemenus/cog.py:664 +msgctxt "cmd:rolemenu_create|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to create new role menus." +msgstr "אתה צריך את ההרשאה `MANAGE_ROLES` כדי לנהל את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:671 +msgctxt "cmd:rolemenu_create|error:my_perms" +msgid "" +"I lack the `MANAGE_ROLES` permission needed to offer roles from role menus." +msgstr "אין לי את ההרשאה `MANAGE_ROLES` כדי לערוך את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:690 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:message_exists" +msgid "The message {link} already has a role menu! Use {edit_cmd} to edit it." +msgstr "" +"להודעה {link} כבר יש תפריט משויך אליו. תשתמשו ב {edit_cmd} כדי לערוך אותו." + +#: src/modules/rolemenus/cog.py:711 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:style_notmine" +msgid "" +"I cannot create a `{style}` style menu on a message I didn't send! (Discord " +"restriction)." +msgstr "" +"אני לא יכול ליצור תפריט בסגנון `{style}` על הודעה שאני לא שלחתי בעצמי (ככה " +"דיסקורד עובד, אין לי איך לעקוף את זה)" + +#: src/modules/rolemenus/cog.py:718 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:rawmessage_notmine" +msgid "" +"Cannot apply a custom menu message to {message} because I do not own this " +"message!" +msgstr "" +"לא הצלחתי להכין תפריט על ההודעה {message} כי אני לא זה ששלח את ההודעה הזו!" + +#: src/modules/rolemenus/cog.py:727 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:template_notmine" +msgid "" +"Cannot apply a menu message template to {message} because I do not own this " +"message!" +msgstr "" +"לא הצלחתי להכין תפריט על ההודעה {message} כי אני לא זה ששלח את ההודעה הזו!" + +#: src/modules/rolemenus/cog.py:740 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_create|error:name_exists" +msgid "A rolemenu called `{name}` already exists! Use {edit_cmd} to edit it." +msgstr "תפריט בשם `{name}` כבר קיים! תשתמשו ב{edit_cmd} כדי לערוך אותו." + +#: src/modules/rolemenus/cog.py:788 +msgctxt "cmd:rolemenu_edit" +msgid "editmenu" +msgstr "ערוךתפריט" + +#: src/modules/rolemenus/cog.py:791 +msgctxt "cmd:rolemenu_edit|desc" +msgid "Edit an existing role menu." +msgstr "ערוך תפריט קיים." + +#: src/modules/rolemenus/cog.py:800 +msgctxt "cmd:rolemenu_edit|param:name" +msgid "name" +msgstr "שם" + +#: src/modules/rolemenus/cog.py:801 +msgctxt "cmd:rolemenu_edit|param:new_name" +msgid "new_name" +msgstr "שם_חדש" + +#: src/modules/rolemenus/cog.py:802 +msgctxt "cmd:rolemenu_edit|param:channel" +msgid "new_channel" +msgstr "ערוץ_חדש" + +#: src/modules/rolemenus/cog.py:807 +msgctxt "cmd:rolemenu_edit|param:menu_style" +msgid "menu_style" +msgstr "סגנון_תפריט" + +#: src/modules/rolemenus/cog.py:808 +msgctxt "cmd:rolemenu_edit|param:remplate" +msgid "template" +msgstr "תבנית" + +#: src/modules/rolemenus/cog.py:809 +msgctxt "cmd:rolemenu_edit|param:rawmessage" +msgid "custom_message" +msgstr "הודעה_מותאמת_אישית" + +#: src/modules/rolemenus/cog.py:814 +msgctxt "cmd:rolemenu_edit|param:name|desc" +msgid "Name of the menu to edit" +msgstr "השם של התפריט שמיועד לעריכה" + +#: src/modules/rolemenus/cog.py:818 +msgctxt "cmd:rolemenu_edit|param:channel|desc" +msgid "Server channel to move the menu to" +msgstr "ערוץ בשרת שאליו אעביר את התפריט הזה" + +#: src/modules/rolemenus/cog.py:827 +msgctxt "cmd:rolemenu_edit|param:menu_style" +msgid "Selection style for this menu (using buttons, dropdowns, or reactions)" +msgstr "סגנון בחירה לתפריט הזה (כפתורים, תפריט נופל או ריאקציות)" + +#: src/modules/rolemenus/cog.py:831 +msgctxt "cmd:rolemenu_edit|param:template" +msgid "Template to use for the menu message body" +msgstr "תבנית שבה אשתמש בגוף התפריט" + +#: src/modules/rolemenus/cog.py:835 +msgctxt "cmd:rolemenu_edit|param:rawmessage" +msgid "Attach a custom menu message to use" +msgstr "הוסף הודעה מותאמת אישית שאשתמש" + +#: src/modules/rolemenus/cog.py:864 +msgctxt "cmd:rolemenu_edit|error:author_perms" +msgid "You need the `MANAGE_ROLES` permission in order to edit role menus." +msgstr "אתה צריך את ההרשאה `MANAGE_ROLES` כדי לנהל את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:871 +msgctxt "cmd:rolemenu_edit|error:my_perms" +msgid "" +"I lack the `MANAGE_ROLES` permission needed to offer roles from role menus." +msgstr "אין לי את ההרשאה `MANAGE_ROLES` כדי לערוך את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:894 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "לשרת הזה אין תפריט בשם `{name}`!" + +#: src/modules/rolemenus/cog.py:914 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|parse:new_name|error:name_exists" +msgid "A role menu with the name **{new_name}** already exists!" +msgstr "תפריט רולים עם השם **{new_name}** כבר קיים!" + +#: src/modules/rolemenus/cog.py:951 +msgctxt "cmd:rolemenu_edit|parse:template|error:not_managed" +msgid "" +"Cannot set a template message for a role menu attached to a message I did " +"not send." +msgstr "אני לא יכול לגשת להודעה הזו, אני לא הייתי זה ששלח אותה." + +#: src/modules/rolemenus/cog.py:962 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|parse:template|success:template" +msgid "Now using the `{name}` menu message template." +msgstr "עכשיו אשתמש בתבנית בשם `{name}` " + +#: src/modules/rolemenus/cog.py:969 +msgctxt "cmd:rolemenu_edit|parse:template|success:custom" +msgid "Now using a custom menu message." +msgstr "עכשיו אשתמש בהודעה מותאמת אישית לתפריט." + +#: src/modules/rolemenus/cog.py:994 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|repost|success" +msgid "The role menu is now available at {message}" +msgstr "התפריט עכשיו משוייך ל {message}" + +#: src/modules/rolemenus/cog.py:1005 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|repost|error:forbidden" +msgid "" +"Cannot update channel! I lack the `EMBED_LINKS` or `SEND_MESSAGES` " +"permission in {channel}." +msgstr "" +"לא הצלחתי לעדכן את הערוץ! אין לי את ההרשאות `EMBED_LINKS` או `SEND_MESSAGES`" +" בערוץ {channel}." + +#: src/modules/rolemenus/cog.py:1010 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_edit|repost|error:unknown" +msgid "" +"An unknown error occurred trying to repost the menu to {channel}.\n" +"**Error:** `{exception}`" +msgstr "" +"שגיאה לא ידועה התרחשה כשניסיתי לשלוח מחדש את התפריט לערוץ {channel}.\n" +"השגיאה: `{exception}`" + +#: src/modules/rolemenus/cog.py:1044 +msgctxt "cmd:rolemenu_delete" +msgid "delmenu" +msgstr "מחקתפריט" + +#: src/modules/rolemenus/cog.py:1047 +msgctxt "cmd:rolemenu_delete|desc" +msgid "Delete a role menu." +msgstr "מחק את התפריט רולים." + +#: src/modules/rolemenus/cog.py:1051 +msgctxt "cmd:rolemenu_delete|param:name" +msgid "menu" +msgstr "תפריט" + +#: src/modules/rolemenus/cog.py:1056 +msgctxt "cmd:rolemenu_delete|param:name|desc" +msgid "Name of the rolemenu to delete." +msgstr "השם של התפריט שמיועד למחיקה" + +#: src/modules/rolemenus/cog.py:1071 +msgctxt "cmd:rolemenu_delete|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to manage the server role " +"menus." +msgstr "אתה צריך את ההרשאה `MANAGE_ROLES` כדי לערוך את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:1094 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delete|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "לשרת הזה אין תפריט בשם `{name}`!" + +#: src/modules/rolemenus/cog.py:1102 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delete|confirm|title" +msgid "" +"Are you sure you want to delete the role menu **{name}**? This is not " +"reversible!" +msgstr "אתם רוצים שאתם רוצים למחוק את התפריט **{name}**? לא תוכלו לחזור בכם." + +#: src/modules/rolemenus/cog.py:1107 +msgctxt "cmd:rolemenu_delete|confirm|button:yes" +msgid "Yes, Delete Now" +msgstr "כן, מחק עכשיו" + +#: src/modules/rolemenus/cog.py:1112 +msgctxt "cmd:rolemenu_delete|confirm|button:no" +msgid "No, Cancel" +msgstr "לא, בטל" + +#: src/modules/rolemenus/cog.py:1137 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delete|success|desc" +msgid "Successfully deleted the menu **{name}**" +msgstr "מחקתי את התפריט **{name}** בהצלחה " + +#: src/modules/rolemenus/cog.py:1145 +msgctxt "cmd:rolemenu_addrole" +msgid "addrole" +msgstr "הוסףרול" + +#: src/modules/rolemenus/cog.py:1148 +msgctxt "cmd:rolemenu_addrole|desc" +msgid "Add a new role to an existing role menu." +msgstr "מוסיף רול חדש לתפריט קיים." + +#: src/modules/rolemenus/cog.py:1153 +msgctxt "cmd:rolemenu_addrole|param:menu" +msgid "menu" +msgstr "תפריט" + +#: src/modules/rolemenus/cog.py:1156 +msgctxt "cmd:rolemenu_addrole|param:role" +msgid "role" +msgstr "רול" + +#: src/modules/rolemenus/cog.py:1167 +msgctxt "cmd:rolemenu_addrole|param:menu|desc" +msgid "Name of the menu to add a role to" +msgstr "השם של התפריט שאליו אוסיף את הרול" + +#: src/modules/rolemenus/cog.py:1171 +msgctxt "cmd:rolemenu_addrole|param:role|desc" +msgid "Role to add to the menu" +msgstr "רול שאותו אוסיף לתפריט" + +#: src/modules/rolemenus/cog.py:1179 +msgctxt "cmd:rolemenu_addrole|param:duration|desc" +msgid "Lifetime of the role after selection in minutes." +msgstr "משך התוקף בדקות לרול שיתקבל לאחר בחירה" + +#: src/modules/rolemenus/cog.py:1227 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_addrole|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "לשרת הזה אין תפריט בשם `{name}`!" + +#: src/modules/rolemenus/cog.py:1312 +msgctxt "cmd:rolemenu_addrole|success:create|title" +msgid "Added Menu Role" +msgstr "רול שהוסף לתפריט" + +#: src/modules/rolemenus/cog.py:1316 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_addrole|success:create|desc" +msgid "Add the role {role} to the menu **{menu}**." +msgstr "הוסף את הרול {role} לתפריט **{menu}**." + +#: src/modules/rolemenus/cog.py:1334 +msgctxt "cmd:rolemenu_addrole|success:edit|title" +msgid "Menu Role updated" +msgstr "תפריט רולים עודכן" + +#: src/modules/rolemenus/cog.py:1346 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_addrole|error:role_exists" +msgid "The role {role} is already selectable from the menu **{menu}**" +msgstr "הרול {role} כבר ניתן לבחירה מהתפריט **{menu}**" + +#: src/modules/rolemenus/cog.py:1364 +msgctxt "cmd:rolemenu_addrole|success|error:reaction|name" +msgid "Note" +msgstr "פתקית" + +#: src/modules/rolemenus/cog.py:1376 +msgctxt "cmd:rolemenu_addrole|success|button:editor|label" +msgid "Edit Menu" +msgstr "ערוך תפריט" + +#: src/modules/rolemenus/cog.py:1393 +msgctxt "cmd:rolemenu_editrole" +msgid "editrole" +msgstr "ערוךרול" + +#: src/modules/rolemenus/cog.py:1396 +msgctxt "cmd:rolemenu_editrole|desc" +msgid "Edit role options in an existing role menu." +msgstr "ערוך הגדרות רול בתפריט רולים קיים." + +#: src/modules/rolemenus/cog.py:1401 +msgctxt "cmd:rolemenu_editrole|param:menu" +msgid "menu" +msgstr "תפריט" + +#: src/modules/rolemenus/cog.py:1404 +msgctxt "cmd:rolemenu_editrole|param:menu_role" +msgid "menu_role" +msgstr "תפריט_רולים" + +#: src/modules/rolemenus/cog.py:1407 +msgctxt "cmd:rolemenu_editrole|param:role" +msgid "new_role" +msgstr "רול_חדש" + +#: src/modules/rolemenus/cog.py:1418 +msgctxt "cmd:rolemenu_editrole|param:menu|desc" +msgid "Name of the menu to edit the role for" +msgstr "השם של התפריט שאליו אערוך את הרול" + +#: src/modules/rolemenus/cog.py:1422 +msgctxt "cmd:rolemenu_editrole|param:menu_role|desc" +msgid "Label, name, or mention of the menu role to edit." +msgstr "תאג, שם, או תיוג של התפריט שתרצו לערוך" + +#: src/modules/rolemenus/cog.py:1426 +msgctxt "cmd:rolemenu_editrole|param:role|desc" +msgid "New server role this menu role should give." +msgstr "רול שרת חדש שהתפריט רולים הזה יתן" + +#: src/modules/rolemenus/cog.py:1434 +msgctxt "cmd:rolemenu_editrole|param:duration|desc" +msgid "Lifetime of the role after selection in minutes." +msgstr "משך התוקף בדקות לרול שיתקבל לאחר בחירה" + +#: src/modules/rolemenus/cog.py:1475 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_editrole|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "לשרת הזה אין תפריט בשם `{name}`!" + +#: src/modules/rolemenus/cog.py:1503 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_editrole|error:role_not_found" +msgid "The menu **{menu}** does not have the role **{name}**" +msgstr "לתפריט **{menu}** אין את הרול **{name}**" + +#: src/modules/rolemenus/cog.py:1569 +msgctxt "cmd:rolemenu_editrole|success|title" +msgid "Role menu role updated" +msgstr "תפריט רולים עודכן" + +#: src/modules/rolemenus/cog.py:1584 +msgctxt "cmd:rolemenu_editrole|success|error:reaction|name" +msgid "Warning!" +msgstr "זהירות!" + +#: src/modules/rolemenus/cog.py:1609 +msgctxt "cmd:rolemenu_delrole" +msgid "delrole" +msgstr "מחקרול" + +#: src/modules/rolemenus/cog.py:1612 +msgctxt "cmd:rolemenu_delrole|desc" +msgid "Remove a role from a role menu." +msgstr "הסר את הרול מהתפריט רולים." + +#: src/modules/rolemenus/cog.py:1616 +msgctxt "cmd:rolemenu_delrole|param:menu" +msgid "menu" +msgstr "תפריט" + +#: src/modules/rolemenus/cog.py:1617 +msgctxt "cmd:rolemenu_delrole|param:menu_role" +msgid "menu_role" +msgstr "תפריט_רולים" + +#: src/modules/rolemenus/cog.py:1622 +msgctxt "cmd:rolemenu_delrole|param:menu|desc" +msgid "Name of the menu to delete the role from." +msgstr "השם של התפריט שממנו אמחק את הרול" + +#: src/modules/rolemenus/cog.py:1626 +msgctxt "cmd:rolemenu_delrole|param:menu_role|desc" +msgid "Name, label, or mention of the role to delete." +msgstr "תאג, שם, או תיוג של הרול שתרצו למחוק" + +#: src/modules/rolemenus/cog.py:1644 +msgctxt "cmd:rolemenu_delrole|error:author_perms" +msgid "" +"You need the `MANAGE_ROLES` permission in order to manage the server role " +"menus." +msgstr "אתה צריך את ההרשאה `MANAGE_ROLES` כדי לערוך את התפריטים של השרת הזה." + +#: src/modules/rolemenus/cog.py:1668 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delrole|error:menu_not_found" +msgid "This server does not have a role menu called `{name}`!" +msgstr "לשרת הזה אין תפריט בשם `{name}`!" + +#: src/modules/rolemenus/cog.py:1696 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delrole|error:role_not_found" +msgid "The menu **{menu}** does not have the role **{name}**" +msgstr "לתפריט **{menu}** אין את הרול **{name}**" + +#: src/modules/rolemenus/cog.py:1713 +#, possible-python-brace-format +msgctxt "cmd:rolemenu_delrole|success" +msgid "The role **{name}** was successfully removed from the menu **{menu}**." +msgstr "הרול **{name}** נמחק בהצלחה מהתפריט **{menu}**." + +#: src/modules/rolemenus/roleoptions.py:54 +msgctxt "roleset:role" +msgid "role" +msgstr "רול" + +#: src/modules/rolemenus/roleoptions.py:57 +msgctxt "roleset:role|desc" +msgid "The role associated to this menu item." +msgstr "הרול משויך לאייטם הזה מהתפריט." + +#: src/modules/rolemenus/roleoptions.py:61 +msgctxt "roleset:role|long_desc" +msgid "The role given when this menu item is selected in the role menu." +msgstr "הרול ניתן למשתמש כאשר האייטם התפריט נבחר על ידי לחיצה." + +#: src/modules/rolemenus/roleoptions.py:74 +#, possible-python-brace-format +msgctxt "roleset:role|set_response:set" +msgid "This menu item will now give the role {role}." +msgstr "האייטם הזה עכשיו יתן את הרול {role}." + +#: src/modules/rolemenus/roleoptions.py:82 +msgctxt "roleset:label" +msgid "label" +msgstr "תגית" + +#: src/modules/rolemenus/roleoptions.py:85 +msgctxt "roleset:label|desc" +msgid "A short button label for this role." +msgstr "טקסט קצת עבור הכפתור של הרול הזה." + +#: src/modules/rolemenus/roleoptions.py:90 +msgctxt "roleset:label|long_desc" +msgid "" +"A short name for this role, to be displayed in button labels, dropdown " +"titles, and some menu layouts. By default uses the Discord role name." +msgstr "" +"שם קצר עבור הרול הזה, כדי להציג על הכפתור עצמו, תפריטים נופלים, ומקומות " +"שונים. הברירת מחדל זה איך שקראתם לרול. " + +#: src/modules/rolemenus/roleoptions.py:104 +#, possible-python-brace-format +msgctxt "roleset:role|set_response" +msgid "This menu role is now called `{value}`." +msgstr "השם של התפריט רולים הזה שונה ל`{value}`." + +#: src/modules/rolemenus/roleoptions.py:112 +msgctxt "roleset:emoji" +msgid "emoji" +msgstr "אמוג'י" + +#: src/modules/rolemenus/roleoptions.py:115 +msgctxt "roleset:emoji|desc" +msgid "The emoji associated with this role." +msgstr "האמוג'י שקשור לרול הזה" + +#: src/modules/rolemenus/roleoptions.py:119 +msgctxt "roleset:emoji|long_desc" +msgid "" +"The role emoji is used for the reaction (in reaction role menus), and " +"otherwise appears next to the role label in the button and dropdown styles. " +"The emoji is also displayed next to the role in most menu templates." +msgstr "" +"הרול אמוג'י משומש עבור הריאקציה (בריאקציות של התפריטי רולים), וניתן לצפייה " +"ליד התאגית של הכפתור ובתפריטים נופלים. האמוג'י גם נראה לי הרול עצמו רוב " +"הפעמים." + +#: src/modules/rolemenus/roleoptions.py:157 +#, possible-python-brace-format +msgctxt "roleset:emoji|error:test_emoji" +msgid "The selected emoji `{emoji}` is invalid or has been deleted." +msgstr "האמוג'י שנבחר `{emoji}` שגוי או נמחק." + +#: src/modules/rolemenus/roleoptions.py:168 +#, possible-python-brace-format +msgctxt "roleset:emoji|set_response:set" +msgid "The menu role emoji is now {emoji}." +msgstr "האמוג'י של הרול הוא עכשיו {emoji}." + +#: src/modules/rolemenus/roleoptions.py:173 +msgctxt "roleset:emoji|set_response:unset" +msgid "The menu role emoji has been removed." +msgstr "התפריט רול אמוג'י הוסר." + +#: src/modules/rolemenus/roleoptions.py:181 +msgctxt "roleset:description" +msgid "description" +msgstr "תיאור" + +#: src/modules/rolemenus/roleoptions.py:184 +msgctxt "roleset:description|desc" +msgid "A longer description of this role." +msgstr "תיאור ארוך יותר לרול הזה." + +#: src/modules/rolemenus/roleoptions.py:189 +msgctxt "roleset:description|long_desc" +msgid "" +"The description is displayed under the role label in dropdown style menus. " +"It may also be used as a substitution key in custom role selection " +"responses." +msgstr "" +"התיאור נמצא מתחת לתאגית רול בתפריטים נופלים. ניתן להשתמש בזה גם כמפתח חלופי " +"בריאקציות מותאמות אישית." + +#: src/modules/rolemenus/roleoptions.py:205 +msgctxt "roleset:description|set_response:set" +msgid "The role description has been set." +msgstr "התיאור רול נקבע." + +#: src/modules/rolemenus/roleoptions.py:210 +msgctxt "roleset:description|set_response:unset" +msgid "The role description has been removed." +msgstr "התיאור של הרול הוסר." + +#: src/modules/rolemenus/roleoptions.py:218 +msgctxt "roleset:price" +msgid "price" +msgstr "מחיר" + +#: src/modules/rolemenus/roleoptions.py:221 +msgctxt "roleset:price|desc" +msgid "Price of the role, in LionCoins." +msgstr "המחיר של הרול במטבעות." + +#: src/modules/rolemenus/roleoptions.py:225 +msgctxt "roleset:price|long_desc" +msgid "How much the role costs when selected, in LionCoins." +msgstr "כמה הרול עולה כשלוחצים עליו במטבעות." + +#: src/modules/rolemenus/roleoptions.py:229 +msgctxt "roleset:price|accepts" +msgid "Amount of coins that the role costs." +msgstr "כמות מטבעות שהרול עולה." + +#: src/modules/rolemenus/roleoptions.py:242 +#, possible-python-brace-format +msgctxt "roleset:price|set_response:set" +msgid "This role will now cost {price} to equip." +msgstr "הרול יעלה למשתמש {price}." + +#: src/modules/rolemenus/roleoptions.py:247 +msgctxt "roleset:price|set_response:unset" +msgid "This role will now be free to equip from this role menu." +msgstr "הרול עכשיו יהיה חינמי כדי לרכוש מהתפריט רולים." + +#: src/modules/rolemenus/roleoptions.py:255 +msgctxt "roleset:duration" +msgid "duration" +msgstr "משך זמן" + +#: src/modules/rolemenus/roleoptions.py:258 +msgctxt "roleset:duration|desc" +msgid "Lifetime of the role after selection" +msgstr "אורך חיים של הרול לאחר הרכישה" + +#: src/modules/rolemenus/roleoptions.py:262 +msgctxt "roleset:duration|long_desc" +msgid "" +"Allows creation of 'temporary roles' which expire a given time after being " +"equipped. Refunds will not be given upon expiry." +msgstr "" +"מאפשר את היצירה של \"רולים זמניים\" שפגים אחרי תקופת זמן ספציפים לאחר " +"הרכישה. המטבעות לא יחזרו למשתמש אחרי שהרול תקף." + +#: src/modules/rolemenus/roleoptions.py:267 +msgctxt "roleset:duration|notset" +msgid "Forever." +msgstr "לנצח." + +#: src/modules/rolemenus/roleoptions.py:280 +#, possible-python-brace-format +msgctxt "roleset:duration|set_response:set" +msgid "This role will now expire after {duration}." +msgstr "הרול הזה יפוג לאחר {duration}." + +#: src/modules/rolemenus/roleoptions.py:285 +msgctxt "roleset:duration|set_response:unset" +msgid "This role will no longer expire after being selected." +msgstr "הרול הזה כבר לא יפוג לאחר הרכישה." + +#: src/modules/rolemenus/templates.py:53 +msgctxt "template:simple|name" +msgid "Simple Menu" +msgstr "תפריט פשוט" + +#: src/modules/rolemenus/templates.py:57 +msgctxt "template:simple|desc" +msgid "A simple embedded list of roles in the menu" +msgstr "תפריט פשוט embeded עם הרולים " + +#: src/modules/rolemenus/templates.py:96 +msgctxt "template:two_column|name" +msgid "Two Column" +msgstr "שתי עמודות" + +#: src/modules/rolemenus/templates.py:100 +msgctxt "template:two_column|desc" +msgid "A compact two column role layout. Excludes prices and durations." +msgstr "תפריט פשוט עם שתי עמודות, לא מכיל את המחירים ואת האורך" + +#: src/modules/rolemenus/templates.py:131 +msgctxt "template:three_column|name" +msgid "Three Column" +msgstr "שלוש עמודות" + +#: src/modules/rolemenus/templates.py:135 +msgctxt "template:three_column|desc" +msgid "" +"A compact three column layout using emojis and labels, excluding prices and " +"durations." +msgstr "" +"שלוש עמודות יפות שישתמשו באמוג'י וטקסטים, שכוללים גם את המחירים והתוקף." + +#: src/modules/rolemenus/templates.py:168 +msgctxt "template:shop|name" +msgid "Role Shop" +msgstr "חנות רולים" + +#: src/modules/rolemenus/templates.py:172 +msgctxt "template:shop|desc" +msgid "A single column display suitable for simple role shops" +msgstr "עמדה בודדת - מתאימה לחנות פשוטה עם מספר רולים בודדים." + +#: src/modules/rolemenus/rolemenu.py:280 +msgctxt "rolemenu|menu_message|error|title" +msgid "ROLE MENU DISPLAY ERROR" +msgstr "שגיאת בהצגת תפריט רולים" + +#: src/modules/rolemenus/rolemenu.py:284 +#, possible-python-brace-format +msgctxt "rolemenu|menu_message|error|desc" +msgid "" +"A critical error occurred trying to display this role menu.\n" +"Error: `{error}`." +msgstr "" +"שגיאה קריטית התחוללה כשניסיתי להציג את התפריט הזה.\n" +"שגיאה: `{error}`." + +#: src/modules/rolemenus/rolemenu.py:336 +#, possible-python-brace-format +msgctxt "rolemenu|update_reactions|error" +msgid "" +"Could not add the {emoji} reaction, perhaps I do not have access to this " +"emoji! Reactions will need to be added manually." +msgstr "" +"לא הצלחתי להוסיף את הריאקצית אמוג'י {emoji}, יכול להיות שאין לי גישה לאמוג'י הזה!\n" +"ריאקציות יצתטרכו להיווסף על ידכם ידנית. " + +#: src/modules/rolemenus/rolemenu.py:381 +msgctxt "ui:rolemenu_dropdown|placeholder" +msgid "Select Roles" +msgstr "בחר רולים" + +#: src/modules/rolemenus/rolemenu.py:472 +msgctxt "rolemenu|error:role_gone" +msgid "This role no longer exists!" +msgstr "הרול הזה כבר לא קיים." + +#: src/modules/rolemenus/rolemenu.py:482 +#, possible-python-brace-format +msgctxt "rolemenu|deselect|error:sticky" +msgid "**{role}** is a sticky role, you cannot remove it with this menu!" +msgstr "" +"**{role}** הוא רול דביק, זה אומר שאתם לא יכולים להסיר אותו עם התפריט הזה." + +#: src/modules/rolemenus/rolemenu.py:493 +msgctxt "rolemenu|deselect|error:perms" +msgid "I don't have enough permissions to remove this role from you!" +msgstr "אין לי מספיק הרשאות כדי להסיר את הרול הזה!" + +#: src/modules/rolemenus/rolemenu.py:500 +msgctxt "rolemenu|deselect|error:discord" +msgid "An unknown error occurred removing your role! Please try again later." +msgstr "" +"שגיאה לא ידועה התחוללה כשניסיתי להסיר את הרול ממך.\n" +"אנא נסה שוב במספר דקות." + +#: src/modules/rolemenus/rolemenu.py:529 +msgctxt "rolemenu|deslect|success|title" +msgid "Role removed" +msgstr "הרול הוסר" + +#: src/modules/rolemenus/rolemenu.py:535 +#, possible-python-brace-format +msgctxt "rolemenu|deselect|success:refund|desc" +msgid "You have removed **{role}**, and been refunded {coin} **{amount}**." +msgstr "הסרתם את הרול **{role}**, וקיבלתם את הכסף חזרה {coin} **{amount}**." + +#: src/modules/rolemenus/rolemenu.py:540 +#, possible-python-brace-format +msgctxt "rolemenu|deselect|success:norefund|desc" +msgid "You have unequipped **{role}**." +msgstr "הורדתם מעצמכם את הרול **{role}**." + +#: src/modules/rolemenus/rolemenu.py:554 +#, possible-python-brace-format +msgctxt "rolemenu|select|error:required_role" +msgid "You need to have the **{role}** role to use this!" +msgstr "אתם צריכים את הרול **{role}** כדי להשתמש בזה!" + +#: src/modules/rolemenus/rolemenu.py:568 +#, possible-python-brace-format +msgctxt "rolemenu|select|error:max_obtainable" +msgid "You already have the maximum of {obtainable} roles from this menu!" +msgstr "" +"כבר יש לכם את המספר המקסימלי ({obtainable}) שאתם יכולים לבחור מהתפריט הזה!" + +#: src/modules/rolemenus/rolemenu.py:582 +#, possible-python-brace-format +msgctxt "rolemenu|select|error:insufficient_funds" +msgid "" +"The role **{role}** costs {coin}**{cost}**,but you only have " +"{coin}**{balance}**!" +msgstr "" +"הרול **{role}** עולה {coin}**{cost}**, אבל יש לכם רק {coin}**{balance}**!" + +#: src/modules/rolemenus/rolemenu.py:598 +msgctxt "rolemenu|select|error:perms" +msgid "I don't have enough permissions to give you this role!" +msgstr "אין לי מספיק הרשאות בכדי לתת לך את הרול הזה!" + +#: src/modules/rolemenus/rolemenu.py:605 +msgctxt "rolemenu|select|error:discord" +msgid "" +"An unknown error occurred while assigning your role! Please try again later." +msgstr "" +"שגיאה לא ידועה התחוללה כשניסיתי לתת לך את הרול.\n" +"אנא נסה שוב במספר דקות." + +#: src/modules/rolemenus/rolemenu.py:647 +msgctxt "rolemenu|select|success|title" +msgid "Role equipped" +msgstr "הרול נלבש." + +#: src/modules/rolemenus/rolemenu.py:653 +#, possible-python-brace-format +msgctxt "rolemenu|select|success:purchase|desc" +msgid "You have purchased the role **{role}** for {coin}**{amount}**" +msgstr "רכשת את הרול **{role}** עבור {coin}**{amount}**" + +#: src/modules/rolemenus/rolemenu.py:658 +#, possible-python-brace-format +msgctxt "rolemenu|select|success:nopurchase|desc" +msgid "You have equipped the role **{role}**" +msgstr "לבשת על עצמך את הרול **{role}**" + +#: src/modules/rolemenus/rolemenu.py:664 +#, possible-python-brace-format +msgctxt "rolemenu|select|expires_at" +msgid "The role will expire at {timestamp}." +msgstr "הרול יפוג ב{timestamp}." + +#: src/modules/rolemenus/rolemenu.py:717 +#, possible-python-brace-format +msgctxt "rolemenu|content:reactions" +msgid "[Click here]({jump_link}) to jump back." +msgstr "[לחצו פה]({jump_link}) כדי לקפוץ אחורה" + +#: src/modules/rolemenus/menuoptions.py:56 +msgctxt "menuset:name" +msgid "name" +msgstr "שם" + +#: src/modules/rolemenus/menuoptions.py:59 +msgctxt "menuset:name|desc" +msgid "Brief name for this role menu." +msgstr "שם קצר עבור התפריט רולים הזה" + +#: src/modules/rolemenus/menuoptions.py:64 +msgctxt "menuset:name|long_desc" +msgid "" +"The role menu name is displayed when selecting the menu in commands, and as " +"the title of most default menu layouts." +msgstr "" +"התפריט רולים הזה יוצג כאשר מזמנים אותו עם פקודה, עם השם הקצר של רוב התפריטי " +"ברירת מחדל. " + +#: src/modules/rolemenus/menuoptions.py:78 +#, possible-python-brace-format +msgctxt "menuset:name|set_response" +msgid "This role menu will now be called **{new_name}**." +msgstr "התפריט רולים הזה יקרא **{new_name}**." + +#: src/modules/rolemenus/menuoptions.py:86 +msgctxt "menuset:sticky" +msgid "sticky_roles" +msgstr "רולים_דביקים" + +#: src/modules/rolemenus/menuoptions.py:89 +msgctxt "menuset:sticky|desc" +msgid "Whether the menu can be used to unequip roles." +msgstr "האם התפריט יוכל לשמש גם כדי להסיר רולים ולא רק ללבוש אותם." + +#: src/modules/rolemenus/menuoptions.py:94 +msgctxt "menuset:sticky|long_desc" +msgid "" +"When enabled, members will not be able to remove equipped roles by selecting" +" them in this menu. Note that when disabled, members will be able to unequip" +" the menu roles even if they were not obtained from the menu." +msgstr "" +"כשאופציה הזו מופעלת, משתמשים לא יוכלו להסיר את הרול הלבוש על ידי בחירה חוזרת" +" מהתפריט. שימו לב שאם האופציה לא פעילה, משתמשים יוכלו להסיר רולים אפילו אם " +"הם לא השיגו אותם מהתפריט." + +#: src/modules/rolemenus/menuoptions.py:110 +msgctxt "menuset:sticky|set_response:true" +msgid "Members will no longer be able to remove roles with this menu." +msgstr "משתמשים לא יוכלו להוריד מעצמם רולים באמצעות התפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:115 +msgctxt "menuset:sticky|set_response:false" +msgid "Members will now be able to remove roles with this menu." +msgstr "משתמשים כן יוכלו להוריד מעצמם רולים באמצעות התפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:123 +msgctxt "menuset:refunds" +msgid "refunds" +msgstr "החזרים" + +#: src/modules/rolemenus/menuoptions.py:126 +msgctxt "menuset:refunds|desc" +msgid "Whether removing a role will refund the purchase price for that role." +msgstr "האם הסרת הרול דרך התפריט יתן החזר כספי מלא למשתמש." + +#: src/modules/rolemenus/menuoptions.py:131 +msgctxt "menuset:refunds|long_desc" +msgid "" +"When enabled, members who *purchased a role through this role menu* will obtain a full refund when they remove the role through the menu.\n" +"**Refunds will only be given for roles purchased through the same menu.**\n" +"**The `sticky` option must be disabled to allow members to remove roles.**" +msgstr "" +"כאשר מופעיל, משתמשים *שקנו את הרול הזה דרך התפריט הספציפי* יקבלו החזר מלא כשהם יסירו את הרול דרך התפריט.\n" +"שימו לב שהחזר כספי ינתן רק דרך התפריט.\n" +"האופציה הדביקה חייבת להיות כבויה אחרת לא יהיה ניתן לתת החזרים." + +#: src/modules/rolemenus/menuoptions.py:148 +msgctxt "menuset:refunds|set_response:true" +msgid "Members will now be refunded when removing a role with this menu." +msgstr "משתמשים יקבלו החזר כספי כאשר הם יסירו רולים באמצעות התפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:153 +msgctxt "menuset:refunds|set_response:false" +msgid "" +"Members will no longer be refunded when removing a role with this menu." +msgstr "" +"משתמשים כבר לא יקבלו החזר כספי כאשר הם יסירו רולים באמצעות התפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:161 +msgctxt "menuset:obtainable" +msgid "obtainable" +msgstr "ניתנים להשגה" + +#: src/modules/rolemenus/menuoptions.py:164 +msgctxt "menuset:obtainable|desc" +msgid "The maximum number of roles equippable from this menu." +msgstr "המספר המקסימלי של רולים שניתן ללבוש מהתפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:169 +msgctxt "menuset:obtainable|long_desc" +msgid "" +"Members will not be able to obtain more than this number of roles from this " +"menu. This counts roles that were not obtained through the rolemenu system." +msgstr "" +"משתמשים לא יוכלו להשיג יותר מהמספר רולים הזה באופן כללי. סופר את כל הרולים " +"שהמשתמש עונד, לא רק רולים שנלבשו דרך מערכת התפריטי רולים. " + +#: src/modules/rolemenus/menuoptions.py:174 +msgctxt "menuset:obtainable|notset" +msgid "Unlimited." +msgstr "ללא הגבלה." + +#: src/modules/rolemenus/menuoptions.py:188 +#, possible-python-brace-format +msgctxt "menuset:obtainable|set_response:set" +msgid "" +"Members will be able to select a maximum of **{value}** roles from this " +"menu." +msgstr "משתמשים יוכלו להשיג מספר מקסימלי של **{value}** רולים מהתפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:193 +msgctxt "menuset:obtainable|set_response:unset" +msgid "Members will be able to select any number of roles from this menu." +msgstr "משתמשים יוכלו לבחור כל כמות של רולים מהתפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:201 +msgctxt "menuset:required_role" +msgid "required_role" +msgstr "רול_נחוץ" + +#: src/modules/rolemenus/menuoptions.py:204 +msgctxt "menuset:required_role|desc" +msgid "Initial role required to use this menu." +msgstr "רול ראשוני שנחוץ על מנת להשתמש בתפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:209 +msgctxt "menuset:required_role|long_desc" +msgid "" +"If set, only members who have the `required_role` will be able to obtain or " +"remove roles using this menu." +msgstr "" +"אם נקבע, רק משתמשים שיש להם את `required_role` יוכלו להשתמש בתפריט רולים " +"הזה." + +#: src/modules/rolemenus/menuoptions.py:223 +#, possible-python-brace-format +msgctxt "menuset:required_role|set_response:set" +msgid "Members will need to have the {role} role to use this menu." +msgstr "משתמשים יצטרכו להיות הבעלים של {role} על מנת להשתמש בתפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:228 +msgctxt "menuset:required_role|set_response:unset" +msgid "Any member who can see the menu may use it." +msgstr "כל משתמש שיכול לראות את התפריט הזה יכול להשתמש בו." + +#: src/modules/rolemenus/menuoptions.py:236 +msgctxt "menuset:message" +msgid "custom_message" +msgstr "הודעה_מותאמת_אישית" + +#: src/modules/rolemenus/menuoptions.py:239 +msgctxt "menuset:message|desc" +msgid "Custom message data used to display the menu." +msgstr "הודעה שמשומשת כדי להציג את התפריט הזה." + +#: src/modules/rolemenus/menuoptions.py:243 +msgctxt "menuset:message|long_desc" +msgid "" +"This setting determines the body of the menu message, including the message " +"content and the message embed(s). While most easily modifiable through the " +"`Edit Message` button, raw JSON-formatted message data may also be uploaded " +"via command." +msgstr "" +"ההגדרה הזו אחראית על הגוף של ההודעה בתפריט, כולל תוכן ההודעה וגם הembed. רוב" +" הדברים יכולים לעבור עריכה דרך הבוט, אבל ניתן גם להעלות קובץ JSON." + +#: src/modules/rolemenus/menuoptions.py:260 +msgctxt "menuset:message|set_response:set" +msgid "The role menu message has been set. Edit through the menu editor." +msgstr "ההודעה של תפריט הרולים נקבעה. ניתן לערוך אותה דרך עורך התפריטים." + +#: src/modules/rolemenus/menuoptions.py:265 +msgctxt "menuset:message|set_response:unset" +msgid "" +"The role menu message has been unset. Select a template through the menu " +"editor." +msgstr "ההודעה של תפריט הרולים הוסרה. ניתן לערוך אותה דרך עורך התפריטים." + +#: src/modules/rolemenus/ui/menus.py:105 +msgctxt "ui:menu_list|menu:editmenu|placeholder" +msgid "Select Menu to Edit" +msgstr "בחר תפריט לעריכה" + +#: src/modules/rolemenus/ui/menus.py:129 +#, possible-python-brace-format +msgctxt "ui:menu_list|menu_line:attached" +msgid "[`{name}`]({jump_url}) with `{count}` roles." +msgstr "[`{name}`]({jump_url}) עם `{count}` רולים." + +#: src/modules/rolemenus/ui/menus.py:138 +#, possible-python-brace-format +msgctxt "ui:menu_list|menu_line:unattached" +msgid "`{name}` with `{count}` roles." +msgstr "`{name}` עם `{count}` רולים." + +#: src/modules/rolemenus/ui/menus.py:163 +#, possible-python-brace-format +msgctxt "ui:menu_list|embed|title" +msgid "Role Menus in {guild}" +msgstr "תפריטי רולים בשרת {guild}" + +#: src/modules/rolemenus/ui/menus.py:172 +msgctxt "ui:menu_list|embed|field:tips|name" +msgid "Tips" +msgstr "טיפים" + +#: src/modules/rolemenus/ui/menus.py:176 +msgctxt "ui:menu_list|embed|field:tips|value" +msgid "" +"Right click an existing message or use the `newmenu` command to create a new" +" menu." +msgstr "" +"לחץ בלחיצה ימנית על הודעה קיימת או השתמש בפקודה `newmenu` כדי ליצור תפריט " +"חדש." + +#: src/modules/rolemenus/ui/menus.py:189 +msgctxt "ui:menu_list|embed|field:unattached|name" +msgid "Unattached Menus" +msgstr "תפריטים שלא קשורים להודעות" + +#: src/modules/rolemenus/ui/menus.py:201 +msgctxt "ui:menu_list|embed|footer:text" +msgid "Click a menu name to jump to the message." +msgstr "לחץ על השם של התפריט כדי לקפוץ אל ההודעה הקשורה אליו." + +#: src/modules/rolemenus/ui/menueditor.py:93 +msgctxt "ui:menu_editor|preview|error:title" +msgid "Display Error!" +msgstr "שגיאה בהצגה!" + +#: src/modules/rolemenus/ui/menueditor.py:97 +#, possible-python-brace-format +msgctxt "ui:menu_editor|preview|error:desc" +msgid "" +"Failed to display preview!\n" +"**Error:** `{exception}`" +msgstr "" +"נכשלתי להראות את התצוגה המקדימה!\n" +"שגיאה: `{exception}`" + +#: src/modules/rolemenus/ui/menueditor.py:151 +msgctxt "ui:menu_editor|button:options|label" +msgid "Menu Options" +msgstr "אפשריות תפריט" + +#: src/modules/rolemenus/ui/menueditor.py:179 +msgctxt "ui:menu_editor|button:bulk_edit|modal|title" +msgid "Menu Options" +msgstr "אפשריות תפריט" + +#: src/modules/rolemenus/ui/menueditor.py:215 +msgctxt "ui:menu_editor|button:bulk_edit|label" +msgid "Bulk Edit" +msgstr "עריכה בכמות גדולה" + +#: src/modules/rolemenus/ui/menueditor.py:235 +msgctxt "ui:menu_editor|button:sticky|label" +msgid "Toggle Sticky" +msgstr "הפעל מצב דביק" + +#: src/modules/rolemenus/ui/menueditor.py:259 +msgctxt "ui:menu_editor|button:refunds|label" +msgid "Toggle Refunds" +msgstr "אפשר החזרים" + +#: src/modules/rolemenus/ui/menueditor.py:289 +msgctxt "ui:menu_editor|menu:reqroles|placeholder" +msgid "Select Required Role" +msgstr "בחר רול נחוץ" + +#: src/modules/rolemenus/ui/menueditor.py:308 +msgctxt "ui:menu_editor|button:modify_roles|label" +msgid "Modify Roles" +msgstr "ערוך רולים" + +#: src/modules/rolemenus/ui/menueditor.py:337 +msgctxt "ui:menu_editor|role_editor|modal|title" +msgid "Edit Menu Role" +msgstr "ערוך תפריט רולים" + +#: src/modules/rolemenus/ui/menueditor.py:411 +msgctxt "ui:menu_editor|menu:add_roles|error:too_many_reactions" +msgid "Too many roles! Reaction role menus cannot exceed `20` roles." +msgstr "יותר מידי רולים! לא ניתן לעבור יותר מ20 רולים בתפריט." + +#: src/modules/rolemenus/ui/menueditor.py:416 +msgctxt "ui:menu_editor|menu:add_roles|error:too_many_roles" +msgid "Too many roles! Role menus cannot have more than `25` roles." +msgstr "יותר מידי רולים! לא ניתן לעבור יותר מ25 רולים בתפריט." + +#: src/modules/rolemenus/ui/menueditor.py:455 +msgctxt "ui:menu_editor|menu:add_roles|placeholder" +msgid "Add Roles" +msgstr "הוסף רולים" + +#: src/modules/rolemenus/ui/menueditor.py:481 +msgctxt "ui:menu_editor|menu:edit_roles|placeholder" +msgid "Edit Roles" +msgstr "ערוך רולים" + +#: src/modules/rolemenus/ui/menueditor.py:514 +msgctxt "ui:menu_editor|menu:del_role|placeholder" +msgid "Remove Roles" +msgstr "הסר רולים" + +#: src/modules/rolemenus/ui/menueditor.py:538 +msgctxt "ui:menu_editor|button:style|error:non-managed" +msgid "" +"Cannot change the style of a menu attached to a message I did not send! " +"Please repost first." +msgstr "" +"לא ניתן לשנות את הסטייל של התפריט המוצמד להודעה שלא אני שלחתי! שלח אותה שוב " +"דרכי." + +#: src/modules/rolemenus/ui/menueditor.py:551 +msgctxt "ui:menu_editor|button:style|label" +msgid "Menu Style" +msgstr "סגנון תפריט" + +#: src/modules/rolemenus/ui/menueditor.py:576 +msgctxt "ui:menu_editor|menu:style|error:too_many_reactions" +msgid "" +"Too many roles! The Reaction style is limited to `20` roles (Discord " +"limitation)." +msgstr "יותר מידי רולים! הסגנון הזה מוגבל אל 20 רולים (מגבלה שדיסקורד שמו)" + +#: src/modules/rolemenus/ui/menueditor.py:586 +msgctxt "ui:menu_editor|menu:style|error:incomplete_emojis" +msgid "" +"Cannot switch to the Reaction Role Style! Every role needs to have a " +"distinct emoji first." +msgstr "לא ניתן להחליף אל הסגנון הזה! כל רול צריך להכיל אמוג'י ייחודי קודם." + +#: src/modules/rolemenus/ui/menueditor.py:602 +msgctxt "ui:menu_editor|menu:style|placeholder" +msgid "Select Menu Style" +msgstr "בחר סגנון תפריט" + +#: src/modules/rolemenus/ui/menueditor.py:606 +msgctxt "ui:menu_editor|menu:style|option:reaction|label" +msgid "Reaction Roles" +msgstr "רולים שמקבלים עם ריאקציות" + +#: src/modules/rolemenus/ui/menueditor.py:609 +msgctxt "ui:menu_editor|menu:style|option:reaction|desc" +msgid "Roles are represented compactly as clickable reactions on a message." +msgstr "" +"רולים שמוצגים בצורה קומפקטית עם ריאקציות שניתן ללחוץ עליהם בהודעה עצמה." + +#: src/modules/rolemenus/ui/menueditor.py:615 +msgctxt "ui:menu_editor|menu:style|option:button|label" +msgid "Button Menu" +msgstr "תפריט עם כפתורים" + +#: src/modules/rolemenus/ui/menueditor.py:618 +msgctxt "ui:menu_editor|menu:style|option:button|desc" +msgid "" +"Roles are represented in 5 rows of 5 buttons, each with an emoji and label." +msgstr "" +"רולים שמוצגים בתור 5 שורות של 5 כפתורים, לכל אחד יש אמוג'י ותגית טקסט." + +#: src/modules/rolemenus/ui/menueditor.py:624 +msgctxt "ui:menu_editor|menu:style|option:dropdown|label" +msgid "Dropdown Menu" +msgstr "תפריט נפתח" + +#: src/modules/rolemenus/ui/menueditor.py:627 +msgctxt "ui:menu_editor|menu:style|option:dropdown|desc" +msgid "Roles are selectable from a dropdown menu below the message." +msgstr "רולים ניתנים לבחירה על ידי תפריט נופל מתחת להודעה." + +#: src/modules/rolemenus/ui/menueditor.py:697 +msgctxt "ui:menu_editor|menu:template|placeholder" +msgid "Select Message Template" +msgstr "בחר תבנית הודעה" + +#: src/modules/rolemenus/ui/menueditor.py:707 +msgctxt "ui:menu_editor|menu:template|option:custom|label" +msgid "Custom Message" +msgstr "הודעה בעריכה אישית" + +#: src/modules/rolemenus/ui/menueditor.py:712 +msgctxt "ui:menu_editor|menu:template|option:custom|description" +msgid "Entirely custom menu message (opens an interactive editor)." +msgstr "בנה הודעה מותאמת אישית מ0 (יפתח את ההעורך הודעות שלנו)" + +#: src/modules/rolemenus/ui/menueditor.py:729 +msgctxt "ui:menu_editor|button:delete|confirm|title" +msgid "Are you sure you want to delete this menu? This is not reversible!" +msgstr "אתם בטוחים שאתם רוצים למחוק את התפריט? לא ניתן לשחזר את הצעד הזה." + +#: src/modules/rolemenus/ui/menueditor.py:734 +msgctxt "ui:menu_editor|button:delete|confirm|button:yes" +msgid "Yes, Delete Now" +msgstr "כן, מחק עכשיו" + +#: src/modules/rolemenus/ui/menueditor.py:739 +msgctxt "ui:menu_editor|button:delete|confirm|button:no" +msgid "No, Go Back" +msgstr "לא, חזור אחורה" + +#: src/modules/rolemenus/ui/menueditor.py:756 +msgctxt "ui:menu_editor|button:delete|label" +msgid "Delete Menu" +msgstr "מחק תפריט" + +#: src/modules/rolemenus/ui/menueditor.py:813 +msgctxt "ui:menu_editor|button:edit_msg|label" +msgid "Edit Message" +msgstr "ערוך הודעה" + +#: src/modules/rolemenus/ui/menueditor.py:844 +msgctxt "ui:menu_editor|button:preview|label" +msgid "Preview" +msgstr "תצוגה מקדימה" + +#: src/modules/rolemenus/ui/menueditor.py:860 +msgctxt "ui:menu_editor|button:repost|widget:repost|menu:channel|placeholder" +msgid "Select New Channel" +msgstr "בחר ערוץ חדש" + +#: src/modules/rolemenus/ui/menueditor.py:878 +msgctxt "ui:menu_editor|button:repost|widget:repost|error:perms|title" +msgid "Insufficient Permissions!" +msgstr "אין לי או לך מספיק הראשות בשרת כדי לעשות את זה!" + +#: src/modules/rolemenus/ui/menueditor.py:882 +msgctxt "ui:menu_editor|button:repost|eidget:repost|error:perms|desc" +msgid "" +"I lack the `EMBED_LINKS` or `SEND_MESSAGES` permission in this channel." +msgstr "אין לי את ההרשאות `EMBED_LINKS` או `SEND_MESSAGES` בערוץ הזה." + +#: src/modules/rolemenus/ui/menueditor.py:895 +#, possible-python-brace-format +msgctxt "ui:menu_editor|button:repost|widget:repost|error:post_failed" +msgid "" +"An error ocurred while posting to {channel}. Do I have sufficient " +"permissions?" +msgstr "" +"שגיאה התרחשה כשניסיתי לשלוח הודעה לערוץ {channel}. אתם בטוחים שיש לי הרשאות" +" מספקות?" + +#: src/modules/rolemenus/ui/menueditor.py:907 +msgctxt "ui:menu_editor|button:repost|widget:repost|success|title" +msgid "Role Menu Moved" +msgstr "תפריט רולים הוזז" + +#: src/modules/rolemenus/ui/menueditor.py:913 +#, possible-python-brace-format +msgctxt "ui:menu_editor|button:repost|widget:repost|success|desc:general" +msgid "The role menu `{name}` is now available at {message_link}." +msgstr "התפריט רולים `{name}` עכשיו זמין בלינק {message_link}." + +#: src/modules/rolemenus/ui/menueditor.py:927 +msgctxt "ui:menu_editor|button:repost|widget:repost|success|desc:reactions" +msgid "Please check the message reactions are correct." +msgstr "אנא בדקו אם הריאקציות שקשורות להודעה הזו נכונות." + +#: src/modules/rolemenus/ui/menueditor.py:940 +msgctxt "ui:menu_editor|button:repost|widget:repost|title" +msgid "Repost Role Menu" +msgstr "פרסם תפריט רולים מחדש" + +#: src/modules/rolemenus/ui/menueditor.py:944 +msgctxt "ui:menu_editor|button:repost|widget:repost|description" +msgid "Please select the channel to which you want to resend this menu." +msgstr "אנא בחרו את הערוץ שבו תרצו לשלוח את התפריט הזה מחדש." + +#: src/modules/rolemenus/ui/menueditor.py:959 +msgctxt "ui:menu_editor|button:repost|label:repost" +msgid "Repost" +msgstr "פרסם מחדש" + +#: src/modules/rolemenus/ui/menueditor.py:964 +msgctxt "ui:menu_editor|button:repost|label:post" +msgid "Post" +msgstr "פרסם" + +#: src/modules/rolemenus/ui/menueditor.py:974 +msgctxt "ui:menu_editor|embed|title" +msgid "Role Menu Editor" +msgstr "עורך תפריט רולים" + +#: src/modules/rolemenus/ui/menueditor.py:983 +#, possible-python-brace-format +msgctxt "ui:menu_editor|embed|description|jump_text:attached" +msgid "Members may use this menu from {jump_url}" +msgstr "משתמשים יוכלו להשתמש בתפריט הזה ב {jump_url}" + +#: src/modules/rolemenus/ui/menueditor.py:988 +msgctxt "ui:menu_editor|embed|description|jump_text:unattached" +msgid "" +"This menu is not currently active!\n" +"Make it available by clicking `Post` below." +msgstr "" +"התפריט לא פעיל כרגע!\n" +"תהפוך אותו לפעיל על ידי לחיצה על \"פרסם\" למטה." + +#: src/modules/rolemenus/ui/menueditor.py:1002 +msgctxt "ui:menu_editor|embed|field:tips|name" +msgid "Command Tips" +msgstr "טיפים לפקודות" + +#: src/modules/rolemenus/ui/menueditor.py:1006 +#, possible-python-brace-format +msgctxt "ui:menu_editor|embed|field:tips|value" +msgid "" +"Use the following commands for faster menu setup.\n" +"{menuedit} to edit the above menu options.\n" +"{addrole} to add new roles (recommended for roles with emojis).\n" +"{editrole} to edit role options." +msgstr "" +"השתמש בפקודות הבאות להתקנה זריזה יותר\n" +"{menuedit} כדי לערוך את האופציות למעלה\n" +"{addrole} כדי להוסיף רולים חדשים (מומלץ עבור רולים שיש להם אמוג'י)\n" +"{editrole} כדי לערוך את האופציות של הרולים" + +#: src/modules/rolemenus/ui/menueditor.py:1046 +msgctxt "ui:menu_editor|error:invald_emoji|title" +msgid "Invalid emoji encountered." +msgstr "נתקלתי באמוג'י לא תקין." + +#: src/modules/rolemenus/ui/menueditor.py:1050 +#, possible-python-brace-format +msgctxt "ui:menu_editor|error:invalid_emoji|desc" +msgid "" +"The emoji `{emoji}` for menu role `{label}` no longer exists, unsetting." +msgstr "" +"האמוג'י `{emoji}` עבור התפריט רולים `{label}` כבר לא קיים, אוריד לו את " +"ההגדרות שהגדרתי קודם." diff --git a/locales/he_IL/LC_MESSAGES/rooms.po b/locales/he_IL/LC_MESSAGES/rooms.po new file mode 100644 index 00000000..1ce37960 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/rooms.po @@ -0,0 +1,791 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/rooms/settingui.py:38 +msgctxt "ui:room_config|menu:category|placeholder" +msgid "Select Private Room Category" +msgstr "בחר קטגוריית חדרים פרטיים" + +#: src/modules/rooms/settingui.py:52 +msgctxt "ui:room_config|button:visible|label" +msgid "Toggle Room Visibility" +msgstr "שנה פרטיות חדרים" + +#: src/modules/rooms/settingui.py:62 +msgctxt "ui:rooms_config|embed|title" +msgid "Private Room System Configuration Panel" +msgstr "תפריט הגדרות חדרים פרטיים" + +#: src/modules/rooms/settingui.py:98 +msgctxt "dash:rooms|title" +msgid "Private Room Configuration ({commands[configure rooms]})" +msgstr "עריכת חדרים פרטיים ({commands[configure rooms]})" + +#: src/modules/rooms/settingui.py:102 +msgctxt "dash:economy|dropdown|placeholder" +msgid "Private Room Panel" +msgstr "תפריט חדר פרטי" + +#: src/modules/rooms/roomui.py:56 +msgctxt "ui:room_status|error:owner_required" +msgid "You must be the private room owner to do this!" +msgstr "אתה חייב להיות הבעלים של החדר הפרטי כדי לעשות את זה!" + +#: src/modules/rooms/roomui.py:72 +msgctxt "ui:room_status|error:member_required" +msgid "You need to be a member of the private room to do this!" +msgstr "אתה צריך להיות אחד מהחברים של החדר הפרטי הזה כדי לעשות את זה!" + +#: src/modules/rooms/roomui.py:90 +msgctxt "ui:room_status|button:deposit|modal:deposit|title" +msgid "Room Deposit" +msgstr "פיקדון חדר" + +#: src/modules/rooms/roomui.py:94 +msgctxt "ui:room_status|button:deposit|modal:deposit|field:question|label" +msgid "How many LionCoins do you want to deposit?" +msgstr "כמה מטבעות תרצה להוסיף לפיקדון?" + +#: src/modules/rooms/roomui.py:112 +#, possible-python-brace-format +msgctxt "ui:room_status|button:deposit|error:invalid_number" +msgid "Cannot deposit `{inputted}` coins. Please enter a positive integer." +msgstr "לא הצלחתי להוסיף `{inputted}` מטבעות. אנא בחרו מספר שלם חיובי." + +#: src/modules/rooms/roomui.py:144 +#, possible-python-brace-format +msgctxt "ui:room_status|button:deposit|error:insufficient_funds" +msgid "" +"You cannot deposit {coin}**{amount}**! You only have {coin}**{balance}**." +msgstr "אתה לא יכול לשלם {coin}**{amount}**!  יש לך רק {coin}**{balance}**." + +#: src/modules/rooms/roomui.py:160 +msgctxt "ui:room_status|button:deposit|label" +msgid "Deposit" +msgstr "הכנס לפיקדון" + +#: src/modules/rooms/roomui.py:171 +msgctxt "ui:room_status|button:edit|label" +msgid "Edit Room" +msgstr "ערוך חדר" + +#: src/modules/rooms/roomui.py:204 +msgctxt "ui:room_status|button:timer|modal:add_timer|title" +msgid "Create Room Timer" +msgstr "צור טיימר לחדר" + +#: src/modules/rooms/roomui.py:236 +msgctxt "ui:room_status|button:timer|timer_created" +msgid "Timer created successfully! Use `/pomodoro edit` to configure further." +msgstr "הטיימר נבנה בהצלחה! השתמש בפאנל בתחתית כדי לשנות אותו." + +#: src/modules/rooms/roomui.py:254 +msgctxt "ui:room_status|button:timer|label:edit_timer" +msgid "Edit Timer" +msgstr "ערוך טיימר" + +#: src/modules/rooms/roomui.py:261 +msgctxt "ui:room_status|button:timer|label:add_timer" +msgid "Add Timer" +msgstr "הוסף טיימר" + +#: src/modules/rooms/roomui.py:304 +#, possible-python-brace-format +msgctxt "ui:room_status|menu:invite|error:too_many_members" +msgid "" +"Too many members! You are inviting `{count}` new members to your room, but " +"you already have `{current}` members! The member cap is `{cap}`." +msgstr "" +"יותר מידי משתמשים! אתה מזמין `{count}` חברים חדשים לחדר בזמן שיש לך כבר " +"`{current}` חברים! מגבלת החדרים לחדר היא `{cap}`." + +#: src/modules/rooms/roomui.py:330 +msgctxt "ui:room_status|menu:invite_menu|placeholder:capped" +msgid "Room member cap reached!" +msgstr "הגעתם למגבלת כמות החברים בחדר!" + +#: src/modules/rooms/roomui.py:336 +msgctxt "ui:room_status|menu:invite_menu|placeholder:notcapped" +msgid "Add Members" +msgstr "הוסף חברים" + +#: src/modules/rooms/roomui.py:359 +msgctxt "ui:room_status|menu:kick_menu|placeholder" +msgid "Remove Members" +msgstr "הסר חברים" + +#: src/modules/rooms/roomui.py:367 +msgctxt "ui:room_status|embed|title" +msgid "Room Control Panel" +msgstr "לוח בקרה של החדר" + +#: src/modules/rooms/roomui.py:375 +msgctxt "ui:room_status|embed|field:channel|name" +msgid "Channel" +msgstr "ערוץ" + +#: src/modules/rooms/roomui.py:380 +msgctxt "ui:room_status|embed|field:owner|name" +msgid "Owner" +msgstr "בעלים" + +#: src/modules/rooms/roomui.py:385 +msgctxt "ui:room_status|embed|field:created|name" +msgid "Created At" +msgstr "נוצר ב" + +#: src/modules/rooms/roomui.py:395 +#, possible-python-brace-format +msgctxt "ui:room_status|embed|field:bank|value:expiring" +msgid "" +"**Warning:** Insufficient room balance to pay next rent ({coin} **{rent}**).\n" +"The room will expire {expiry}.\n" +"Use {room_deposit_cmd} to increase balance." +msgstr "" +"אזהרה! לא מספיק פיקדון כדי לשלם את השכירות הבאה! ({coin} **{rent}**).\n" +"החדר יפוג ב{expiry}.\n" +"השתמשו ב {room_deposit_cmd} כדי להפקיד עוד מטבעות לפיקדון ולדחות את התוקף!" + +#: src/modules/rooms/roomui.py:407 +#, possible-python-brace-format +msgctxt "ui:room_status|embed|field:bank|value:notexpiring" +msgid "Next rent due {time} (- {coin}**{rent}**)" +msgstr "השכירות הבאה: {time} (- {coin}**{rent}**)" + +#: src/modules/rooms/roomui.py:416 +#, possible-python-brace-format +msgctxt "ui:room_status|embed|field:bank|name" +msgid "Room Balance: {coin}**{amount}**" +msgstr "בנק החדר: {coin}**{amount}**" + +#: src/modules/rooms/roomui.py:428 +#, possible-python-brace-format +msgctxt "ui:room_status|embed|field:members|name" +msgid "Members ({count}/{cap})" +msgstr "חברים ({count}/{cap})" + +#: src/modules/rooms/cog.py:306 +msgctxt "cmd:room" +msgid "room" +msgstr "חדר" + +#: src/modules/rooms/cog.py:307 +msgctxt "cmd:room|desc" +msgid "Base command group for private room configuration." +msgstr "קבוצת פקודות בסיס לניהול הגדרות חדרים פרטיים." + +#: src/modules/rooms/cog.py:314 +msgctxt "cmd:room_rent" +msgid "rent" +msgstr "שכירות" + +#: src/modules/rooms/cog.py:317 +msgctxt "cmd:room_rent|desc" +msgid "Rent a private voice channel with LionCoins." +msgstr "שכור חדר פרטי עבור מטבעות." + +#: src/modules/rooms/cog.py:321 +msgctxt "cmd:room_rent|param:days" +msgid "days" +msgstr "ימים" + +#: src/modules/rooms/cog.py:322 +msgctxt "cmd:room_rent|param:members" +msgid "members" +msgstr "משתמשים" + +#: src/modules/rooms/cog.py:323 +msgctxt "cmd:room_rent|param:name" +msgid "name" +msgstr "שם" + +#: src/modules/rooms/cog.py:328 +msgctxt "cmd:room_rent|param:days|desc" +msgid "Number of days to pre-purchase. (Default: 1)" +msgstr "מספר ימים להשכיר. (ברירת מחדל: 1)" + +#: src/modules/rooms/cog.py:332 +msgctxt "cmd:room_rent|param:members|desc" +msgid "Mention the members you want to add to your private room." +msgstr "ציין את החברים שתרצה להוסיף לחדר הפרטי שלך." + +#: src/modules/rooms/cog.py:336 +msgctxt "cmd:room_rent|param:name|desc" +msgid "Name of your private voice channel." +msgstr "תן שם לחדר הפרטי שלך." + +#: src/modules/rooms/cog.py:354 +msgctxt "cmd:room_rent|error:not_setup" +msgid "" +"The private room system has not been set up! A private room category needs " +"to be set first with `/configure rooms`." +msgstr "" +"מערכת החדרים הפרטיים לא הושלמה! האדמין של הסרבר צריך קודם לקבוע קטגוריה " +"לחדרים בפרטים באמצעות `/configure rooms`." + +#: src/modules/rooms/cog.py:365 +msgctxt "cmd:room_rent|error:insufficient_perms" +msgid "" +"I do not have enough permissions to create a new channel under the " +"configured private room category!" +msgstr "אין לי מספיק הראשות כדי ליצור חדרים מתחת לקטגוריה שנקבעה!" + +#: src/modules/rooms/cog.py:379 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:room_exists" +msgid "You already own a private room! Click to visit: {channel}" +msgstr "כבר יש לך חדר פרטי! לחץ פה כדי לעבור אליו: {channel}" + +#: src/modules/rooms/cog.py:399 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:member_not_found" +msgid "Could not find the requested member {mention} in this server!" +msgstr "לא הצלחתי למצוא את {mention} בשרת הזה!" + +#: src/modules/rooms/cog.py:413 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:too_many_members" +msgid "" +"Too many members! You have requested to add `{count}` members to your room, " +"but the maximum private room size is `{cap}`!" +msgstr "" +"יותר מידי משתמשים! ביקשתם להוסיף `{count}` משתמשים לחדר שלכם, אבל המקסימום " +"הוא `{cap}`!" + +#: src/modules/rooms/cog.py:427 +#, possible-python-brace-format +msgctxt "cmd:room_rent|confirm:purchase" +msgid "" +"Are you sure you want to spend {coin}**{required}** to rent a private room " +"for `one` day?" +msgid_plural "" +"Are you sure you want to spend {coin}**{required}** to rent a private room " +"for `{days}` days?" +msgstr[0] "" +"אתם בטוחים שאתם רוצים להוציא {coin}**{required}** כדי לשכור את החדר הפרטי " +"למשך תקופה של יממה?" +msgstr[1] "" +"אתם בטוחים שאתם רוצים להוציא {coin}**{required}** כדי לשכור את החדר הפרטי " +"למשך תקופה של יומיים?" +msgstr[2] "" +"אתם בטוחים שאתם רוצים להוציא {coin}**{required}** כדי לשכור את החדר הפרטי " +"למשך תקופה של `{days}` ימים?" +msgstr[3] "" +"אתם בטוחים שאתם רוצים להוציא {coin}**{required}** כדי לשכור את החדר הפרטי " +"למשך תקופה של `{days}` ימים?" + +#: src/modules/rooms/cog.py:452 +#, possible-python-brace-format +msgctxt "cmd:room_rent|success" +msgid "Successfully created your private room {channel}!" +msgstr "החדר הפרטי נוצר בהצלחה {channel}!" + +#: src/modules/rooms/cog.py:457 +msgctxt "cmd:room_rent|success|title" +msgid "Private Room Created!" +msgstr "החדר הפרטי נוצר בהצלחה!" + +#: src/modules/rooms/cog.py:491 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:insufficient_funds" +msgid "" +"Renting a private room for `one` day costs {coin}**{required}**, but you " +"only have {coin}**{balance}**!" +msgid_plural "" +"Renting a private room for `{days}` days costs {coin}**{required}**, but you" +" only have {coin}**{balance}**!" +msgstr[0] "" +"לשכור חדר פרטי ליממה עולה {coin}**{required}**, אבל יש לכם רק " +"{coin}**{balance}**!" +msgstr[1] "" +"לשכור חדר פרטי ליומיים עולה {coin}**{required}**, אבל יש לכם רק " +"{coin}**{balance}**!" +msgstr[2] "" +"לשכור חדר פרטי ל `{days}` ימים עולה {coin}**{required}**, אבל יש לכם רק " +"{coin}**{balance}**!" +msgstr[3] "" +"לשכור חדר פרטי ל `{days}` ימים עולה {coin}**{required}**, אבל יש לכם רק " +"{coin}**{balance}**!" + +#: src/modules/rooms/cog.py:525 +msgctxt "cmd:room_rent|error:my_permissions" +msgid "" +"Could not create your private room! You were not charged.\n" +"I have insufficient permissions to create a private room channel." +msgstr "" +"לא הצלחתי ליצור חדר פרטי! לא לקחתי ממך מטבעות.\n" +"אין לי מספיק הרשאות כדי ליצור את החדר הפרטי." + +#: src/modules/rooms/cog.py:537 +#, possible-python-brace-format +msgctxt "cmd:room_rent|error:unknown" +msgid "" +"Could not create your private room! You were not charged.\n" +"An unknown error occurred while creating your private room.\n" +"`{error}`" +msgstr "" +"לא הצלחתי ליצור חדר פרטי! לא לקחתי ממך מטבעות.\n" +"שגיאה לא ידועה התחוללה כשניסיתי לעשות את זה.\n" +"`{error}`" + +#: src/modules/rooms/cog.py:547 +msgctxt "cmd:room_status" +msgid "status" +msgstr "סטטוס" + +#: src/modules/rooms/cog.py:550 +msgctxt "cmd:room_status|desc" +msgid "Display the status of your current room." +msgstr "הצג את הסטטוס של החדר הנוכחי שלך." + +#: src/modules/rooms/cog.py:567 +msgctxt "cmd:room_status|error:no_target" +msgid "" +"Could not identify target private room! Please re-run the command in the " +"private room you wish to view the status of." +msgstr "" +"לא הצלחתי לזהות את החדר הפרטי! אנא הרץ את הפקודה מחדש בחדר בתוך הפרטי שאתה " +"רוצה לראות את הסטטוס שלו." + +#: src/modules/rooms/cog.py:582 +msgctxt "cmd:room_invite" +msgid "invite" +msgstr "הזמן" + +#: src/modules/rooms/cog.py:585 +msgctxt "cmd:room_invite|desc" +msgid "Add members to your private room." +msgstr "הוסף חברים לחדר הפרטי שלך." + +#: src/modules/rooms/cog.py:589 +msgctxt "cmd:room_invite|param:members" +msgid "members" +msgstr "משתמשים" + +#: src/modules/rooms/cog.py:594 +msgctxt "cmd:room_invite|param:members|desc" +msgid "Mention the members you want to add." +msgstr "תייג את החברים שאתה רוצה להוסיף." + +#: src/modules/rooms/cog.py:608 +#, possible-python-brace-format +msgctxt "cmd:room_invite|error:no_room" +msgid "" +"You do not own a private room! Use `/room rent` to rent one with {coin}!" +msgstr "אין לך חדש פרטי! תשתמש ב `/room rent` כדי ליצור אחד עם {coin}!" + +#: src/modules/rooms/cog.py:629 +#, possible-python-brace-format +msgctxt "cmd:room_invite|error:member_not_found" +msgid "Could not find the invited member {mention} in this server!" +msgstr "לא הצלחתי למצוא את החבר {mention} בשרת הזה! " + +#: src/modules/rooms/cog.py:640 +msgctxt "cmd:room_invite|error:no_new_members" +msgid "All members mentioned are already in the room!" +msgstr "כל החברים שציינת כבר בחדר!" + +#: src/modules/rooms/cog.py:654 +#, possible-python-brace-format +msgctxt "cmd:room_invite|error:too_many_members" +msgid "" +"Too many members! You have invited `{count}` new members to your room, but " +"you already have `{current}`, and the member cap is `{cap}`!" +msgstr "" +"יותר מידי משתמשים! אתה מזמין `{count}` חברים חדשים לחדר בזמן שיש לך כבר " +"`{current}` חברים! מגבלת החדרים לחדר היא `{cap}`." + +#: src/modules/rooms/cog.py:678 +msgctxt "cmd:room_invite|success|ack" +msgid "Members Invited successfully." +msgstr "הזמנתי את החברים בהצלחה." + +#: src/modules/rooms/cog.py:686 +msgctxt "cmd:room_kick" +msgid "kick" +msgstr "העף" + +#: src/modules/rooms/cog.py:689 +msgctxt "cmd:room_kick|desc" +msgid "Remove a members from your private room." +msgstr "העף חברים מהחדר הפרטי שלך." + +#: src/modules/rooms/cog.py:693 +msgctxt "cmd:room_kick|param:members" +msgid "members" +msgstr "משתמשים" + +#: src/modules/rooms/cog.py:698 +msgctxt "cmd:room_kick|param:members|desc" +msgid "" +"Mention the members you want to remove. Also accepts space-separated user " +"ids." +msgstr "" +"תייג את החברים שאתה רוצה להעיף. אני יכול לקבל גם מספר זהות מופרד עם פסיקים." + +#: src/modules/rooms/cog.py:712 +#, possible-python-brace-format +msgctxt "cmd:room_kick|error:no_room" +msgid "" +"You do not own a private room! Use `/room rent` to rent one with {coin}!" +msgstr "אין לך חדש פרטי! תשתמש ב `/room rent` כדי ליצור אחד עם {coin}!" + +#: src/modules/rooms/cog.py:729 +msgctxt "cmd:room_kick|error:no_matching_members" +msgid "None of the mentioned members are in this room!" +msgstr "אף אחד ממי שציינת לא נמצא בחדר הזה." + +#: src/modules/rooms/cog.py:746 +msgctxt "cmd:room_kick|success|ack" +msgid "Members removed." +msgstr "משתמשים נמחקו." + +#: src/modules/rooms/cog.py:752 +msgctxt "cmd:room_transfer" +msgid "transfer" +msgstr "העבר" + +#: src/modules/rooms/cog.py:755 +msgctxt "cmd:room_transfer|desc" +msgid "Transfer your private room to another room member. Not reversible!" +msgstr "העבר את החדר הפרטי הזה למשתמש אחר. לא ניתן לשינוי!" + +#: src/modules/rooms/cog.py:759 +msgctxt "cmd:room_transfer|param:new_owner" +msgid "new_owner" +msgstr "בעלים_חדש" + +#: src/modules/rooms/cog.py:764 +msgctxt "cmd:room_transfer|param:new_owner" +msgid "The room member you would like to transfer your room to." +msgstr "החבר שתרצה להעביר את החדר הזה אליו." + +#: src/modules/rooms/cog.py:778 +msgctxt "cmd:room_transfer|error:no_room" +msgid "You do not own a private room to transfer!" +msgstr "אין לך חדר פרטי להעביר!" + +#: src/modules/rooms/cog.py:790 +#, possible-python-brace-format +msgctxt "cmd:room_transfer|error:target_not_member" +msgid "" +"{mention} is not a member of your private room! You must invite them first." +msgstr "{mention} הוא לא חבר בחדר הפרטי שלך! אתם חייבים להזמין אותם קודם." + +#: src/modules/rooms/cog.py:802 +#, possible-python-brace-format +msgctxt "cmd:room_transfer|error:target_has_room" +msgid "" +"{mention} already owns a room! Members can only own one room at a time." +msgstr "" +"ל{mention} יש כבר חדר משלו. אנשים יכולים להיות הבעלים רק של חדר אחד בכל פעם." + +#: src/modules/rooms/cog.py:811 +#, possible-python-brace-format +msgctxt "cmd:room_transfer|confirm|question" +msgid "" +"Are you sure you wish to transfer your private room {channel} to " +"{new_owner}? This action is not reversible!" +msgstr "" +"אתם בטוחים שאתם רוצים להעביר את החדר הפרטי שלך {channel} לבעלים החדש " +"{new_owner}? לא תוכלו לחזור בכם אחרי שתאשרו." + +#: src/modules/rooms/cog.py:831 +#, possible-python-brace-format +msgctxt "cmd:room_transfer|success|description" +msgid "" +"You have successfully transferred ownership of {channel} to {new_owner}." +msgstr "העברת את הבעלות של {channel} אל {new_owner}." + +#: src/modules/rooms/cog.py:837 +msgctxt "cmd:room_deposit" +msgid "deposit" +msgstr "הכנס לפיקדון" + +#: src/modules/rooms/cog.py:840 +msgctxt "cmd:room_deposit|desc" +msgid "" +"Deposit LionCoins in your private room bank to add more days. (Members may " +"also deposit!)" +msgstr "" +"הפקד מטבעות לחדר כדי להוסיף עוד ימים! (גם משתמשים רגילים בחדר יכולים להפקיד " +"מטבעות!)" + +#: src/modules/rooms/cog.py:844 +msgctxt "cmd:room_deposit|param:coins" +msgid "coins" +msgstr "מטבעות" + +#: src/modules/rooms/cog.py:849 +msgctxt "cmd:room_deposit|param:coins|desc" +msgid "Number of coins to deposit." +msgstr "מספר מטבעות להפקיד." + +#: src/modules/rooms/cog.py:869 +msgctxt "cmd:room_deposit|error:no_target" +msgid "" +"Could not identify target private room! Please re-run the command in the " +"private room you wish to contribute to." +msgstr "" +"לא הצלחתי לזהות את החדר הפרטי! אנא הרץ את הפקודה מחדש בחדר בתוך הפרטי שאתה " +"רוצה להפקיד אליו מטבעות." + +#: src/modules/rooms/cog.py:885 +#, possible-python-brace-format +msgctxt "cmd:room_deposit|error:insufficient_funds" +msgid "" +"You cannot deposit {coin}**{amount}**! You only have {coin}**{balance}**." +msgstr "אתה לא יכול לשלם {coin}**{amount}**!  יש לך רק {coin}**{balance}**." + +#: src/modules/rooms/cog.py:906 +#, possible-python-brace-format +msgctxt "cmd:room_depost|success" +msgid "" +"Success! You have contributed {coin}**{amount}** to the private room bank." +msgstr "הצלחתי להפקיד {coin}**{amount}** בבנק של החדר הפרטי." + +#: src/modules/rooms/cog.py:921 +msgctxt "cmd:configure_rooms" +msgid "rooms" +msgstr "חדרים" + +#: src/modules/rooms/cog.py:922 +msgctxt "cmd:configure_rooms|desc" +msgid "Configure Rented Private Rooms" +msgstr "הגדר חדרים פרטיים" + +#: src/modules/rooms/room.py:81 +#, possible-python-brace-format +msgctxt "room|notify:deposit|description" +msgid "{member} has deposited {coin}**{amount}** into the room bank!" +msgstr "{member} הפקיד {coin}**{amount}** לבנק של החדר!" + +#: src/modules/rooms/room.py:104 +msgctxt "room|notify:new_members|title" +msgid "New Members!" +msgstr "חברים חדשים!" + +#: src/modules/rooms/room.py:108 +#, possible-python-brace-format +msgctxt "room|notify:new_members|desc" +msgid "Welcome {members}" +msgstr "ברוכים הבאים {members}!" + +#: src/modules/rooms/room.py:183 +#, possible-python-brace-format +msgctxt "room|notify:transfer|description" +msgid "{old_owner} has transferred private room ownership to {new_owner}" +msgstr "{old_owner} העביר את הבעלות על החדר אל {new_owner}" + +#: src/modules/rooms/room.py:247 +msgctxt "room|embed:expiry|title" +msgid "Private Room Expired!" +msgstr "החדר הפרטי פג תוקף!" + +#: src/modules/rooms/room.py:251 +#, possible-python-brace-format +msgctxt "room|embed:expiry|description" +msgid "Your private room in **{guild}** has expired!" +msgstr "החדר הפרטי שלך ב**{guild}** פג תוקף." + +#: src/modules/rooms/room.py:265 +#, possible-python-brace-format +msgctxt "room|tick|rent_deducted" +msgid "Daily rent deducted from room balance. New balance: {coin}**{amount}**" +msgstr "שכירות יומים נלקחה מהבנק. מאזן עדכני: {coin}**{amount}**" + +#: src/modules/rooms/settings.py:21 +msgctxt "guildset:room_category" +msgid "rooms_category" +msgstr "קטגוריית_חדרים" + +#: src/modules/rooms/settings.py:25 +msgctxt "guildset:rooms_category|desc" +msgid "Category in which to create private voice channels." +msgstr "קטגוריה שבה אצור את החדרים הפרטיים של המשתמשים." + +#: src/modules/rooms/settings.py:29 +msgctxt "guildset:room_category|long_desc" +msgid "" +"When a member uses {cmds[room rent]} to rent a new private room, a private " +"voice channel will be created under this category, manageable by the member." +" I must have permission to create new channels in this category, as well as " +"to manage permissions." +msgstr "" +"כאשר משתמש משתמש ב{cmds[room rent]} על מנת ליצור חדר פרטי, חדר קול עם צאט " +"פרטי יווצר מתחת לקטגוריה הזו. החדר ניתן לשינוי על ידי המשתמש עצמו, ואני חייב" +" להיות בעל הראשות נכונות בקטגוריה הזו, כדי שאוכל להגיד ולשלוט בחדר אוטומטית." + +#: src/modules/rooms/settings.py:37 +msgctxt "guildset:room_category|accepts" +msgid "Private room category name or id." +msgstr "שם או מספר זהות של קטגוריית החדרים הפרטיים." + +#: src/modules/rooms/settings.py:51 +msgctxt "guildset:rooms_category|set_response:unset" +msgid "" +"The private room category has been unset. Existing private rooms will not be" +" affected. Delete the channels manually to remove the private rooms." +msgstr "" +"הקטגוריה של החדרים הפרטיים הוסרה. חדרים שכבר קיימים לא יושפעו, תצטרכו למחוק " +"את החדרים בצורה ידנית כדי להסיר אותם." + +#: src/modules/rooms/settings.py:57 +#, possible-python-brace-format +msgctxt "guildset:rooms_category|set_response:set" +msgid "" +"Private room category has been set to {channel}. Existing private rooms will" +" be moved." +msgstr "" +"קטגורית חדרים פרטיים נקבעה ל{channel}. אני אעביר את החדרים הנוכחיים לאט לאט " +"אל הקטגוריה החדשה, אין צורך לעשות זאת ידנית." + +#: src/modules/rooms/settings.py:67 +#, possible-python-brace-format +msgctxt "guildset:room_category|set_using" +msgid "{cmd} or category selector below." +msgstr "{cmd} או בחירת קטגוריות בתחתית." + +#: src/modules/rooms/settings.py:76 +msgctxt "guildset:rooms_price" +msgid "room_rent" +msgstr "שכירות_חדר" + +#: src/modules/rooms/settings.py:80 +msgctxt "guildset:rooms_rent|desc" +msgid "Daily rent price for a private room." +msgstr "מחיר יומי להשכרת חדר פרטי." + +#: src/modules/rooms/settings.py:84 +msgctxt "guildset:rooms_rent|long_desc" +msgid "" +"Members will be charged this many LionCoins for each day they rent a private" +" room." +msgstr "" +"משתמשים יצטרכו לשלם כמות כזו של מטבעות אם הם רוצים לקנות חדר פרטי ליום שלם." + +#: src/modules/rooms/settings.py:88 +msgctxt "guildset:rooms_rent|accepts" +msgid "Number of LionCoins charged per day for a private room." +msgstr "מספר מטבעות לתשלום עבור תקוף של יממה בחדר פרטי." + +#: src/modules/rooms/settings.py:100 +#, possible-python-brace-format +msgctxt "guildset:rooms_price|set_response" +msgid "Private rooms will now cost {coin}**{amount}** per 24 hours." +msgstr "חדרים פרטיים יעלו עכשיו {coin}**{amount}** כל יממה." + +#: src/modules/rooms/settings.py:112 +msgctxt "guildset:rooms_slots" +msgid "room_member_cap" +msgstr "מספר_אנשים_בחדר" + +#: src/modules/rooms/settings.py:115 +msgctxt "guildset:rooms_slots|desc" +msgid "Maximum number of members in each private room." +msgstr "מספר אנשים מקסימלי שחדר פרטי יכול להכיל בשרת." + +#: src/modules/rooms/settings.py:119 +msgctxt "guildset:rooms_slots|long_desc" +msgid "" +"Private room owners may invite other members to their private room via the " +"UI, or through the {cmds[room invite]} command. This setting limits the " +"maximum number of members a private room may hold." +msgstr "" +"בעלים של חדרים פרטיים יוכלו להזמין את החברים שלהם בדרכים שונות, לדוגמא: " +"{cmds[room invite]}. ההגדרה הזו היא בעצם כמה אנשים אתם מרשים שיהיו בחדר פרטי" +" בבת אחת." + +#: src/modules/rooms/settings.py:125 +msgctxt "guildset:rooms_slots|accepts" +msgid "Maximum number of members allowed per private room." +msgstr "מספר אנשים מקסימלי שחדר פרטי יכול להכיל בשרת." + +#: src/modules/rooms/settings.py:137 +#, possible-python-brace-format +msgctxt "guildset:rooms_slots|set_response" +msgid "Private rooms are now capped to **{amount}** members." +msgstr "מגבלת הכמות של החדרים נקבעה בהצלחה ל**{amount}** חברים." + +#: src/modules/rooms/settings.py:146 +msgctxt "guildset:rooms_visible" +msgid "room_visibility" +msgstr "פרטיות_חדר" + +#: src/modules/rooms/settings.py:149 +msgctxt "guildset:rooms_visible|desc" +msgid "Whether private rented rooms are visible to non-members." +msgstr "" +"האם חדרים פרטיים יוסתרו או לא ממשתמשים שלא חברים בחדרים (הם לא יוכלו להצטרף," +" רק לראות שהם קיימים)" + +#: src/modules/rooms/settings.py:153 +msgctxt "guildset:rooms_visible|long_desc" +msgid "" +"If enabled, new private rooms will be created with the `VIEW_CHANNEL` " +"permission enabled for the `@everyone` role." +msgstr "" +"אם מופעל, חדרים חדשים יווצרו עם ההרשאה `VIEW_CHANNEL` לכל חברי השרת, אבל הם " +"לא יוכלו להצטרף אליו, רק לראות אותו." + +#: src/modules/rooms/settings.py:157 +msgctxt "guildset:rooms_visible|accepts" +msgid "Visible/Invisible" +msgstr "נראה/בלתי נראה" + +#: src/modules/rooms/settings.py:159 +msgctxt "guildset:rooms_visible|output:true" +msgid "Visible" +msgstr "ציבורי" + +#: src/modules/rooms/settings.py:160 +msgctxt "guildset:rooms_visible|output:false" +msgid "Invisible" +msgstr "פרטי" + +#: src/modules/rooms/settings.py:166 +msgctxt "guildset:rooms_visible|parse:truthy_values" +msgid "visible|enabled|yes|true|on|enable|1" +msgstr "נראה/מופעל/כן/נכון/דלוק/הפעל/1" + +#: src/modules/rooms/settings.py:170 +msgctxt "guildset:rooms_visible|parse:falsey_values" +msgid "invisible|disabled|no|false|off|disable|0" +msgstr "בלתינראה/כבוי/לא/לאנכון/כבוי/מנוטרל/0" + +#: src/modules/rooms/settings.py:182 +msgctxt "guildset:rooms_visible|set_response:enabled" +msgid "Private rooms will now be visible to everyone." +msgstr "חדרים פרטיים יהיו שקופים לכולם." + +#: src/modules/rooms/settings.py:187 +msgctxt "guildset:rooms_visible|set_response:disabled" +msgid "Private rooms will now only be visible to their members (and admins)." +msgstr "חדרים פרטיים יהיו שקופים רק לחברים שלהם וכמובן לאדמינים של השרת." + +#: src/modules/rooms/settings.py:197 +#, possible-python-brace-format +msgctxt "guildset:rooms_visible|set_using" +msgid "{cmd} or toggle below." +msgstr "{cmd} או תפריט הבחירה למטה." diff --git a/locales/he_IL/LC_MESSAGES/schedule.po b/locales/he_IL/LC_MESSAGES/schedule.po new file mode 100644 index 00000000..97892ec6 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/schedule.po @@ -0,0 +1,1025 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/schedule/cog.py:429 +msgctxt "create_booking|error:no_lobby" +msgid "" +"This server has not set a `session_lobby`, so the scheduled session system " +"is disabled!" +msgstr "השרת הזה לא קבע לובי למידה, ולכן מערכת הלו\"זים מבוטלת." + +#: src/modules/schedule/cog.py:441 +msgctxt "create_booking|error:no_member" +msgid "An unknown Discord error occurred. Please try again in a few minutes." +msgstr "שגיאה לא ידועה התחוללה. אנא נסה שוב במספר דקות." + +#: src/modules/schedule/cog.py:449 +msgctxt "create_booking|error:blacklisted" +msgid "" +"You have been blacklisted from the scheduled session system in this server." +msgstr "נכנסת לרשימה השחורה של מערכת הלו\"זים בשרת הזה." + +#: src/modules/schedule/cog.py:460 +#, possible-python-brace-format +msgctxt "create_booking|error:insufficient_balance" +msgid "" +"Booking a session costs {coin}**{required}**, but you only have " +"{coin}**{balance}**." +msgid_plural "" +"Booking `{count}` sessions costs {coin}**{required}**, but you only have " +"{coin}**{balance}**." +msgstr[0] "" +"קביעת `{count}` סשנים יעלו {coin}**{required}**, אבל יש לך רק " +"{coin}**{balance}**." +msgstr[1] "" +"קביעת `{count}` סשנים יעלו {coin}**{required}**, אבל יש לך רק " +"{coin}**{balance}**." +msgstr[2] "" +"קביעת `{count}` סשנים יעלו {coin}**{required}**, אבל יש לך רק " +"{coin}**{balance}**." +msgstr[3] "" +"קביעת `{count}` סשנים יעלו {coin}**{required}**, אבל יש לך רק " +"{coin}**{balance}**." + +#: src/modules/schedule/cog.py:474 +msgctxt "create_booking|error:already_booked" +msgid "One or more requested timeslots are already booked!" +msgstr "סשן אחד או יותר כבר נקבע קודם!" + +#: src/modules/schedule/cog.py:677 +msgctxt "cmd:schedule" +msgid "schedule" +msgstr "הירשם בלו\"ז" + +#: src/modules/schedule/cog.py:680 +msgctxt "cmd:schedule|desc" +msgid "View and manage your scheduled session." +msgstr "צפה או נהל את הסשנים שקבעת בלו\"ז." + +#: src/modules/schedule/cog.py:708 +#, possible-python-brace-format +msgctxt "cmd:schedule|cancel_booking|error:parse_slot" +msgid "" +"Time slot `{provided}` not recognised. Please select a session to cancel " +"from the autocomplete options." +msgstr "לוח הזמנים `{provided}` לא נקבע. אנא בחר סשן לביטול מהאופציות." + +#: src/modules/schedule/cog.py:716 +#, possible-python-brace-format +msgctxt "cmd:schedule|cancel_booking|error:not_booked" +msgid "Could not cancel {time} booking because it is not booked!" +msgstr "לא הצלחתי לבטל את {time} כי לעולם לא קבעת את הסשן הזה." + +#: src/modules/schedule/cog.py:725 +#, possible-python-brace-format +msgctxt "cmd:schedule|cancel_booking|error:too_soon" +msgid "Cannot cancel {time} booking because it is running or starting soon!" +msgstr "לא הצלחתי לבטל את {time} כי הוא כבר התחיל או מתחיל ממש בקרוב!" + +#: src/modules/schedule/cog.py:738 +#, possible-python-brace-format +msgctxt "cmd:schedule|cancel_booking|success" +msgid "Successfully cancelled your booking at {time}." +msgstr "ביטלתי בהצלחה את הסשן שלך ב {time}." + +#: src/modules/schedule/cog.py:751 +#, possible-python-brace-format +msgctxt "cmd:schedule|create_booking|error:parse_slot" +msgid "" +"Time slot `{provided}` not recognised. Please select a session to cancel " +"from the autocomplete options." +msgstr "לוח הזמנים `{provided}` לא נקבע. אנא בחר סשן לביטול מהאופציות." + +#: src/modules/schedule/cog.py:759 +#, possible-python-brace-format +msgctxt "cmd:schedule|create_booking|error:already_booked" +msgid "You have already booked a scheduled session for {time}." +msgstr "כבר קבעת בלו\"ז ב {time}." + +#: src/modules/schedule/cog.py:768 +#, possible-python-brace-format +msgctxt "cmd:schedule|create_booking|error:too_soon" +msgid "Cannot book session at {time} because it is running or starting soon!" +msgstr "לא הצלחתי לקבוע את {time} כי הוא כבר התחיל או מתחיל ממש בקרוב!" + +#: src/modules/schedule/cog.py:780 +#, possible-python-brace-format +msgctxt "cmd:schedule|create_booking|success" +msgid "You have successfully scheduled a session at {time}." +msgstr "קבעת בלו\"ז ב {time} בהצלחה." + +#: src/modules/schedule/cog.py:847 +msgctxt "cmd:configure_schedule" +msgid "schedule" +msgstr "הירשם בלו\"ז" + +#: src/modules/schedule/cog.py:850 +msgctxt "cmd:configure_schedule|desc" +msgid "Configure Scheduled Session system" +msgstr "תפריט הגדרות מערכת הלו\"זים" + +#: src/modules/schedule/settings.py:36 +msgctxt "guildset:session_lobby" +msgid "session_lobby" +msgstr "לובי_סשנים" + +#: src/modules/schedule/settings.py:39 +msgctxt "guildset:session_lobby|desc" +msgid "Channel to post scheduled session announcement and status to." +msgstr "הערוץ שבו אשלח התראות והכרזות של מערכת הלו\"זים" + +#: src/modules/schedule/settings.py:43 +msgctxt "guildset:session_lobby|long_desc" +msgid "" +"Channel in which to announce scheduled sessions and post their status. I must have the `MANAGE_WEBHOOKS` permission in this channel.\n" +"**This must be configured in order for the scheduled session system to function.**" +msgstr "" +"הערוץ שבו אכריז על מערכת הלוזים והססטוס שלהם. אני צריך את ההרשאה " +"`MANAGE_WEBHOOKS` בערוץ כדי לעשות את זה. " + +#: src/modules/schedule/settings.py:49 +msgctxt "guildset:session_lobby|accepts" +msgid "Name or id of the session lobby channel." +msgstr "שם או מספר מזהה של חדר הלובי של הסשנים." + +#: src/modules/schedule/settings.py:63 +#, possible-python-brace-format +msgctxt "guildset:session_lobby|set_response|set" +msgid "Scheduled sessions will now be announced in {channel}" +msgstr "עדכונים של מערכת הסשנים יהיו מוכרזים ב {channel}" + +#: src/modules/schedule/settings.py:68 +msgctxt "guildset:session_lobby|set_response|unset" +msgid "" +"The schedule session lobby has been unset. Shutting down scheduled session " +"system." +msgstr "הלובי של מערכת הסשנים הוסר, מכבה את מערכת הסשנים." + +#: src/modules/schedule/settings.py:78 +msgctxt "guildset:session_lobby|formatted|unset" +msgid "`Not Set` (The scheduled session system is disabled.)" +msgstr "`לא נקבע` (מערכת הלו\"זים מבוטלת)" + +#: src/modules/schedule/settings.py:83 +#, possible-python-brace-format +msgctxt "guildset:session_lobby|formatted|set" +msgid "<#{channelid}>" +msgstr "<#{channelid}>" + +#: src/modules/schedule/settings.py:92 +msgctxt "guildset:session_room" +msgid "session_room" +msgstr "חדר_סשנים" + +#: src/modules/schedule/settings.py:95 +msgctxt "guildset:session_room|desc" +msgid "Special voice channel open to scheduled session members." +msgstr "ערוץ קול מיוחד שאפשר רק לאנשים שקבעו סשן." + +#: src/modules/schedule/settings.py:99 +msgctxt "guildset:session_room|long_desc" +msgid "" +"If set, this voice channel serves as a dedicated room for scheduled session " +"members. During (and slightly before) each scheduled session, all members " +"who have booked the session will be given permission to join the voice " +"channel (via permission overwrites). I require the `MANAGE_CHANNEL`, " +"`MANAGE_PERMISSIONS`, `CONNECT`, and `VIEW_CHANNEL` permissions in this " +"channel, and my highest role must be higher than all permission overwrites " +"set in the channel. Furthermore, if this is set to a *category* channel, " +"then the permission overwrites will apply to all *synced* channels under the" +" category, as usual." +msgstr "" +"אם פעיל, ערוץ הקול ישמש כחדר ייעודי למערכת הלוזים של השרת. במהלך (וקצת לפני)" +" כל סשן, כל האנשים שקבעו פגישה יקבלו התראה ויוכלו להצטרף לחדר הזה. אני צריך " +"את ההתראות `MANAGE_CHANNEL`, `MANAGE_PERMISSIONS`, `CONNECT`, and " +"`VIEW_CHANNEL` כדי לעשות את זה, והרול שלי צריך להיות הכי גבוה בהיררכיה של " +"הרולים." + +#: src/modules/schedule/settings.py:109 +msgctxt "guildset:session_room|accepts" +msgid "Name or id of the session room voice channel." +msgstr "שם או מספר מזהה של חדר הקול של הסשנים." + +#: src/modules/schedule/settings.py:123 +#, possible-python-brace-format +msgctxt "guildset:session_room|set_response|set" +msgid "Schedule session members will now be given access to {channel}" +msgstr "משתמשים במערכת הסשנים יקבלו הרשאה אל {channel}" + +#: src/modules/schedule/settings.py:128 +msgctxt "guildset:session_room|set_response|unset" +msgid "The dedicated schedule session room has been removed." +msgstr "החדר קולי של מערכת הסשנים הוסר." + +#: src/modules/schedule/settings.py:135 +msgctxt "guildset:session_channels" +msgid "session_channels" +msgstr "חדרי_סשנים" + +#: src/modules/schedule/settings.py:138 +msgctxt "guildset:session_channels|desc" +msgid "Voice channels in which to track activity for scheduled sessions." +msgstr "חדרי קול שבהם אעקוב אחרי פעילות במערכת הסשנים." + +#: src/modules/schedule/settings.py:142 +msgctxt "guildset:session_channels|long_desc" +msgid "" +"Only activity in these channels (and in `session_room` if set) will count " +"towards scheduled session attendance. If a category is selected, then all " +"channels under the category will also be included. Activity tracking also " +"respects the `untracked_voice_channels` setting." +msgstr "" +"רק פעילות בערוצים האלו תחשב בתור נוכחות במערכת הלו\"זים. אם בחרתם בקטגוריה, " +"כל הערוצים מתחת לקטגוריה הזו יבחרו." + +#: src/modules/schedule/settings.py:149 +msgctxt "guildset:session_channels|accepts" +msgid "Comma separated list of session channel names or ids." +msgstr "רשימה מופרדת עם פסיקים של הערוצים המוגדרים כערוצי סשנים." + +#: src/modules/schedule/settings.py:166 +#, possible-python-brace-format +msgctxt "guildset:session_channels|set_response|set" +msgid "" +"Activity in the following sessions will now count towards scheduled session " +"attendance: {channels}" +msgstr "פעילות בסשנים הבאים עכשיו יחשבו כנוכחות במערכת הסשנים: {channels}" + +#: src/modules/schedule/settings.py:171 +msgctxt "guildset:session_channels|set_response|unset" +msgid "" +"Activity in all (tracked) voice channels will now count towards session " +"attendance." +msgstr "פעילו בכל ערוצי הקול יחשבו בתור נוכחות במערכת הסשנים." + +#: src/modules/schedule/settings.py:181 +msgctxt "guildset:session_channels|formatted|unset" +msgid "All Channels (excluding `untracked_channels`)" +msgstr "כל הערוצים (ללא הערוצים שלא נעקבים)" + +#: src/modules/schedule/settings.py:211 +msgctxt "guildset:schedule_cost" +msgid "schedule_cost" +msgstr "מחיר_סשן" + +#: src/modules/schedule/settings.py:214 +msgctxt "guildset:schedule_cost|desc" +msgid "Booking cost for each scheduled session." +msgstr "מחיר לקביעת כל סשן בלו\"ז." + +#: src/modules/schedule/settings.py:218 +msgctxt "guildset:schedule_cost|long_desc" +msgid "" +"Members will be charged this many LionCoins for each scheduled session they " +"book." +msgstr "משתמשים יצטרכו לשלם את כמות המטבעות הזו כדי לקבוע סשן בלו\"ז." + +#: src/modules/schedule/settings.py:222 +msgctxt "guildset:schedule_cost|accepts" +msgid "Price of each session booking (non-negative integer)." +msgstr "מחיר של כל סשן (מספר שלם חיובי)." + +#: src/modules/schedule/settings.py:234 +#, possible-python-brace-format +msgctxt "guildset:schedule_cost|set_response" +msgid "" +"Schedule session bookings will now cost {coin} **{amount}** per timeslot." +msgstr "קביעת סשן יעלה עכשיו {coin}**{amount}** כל פגישה." + +#: src/modules/schedule/settings.py:247 +#, possible-python-brace-format +msgctxt "guildset:schedule_cost|formatted" +msgid "{coin}**{amount}** per booking." +msgstr "{coin}**{amount}** עבור כל סשן." + +#: src/modules/schedule/settings.py:256 +msgctxt "guildset:attendance_reward" +msgid "attendance_reward" +msgstr "פרס_נוכחות" + +#: src/modules/schedule/settings.py:259 +msgctxt "guildset:attendance_reward|desc" +msgid "Reward for attending a booked scheduled session." +msgstr "פרס עבור נוכחות במערכת הלו\"זים." + +#: src/modules/schedule/settings.py:263 +msgctxt "guildset:attendance_reward|long_desc" +msgid "" +"When a member successfully attends a scheduled session they booked, they " +"will be awarded this many LionCoins. Should generally be more than the " +"`schedule_cost` setting." +msgstr "כאשר מישהו נכח בהצלחה במערכת הלו\"זים הוא יקבל פרס של מטבעות." + +#: src/modules/schedule/settings.py:269 +msgctxt "guildset:attendance_reward|accepts" +msgid "Number of coins to reward session attendance." +msgstr "מספר מטבעות שמשתמש יקבל בעקבות נוכחות מוצלחת בחדר הלו\"זים." + +#: src/modules/schedule/settings.py:281 +#, possible-python-brace-format +msgctxt "guildset:attendance_reward|set_response" +msgid "" +"Members will be rewarded {coin}**{amount}** when they attend a scheduled " +"session." +msgstr "משתמשים יקבלו {coin}**{amount}** כשהם משתתפים בסשן." + +#: src/modules/schedule/settings.py:291 +#, possible-python-brace-format +msgctxt "guildset:attendance_reward|formatted" +msgid "{coin}**{amount}** upon attendance." +msgstr "{coin}**{amount}** עבור נוכחות מוצלחת." + +#: src/modules/schedule/settings.py:300 +msgctxt "guildset:attendance_bonus" +msgid "group_attendance_bonus" +msgstr "פרס_נוכחות_קבוצתית" + +#: src/modules/schedule/settings.py:303 +msgctxt "guildset:attendance_bonus|desc" +msgid "Bonus reward given when all members attend a scheduled session." +msgstr "בונוס ינתן לכל המשתמשים כאשר כל מי שקבע את הסשן נכח בהצלחה." + +#: src/modules/schedule/settings.py:307 +msgctxt "guildset:attendance_bonus|long_desc" +msgid "" +"When all members who have booked a session successfully attend the session, " +"they will be given this bonus in *addition* to the `attendance_reward`." +msgstr "" +"כאשר כל המשתמשים שקבעו את הסשן הצטרפו לסשן בהצלחה, אני אתן בונוס לכולם בנוסף" +" לפרס שמגיע להם על נוכחות." + +#: src/modules/schedule/settings.py:312 +msgctxt "guildset:attendance_bonus|accepts" +msgid "Bonus coins rewarded when everyone attends a session." +msgstr "בונוס שכולם יקבלו שכולם משתתפים בסשן." + +#: src/modules/schedule/settings.py:324 +#, possible-python-brace-format +msgctxt "guildset:attendance_bonus|set_response" +msgid "" +"Session members will be rewarded an additional {coin}**{amount}** when " +"everyone attends." +msgstr "משתתפים יקבלו בונוס של {coin}**{amount}**  אם כל מי שקבע השתתף בסשן." + +#: src/modules/schedule/settings.py:334 +#, possible-python-brace-format +msgctxt "guildset:attendance_bonus|formatted" +msgid "{coin}**{amount}** bonus when all booked members attend." +msgstr "{coin}**{amount}** בונוס כאשר כל מי שקבע את הסשן הצטרף." + +#: src/modules/schedule/settings.py:343 +msgctxt "guildset:min_attendance" +msgid "min_attendance" +msgstr "נוכחות_מינימלית" + +#: src/modules/schedule/settings.py:346 +msgctxt "guildset:min_attendance|desc" +msgid "Minimum attendance before reward eligability." +msgstr "זמן מינימלי לפני שאחשיב את הנוכחות כמוצלחת." + +#: src/modules/schedule/settings.py:350 +msgctxt "guildset:min_attendance|long_desc" +msgid "" +"Scheduled session members will need to attend the session for at least this " +"number of minutes before they are marked as having attended (and hence are " +"rewarded)." +msgstr "" +"משתמשים יצטרכו להישאר בחדר לתקופת זמן הזו לפני שאחשיב את הנוכחות שלהם " +"שמוצלחת. " + +#: src/modules/schedule/settings.py:355 +msgctxt "guildset:min_attendance|accepts" +msgid "Number of minutes (1-60) before attendance is counted." +msgstr "מספר הדקות (1-60) לפני שאחשיב נוכחות בחדר כמוצלחת." + +#: src/modules/schedule/settings.py:369 +#, possible-python-brace-format +msgctxt "guildset:min_attendance|set_response" +msgid "" +"Members will be rewarded after they have attended booked sessions for at " +"least **`{amount}`** minutes." +msgstr "הסשן יחושב כשמוצלח אחרי **`{amount}`** דקות." + +#: src/modules/schedule/settings.py:379 +#, possible-python-brace-format +msgctxt "guildset:min_attendance|formatted" +msgid "**`{amount}`** minutes" +msgstr "**`{amount}`** דקות" + +#: src/modules/schedule/settings.py:400 +msgctxt "guildset:min_attendance|parse|error" +msgid "" +"Minimum attendance must be an integer number of minutes between `1` and " +"`60`." +msgstr "מספר הדקות חייב להיות מספר שלם בין 1 ל60" + +#: src/modules/schedule/settings.py:410 +msgctxt "guildset:schedule_blacklist_role" +msgid "schedule_blacklist_role" +msgstr "סשנים_רשימה_שחורה" + +#: src/modules/schedule/settings.py:413 +msgctxt "guildset:schedule_blacklist_role|desc" +msgid "Role which disables scheduled session booking." +msgstr "רולים שחוסמים מפני קביעה לחדר לוז\"ים" + +#: src/modules/schedule/settings.py:417 +msgctxt "guildset:schedule_blacklist_role|long_desc" +msgid "" +"Members with this role will not be allowed to book scheduled sessions in " +"this server. If the role is manually added, all future scheduled sessions " +"for the user are cancelled. This provides a way to stop repeatedly " +"unreliable members from blocking the group bonus for all members. " +"Alternatively, consider setting the booking cost (and reward) very high to " +"provide a strong disincentive for not attending a session." +msgstr "" +"משתמשים עם הרול הזה לא יוכלו לקבוע פגישות בשרת הזה. המערכת הזו נועדה לחסום " +"אנשים שמעצבנים אנשים אחרים על ידי קביעה של סשנים והברזה חוזרת ונשנת. הם לא " +"יוכלו להשתמש בפונקציה הזו של הבוט בשרת הזה." + +#: src/modules/schedule/settings.py:425 +msgctxt "guildset:schedule_blacklist_role|accepts" +msgid "Blacklist role name or id." +msgstr "רול או מספר זהות של רשימה שחורה." + +#: src/modules/schedule/settings.py:438 +#, possible-python-brace-format +msgctxt "guildset:schedule_blacklist_role|set_response|set" +msgid "Members with {role} will be unable to book scheduled sessions." +msgstr "משתמשים עם הרול הזה {role} לא יוכלו לקבוע פגישות לוז\"ים יותר." + +#: src/modules/schedule/settings.py:443 +msgctxt "guildset:schedule_blacklist_role|set_response|unset" +msgid "The schedule blacklist role has been unset." +msgstr "הרשימה השחורה של מערכת הסשנים נמחקה." + +#: src/modules/schedule/settings.py:453 +#, possible-python-brace-format +msgctxt "guildset:schedule_blacklist_role|formatted|set" +msgid "{role} members will not be able to book scheduled sessions." +msgstr "{role} לא יוכלו להשתמש במערכת הלו\"זים." + +#: src/modules/schedule/settings.py:458 +msgctxt "guildset:schedule_blacklist_role|formatted|unset" +msgid "Not Set" +msgstr "לא נקבע." + +#: src/modules/schedule/settings.py:467 +msgctxt "guildset:schedule_blacklist_after" +msgid "schedule_blacklist_after" +msgstr "סשן_רשימהשחורה_לאחרכמהזמן" + +#: src/modules/schedule/settings.py:470 +msgctxt "guildset:schedule_blacklist_after|desc" +msgid "Number of missed sessions within 24h before blacklisting." +msgstr "מספר הסשנים שהוברזו ב24 לפני שאכניס אותם לרשימה השחורה." + +#: src/modules/schedule/settings.py:474 +msgctxt "guildset:schedule_blacklist_after|long_desc" +msgid "" +"Members who miss more than this number of booked sessions in a single 24 " +"hour period will be automatically given the `blacklist_role`. Has no effect " +"if the `blacklist_role` is not set or if I do not have sufficient " +"permissions to assign the blacklist role." +msgstr "" +"משתמשים שמפסידים יותר מהמספר הזה של סשנים ב24 שעות יקבלו את הרול רשימה שחורה" +" ולא יוכלו להצטרף לחדר סשנים. סימו לב שחייבות להיות לי הרשאות נכונות כדי " +"שאצליח לתת את הרול הזה לאנשים." + +#: src/modules/schedule/settings.py:481 +msgctxt "guildset:schedule_blacklist_after|accepts" +msgid "A number of missed sessions (1-24) before blacklisting." +msgstr "" +"מספר הסשנים שהוברזו (בין 1 ל24) האחרונות לפני שאכניס אותם לרשימה השחורה." + +#: src/modules/schedule/settings.py:496 +#, possible-python-brace-format +msgctxt "guildset:schedule_blacklist_after|set_response|set" +msgid "" +"Members will be blacklisted after **`{amount}`** missed sessions within " +"`24h`." +msgstr "" +"משתמשים יכנסו לרשימה השחורה לאחר **`{amount}`** סשנים שהם הבריזו מהם ב24 " +"שעות." + +#: src/modules/schedule/settings.py:501 +msgctxt "guildset:schedule_blacklist_after|set_response|unset" +msgid "" +"Members will not be automatically blacklisted from booking scheduled " +"sessions." +msgstr "משתמשים לא יכנסו לרשימה השחורה אוטומטית." + +#: src/modules/schedule/settings.py:511 +#, possible-python-brace-format +msgctxt "guildset:schedule_blacklist_after|formatted|set" +msgid "Blacklist after **`{amount}`** missed sessions within `24h`." +msgstr "" +"משתמשים יכנסו לרשימה השחורה לאחר **`{amount}`** סשנים שהם הבריזו מהם ב24 " +"שעות." + +#: src/modules/schedule/settings.py:516 +msgctxt "guildset:schedule_blacklist_after|formatted|unset" +msgid "Do not automatically blacklist." +msgstr "אל תכניס לרשימה השחורה אוטומטית." + +#: src/modules/schedule/settings.py:528 +msgctxt "guildset:schedule_blacklist_role|parse|error" +msgid "Blacklist threshold must be a number between `1` and `24`." +msgstr "המספר של הרשימה השחורה חייב להיות מספר בין 1 ל24." + +#: src/modules/schedule/ui/settingui.py:69 +msgctxt "ui:schedule_config|button:page0|label" +msgid "Page 1" +msgstr "עמוד 1" + +#: src/modules/schedule/ui/settingui.py:88 +msgctxt "ui:schedule_config|menu:lobby|placeholder" +msgid "Select Lobby Channel" +msgstr "בחר ערוץ לובי" + +#: src/modules/schedule/ui/settingui.py:105 +msgctxt "ui:schedule_config|menu:room|placeholder" +msgid "Select Session Room" +msgstr "בחר ערוץ סשנים" + +#: src/modules/schedule/ui/settingui.py:123 +msgctxt "ui:schedule_config|menu:channels|placeholder" +msgid "Select Session Channels" +msgstr "בחר ערוצי סשנים" + +#: src/modules/schedule/ui/settingui.py:137 +msgctxt "ui:schedule_config|button:page1|label" +msgid "Page 2" +msgstr "עמוד 2" + +#: src/modules/schedule/ui/settingui.py:152 +msgctxt "ui:schedule_config|button:page2|label" +msgid "Page 3" +msgstr "עמוד 3" + +#: src/modules/schedule/ui/settingui.py:169 +msgctxt "ui:schedule_config|menu:blacklist_role|placeholder" +msgid "Select Blacklist Role" +msgstr "בחר רול לרשימה השחורה" + +#: src/modules/schedule/ui/settingui.py:177 +msgctxt "ui:schedule_config|embed|title" +msgid "Scheduled Session Configuration Panel" +msgstr "תפריט הגדרות מערכת לו\"זים" + +#: src/modules/schedule/ui/settingui.py:230 +msgctxt "dash:schedule|title" +msgid "Scheduled Session Configuration ({commands[configure schedule]})" +msgstr "ניהול מערכת הלו\"זים ({commands[configure schedule]})" + +#: src/modules/schedule/ui/settingui.py:234 +msgctxt "dash:schedule|dropdown|placeholder" +msgid "Scheduled Sessions Panel" +msgstr "תפריט הגדרות מערכת לו\"זים" + +#: src/modules/schedule/ui/settingui.py:251 +msgctxt "dash:schedule|section:schedule_channels|name" +msgid "Scheduled Session Channels ({commands[configure schedule]})" +msgstr "ניהול מערכת הלו\"זים ({commands[configure schedule]})" + +#: src/modules/schedule/ui/settingui.py:261 +msgctxt "dash:schedule|section:schedule_rewards|name" +msgid "Scheduled Session Rewards ({commands[configure schedule]})" +msgstr "ניהול פרסים מערכת לו\"זים ({commands[configure schedule]})" + +#: src/modules/schedule/ui/settingui.py:271 +msgctxt "dash:schedule|section:schedule_blacklist|name" +msgid "Scheduled Session Blacklist ({commands[configure schedule]})" +msgstr "ניהול מערכת הלו\"זים רשימה שחורה ({commands[configure schedule]})" + +#: src/modules/schedule/ui/scheduleui.py:31 +msgctxt "ui:schedule|about" +msgid "Guide tips here TBD" +msgstr "Guide tips here TBD" + +#: src/modules/schedule/ui/scheduleui.py:116 +msgctxt "ui:schedule|button:clear|error:nothing" +msgid "No upcoming sessions to cancel! Your schedule is already clear." +msgstr "אין סשנים שקבעתם שאתם יכולים לבטל! הלו\"ז שלכם כבר ריק." + +#: src/modules/schedule/ui/scheduleui.py:129 +msgctxt "ui:schedule|button:clear|success" +msgid "Successfully cancelled and refunded your upcoming scheduled sessions." +msgstr "ביטלתי והחזרתי את המטבעות עבור הסשנים העתידיים שלכם." + +#: src/modules/schedule/ui/scheduleui.py:142 +msgctxt "ui:schedule|button:clear|label" +msgid "Clear Schedule" +msgstr "נקה יומן" + +#: src/modules/schedule/ui/scheduleui.py:158 +msgctxt "ui:schedule|button:about|label" +msgid "About Schedule" +msgstr "מידע על הלו\"ז" + +#: src/modules/schedule/ui/scheduleui.py:184 +msgctxt "ui:schedule|menu:booking|error:current_slot" +msgid "You cannot schedule a currently running session!" +msgstr "אתה לא יכול לקבוע סשן שכבר רץ כרגע." + +#: src/modules/schedule/ui/scheduleui.py:191 +msgctxt "ui:schedule|menu:booking|error:next_slot" +msgid "Too late! You cannot schedule a session starting in the next minute." +msgstr "מאוחר מידי! אי אפשר לקבוע סשן שמתחיל ממש בכל כרגע." + +#: src/modules/schedule/ui/scheduleui.py:198 +msgctxt "ui:schedule|menu:booking|error:already_booked" +msgid "You have already booked one or more of the requested sessions!" +msgstr "כבר קבעתם אחד או יותר מהסשנים הללו." + +#: src/modules/schedule/ui/scheduleui.py:211 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:booking|error:insufficient_balance" +msgid "" +"Booking `{count}` scheduled sessions requires {coin}**{required}**, but you " +"only have {coin}**{balance}**!" +msgstr "" +"כדי לקבוע `{count}` סשנים צריך {coin}**{required}**, אבל יש לכם רק " +"{coin}**{balance}**!" + +#: src/modules/schedule/ui/scheduleui.py:227 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:booking|success" +msgid "Successfully booked your scheduled session at {times}." +msgid_plural "" +"Successfully booked the following scheduled sessions.\n" +"{times}" +msgstr[0] "" +"הצלחתי לקבוע את הסשנים הבאים בהצלחה\n" +"{times}" +msgstr[1] "" +"הצלחתי לקבוע את הסשנים הבאים בהצלחה\n" +"{times}" +msgstr[2] "" +"הצלחתי לקבוע את הסשנים הבאים בהצלחה\n" +"{times}" +msgstr[3] "" +"הצלחתי לקבוע את הסשנים הבאים בהצלחה\n" +"{times}" + +#: src/modules/schedule/ui/scheduleui.py:250 +msgctxt "ui:schedule|menu:booking|placeholder:blacklisted" +msgid "Book Sessions (Cannot book - Blacklisted)" +msgstr "קביעת סשנים (לא ניתן לקבוע - רשימה שחורה)" + +#: src/modules/schedule/ui/scheduleui.py:258 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:booking|placeholder:regular" +msgid "Book Sessions ({amount} LC)" +msgstr "קבע בלו\"ז ({amount} LC)" + +#: src/modules/schedule/ui/scheduleui.py:303 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:slots|option|format" +msgid "{day} {time} ({until})" +msgstr "{day} {time} ({until})" + +#: src/modules/schedule/ui/scheduleui.py:307 +msgctxt "ui:schedule|menu:slots|option|day:today" +msgid "Today" +msgstr "היום" + +#: src/modules/schedule/ui/scheduleui.py:311 +msgctxt "ui:schedule|menu:slots|option|day:tomorrow" +msgid "Tomorrow" +msgstr "מחר" + +#: src/modules/schedule/ui/scheduleui.py:333 +#, possible-python-brace-format +msgctxt "ui:schedule|format_until|positive" +msgid "in <1 hour" +msgid_plural "in {number} hours" +msgstr[0] "בעוד שעה" +msgstr[1] "העוד שעתיים" +msgstr[2] "בעוד {number} שעות" +msgstr[3] "בעוד {number} שעות" + +#: src/modules/schedule/ui/scheduleui.py:340 +msgctxt "ui:schedule|format_until|now" +msgid "right now!" +msgstr "כרגע!" + +#: src/modules/schedule/ui/scheduleui.py:362 +msgctxt "ui:schedule|menu:cancel|error:current_slot" +msgid "" +"You cannot cancel a currently running *scheduled* session! Please attend it " +"if possible." +msgstr "" +"לא ניתן לבטל סשן שכבר התחיל. אנא השתדל להצטרף אליו, או שתמנע מחבריך לקבל " +"בונוס." + +#: src/modules/schedule/ui/scheduleui.py:368 +msgctxt "ui:schedule|menu:cancel|error:too_late" +msgid "" +"Too late! You cannot cancel a scheduled session within a minute of it " +"starting. Please attend it if possible." +msgstr "" +"מאוחר מידי! לא ניתן לבטל סשן כל כך קרוב ממתי שהוא מתחיל. אנא הצטרף אליו כדי " +"לא למנוע מחבריך לקבל את הבונוס שלהם." + +#: src/modules/schedule/ui/scheduleui.py:385 +msgctxt "ui:schedule|menu:cancel|error:already_cancelled" +msgid "The selected bookings no longer exist! Nothing to cancel." +msgstr "הסשן שבחרת כבר לא קיים! אין לי מה לבטל." + +#: src/modules/schedule/ui/scheduleui.py:395 +#, possible-python-brace-format +msgctxt "ui:schedule|menu:cancel|success" +msgid "" +"Successfully cancelled and refunded your scheduled session booking for " +"{times}." +msgid_plural "" +"Successfully cancelled and refunded your scheduled session bookings:\n" +"{times}." +msgstr[0] "" +"ביטלתי והחזרתי את הכסף על הסשנים הבאים: \n" +"{times}." +msgstr[1] "" +"ביטלתי והחזרתי את הכסף על הסשנים הבאים: \n" +"{times}." +msgstr[2] "" +"ביטלתי והחזרתי את הכסף על הסשנים הבאים: \n" +"{times}." +msgstr[3] "" +"ביטלתי והחזרתי את הכסף על הסשנים הבאים: \n" +"{times}." + +#: src/modules/schedule/ui/scheduleui.py:416 +msgctxt "ui:schedule|menu:cancel|placeholder" +msgid "Cancel booked sessions" +msgstr "בטל סשנים שנקבעו" + +#: src/modules/schedule/ui/scheduleui.py:438 +msgctxt "ui:schedule|embed|author" +msgid "Your Scheduled Sessions and Past Statistics" +msgstr "הלו\"ז שלך וסטטיסטיקות קודמות" + +#: src/modules/schedule/ui/scheduleui.py:450 +msgctxt "ui:schedule|embed|field:stats|field:recent" +msgid "Recent" +msgstr "לאחרונה" + +#: src/modules/schedule/ui/scheduleui.py:457 +msgctxt "ui:schedule|embed|field:stats|field:alltime" +msgid "All Time" +msgstr "כל הזמנים" + +#: src/modules/schedule/ui/scheduleui.py:463 +msgctxt "ui:schedule|embed|field:stats|field:streak" +msgid "Streak" +msgstr "רצף" + +#: src/modules/schedule/ui/scheduleui.py:468 +#, possible-python-brace-format +msgctxt "ui:schedule|embed|field:stats|field:streak|value:zero" +msgid "One session attended! Keep it up!" +msgid_plural "**{streak}** sessions attended in a row! Good job!" +msgstr[0] "נכחת ברצף אחד! כל הכבוד!" +msgstr[1] "נכחת בשתי סשנים! כל הכבוד!" +msgstr[2] "נכחת בהרבה סשנים! כל הכבוד!" +msgstr[3] "**{streak}** סשנים ברצף! כל הכבוד!" + +#: src/modules/schedule/ui/scheduleui.py:475 +msgctxt "ui:schedule|embed|field:stats|field:streak|value:positive" +msgid "No streak yet!" +msgstr "אין רצף כרגע!" + +#: src/modules/schedule/ui/scheduleui.py:483 +msgctxt "ui:schedule|embed|field:stats|name" +msgid "Session Statistics" +msgstr "סטטיסטיקת נוכחות" + +#: src/modules/schedule/ui/scheduleui.py:502 +msgctxt "ui:schedule|embed|field:upcoming|name" +msgid "Upcoming Sessions" +msgstr "סשנים עתידיים" + +#: src/modules/schedule/ui/scheduleui.py:506 +msgctxt "ui:schedule|embed|field:upcoming|value:empty" +msgid "No sessions scheduled yet!" +msgstr "שום סשן לא נקבע עדיין!" + +#: src/modules/schedule/ui/scheduleui.py:520 +#, possible-python-brace-format +msgctxt "ui:schedule|embed|stats_format" +msgid "" +"**{attended}** attended out of **{total}** booked.\r\n" +"**{percent}%** attendance rate.\r\n" +"**{average}** average attendance time." +msgstr "" +"**{attended}** נוכחות מתוך **{total}** סשנים.\n" +"**{percent}%** אחוזי נוכחות.\n" +"**{average}** זמן נוכחות ממוצע." + +#: src/modules/schedule/ui/scheduleui.py:534 +#, possible-python-brace-format +msgctxt "ui:schedule|booking_format:short" +msgid "`{until}` | {start} - {end}" +msgstr "`{until}` | {start} - {end}" + +#: src/modules/schedule/ui/scheduleui.py:538 +#, possible-python-brace-format +msgctxt "ui:schedule|booking_format:long" +msgid "> `{until}` | {start} - {end}" +msgstr "> `{until}` | {start} - {end}" + +#: src/modules/schedule/ui/sessionui.py:52 +msgctxt "ui:sessionui|button:book|label" +msgid "Book" +msgstr "קבע" + +#: src/modules/schedule/ui/sessionui.py:56 +msgctxt "ui:sessionui|button:cancel|label" +msgid "Cancel" +msgstr "בטל" + +#: src/modules/schedule/ui/sessionui.py:60 +msgctxt "ui:sessionui|button:schedule|label" +msgid "Open Schedule" +msgstr "פתח יומן" + +#: src/modules/schedule/ui/sessionui.py:87 +msgctxt "ui:session|button:book|error:starting_soon" +msgid "Too late! This session has started or is starting shortly." +msgstr "מאוחר מידי! הסשן כבר התחיל או מתחיל מידי." + +#: src/modules/schedule/ui/sessionui.py:94 +msgctxt "ui:session|button:book|error:already_booked" +msgid "You are already a member of this session!" +msgstr "אתה כבר רשום לסשן הזה!" + +#: src/modules/schedule/ui/sessionui.py:101 +msgctxt "ui:session|button:book|success" +msgid "Successfully booked this session." +msgstr "קבעתי את הסשן בהצלחה!" + +#: src/modules/schedule/ui/sessionui.py:115 +msgctxt "ui:session|button:book|error|title" +msgid "Could not book session" +msgstr "לא ניתן לקבוע סשן." + +#: src/modules/schedule/ui/sessionui.py:133 +msgctxt "ui:session|button:cancel|error:starting_soon" +msgid "Too late! This session has started or is starting shortly." +msgstr "מאוחר מידי! הסשן כבר התחיל או מתחיל מידי." + +#: src/modules/schedule/ui/sessionui.py:140 +msgctxt "ui:session|button:cancel|error:not_booked" +msgid "You are not a member of this session!" +msgstr "אתה לא חבר בסשן הזה!" + +#: src/modules/schedule/ui/sessionui.py:150 +msgctxt "ui:session|button:cancel|success" +msgid "Successfully cancelled this session." +msgstr "ביטלתי את הסשן בהצלחה!" + +#: src/modules/schedule/ui/sessionui.py:164 +msgctxt "ui:session|button:cancel|error|title" +msgid "Could not cancel session" +msgstr "לא הצלחתי לבטל את הסשן" + +#: src/modules/schedule/core/session.py:196 +msgctxt "session|error:lobby_webhook_perms" +msgid "" +"Insufficient permissions to create a webhook in this channel. I require the " +"`MANAGE_WEBHOOKS` permission." +msgstr "" +"אין לי מספיק הרשות לשלוח התראות בערוץ הזה, אני צריך את ההרשאה " +"`MANAGE_WEBHOOKS` " + +#: src/modules/schedule/core/session.py:274 +#, possible-python-brace-format +msgctxt "session|prepare|error:room_permissions" +msgid "" +"Could not prepare the configured session room {room} for the next scheduled " +"session! I require the `MANAGE_CHANNEL`, `MANAGE_ROLES`, `CONNECT` and " +"`VIEW_CHANNEL` permissions." +msgstr "" +"לא הצלחתי להכין את החדר {room} לסשן הבא! אני צריך את ההראשות " +"`MANAGE_CHANNEL`, `MANAGE_ROLES`, `CONNECT` וגם `VIEW_CHANNEL`" + +#: src/modules/schedule/core/session.py:317 +#, possible-python-brace-format +msgctxt "session|open|error:room_permissions" +msgid "" +"Could not set up the configured session room {room} for this scheduled " +"session! I require the `MANAGE_CHANNEL`, `MANAGE_ROLES`, `CONNECT` and " +"`VIEW_CHANNEL` permissions." +msgstr "" +"לא הצלחתי להכין את החדר {room} לסשן הבא! אני צריך את ההראשות " +"`MANAGE_CHANNEL`, `MANAGE_ROLES`, `CONNECT` וגם `VIEW_CHANNEL`" + +#: src/modules/schedule/core/session.py:358 +#, possible-python-brace-format +msgctxt "session|status|title" +msgid "Session {start} - {end}" +msgstr "סשן {start} - {end}" + +#: src/modules/schedule/core/session.py:369 +msgctxt "session|status|desc:cancelled" +msgid "" +"I cancelled this scheduled session because I was unavailable. All members " +"who booked the session have been refunded." +msgstr "" +"ביטלתי את הסשן הזה מאחר ולא הייתי זמין, כל המשתמשים שקבעו בזמן הזה קיבלו " +"החזר כספי." + +#: src/modules/schedule/core/session.py:376 +msgctxt "session|status|desc:no_members" +msgid "*No members scheduled this session.*" +msgstr "*שום משתמש לא קבע לסשן הזה*" + +#: src/modules/schedule/core/session.py:382 +#, possible-python-brace-format +msgctxt "session|status:preparing|desc:has_members" +msgid "Starting {start}" +msgstr "מתחיל {start}" + +#: src/modules/schedule/core/session.py:385 +msgctxt "session|status:preparing|field:members" +msgid "Members" +msgstr "משתמשים" + +#: src/modules/schedule/core/session.py:392 +#, possible-python-brace-format +msgctxt "session|status:running|desc:has_members" +msgid "Finishing {start}" +msgstr "מסיים {start}" + +#: src/modules/schedule/core/session.py:426 +msgctxt "session|status:running|field:waiting" +msgid "Waiting For" +msgstr "מחכה ל:" + +#: src/modules/schedule/core/session.py:432 +msgctxt "session|status:running|field:attending" +msgid "Attending" +msgstr "נוכח" + +#: src/modules/schedule/core/session.py:438 +msgctxt "session|status:running|field:attended" +msgid "Attended" +msgstr "נוכח" + +#: src/modules/schedule/core/session.py:463 +#, possible-python-brace-format +msgctxt "session|status:finished|desc:everyone_att" +msgid "" +"Everyone attended the session! All members were rewarded with {coin} " +"**{reward} + {bonus}**!" +msgstr "כולם נכחו בסשן הזה! כל המשתמשים קיבלו {coin} **{reward} + {bonus}**!" + +#: src/modules/schedule/core/session.py:474 +#, possible-python-brace-format +msgctxt "session|status:finished|desc:some_att" +msgid "" +"Everyone who attended was rewarded with {coin} **{reward}**! Some members did not attend so everyone missed out on the bonus {coin} **{bonus}**.\n" +"**Members who missed their session have all future sessions cancelled without refund!*" +msgstr "" +"כל מי שנכח קיבל {coin} **{reward}**! חלק מהמשתשמים לא נכחו ולכן לא יכלתי לתת לכולם בונוס של {coin} **{bonus}**.\n" +"אנשים שלא נוכחים מונעים מחבריהם לקבל בונוס! מי שלא נכח, כל הסשנים העתידיים שלו בוטלו ללא החזר כספי." + +#: src/modules/schedule/core/session.py:486 +msgctxt "session|status:finished|desc:some_att" +msgid "" +"No-one attended this session! No-one received rewards.\n" +"**Members who missed their session have all future sessions cancelled without refund!*" +msgstr "" +"אף אחד לא נכח בסשן הזה! אף אחד לא קיבל פרס.\n" +"כל מי שלא נכח יבוטלו לו כל הסשנים העתידיים ללא החזר כספי." + +#: src/modules/schedule/core/session.py:492 +msgctxt "session|status:finished|field:attended" +msgid "Attended" +msgstr "נוכח" + +#: src/modules/schedule/core/session.py:497 +msgctxt "session|status:finished|field:missing" +msgid "Missing" +msgstr "חסר" diff --git a/locales/he_IL/LC_MESSAGES/settings_base.po b/locales/he_IL/LC_MESSAGES/settings_base.po new file mode 100644 index 00000000..d3a7071c --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/settings_base.po @@ -0,0 +1,227 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/settings/ui.py:179 +msgctxt "setting|formatted|notset" +msgid "Not Set" +msgstr "לא נקבע." + +#: src/settings/ui.py:338 +#, possible-python-brace-format +msgctxt "setting|summary_embed|title" +msgid "Configuration options for `{name}`" +msgstr "הגדרות של `{name}`." + +#: src/settings/ui.py:350 +msgctxt "setting|summary_table|field:currently|key" +msgid "Currently" +msgstr "כרגע" + +#: src/settings/ui.py:357 +msgctxt "setting|summary_table|field:default|key" +msgid "By Default" +msgstr "כברירת מחדל" + +#: src/settings/ui.py:364 +msgctxt "setting|summary_table|field:set|key" +msgid "Set Using" +msgstr "בחר באמצעות" + +#: src/settings/setting_types.py:48 +msgctxt "settype:string|accepts" +msgid "Any Text" +msgstr "כל טקסט" + +#: src/settings/setting_types.py:89 +#, possible-python-brace-format +msgctxt "settype:string|error" +msgid "Provided string is too long! Maximum length: {maxlen} characters." +msgstr "הטקסט שהבאת לי ארוך מידי! אורך מקסימלי: {maxlen} תווים." + +#: src/settings/setting_types.py:114 +msgctxt "settype:emoji|accepts" +msgid "Paste a builtin emoji, custom emoji, or emoji id." +msgstr "הדבק אימוג'י או מספר זהות של אחד." + +#: src/settings/setting_types.py:167 +#, possible-python-brace-format +msgctxt "settype:emoji|error:parse" +msgid "" +"Could not parse `{provided}` as a Discord emoji. Supported formats are " +"builtin emojis (e.g. `{builtin}`), custom emojis (e.g. {custom}), or custom " +"emoji ids (e.g. `{custom_id}`)." +msgstr "" +"לא הצלחתי להבין את `{provided}` כאמוג'י. אני תומך רק באמוג'ים של דיסקורד, " +"שיש לכם בשרת, או במספר מזהה של אימוג'י ספציפי משרת אחד שאני נמצא בו." + +#: src/settings/setting_types.py:236 +msgctxt "settype:channel|accepts" +msgid "A channel name or id" +msgstr "שם ערוץ או מספר הזהות שלו" + +#: src/settings/setting_types.py:282 +#, possible-python-brace-format +msgctxt "settype:channel|parse|error:not_found" +msgid "Channel `{string}` could not be found in this guild!" +msgstr "הערוץ `{string}` לא נמצא בשרת הזה." + +#: src/settings/setting_types.py:368 +msgctxt "settype:role|accepts" +msgid "A role name or id" +msgstr "שם רול או מספר הזהות שלו" + +#: src/settings/setting_types.py:427 +#, possible-python-brace-format +msgctxt "settype:role|parse|error:not_found" +msgid "Role `{string}` could not be found in this guild!" +msgstr "הרול `{string}` לא נמצא בשרת הזה." + +#: src/settings/setting_types.py:492 +msgctxt "settype:bool|accepts" +msgid "Enabled/Disabled" +msgstr "הפעל/כבה" + +#: src/settings/setting_types.py:497 +msgctxt "settype:bool|parse:truthy_values" +msgid "enabled|yes|true|on|enable|1" +msgstr "מופעל/כן/נכון/דלוק/הפעל/1" + +#: src/settings/setting_types.py:501 +msgctxt "settype:bool|parse:falsey_values" +msgid "disabled|no|false|off|disable|0" +msgstr "כבוי/לא/לאנכון/כבוי/מנוטרל/0" + +#: src/settings/setting_types.py:506 +msgctxt "settype:bool|output:true" +msgid "On" +msgstr "דלוק" + +#: src/settings/setting_types.py:507 +msgctxt "settype:bool|output:false" +msgid "Off" +msgstr "כבוי" + +#: src/settings/setting_types.py:508 +msgctxt "settype:bool|output:none" +msgid "Not Set" +msgstr "לא נקבע." + +#: src/settings/setting_types.py:619 +msgctxt "settype:integer|accepts" +msgid "An integer" +msgstr "מספר שלם" + +#: src/settings/setting_types.py:682 +msgctxt "settype:emoji|desc" +msgid "Unicode or custom emoji" +msgstr "אוניקוד לאמוג'י " + +#: src/settings/setting_types.py:754 +msgctxt "settype:guildid|accepts" +msgid "Any Snowflake ID" +msgstr "Any Snowflake ID" + +#: src/settings/setting_types.py:823 +msgctxt "settype:timezone|accepts" +msgid "A timezone name from the 'tz database' (e.g. 'Europe/London')" +msgstr "אזור זמן מהארכיון של \"tz\" (לדוגמא 'Europe/London')" + +#: src/settings/setting_types.py:893 +msgctxt "settype:timezone|summary_table|field:supported|key" +msgid "Supported" +msgstr "נתמך" + +#: src/settings/setting_types.py:897 +#, possible-python-brace-format +msgctxt "settype:timezone|summary_table|field:supported|value" +msgid "Any timezone from the [tz database]({link})." +msgstr "כל אזור זמן מפה [tz database]({link})." + +#: src/settings/setting_types.py:914 +#, possible-python-brace-format +msgctxt "set_type:timezone|acmpl|no_matching" +msgid "No timezones matching '{input}'!" +msgstr "אין אזורי זמן שמתאימים ל'{input}'!" + +#: src/settings/setting_types.py:927 +#, possible-python-brace-format +msgctxt "set_type:timezone|acmpl|choice" +msgid "{tz} (Currently {now})" +msgstr "{tz} (כרגע {now})" + +#: src/settings/setting_types.py:957 +msgctxt "settype:timestamp|accepts" +msgid "A timestamp in the form YYYY-MM-DD HH:MM" +msgstr "אנא השתמשו בYYYY-MM-DD HH:MM" + +#: src/settings/setting_types.py:986 +#, possible-python-brace-format +msgctxt "settype:timestamp|parse|error:invalid" +msgid "" +"Could not parse `{provided}` as a timestamp. Please use `YYYY-MM-DD HH:MM` " +"format." +msgstr "" +"לא הצלחתי להבין את `{provided}`, אנא השתמש בפורמט `YYYY-MM-DD HH:MM` " +"format." + +#: src/settings/setting_types.py:1017 +msgctxt "settype:raw|accepts" +msgid "Anything" +msgstr "כל אופציה" + +#: src/settings/setting_types.py:1070 +msgctxt "settype:enum|accepts" +msgid "A valid option." +msgstr "אופציה שעובדת." + +#: src/settings/setting_types.py:1120 +#, possible-python-brace-format +msgctxt "settype:enum|parse|error:not_found" +msgid "`{provided}` is not a valid option!" +msgstr "`{provided}` אינו אופציה שעובדת!" + +#: src/settings/setting_types.py:1168 +msgctxt "settype:duration|accepts" +msgid "A number of days, hours, minutes, and seconds, e.g. `2d 4h 10s`." +msgstr "מספר ימים, שעות, דקות ושניות באנגלית, לדוגמא: `2d 4h 10s`." + +#: src/settings/setting_types.py:1349 +msgctxt "settype:channel_list|accepts" +msgid "Comma separated list of channel ids." +msgstr "תעודת זהות של ערוצים מופרדים באמצעות פסיק." + +#: src/settings/setting_types.py:1360 +msgctxt "settype:role_list|accepts" +msgid "Comma separated list of role ids." +msgstr "תעודת זהות של רולים מופרדים באמצעות פסיק." + +#: src/settings/setting_types.py:1376 +msgctxt "settype:stringlist|accepts" +msgid "Comma separated strings." +msgstr "טקסטים מופרדים באמצעות פסיק." + +#: src/settings/setting_types.py:1387 +msgctxt "settype:guildidlist|accepts" +msgid "Comma separated list of guild ids." +msgstr "תעודת זהות של שרתים מופרדים באמצעות פסיק." diff --git a/locales/he_IL/LC_MESSAGES/shop.po b/locales/he_IL/LC_MESSAGES/shop.po new file mode 100644 index 00000000..21a78a97 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/shop.po @@ -0,0 +1,603 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/shop/cog.py:108 +msgctxt "group:editshop" +msgid "editshop" +msgstr "ערוךחנות" + +#: src/modules/shop/cog.py:117 +msgctxt "group:shop" +msgid "shop" +msgstr "חנות" + +#: src/modules/shop/cog.py:123 +msgctxt "cmd:shop_open" +msgid "open" +msgstr "פתח" + +#: src/modules/shop/cog.py:124 +msgctxt "cmd:shop_open|desc" +msgid "Open the server shop." +msgstr "פתח את החנות השרת." + +#: src/modules/shop/cog.py:150 +msgctxt "cmd:shop_open|error:no_shops" +msgid "There is nothing to buy!" +msgstr "אין שום דבר שניתן לרכישה!" + +#: src/modules/shop/cog.py:212 +msgctxt "ui:stores|button:close|label" +msgid "Close" +msgstr "סגור" + +#: src/modules/shop/cog.py:219 +msgctxt "ui:stores|button:close|response|title" +msgid "Shop Closed" +msgstr "החנות נסגרה" + +#: src/modules/shop/shops/colours.py:104 +#, possible-python-brace-format +msgctxt "ui:colourstore|menu:buycolours|label" +msgid "{name} ({price} LC)" +msgstr "{name} ({price} מטבעות)" + +#: src/modules/shop/shops/colours.py:109 +#, possible-python-brace-format +msgctxt "ui:colourstore|menu:buycolours|label" +msgid "{name} (This is your colour!)" +msgstr "{name} (זה הצבע הנוכחי שלך!)" + +#: src/modules/shop/shops/colours.py:114 +#, possible-python-brace-format +msgctxt "ui:colourstore|menu:buycolours|desc" +msgid "Colour: {colour}" +msgstr "צבע: {colour}" + +#: src/modules/shop/shops/colours.py:119 +msgctxt "ui:colourstore|menu:buycolours|desc" +msgid "Colour: Unknown" +msgstr "צבע: לא ידוע" + +#: src/modules/shop/shops/colours.py:133 +msgctxt "shop:colours|name" +msgid "Colour Shop" +msgstr "חנות צבעים" + +#: src/modules/shop/shops/colours.py:172 +msgctxt "shop:colour|purchase|error:not_purchasable" +msgid "This item may not be purchased!" +msgstr "לא ניתן לרכוש את האייטם הזה" + +#: src/modules/shop/shops/colours.py:185 +msgctxt "shop:colour|purchase|error:no_guild" +msgid "Could not retrieve the server from Discord!" +msgstr "לא הצלחתי למצוא את השרת דרך דיסקורד!" + +#: src/modules/shop/shops/colours.py:195 +msgctxt "shop:colour|purchase|error:no_member" +msgid "Could not retrieve the member from Discord." +msgstr "לא הצלחתי למצוא את המשתמש דרך דיסקורד!" + +#: src/modules/shop/shops/colours.py:205 +msgctxt "shop:colour|purchase|error:no_role" +msgid "This colour role could not be found in the server." +msgstr "הרול צבע הזה לא נמצא בשרת." + +#: src/modules/shop/shops/colours.py:214 +#, possible-python-brace-format +msgctxt "shop:colour|purchase|error:low_balance" +msgid "" +"This item costs {coin}{amount}!\n" +"Your balance is {coin}{balance}" +msgstr "" +"האייטם עולה {coin}{amount}!\n" +"אבל יש לכם רק {coin}{balance}" + +#: src/modules/shop/shops/colours.py:229 +msgctxt "shop:colour|purchase|error:owned" +msgid "You already own this item!" +msgstr "כבר יש לך את האייטם הזה!" + +#: src/modules/shop/shops/colours.py:263 +msgctxt "shop:colour|purchase|error:failed_no_role" +msgid "This colour role no longer exists!" +msgstr "הרול צבע הזה כבר לא קיים!" + +#: src/modules/shop/shops/colours.py:270 +msgctxt "shop:colour|purchase|error:failed_permissions" +msgid "I do not have enough permissions to give you this colour role!" +msgstr "אין לי מספיק הרשאות כדי לתת לכם את הרול צבע הזה!" + +#: src/modules/shop/shops/colours.py:277 +msgctxt "shop:colour|purchase|error:failed_unknown" +msgid "An unknown error occurred while giving you this colour role!" +msgstr "שגיאה לא ידועה התחוללה כשניסיתי לתת לכם את הרול צבע הזה." + +#: src/modules/shop/shops/colours.py:346 +msgctxt "grp:editshop_colours" +msgid "colours" +msgstr "צבעים" + +#: src/modules/shop/shops/colours.py:351 +msgctxt "cmd:editshop_colours_create" +msgid "create" +msgstr "צור" + +#: src/modules/shop/shops/colours.py:354 +msgctxt "cmd:editshop_colours_create|desc" +msgid "Create a new colour role with the given colour." +msgstr "צור רול צבע עם הצבע הזה." + +#: src/modules/shop/shops/colours.py:358 +msgctxt "cmd:editshop_colours_create|param:colour" +msgid "colour" +msgstr "צבע" + +#: src/modules/shop/shops/colours.py:359 +msgctxt "cmd:editshop_colours_create|param:name" +msgid "name" +msgstr "שם" + +#: src/modules/shop/shops/colours.py:360 +msgctxt "cmd:editshop_colours_create|param:price" +msgid "price" +msgstr "מחיר" + +#: src/modules/shop/shops/colours.py:365 +msgctxt "cmd:editshop_colours_create|param:colour|desc" +msgid "What colour should the role be? (As a hex code, e.g. #AB22AB)" +msgstr "איזה צבע הרול הזה צריך להיות? (תשתמשו בקוד hex לדוגמא #AB22AB)" + +#: src/modules/shop/shops/colours.py:369 +msgctxt "cmd:editshop_colours_create|param:name|desc" +msgid "What should the colour role be called?" +msgstr "מה יהיה השם של הרול צבע הזה?" + +#: src/modules/shop/shops/colours.py:373 +msgctxt "cmd:editshop_colours_create|param:price|desc" +msgid "How much should the colour role cost?" +msgstr "כמה הרול צבע הזה יעלה?" + +#: src/modules/shop/shops/colours.py:395 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_create|error:parse_colour" +msgid "" +"I could not extract a colour value from `{colour}`!\n" +"Please enter the colour as a hex string, e.g. `#FA0BC1`" +msgstr "" +"לא הצלחתי להבין את הצבע מ `{colour}`!\n" +"אנא הכנס צבע בצורה של hex לדוגמא: `#FA0BC1`" + +#: src/modules/shop/shops/colours.py:405 +msgctxt "cmd:editshop_colours_create|error:perms" +msgid "" +"I do not have permission to create server roles!\n" +"Please either give me this permission, or create the role manually and use `/editshop colours add` instead." +msgstr "" +"אין לי הרשאות נכונות ליצור רולים לשרת.\n" +"אנא תן לי את ההרשאות, או צור את הרול ידנית ואז תמשתמש ב `/editshop colours add` במקום." + +#: src/modules/shop/shops/colours.py:421 +msgctxt "cmd:editshop_colours_create|error:max_colours" +msgid "" +"This server already has the maximum of `25` colour roles!\n" +"Please remove some before adding or creating more." +msgstr "" +"לשרת יש כבר את המקסימום של 25 צבעים\n" +"אנא מחק כמה מהם לפני שאתה יוצר חדשים." + +#: src/modules/shop/shops/colours.py:440 +msgctxt "cmd:editshop_colours_create|error:failed_unknown" +msgid "" +"An unknown Discord error occurred while creating your colour role!\n" +"Please try again in a few minutes." +msgstr "" +"שגיאה לא ידועה התחוללה כשניסיתי ליצור את הרול הזה.\n" +"אנא נסה שוב במספר דקות." + +#: src/modules/shop/shops/colours.py:490 +msgctxt "cmd:editshop_colours_create|resp:done|title" +msgid "Colour Role Created" +msgstr "רול צבע נוצר" + +#: src/modules/shop/shops/colours.py:494 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_create|resp:done|desc" +msgid "" +"You have created the role {mention}, and added it to the colour shop for " +"{coin}**{price}**!" +msgstr "" +"יצרתם את הרול {mention}, והוספת אותו לחנות צבעים עבור {coin}**{price}**! " +"בהצלחה!" + +#: src/modules/shop/shops/colours.py:501 +msgctxt "cmd:editshop_colours_create|resp:done|field:position_note|value" +msgid "" +"The new colour role was added below all other roles. Remember a member's " +"active colour is determined by their highest coloured role!" +msgstr "" +"הרול צבע החדש נוסף מתחת לכל הצבעים האחרים. זכור כי הרול האקטיבי הוא הרול הכי" +" מבניהם!" + +#: src/modules/shop/shops/colours.py:505 +msgctxt "cmd:editshop_colours_create|resp:done|field:position_note|name" +msgid "Note" +msgstr "פתקית" + +#: src/modules/shop/shops/colours.py:514 +msgctxt "cmd:editshop_colours_edit" +msgid "edit" +msgstr "ערוך" + +#: src/modules/shop/shops/colours.py:517 +msgctxt "cmd:editshop_colours_edit|desc" +msgid "Edit the name, colour, or price of a colour role." +msgstr "ערוך את השם, צבע והמחיר של רול הצבע." + +#: src/modules/shop/shops/colours.py:521 +msgctxt "cmd:editshop_colours_edit|param:role" +msgid "role" +msgstr "רול" + +#: src/modules/shop/shops/colours.py:522 +msgctxt "cmd:editshop_colours_edit|param:name" +msgid "name" +msgstr "שם" + +#: src/modules/shop/shops/colours.py:523 +msgctxt "cmd:editshop_colours_edit|param:colour" +msgid "colour" +msgstr "צבע" + +#: src/modules/shop/shops/colours.py:524 +msgctxt "cmd:editshop_colours_edit|param:price" +msgid "price" +msgstr "מחיר" + +#: src/modules/shop/shops/colours.py:529 +msgctxt "cmd:editshop_colours_edit|param:role|desc" +msgid "Select a colour role to edit." +msgstr "בחר בצבע לעריכה." + +#: src/modules/shop/shops/colours.py:533 +msgctxt "cmd:editshop_colours_edit|param:name|desc" +msgid "New name to give the colour role." +msgstr "שם חדש לתת לרול הצבע." + +#: src/modules/shop/shops/colours.py:537 +msgctxt "cmd:editshop_colours_edit|param:colour|desc" +msgid "New colour for the colour role (as hex, e.g. #AB12AB)." +msgstr "צבע חדש עבור רול הצבע (לדוגמא #AB12AB)" + +#: src/modules/shop/shops/colours.py:541 +msgctxt "cmd:editshop_colours_edit|param:price|desc" +msgid "New price for the colour role." +msgstr "מחיר חדש לרול הצבע." + +#: src/modules/shop/shops/colours.py:570 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_edit|error:invalid_role" +msgid "{mention} is not in the colour role shop!" +msgstr "{mention} לא נמצא בחנות צבעים." + +#: src/modules/shop/shops/colours.py:584 +msgctxt "cmd:editshop_colours_edit|error:no_args" +msgid "You must give me one of `name`, `colour`, or `price` to update!" +msgstr "אתם חייבים לתת לי שם, צבע ומחיר כדי לעדכן!" + +#: src/modules/shop/shops/colours.py:600 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_edit|error:parse_colour" +msgid "" +"I could not extract a colour value from `{colour}`!\n" +"Please enter the colour as a hex string, e.g. `#FA0BC1`" +msgstr "" +"לא הצלחתי להבין את הצבע מ `{colour}`!\n" +"אנא הכנס צבע בצורה של hex לדוגמא: `#FA0BC1`" + +#: src/modules/shop/shops/colours.py:615 +msgctxt "cmd:editshop_colours_edit|error:perms" +msgid "I do not have sufficient server permissions to edit this role!" +msgstr "אין לך הרשאות מתאימות בשרת עצמו כדי לערוך את הרול הזה!" + +#: src/modules/shop/shops/colours.py:631 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_edit|resp:done|line:price" +msgid "{tick} Set price to {coin}**{price}**" +msgstr "{tick} המחיר נקבע ל{coin}**{price}**" + +#: src/modules/shop/shops/colours.py:648 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_edit|resp:done|line:role" +msgid "{tick} Updated role to {mention}" +msgstr "{tick} הרול עודכן ל{mention}" + +#: src/modules/shop/shops/colours.py:658 +msgctxt "cmd:editshop_colours_edit|resp:done|embed:title" +msgid "Colour Role Updated" +msgstr "רול צבע עודכן" + +#: src/modules/shop/shops/colours.py:664 +msgctxt "cmd:editshop_colours_auto" +msgid "auto" +msgstr "אוטומטי" + +#: src/modules/shop/shops/colours.py:665 +msgctxt "cmd:editshop_colours_auto|desc" +msgid "Automatically create a set of colour roles." +msgstr "צור באופן אוטומטי סט של רולי צבעים עבור השרת שלך." + +#: src/modules/shop/shops/colours.py:674 +msgctxt "cmd:editshop_colours_add" +msgid "add" +msgstr "הוסף" + +#: src/modules/shop/shops/colours.py:677 +msgctxt "cmd:editshop_colours_add|desc" +msgid "Add an existing role to the colour shop." +msgstr "הוסף רול קיים לחנות של הצבעים." + +#: src/modules/shop/shops/colours.py:681 +msgctxt "cmd:editshop_colours_add|param:role" +msgid "role" +msgstr "רול" + +#: src/modules/shop/shops/colours.py:682 +msgctxt "cmd:editshop_colours_add|param:price" +msgid "price" +msgstr "מחיר" + +#: src/modules/shop/shops/colours.py:687 +msgctxt "cmd:editshop_colours_add|param:role|desc" +msgid "Select a role to add to the colour shop." +msgstr "בחר רול להוסיף לחנות צבעים." + +#: src/modules/shop/shops/colours.py:691 +msgctxt "cmd:editshop_colours_add|param:price|desc" +msgid "How much should this role cost?" +msgstr "כמה הרול הזה יעלה?" + +#: src/modules/shop/shops/colours.py:716 +msgctxt "cmd:editshop_colours_add|error:max_colours" +msgid "" +"This server already has the maximum of `25` colour roles!\n" +"Please remove some before adding or creating more." +msgstr "" +"לשרת יש כבר את המקסימום של 25 צבעים\n" +"אנא מחק כמה מהם לפני שאתה יוצר חדשים." + +#: src/modules/shop/shops/colours.py:725 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_add|error:role_exists" +msgid "The role {mention} is already registered as a colour role!" +msgstr "הרול {mention} כבר רשום בתור רול צבע בשרת הזה!" + +#: src/modules/shop/shops/colours.py:734 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_add|error:role_perms" +msgid "" +"I do not have enough permissions to assign the role {mention}! Please ensure" +" I have the `MANAGE_ROLES` permission, and that my top role is above this " +"role." +msgstr "" +"אין לי מספיק הרשאות כדי לתת את הרול {mention}! בדקו שיש לי את ההרשאה " +"`MANAGE_ROLES`, ושהרול שלי הוא הכי גבוה ברשימה של הרולים שלכם." + +#: src/modules/shop/shops/colours.py:745 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_add|error:caller_perms" +msgid "" +"You do not have sufficient server permissions to assign {mention} to the " +"shop! You must have `MANAGE_ROLES`, and your top role must be above this " +"role." +msgstr "" +"אין לך מספיק הרשאות כדי להוסיף את {mention} לחנות! חייב להיות לך את ההרשאות " +"`MANAGE_ROLES`, והרול שלך חייב להיות מעל הרול שאתה יוצר." + +#: src/modules/shop/shops/colours.py:754 +msgctxt "cmd:editshop_colours_add|error:role_has_admin" +msgid "" +"I refuse to add an administrator role to the LionCoin shop. That is a really" +" bad idea." +msgstr "אני לא יכול להרשות לכם להוסיף רול אדמין לחנות, זה רעיון ממש לא טוב." + +#: src/modules/shop/shops/colours.py:775 +msgctxt "cmd:editshop_colours_add|resp:done|embed:title" +msgid "Colour Role Created" +msgstr "רול צבע נוצר" + +#: src/modules/shop/shops/colours.py:778 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_add|resp:done|embed:desc" +msgid "You have added {mention} to the colour shop for {coin}**{price}**!" +msgstr "" +"בחרתם את הרול {mention}, והוספת אותו לחנות צבעים עבור {coin}**{price}**! " +"בהצלחה!" + +#: src/modules/shop/shops/colours.py:786 +msgctxt "cmd:editshop_colours_clear" +msgid "clear" +msgstr "נקה" + +#: src/modules/shop/shops/colours.py:789 +msgctxt "cmd:editshop_colours_clear|desc" +msgid "" +"Remove all the colour roles from the shop, and optionally delete the roles." +msgstr "הסר את כל הרולי צבעים מהחנות, ואפילו הסר אותם באופן כללי (אופציונלי)." + +#: src/modules/shop/shops/colours.py:793 +msgctxt "cmd:editshop_colours_clear|param:delete" +msgid "delete_roles" +msgstr "מחק_רול" + +#: src/modules/shop/shops/colours.py:798 +msgctxt "cmd:editshop_colours_clear|param:delete|desc" +msgid "Also delete the associated roles." +msgstr "מחק גם את הרולים הקשורים." + +#: src/modules/shop/shops/colours.py:840 +msgctxt "cmd:editshop_colours_clear|error:no_colours" +msgid "There are no coloured roles to remove!" +msgstr "אין רולים צבעים למחיקה!" + +#: src/modules/shop/shops/colours.py:884 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:clear" +msgid "{tick} Colour shop cleared." +msgstr "{tick} חנות הצבעים נוקתה." + +#: src/modules/shop/shops/colours.py:895 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:refunding" +msgid "{loading} Refunded **{count}/{total}** members." +msgstr "{loading} החזרתי את הכסף ל**{count}/{total}** משתמשים." + +#: src/modules/shop/shops/colours.py:901 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:refunded" +msgid "{tick} Refunded **{total}/{total}** members." +msgstr "{tick} החזרתי את הכסף ל**{total}/{total}** משתמשים." + +#: src/modules/shop/shops/colours.py:914 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted_failed" +msgid "" +"{emoji} Deleted **{count}/{total}** colour roles. (**{failed}** failed!)" +msgstr "{emoji} מחקתי **{count}/{total}** רולי צבעים. (**{failed}** נכשלו!)" + +#: src/modules/shop/shops/colours.py:919 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted" +msgid "{emoji} Deleted **{count}/{total}** colour roles." +msgstr "{emoji} מחקתי **{count}/{total}** רולי צבעים. " + +#: src/modules/shop/shops/colours.py:968 +msgctxt "cmd:editshop_colours_remove" +msgid "remove" +msgstr "הסר" + +#: src/modules/shop/shops/colours.py:971 +msgctxt "cmd:editshop_colours_remove|desc" +msgid "Remove a specific colour role from the shop." +msgstr "מחק רול צבעים ספציפי מהחנות." + +#: src/modules/shop/shops/colours.py:975 +msgctxt "cmd:editshop_colours_remove|param:role" +msgid "role" +msgstr "רול" + +#: src/modules/shop/shops/colours.py:976 +msgctxt "cmd:editshop_colours_remove" +msgid "delete_role" +msgstr "רול_למחיקה" + +#: src/modules/shop/shops/colours.py:981 +msgctxt "cmd:editshop_colours_remove|param:role|desc" +msgid "Select the colour role to remove." +msgstr "בחר בצבע למחיקה." + +#: src/modules/shop/shops/colours.py:985 +msgctxt "cmd:editshop_colours_remove|param:delete_role|desc" +msgid "Whether to delete the associated role." +msgstr "האם למחוק גם את הרולים הקשורים." + +#: src/modules/shop/shops/colours.py:1010 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_remove|error:not_colour" +msgid "{mention} is not in the colour role shop!" +msgstr "{mention} לא נמצא בחנות צבעים." + +#: src/modules/shop/shops/colours.py:1028 +msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" +msgid "Successfully deleted the role." +msgstr "הרול נמחק בהצלחה." + +#: src/modules/shop/shops/colours.py:1033 +msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" +msgid "I do not have sufficient permissions to delete the role." +msgstr "אין לך הרשאות מתאימות בשרת עצמו כדי לערוך את הרול הזה!" + +#: src/modules/shop/shops/colours.py:1038 +msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" +msgid "Failed to delete the role for an unknown reason." +msgstr "לא הצלחתי למחוק את הרול בעקבות שגיאה לא ידועה." + +#: src/modules/shop/shops/colours.py:1043 +msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" +msgid "Could not find the role in order to delete it." +msgstr "לא הצלחתי למצוא את הרול על מנת למחוק אותו." + +#: src/modules/shop/shops/colours.py:1054 +#, possible-python-brace-format +msgctxt "cmd:editshop_colours_remove|resp:done|embed:desc" +msgid "" +"Removed {mention} from the colour shop.\n" +"{delete_line}" +msgstr "" +"מחקתי את {mention} מחנות הרולים\n" +"{delete_line}" + +#: src/modules/shop/shops/colours.py:1114 +msgctxt "ui:colourstore|menu:buycolours|embed:error|title" +msgid "Purchase Failed!" +msgstr "הרכישה נכשלה!" + +#: src/modules/shop/shops/colours.py:1125 +#, possible-python-brace-format +msgctxt "ui:colourstore|menu:buycolours|resp:done|desc" +msgid "{tick} You have purchased {mention}" +msgstr "{tick} קנית את {mention} בהצלחה" + +#: src/modules/shop/shops/colours.py:1160 +msgctxt "ui:colourstore|menu:buycolours|placeholder" +msgid "There are no colour roles available to purchase!" +msgstr "אין רולים צבעים לרכישה!" + +#: src/modules/shop/shops/colours.py:1166 +msgctxt "ui:colourstore|menu:buycolours|placeholder" +msgid "Select a colour role to purchase!" +msgstr "בחר רול צבע לרכישה!" + +#: src/modules/shop/shops/colours.py:1195 +#, possible-python-brace-format +msgctxt "ui:colourstore|embed|line:owned_item" +msgid "`[{j:02}]` | `{price} LC` | {mention} (You own this!)" +msgstr "`[{j:02}]` | `{price} מטבעות` | {mention} (יש לך את הצבע הזה!)" + +#: src/modules/shop/shops/colours.py:1200 +#, possible-python-brace-format +msgctxt "ui:colourstore|embed|line:item" +msgid "`[{j:02}]` | `{price} LC` | {mention}" +msgstr "`[{j:02}]` | `{price} מטבעות` | {mention} " + +#: src/modules/shop/shops/colours.py:1207 +msgctxt "ui:colourstore|embed|desc" +msgid "No colour roles available for purchase!" +msgstr "אין רולים צבעים לרכישה!" + +#: src/modules/shop/shops/colours.py:1210 +msgctxt "ui:colourstore|embed|title" +msgid "Colour Role Shop" +msgstr "חנות רולי צבעים" diff --git a/locales/he_IL/LC_MESSAGES/statistics.po b/locales/he_IL/LC_MESSAGES/statistics.po new file mode 100644 index 00000000..908ba267 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/statistics.po @@ -0,0 +1,735 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/statistics/cog.py:42 +msgctxt "cmd:me" +msgid "me" +msgstr "אני" + +#: src/modules/statistics/cog.py:45 +msgctxt "cmd:me|desc" +msgid "Display your personal profile and summary statistics." +msgstr "הצג את הפרופיל האישי שלך וסיכום סטטיסטיקות הפעילות שלך." + +#: src/modules/statistics/cog.py:55 +msgctxt "cmd:stats" +msgid "stats" +msgstr "סטטיסטיקות" + +#: src/modules/statistics/cog.py:58 +msgctxt "cmd:stats|desc" +msgid "Weekly and monthly statistics for your recent activity." +msgstr "סטטיסטיקות שבועיות וחודשיות של הפעילות האחרונה שלך." + +#: src/modules/statistics/cog.py:71 +msgctxt "cmd:leaderboard" +msgid "leaderboard" +msgstr "לוח השגים" + +#: src/modules/statistics/cog.py:74 +msgctxt "cmd:leaderboard|desc" +msgid "Server leaderboard." +msgstr "לוח השגים של השרת" + +#: src/modules/statistics/cog.py:91 +msgctxt "cmd:configure_statistics" +msgid "statistics" +msgstr "סטטיסטיקות" + +#: src/modules/statistics/cog.py:92 +msgctxt "cmd:configure_statistics|desc" +msgid "Statistics configuration panel" +msgstr "תפריט הגדרות סטטיסטיקת פעילות" + +#: src/modules/statistics/cog.py:95 +msgctxt "cmd:configure_statistics|param:season_start" +msgid "season_start" +msgstr "התחלת_סשן" + +#: src/modules/statistics/cog.py:100 +msgctxt "cmd:configure_statistics|param:season_start|desc" +msgid "" +"Time from which to start counting activity for rank badges and season " +"leaderboards. (YYYY-MM-DD)" +msgstr "" +"הזמן שבו אתחיל לספור את הפעילות של האנשים (אנחנו קוראים לזה \"עונה\") (YYYY-" +"MM-DD)" + +#: src/modules/statistics/cog.py:130 +#, possible-python-brace-format +msgctxt "cmd:configure_statistics|resp:success|desc" +msgid "" +"Activity ranks and season leaderboard will now be measured from " +"{season_start}." +msgstr "פעילות דרגות ולוח השיאים עכשיו יתחילו מ {season_start}." + +#: src/modules/statistics/settings.py:37 +msgctxt "settype:stat|output:voice" +msgid "`Voice`" +msgstr "`קול`" + +#: src/modules/statistics/settings.py:38 +msgctxt "settype:stat|output:text" +msgid "`Text`" +msgstr "טקסט" + +#: src/modules/statistics/settings.py:39 +msgctxt "settype:stat|output:anki" +msgid "`Anki`" +msgstr "אנקי" + +#: src/modules/statistics/settings.py:42 +msgctxt "settype:stat|input_format:voice" +msgid "Voice" +msgstr "קול" + +#: src/modules/statistics/settings.py:43 +msgctxt "settype:stat|input_format:text" +msgid "Text" +msgstr "טקסט" + +#: src/modules/statistics/settings.py:44 +msgctxt "settype:stat|input_format:anki" +msgid "Anki" +msgstr "אנקי" + +#: src/modules/statistics/settings.py:47 +msgctxt "settype:stat|input_pattern:voice" +msgid "voice|study" +msgstr "קול|למידה" + +#: src/modules/statistics/settings.py:48 +msgctxt "settype:stat|input_pattern:text" +msgid "text|messages" +msgstr "טקסט|הודעות" + +#: src/modules/statistics/settings.py:49 +msgctxt "settype:stat|input_pattern:anki" +msgid "anki" +msgstr "אנקי" + +#: src/modules/statistics/settings.py:53 +msgctxt "settype:state|accepts" +msgid "Voice/Text/Anki" +msgstr "קול/טקסט/אנקי" + +#: src/modules/statistics/settings.py:66 +msgctxt "userset:show_global_stats" +msgid "global_stats" +msgstr "סטטיסטיקות_גלובליות" + +#: src/modules/statistics/settings.py:69 +msgctxt "userset:show_global_stats|desc" +msgid "Whether displayed statistics include all your servers." +msgstr "האם הסטטיסטקות יכללו את כל השרתים שאתה נמצא בהם ביחד." + +#: src/modules/statistics/settings.py:73 +msgctxt "userset:show_global_stats|long_desc" +msgid "" +"Whether statistics commands display combined stats for all servers or just " +"your current server." +msgstr "" +"האם פקודות סטטיקטיקה יראו את הפעילות של המשתמשים מכל השרתים או רק השרת " +"הנוכחי." + +#: src/modules/statistics/settings.py:88 +msgctxt "guildset:season_start" +msgid "season_start" +msgstr "התחלת_סשן" + +#: src/modules/statistics/settings.py:91 +msgctxt "guildset:season_start|desc" +msgid "Start of the current statistics season." +msgstr "התחל את העונה החדשה של הסטטיסטיקות בשרת." + +#: src/modules/statistics/settings.py:95 +msgctxt "guildset:season_start|long_desc" +msgid "" +"Activity ranks will be determined based on tracked activity since this time," +" and the leaderboard will display activity since this time by default. Unset" +" to disable seasons and use all-time statistics instead." +msgstr "" +"דרגות פעילות יקבעו על בסיס פעילות נעקב מהתאריך הזה, ולוח השיאים יראה גם את " +"הפעילות מהתאריך הזה כברירת מחדל. הסר כדי לבטל את העונות ובכדי להשתמש בתצוגה " +"מכל הזמנים במקום מזמן מסויים." + +#: src/modules/statistics/settings.py:101 +msgctxt "guildset:season_start|accepts" +msgid "The season start time in the form YYYY-MM-DD HH:MM" +msgstr "אנא השתמשו בYYYY-MM-DD HH:MM" + +#: src/modules/statistics/settings.py:105 +msgctxt "guildset:season_start|notset" +msgid "Not Set (Using all-time statistics)" +msgstr "לא נבחר (משתמש בסטטיסטיקות מכל הזמנים)" + +#: src/modules/statistics/settings.py:124 +#, possible-python-brace-format +msgctxt "guildset:season_start|parse|error:future_time" +msgid "Provided season start time {timestamp} is in the future!" +msgstr "התאריך שהבאת לתחילת העונה {timestamp} הוא בעתיד!" + +#: src/modules/statistics/settings.py:136 +#, possible-python-brace-format +msgctxt "guildset:season_start|set_response|set" +msgid "" +"The leaderboard season and activity ranks will now count from {timestamp}. " +"Member ranks will update when they are next active. Use {rank_cmd} to " +"refresh immediately." +msgstr "" +"לוח השיאים עכשיו יציג את הסטטיסטיקות של של העונה שקבעת שתתחיל מ{timestamp}. הדרגות של האנשים יעודכנו בפעם הבאה שהם יהיו פעילים.\n" +"השתמשו ב {rank_cmd} אם אתם רוצים לעדכן אותם באופן מיידי." + +#: src/modules/statistics/settings.py:145 +#, possible-python-brace-format +msgctxt "guildset:season_start|set_response|unset" +msgid "" +"The leaderboard and activity ranks will now count all-time statistics. " +"Member ranks will update when they are next active. Use {rank_cmd} to " +"refresh immediately." +msgstr "" +"לוח השיאים עכשיו יציג את הסטטיסטיקות של כל הזמנים. הדרגות של האנשים יעודכנו בפעם הבאה שהם יהיו פעילים.\n" +"השתמשו ב {rank_cmd} אם אתם רוצים לעדכן אותם באופן מיידי." + +#: src/modules/statistics/settings.py:156 +msgctxt "guildset:unranked_roles" +msgid "unranked_roles" +msgstr "רולים_ללא_מעקב" + +#: src/modules/statistics/settings.py:159 +msgctxt "guildset:unranked_roles|desc" +msgid "Roles to exclude from the leaderboards." +msgstr "רולים שלא אציג בלוח השיאים." + +#: src/modules/statistics/settings.py:163 +msgctxt "guildset:unranked_roles|long_desc" +msgid "" +"When set, members with *any* of these roles will not appear on the " +"/leaderboard ranking list." +msgstr "כשמופעל, אנשים עם *אחד* מהרולים האלו לא יופיע בלוח השיאים." + +#: src/modules/statistics/settings.py:167 +msgctxt "guildset:unranked_roles|accepts" +msgid "Comma separated list of unranked role names or ids." +msgstr "" +"רשימה מופרדת עם פסיקים של הערוצים, רולים, אנשים ומספר זהות של מי שלא תרצו " +"שאתן לו דרגות." + +#: src/modules/statistics/settings.py:183 +msgctxt "guildset:unranked_roles|set_using" +msgid "Role selector below." +msgstr "בחירת רולים בתחתית." + +#: src/modules/statistics/settings.py:193 +#, possible-python-brace-format +msgctxt "guildset:unranked_roles|set_response|set" +msgid "" +"Members of the following roles will not appear on the leaderboard: {roles}" +msgstr "אנשים עם הרולים הבאים לא יפיעו בלוח השיאים: {roles}" + +#: src/modules/statistics/settings.py:200 +msgctxt "guildset:unranked_roles|set_response|unset" +msgid "You have cleared the unranked role list." +msgstr "ניקית את הרשימה של הרולים שאני לא עוקב אחריהם." + +#: src/modules/statistics/settings.py:214 +msgctxt "guildset:visible_stats" +msgid "visible_stats" +msgstr "סטטיסטיקות_זמינות" + +#: src/modules/statistics/settings.py:217 +msgctxt "guildset:visible_stats|desc" +msgid "Which statistics will be visible in the statistics commands." +msgstr "" +"איזה סוג סטטיסטיקה יהיה זמין כמשתמשים ישתמשו בפקודה שמראה להם את הסטטיסטיקה " +"שלהם." + +#: src/modules/statistics/settings.py:221 +msgctxt "guildset:visible_stats|desc" +msgid "" +"Choose which statistics types to display in the leaderboard and statistics " +"commands." +msgstr "בחר באיזה סוג סטטיסטיקה לוח השיאים ופקודות הסטטיסטיקה ישתמשו." + +#: src/modules/statistics/settings.py:225 +msgctxt "guildset:visible_stats|accepts" +msgid "Voice, Text, Anki" +msgstr "קול, טקסט, אנקי" + +#: src/modules/statistics/settings.py:246 +msgctxt "guildset:visible_stats|set_using" +msgid "Option menu below." +msgstr "תפריט בחירה למטה." + +#: src/modules/statistics/settings.py:254 +#, possible-python-brace-format +msgctxt "guildset:visible_stats|set_response" +msgid "Members will be able to view the following statistics types: {types}" +msgstr "משתמשים יוכלו לראות את הסוגי סטטיסטיקה הבאים: {types}" + +#: src/modules/statistics/settings.py:264 +msgctxt "guildset:default_stat" +msgid "default_stat" +msgstr "ברירתמחדל_סטטיסטיקה" + +#: src/modules/statistics/settings.py:267 +msgctxt "guildset:default_stat|desc" +msgid "Statistic type to display by default in setting dialogues." +msgstr "סוג הסטטיסטיקה שתרצו לראות כשאתם משחקים עם ההגדרות." + +#: src/modules/statistics/settings.py:271 +msgctxt "guildset:default_stat|long_desc" +msgid "Which statistic type to display by default in setting dialogues." +msgstr "איזה סוג סטטיסטיקה תרצו להראות כברירת מחדל בהגדרות?" + +#: src/modules/statistics/settings.py:304 +msgctxt "ui:statistics_config|menu:unranked_roles|placeholder" +msgid "Select Unranked Roles" +msgstr "בחר רולים ללא מעקב" + +#: src/modules/statistics/settings.py:328 +msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:voice" +msgid "Voice Activity" +msgstr "פעילות חדרי קול" + +#: src/modules/statistics/settings.py:333 +msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:study" +msgid "Study Statistics" +msgstr "סטטיסטיקת למידה" + +#: src/modules/statistics/settings.py:343 +msgctxt "ui:statistics_config|menu:visible_stats|item:text" +msgid "Message Activity" +msgstr "פעילות הודעות" + +#: src/modules/statistics/settings.py:351 +msgctxt "ui:statistics_config|menu:visible_stats|item:anki" +msgid "Anki Reviews" +msgstr "ביקורות אנקי" + +#: src/modules/statistics/settings.py:362 +msgctxt "ui:statistics_config|menu:visible_stats|placeholder" +msgid "Select Visible Statistics" +msgstr "בחר סטטיסטקות ציבוריות" + +#: src/modules/statistics/settings.py:383 +msgctxt "ui:statistics_config|embed|title" +msgid "Statistics Configuration Panel" +msgstr "תפריט הגדרות סטטיסטיקת פעילות" + +#: src/modules/statistics/settings.py:405 +msgctxt "dash:stats|title" +msgid "Activity Statistics Configuration ({commands[configure statistics]})" +msgstr "תפריט סטטיסטיקת פעילות ({commands[configure statistics]})" + +#: src/modules/statistics/settings.py:409 +msgctxt "dash:stats|dropdown|placeholder" +msgid "Activity Statistics Panel" +msgstr "תפריט סטטיסטיקת פעילות" + +#: src/modules/statistics/ui/goals.py:92 +msgctxt "ui:MonthlyUI|name" +msgid "Monthly" +msgstr "חודשי" + +#: src/modules/statistics/ui/goals.py:135 +msgctxt "ui:WeeklyUI|name" +msgid "Weekly" +msgstr "שבועי" + +#: src/modules/statistics/ui/summary.py:18 +msgctxt "ui:SummaryUI|name" +msgid "Summary" +msgstr "סיכום" + +#: src/modules/statistics/ui/weeklymonthly.py:96 +msgctxt "menu:stat_type|opt:weekly_voice|name" +msgid "Weekly Voice Statistics" +msgstr "סיכום סטטיסטיקות שבועיות (קוליות)" + +#: src/modules/statistics/ui/weeklymonthly.py:101 +msgctxt "menu:stat_type|opt:weekly_text|name" +msgid "Weekly Text Statistics" +msgstr "סטטיסטיקות טקסט שבועיות" + +#: src/modules/statistics/ui/weeklymonthly.py:106 +msgctxt "menu:stat_type|opt:weekly_anki|name" +msgid "Weekly Anki Statistics" +msgstr "סטטיסטיקות אנקי שבועיות" + +#: src/modules/statistics/ui/weeklymonthly.py:112 +msgctxt "menu:stat_type|opt:monthly_voice|name" +msgid "Monthly Voice Statistics" +msgstr "סטטיסטיקות קול חודשיות" + +#: src/modules/statistics/ui/weeklymonthly.py:117 +msgctxt "menu:stat_type|opt:monthly_text|name" +msgid "Monthly Text Statistics" +msgstr "סטטיסטיקות טקסט חודשיות" + +#: src/modules/statistics/ui/weeklymonthly.py:122 +msgctxt "menu:stat_type|opt:monthly_anki|name" +msgid "Monthly Anki Statistics" +msgstr "סטטיסטיקות אנקי חודשיות" + +#: src/modules/statistics/ui/weeklymonthly.py:144 +msgctxt "modal:goal_editor|field:task_goal|label" +msgid "Task goal" +msgstr "מטרת מטלות" + +#: src/modules/statistics/ui/weeklymonthly.py:148 +msgctxt "modal:goal_editor|field:task_goal|placeholder" +msgid "Enter the number of tasklist tasks you aim to do" +msgstr "הכנס את מספר המטלות שאתה מכוון להגיע אליו" + +#: src/modules/statistics/ui/weeklymonthly.py:159 +#, possible-python-brace-format +msgctxt "modal:goal_editor|field:task_goal|error:NAN" +msgid "The provided task goal `{input}` is not a number! Please try again." +msgstr "המטרה שהבאת `{input}` אינה מספר, אנא נסו שוב." + +#: src/modules/statistics/ui/weeklymonthly.py:181 +msgctxt "modal:goal_editor|field:voice_goal|label" +msgid "Study time goal" +msgstr "מטרת זמן למידה" + +#: src/modules/statistics/ui/weeklymonthly.py:185 +msgctxt "modal:goal_editor|field:voice_goal|placeholder" +msgid "Enter a number of hours of study to aim for." +msgstr "הכנס את מספר השעות שאתה רוצה ללמוד." + +#: src/modules/statistics/ui/weeklymonthly.py:190 +msgctxt "modal:goal_editor|field:text_goal|label" +msgid "Message goal" +msgstr "מטרת הודעות" + +#: src/modules/statistics/ui/weeklymonthly.py:194 +msgctxt "modal:goal_editor|field:text_goal|placeholder" +msgid "Enter a message count to aim for." +msgstr "הכנס את מספר ההודעות שתרצה לשלוח." + +#: src/modules/statistics/ui/weeklymonthly.py:199 +msgctxt "modal:goal_editor|field:anki_goal|label" +msgid "Card goal" +msgstr "מטרות כרטיסים" + +#: src/modules/statistics/ui/weeklymonthly.py:203 +msgctxt "modal:goal_editor|field:anki_goal|label" +msgid "Enter a number of card revisions to aim for." +msgstr "הכנס את מספר הקלפים שתרצה לעשות." + +#: src/modules/statistics/ui/weeklymonthly.py:216 +#, possible-python-brace-format +msgctxt "modal:goal_editor|field:voice_goal|error:NAN" +msgid "" +"The provided study time goal `{input}` is not a number! Please try again." +msgstr "המטרה שהבאת `{input}` אינה מספר, אנא נסו שוב." + +#: src/modules/statistics/ui/weeklymonthly.py:223 +#, possible-python-brace-format +msgctxt "modal:goal_editor|field:text_goal|error:NAN" +msgid "The provided message goal `{input}` is not a number! Please try again." +msgstr "המטרה שהבאת `{input}` אינה מספר, אנא נסו שוב." + +#: src/modules/statistics/ui/weeklymonthly.py:230 +#, possible-python-brace-format +msgctxt "modal:goal_editor|field:anki_goal|error:NAN" +msgid "The provided card goal `{input}` is not a number! Please try again." +msgstr "המטרה שהבאת `{input}` אינה מספר, אנא נסו שוב." + +#: src/modules/statistics/ui/weeklymonthly.py:252 +msgctxt "modal:goal_editor|field:weekly_task_editor|label" +msgid "Tasks to complete this week (one per line)" +msgstr "מטלות להשלים בשבוע הזה (אחת בכל שורה)" + +#: src/modules/statistics/ui/weeklymonthly.py:256 +msgctxt "modal:goal_editor|field:weekly_task_editor|placeholder" +msgid "" +"[ ] Write my biology essay\n" +"[x] Complete the second maths assignment\n" +msgstr "" +"[ ] לקרוא את הסיכום ביולוגיה שלי\n" +"[x] להגיש שיעורי בית למורה שאני שונא\n" + +#: src/modules/statistics/ui/weeklymonthly.py:262 +msgctxt "modal:goal_editor|field:monthly_task_editor|label" +msgid "Tasks to complete this month (one per line)" +msgstr "מטלות להשלים בחודש הזה (אחת בכל שורה)" + +#: src/modules/statistics/ui/weeklymonthly.py:266 +msgctxt "modal:goal_editor|field:monthly_task_editor|placeholder" +msgid "" +"[ ] Write my biology essay\n" +"[x] Complete the second maths assignment\n" +msgstr "" +"[ ] לקרוא את הסיכום ביולוגיה שלי\n" +"[x] להגיש שיעורי בית למורה שאני שונא\n" + +#: src/modules/statistics/ui/weeklymonthly.py:284 +#, possible-python-brace-format +msgctxt "modal:goal_editor||field:task_editor|error:parse_general" +msgid "" +"Malformed task!\n" +"`{input}`" +msgstr "" +"מטלה שגויה!\n" +"`{input}`" + +#: src/modules/statistics/ui/weeklymonthly.py:301 +msgctxt "modal:goal_editor|title" +msgid "Weekly goal editor" +msgstr "עורך מטרות שבועיות" + +#: src/modules/statistics/ui/weeklymonthly.py:306 +msgctxt "modal:goal_editor|monthly|title" +msgid "Monthly goal editor" +msgstr "ערוך מטרות חודשיות" + +#: src/modules/statistics/ui/weeklymonthly.py:499 +msgctxt "ui:weeklymonthly|button:edit_goals|label" +msgid "Edit Goals" +msgstr "ערוך מטרות" + +#: src/modules/statistics/ui/weeklymonthly.py:515 +#, possible-python-brace-format +msgctxt "ui:weeklymonthly|menu:period|monthly|label" +msgid "{month} {year}" +msgstr "{month} {year}" + +#: src/modules/statistics/ui/weeklymonthly.py:530 +#, possible-python-brace-format +msgctxt "ui:weeklymonthly|menu:period|weekly|label" +msgid "{year} W{week}" +msgstr "{year} W{week}" + +#: src/modules/statistics/ui/weeklymonthly.py:534 +#, possible-python-brace-format +msgctxt "ui:weeklymonthly|menu:period|weekly|desc" +msgid "" +"{start_day} {start_month} {start_year} to {end_day} {end_month} {end_year}" +msgstr "" +"{start_day} {start_month} {start_year} to {end_day} {end_month} {end_year}" + +#: src/modules/statistics/ui/weeklymonthly.py:612 +msgctxt "ui:weeklymonthly|button:period|close|label" +msgid "Close Selector" +msgstr "סגור תפריט" + +#: src/modules/statistics/ui/weeklymonthly.py:617 +msgctxt "ui:weeklymonthly|button:period|weekly|label" +msgid "Select Week" +msgstr "בחר שבוע" + +#: src/modules/statistics/ui/weeklymonthly.py:622 +msgctxt "ui:weeklymonthly|button:period|monthly|label" +msgid "Select Month" +msgstr "בחר חודש" + +#: src/modules/statistics/ui/weeklymonthly.py:687 +msgctxt "ui:weeklymonthly|menu:period|weekly|placeholder" +msgid "Select a week to display" +msgstr "בחר שבוע להצגה" + +#: src/modules/statistics/ui/weeklymonthly.py:692 +msgctxt "ui:weeklymonthly|menu:period|monthly|placeholder" +msgid "Select a month to display" +msgstr "בחר חודש להצגה" + +#: src/modules/statistics/ui/weeklymonthly.py:714 +msgctxt "ui:WeeklyMonthly|button:global|resp:success" +msgid "" +"You will now see combined statistics from all your servers (where " +"applicable)! Press again to revert." +msgstr "" +"עכשיו תוכל לראות סטטיסטיקות מכל השרתים שבהם אתה נמצא! (וגם אני). לחץ שוב על " +"מנת לראות סטטיסטיקות רק מהשרת הזה." + +#: src/modules/statistics/ui/weeklymonthly.py:727 +msgctxt "ui:WeeklyMonthly|button:global|mode:local" +msgid "Server Statistics" +msgstr "סטטיסטיקות שקת" + +#: src/modules/statistics/ui/weeklymonthly.py:732 +msgctxt "ui:WeeklyMonthly|button:global|mode:global" +msgid "Global Statistics" +msgstr "סטטיסטיקות גלובליות" + +#: src/modules/statistics/ui/profile.py:41 +msgctxt "modal:profile_editor|field:editor|label" +msgid "Profile Tags (One line per tag)" +msgstr "תאגי כרטיס (שורה חדשה עבור כל תאג)" + +#: src/modules/statistics/ui/profile.py:45 +msgctxt "modal:profile_editor|field:editor|placeholder" +msgid "" +"Mathematician\n" +"Loves Cats" +msgstr "" +"מתמטיקאי\n" +"אוהב חתולים" + +#: src/modules/statistics/ui/profile.py:53 +msgctxt "modal:profile_editor|title" +msgid "Profile Tag Editor" +msgstr "עורך כרטיס אישי" + +#: src/modules/statistics/ui/profile.py:71 +#, possible-python-brace-format +msgctxt "modal:profile_editor|error:too_many_tags" +msgid "Too many tags! You can have at most `{limit}` profile tags." +msgstr "יותר מידי תאגים! אתה יכול להוסיף רק `{limit}` לכרטיס שלך." + +#: src/modules/statistics/ui/profile.py:92 +msgctxt "menu:stat_type|opt:voice|name" +msgid "Voice Statistics" +msgstr "סטטיסטיקות קול" + +#: src/modules/statistics/ui/profile.py:97 +msgctxt "menu:stat_type|opt:text|name" +msgid "Text Statistics" +msgstr "סטטיסטיקות טקסט" + +#: src/modules/statistics/ui/profile.py:102 +msgctxt "menu:stat_type|opt:anki|name" +msgid "Anki Statistics" +msgstr "סטטיסטיקות אנקי" + +#: src/modules/statistics/ui/profile.py:190 +msgctxt "modal:profile_editor|resp:success" +msgid "Your profile has been updated!" +msgstr "הפרופיל שלך עודכן!" + +#: src/modules/statistics/ui/profile.py:200 +msgctxt "ui:profile_card|button:edit|label" +msgid "Edit Profile Badges" +msgstr "ערוך תגיות כרטיס תלמיד" + +#: src/modules/statistics/ui/profile.py:219 +msgctxt "ui:profile_card|button:statistics|label:hide" +msgid "Hide Statistics" +msgstr "הסתדר סטטיסטיקה" + +#: src/modules/statistics/ui/profile.py:224 +msgctxt "ui:profile_card|button:statistics|label:show" +msgid "Show Statistics" +msgstr "הצג סטטיסטיקות" + +#: src/modules/statistics/ui/profile.py:253 +msgctxt "ui:Profile|button:global|resp:success" +msgid "" +"You will now see statistics from all you servers (where applicable)! Press " +"again to revert." +msgstr "" +"עכשיו תוכל לראות סטטיסטיקות מכל השרתים שבהם אתה נמצא! (וגם אני). לחץ שוב על " +"מנת לראות סטטיסטיקות רק מהשרת הזה." + +#: src/modules/statistics/ui/leaderboard.py:231 +msgctxt "ui:leaderboard|menu:stats|placeholder" +msgid "Select Activity Type" +msgstr "בחר סוג פעילות" + +#: src/modules/statistics/ui/leaderboard.py:240 +msgctxt "ui:leaderboard|menu:stats|item:voice" +msgid "Voice Activity" +msgstr "פעילות חדרי קול" + +#: src/modules/statistics/ui/leaderboard.py:251 +msgctxt "ui:leaderboard|menu:stats|item:study" +msgid "Study Statistics" +msgstr "סטטיסטיקת למידה" + +#: src/modules/statistics/ui/leaderboard.py:262 +msgctxt "ui:leaderboard|menu:stats|item:message" +msgid "Message Activity" +msgstr "פעילות הודעות" + +#: src/modules/statistics/ui/leaderboard.py:273 +msgctxt "ui:leaderboard|menu;stats|item:anki" +msgid "Anki Cards Reviewed" +msgstr "קלפי אנקי שהושלמו" + +#: src/modules/statistics/ui/leaderboard.py:327 +msgctxt "ui:leaderboard|button:season|label" +msgid "This Season" +msgstr "בעונה הזו" + +#: src/modules/statistics/ui/leaderboard.py:331 +msgctxt "ui:leaderboard|button:day|label" +msgid "Today" +msgstr "היום" + +#: src/modules/statistics/ui/leaderboard.py:335 +msgctxt "ui:leaderboard|button:week|label" +msgid "This Week" +msgstr "בשבוע הזה" + +#: src/modules/statistics/ui/leaderboard.py:339 +msgctxt "ui:leaderboard|button:month|label" +msgid "This Month" +msgstr "בחודש הנוכחי" + +#: src/modules/statistics/ui/leaderboard.py:343 +msgctxt "ui:leaderboard|button:alltime|label" +msgid "All Time" +msgstr "כל הזמנים" + +#: src/modules/statistics/ui/leaderboard.py:347 +msgctxt "ui:leaderboard|button:jump|label" +msgid "Jump" +msgstr "קפוץ" + +#: src/modules/statistics/ui/leaderboard.py:362 +msgctxt "ui:leaderboard|button:jump|input:title" +msgid "Jump to page" +msgstr "קפוץ אל עמוד" + +#: src/modules/statistics/ui/leaderboard.py:366 +msgctxt "ui:leaderboard|button:jump|input:question" +msgid "Page number to jump to" +msgstr "מספר עמוד לקפוץ אליו" + +#: src/modules/statistics/ui/leaderboard.py:377 +msgctxt "ui:leaderboard|button:jump|error:invalid_page" +msgid "Invalid page number, please try again!" +msgstr "מספר עמוד לא נכון, אנא נסה שוב!" + +#: src/modules/statistics/ui/leaderboard.py:428 +msgctxt "ui:leaderboard|mode:voice|message:empty|desc" +msgid "There has been no voice activity in this period!" +msgstr "אין לך שום פעילות קולית בתקופה הזו!" + +#: src/modules/statistics/ui/leaderboard.py:433 +msgctxt "ui:leaderboard|mode:text|message:empty|desc" +msgid "There has been no message activity in this period!" +msgstr "אין לך שום הודעות ששלחת בתקופה הזו!" + +#: src/modules/statistics/ui/leaderboard.py:438 +msgctxt "ui:leaderboard|mode:anki|message:empty|desc" +msgid "There have been no Anki cards reviewed in this period!" +msgstr "אין לך שום קלפי אנקי שעשית בתקופה הזו!" + +#: src/modules/statistics/ui/leaderboard.py:444 +msgctxt "ui:leaderboard|message:empty|title" +msgid "Leaderboard Empty!" +msgstr "לוח ההישגים ריק!" diff --git a/locales/he_IL/LC_MESSAGES/stats-gui.po b/locales/he_IL/LC_MESSAGES/stats-gui.po new file mode 100644 index 00000000..3d911d73 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/stats-gui.po @@ -0,0 +1,144 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#. First column +#: src/gui/cards/stats.py:72 +msgctxt "skin:stats|header:col1" +msgid "STATISTICS" +msgstr "סטטיסטיקות" + +#: src/gui/cards/stats.py:75 +msgctxt "skin:stats|subheader:leaderboard" +msgid "LEADERBOARD POSITION" +msgstr "מיקום בלוח הישגים" + +#: src/gui/cards/stats.py:79 +msgctxt "skin:stats|mode:study|subheader:study" +msgid "STUDY TIME" +msgstr "זמן למידה" + +#: src/gui/cards/stats.py:83 +msgctxt "skin:stats|mode:voice|subheader:study" +msgid "VOICE TIME" +msgstr "זמן בערוץ קול" + +#: src/gui/cards/stats.py:87 +msgctxt "skin:stats|mode:text|subheader:study" +msgid "MESSAGES" +msgstr "הודעות" + +#: src/gui/cards/stats.py:91 +msgctxt "skin:stats|mode:anki|subheader:study" +msgid "CARDS REVIEWED" +msgstr "קלפים שנעשו" + +#: src/gui/cards/stats.py:102 +msgctxt "skin:stats|subheader:workouts" +msgid "WORKOUTS" +msgstr "אימונים" + +#: src/gui/cards/stats.py:118 +msgctxt "skin:stats|field:daily" +msgid "DAILY" +msgstr "יומי" + +#: src/gui/cards/stats.py:122 +msgctxt "skin:stats|field:weekly" +msgid "WEEKLY" +msgstr "שבועי" + +#: src/gui/cards/stats.py:126 +msgctxt "skin:stats|field:monthly" +msgid "MONTHLY" +msgstr "חודשי" + +#: src/gui/cards/stats.py:130 +msgctxt "skin:stats|field:alltime" +msgid "ALL TIME" +msgstr "כל הזמנים" + +#: src/gui/cards/stats.py:134 +msgctxt "skin:stats|field:time" +msgid "TIME" +msgstr "זמן" + +#: src/gui/cards/stats.py:138 +msgctxt "skin:stats|field:anki" +msgid "ANKI: COMING SOON" +msgstr "אנקי: בקרוב" + +#: src/gui/cards/stats.py:155 +msgctxt "skin:stats|mode:study|header:col2" +msgid "STUDY STREAK" +msgstr "רצף למידה" + +#: src/gui/cards/stats.py:159 +msgctxt "skin:stats|mode:voice|header:col2" +msgid "VOICE STREAK" +msgstr "פעילות קולית רצף" + +#: src/gui/cards/stats.py:163 +msgctxt "skin:stats|mode:text|header:col2" +msgid "ACTIVITY STREAK" +msgstr "רצף פעילות" + +#: src/gui/cards/stats.py:167 +msgctxt "skin:stats|mode:anki|header:col2" +msgid "ANKI REVIEW STREAK" +msgstr "אנקי רצף" + +#: src/gui/cards/stats.py:180 +#, possible-python-brace-format +msgctxt "skin:stats|mode:study|field:col2_summary" +msgid "{amount} HRS" +msgstr "{amount} שעות" + +#: src/gui/cards/stats.py:184 +#, possible-python-brace-format +msgctxt "skin:stats|mode:voice|field:col2_summary" +msgid "{amount} HRS" +msgstr "{amount} שעות" + +#: src/gui/cards/stats.py:188 +#, possible-python-brace-format +msgctxt "skin:stats|mode:text|field:col2_summary" +msgid "{amount} XP" +msgstr "{amount} נקודות" + +#: src/gui/cards/stats.py:192 +#, possible-python-brace-format +msgctxt "skin:stats|mode:anki|field:col2_summary" +msgid "{amount} CARDS" +msgstr "{amount} כרטיסים" + +#: src/gui/cards/stats.py:223 +msgctxt "skin:stats|cal|weekdays" +msgid "S,M,T,W,T,F,S" +msgstr "ר,ש,ש,ר,ח,ש,ש" + +#: src/gui/cards/stats.py:227 +msgctxt "skin:stats|cal|months" +msgid "" +"JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER" +msgstr "" +"ינואר,פבואר,מרץ,אפריל,מאי,יוני,יולי,אוגוסט,ספטמבר,אוקטובר,נובמבר,דצמבר" diff --git a/locales/he_IL/LC_MESSAGES/sysadmin.po b/locales/he_IL/LC_MESSAGES/sysadmin.po new file mode 100644 index 00000000..068810e8 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/sysadmin.po @@ -0,0 +1,204 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/sysadmin/presence.py:116 +msgctxt "botset:presence_status" +msgid "online_status" +msgstr "online_status" + +#: src/modules/sysadmin/presence.py:117 +msgctxt "botset:presence_status|desc" +msgid "Bot status indicator" +msgstr "Bot status indicator" + +#: src/modules/sysadmin/presence.py:120 +msgctxt "botset:presence_status|long_desc" +msgid "Whether the bot account displays as online, idle, dnd, or offline." +msgstr "Whether the bot account displays as online, idle, dnd, or offline." + +#: src/modules/sysadmin/presence.py:124 +msgctxt "botset:presence_status|accepts" +msgid "Online/Idle/Dnd/Offline" +msgstr "Online/Idle/Dnd/Offline" + +#: src/modules/sysadmin/presence.py:133 +msgctxt "botset:presence_status|output:online" +msgid "**Online**" +msgstr "**Online**" + +#: src/modules/sysadmin/presence.py:134 +msgctxt "botset:presence_status|output:idle" +msgid "**Idle**" +msgstr "**Idle**" + +#: src/modules/sysadmin/presence.py:135 +msgctxt "botset:presence_status|output:dnd" +msgid "**Do Not Disturb**" +msgstr "**Do Not Disturb**" + +#: src/modules/sysadmin/presence.py:136 +msgctxt "botset:presence_status|output:offline" +msgid "**Offline**" +msgstr "**Offline**" + +#: src/modules/sysadmin/presence.py:139 +msgctxt "botset:presence_status|input_format:online" +msgid "Online" +msgstr "Online" + +#: src/modules/sysadmin/presence.py:140 +msgctxt "botset:presence_status|input_format:idle" +msgid "Idle" +msgstr "Idle" + +#: src/modules/sysadmin/presence.py:141 +msgctxt "botset:presence_status|input_format:dnd" +msgid "DND" +msgstr "DND" + +#: src/modules/sysadmin/presence.py:142 +msgctxt "botset:presence_status|input_format:offline" +msgid "Offline" +msgstr "Offline" + +#: src/modules/sysadmin/presence.py:145 +msgctxt "botset:presence_status|input_pattern:online" +msgid "on|online" +msgstr "on|online" + +#: src/modules/sysadmin/presence.py:146 +msgctxt "botset:presence_status|input_pattern:idle" +msgid "idle" +msgstr "idle" + +#: src/modules/sysadmin/presence.py:147 +msgctxt "botset:presence_status|input_pattern:dnd" +msgid "do not disturb|dnd" +msgstr "do not disturb|dnd" + +#: src/modules/sysadmin/presence.py:148 +msgctxt "botset:presence_status|input_pattern:offline" +msgid "off|offline|invisible" +msgstr "off|offline|invisible" + +#: src/modules/sysadmin/presence.py:155 +msgctxt "botset:presence_type" +msgid "activity_type" +msgstr "activity_type" + +#: src/modules/sysadmin/presence.py:156 +msgctxt "botset:presence_type|desc" +msgid "Type of presence activity" +msgstr "Type of presence activity" + +#: src/modules/sysadmin/presence.py:159 +msgctxt "botset:presence_type|long_desc" +msgid "" +"Whether the bot activity is shown as 'Listening', 'Playing', or 'Watching'." +msgstr "" +"Whether the bot activity is shown as 'Listening', 'Playing', or 'Watching'." + +#: src/modules/sysadmin/presence.py:163 +msgctxt "botset:presence_type|accepts" +msgid "Listening/Playing/Watching/Streaming" +msgstr "Listening/Playing/Watching/Streaming" + +#: src/modules/sysadmin/presence.py:172 +msgctxt "botset:presence_type|output:watching" +msgid "**Watching**" +msgstr "**Watching**" + +#: src/modules/sysadmin/presence.py:173 +msgctxt "botset:presence_type|output:listening" +msgid "**Listening**" +msgstr "**Listening**" + +#: src/modules/sysadmin/presence.py:174 +msgctxt "botset:presence_type|output:playing" +msgid "**Playing**" +msgstr "**Playing**" + +#: src/modules/sysadmin/presence.py:175 +msgctxt "botset:presence_type|output:streaming" +msgid "**Streaming**" +msgstr "**Streaming**" + +#: src/modules/sysadmin/presence.py:178 +msgctxt "botset:presence_type|input_format:watching" +msgid "Watching" +msgstr "Watching" + +#: src/modules/sysadmin/presence.py:179 +msgctxt "botset:presence_type|input_format:listening" +msgid "Listening" +msgstr "Listening" + +#: src/modules/sysadmin/presence.py:180 +msgctxt "botset:presence_type|input_format:playing" +msgid "Playing" +msgstr "Playing" + +#: src/modules/sysadmin/presence.py:181 +msgctxt "botset:presence_type|input_format:streaming" +msgid "Streaming" +msgstr "Streaming" + +#: src/modules/sysadmin/presence.py:184 +msgctxt "botset:presence_type|input_pattern:watching" +msgid "watching" +msgstr "watching" + +#: src/modules/sysadmin/presence.py:185 +msgctxt "botset:presence_type|input_pattern:listening" +msgid "listening" +msgstr "listening" + +#: src/modules/sysadmin/presence.py:186 +msgctxt "botset:presence_type|input_pattern:playing" +msgid "playing" +msgstr "playing" + +#: src/modules/sysadmin/presence.py:187 +msgctxt "botset:presence_type|input_pattern:streaming" +msgid "streaming" +msgstr "streaming" + +#: src/modules/sysadmin/presence.py:194 +msgctxt "botset:presence_name" +msgid "activity_name" +msgstr "activity_name" + +#: src/modules/sysadmin/presence.py:195 +msgctxt "botset:presence_name|desc" +msgid "Name of the presence activity" +msgstr "Name of the presence activity" + +#: src/modules/sysadmin/presence.py:196 +msgctxt "botset:presence_name|long_desc" +msgid "Presence activity name." +msgstr "Presence activity name." + +#: src/modules/sysadmin/presence.py:197 +msgctxt "botset:presence_name|accepts" +msgid "The name of the activity to show." +msgstr "השם של הפעילות לצפייה." diff --git a/locales/he_IL/LC_MESSAGES/tasklist.po b/locales/he_IL/LC_MESSAGES/tasklist.po new file mode 100644 index 00000000..55344caa --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/tasklist.po @@ -0,0 +1,816 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/tasklist/cog.py:35 +msgctxt "argtype:Before|opt:HOUR" +msgid "The last hour" +msgstr "בשעה האחרונה" + +#: src/modules/tasklist/cog.py:36 +msgctxt "argtype:Before|opt:HALFDAY" +msgid "The last 12 hours" +msgstr "ב12 שעות האחרונות" + +#: src/modules/tasklist/cog.py:37 +msgctxt "argtype:Before|opt:DAY" +msgid "The last 24 hours" +msgstr "ביממה האחרונה" + +#: src/modules/tasklist/cog.py:38 +msgctxt "argtype:Before|opt:TODAY" +msgid "Today" +msgstr "היום" + +#: src/modules/tasklist/cog.py:39 +msgctxt "argtype:Before|opt:YESTERDAY" +msgid "Yesterday" +msgstr "אתמול" + +#: src/modules/tasklist/cog.py:40 +msgctxt "argtype:Before|opt:Monday" +msgid "This Monday" +msgstr "יום שני" + +#: src/modules/tasklist/cog.py:41 +msgctxt "argtype:Before|opt:THISMONTH" +msgid "This Month" +msgstr "בחודש הנוכחי" + +#: src/modules/tasklist/cog.py:225 +msgctxt "cmd:tasklist" +msgid "tasklist" +msgstr "רשימת מטלות" + +#: src/modules/tasklist/cog.py:228 +msgctxt "cmd:tasklist|desc" +msgid "Open your tasklist." +msgstr "פתח את רשימת המטלות שלך" + +#: src/modules/tasklist/cog.py:237 +msgctxt "group:tasks" +msgid "tasks" +msgstr "מטלות" + +#: src/modules/tasklist/cog.py:238 +msgctxt "group:tasks|desc" +msgid "Base command group for tasklist commands." +msgstr "הפקודה הבסיסית לקבוצת רשימת המטלות" + +#: src/modules/tasklist/cog.py:260 +msgctxt "argtype:taskid|error:no_tasks" +msgid "Tasklist empty! No matching tasks." +msgstr "רשימת המטלות ריקה! אין מטלות מתאימות." + +#: src/modules/tasklist/cog.py:305 +#, possible-python-brace-format +msgctxt "argtype:taskid|error:parse_multi" +msgid "(Warning: {error})" +msgstr "(אזהרה: {error})" + +#: src/modules/tasklist/cog.py:339 +#, possible-python-brace-format +msgctxt "argtype:taskid|error:no_matching" +msgid "No tasks matching '{partial}'!" +msgstr "אין מטלות שמתאימות ל'{partial}'!" + +#: src/modules/tasklist/cog.py:359 +msgctxt "cmd:tasks_new" +msgid "new" +msgstr "חדש" + +#: src/modules/tasklist/cog.py:362 +msgctxt "cmd:tasks_new|desc" +msgid "Add a new task to your tasklist." +msgstr "הוסף מטלה לרשימת המטלות שלך" + +#: src/modules/tasklist/cog.py:366 +msgctxt "cmd:tasks_new|param:content" +msgid "task" +msgstr "מטלה" + +#: src/modules/tasklist/cog.py:367 +msgctxt "cmd:tasks_new|param:parent" +msgid "parent" +msgstr "הורה" + +#: src/modules/tasklist/cog.py:370 +msgctxt "cmd:tasks_new|param:content|desc" +msgid "Content of your new task." +msgstr "התוכן של המטלה החדשה שלך" + +#: src/modules/tasklist/cog.py:371 +msgctxt "cmd:tasks_new|param:parent" +msgid "Parent of this task." +msgstr "ההורה של המטלה הזו." + +#: src/modules/tasklist/cog.py:391 +#, possible-python-brace-format +msgctxt "cmd:tasks_new|error:parse_parent" +msgid "Could not find parent task number `{input}` in your tasklist." +msgstr "לא הצלחתי למצוא את ההורה מספר `{input}` ברשימה שלך." + +#: src/modules/tasklist/cog.py:406 +#, possible-python-brace-format +msgctxt "cmd:tasks_new|resp:success" +msgid "{tick} Created task `{label}`." +msgstr "{tick} מטלה שנוצרה `{label}`." + +#: src/modules/tasklist/cog.py:418 +msgctxt "cmd:tasks_upload" +msgid "upload" +msgstr "העלה" + +#: src/modules/tasklist/cog.py:421 +msgctxt "cmd:tasks_upload|desc" +msgid "Upload a list of tasks to append to or replace your tasklist." +msgstr "העלה רשימת משימות כדי להרחיב או להחליף את הרשימה שלך." + +#: src/modules/tasklist/cog.py:425 +msgctxt "cmd:tasks_upload|param:tasklist" +msgid "tasklist" +msgstr "רשימת מטלות" + +#: src/modules/tasklist/cog.py:426 +msgctxt "cmd:tasks_upload|param:append" +msgid "append" +msgstr "הרחב" + +#: src/modules/tasklist/cog.py:431 +msgctxt "cmd:tasks_upload|param:tasklist|desc" +msgid "" +"Text file containing a (standard markdown formatted) checklist of tasks to " +"add or append." +msgstr "" +"מסמך טקסט המכיל רשימת מטלות כדי להוסיף או להחליף את הרשימה המקורית שלך." + +#: src/modules/tasklist/cog.py:435 +msgctxt "cmd:tasks_upload|param:append|desc" +msgid "" +"Whether to append the given tasks or replace your entire tasklist. Defaults " +"to True." +msgstr "האם להחליף או להרחיב את הרשימה הנוכחית. ברירית המחדל היא True." + +#: src/modules/tasklist/cog.py:451 +msgctxt "cmd:tasks_upload|error:not_text" +msgid "The attached tasklist must be a text file!" +msgstr "הרשימה שהוספת חייבת להיות מסמך טקסט!" + +#: src/modules/tasklist/cog.py:459 +msgctxt "cmd:tasks_upload|error:too_large" +msgid "The attached tasklist was too large!" +msgstr "הקובץ שהוספת גדול מידי." + +#: src/modules/tasklist/cog.py:470 +msgctxt "cmd:tasks_upload|error:too_many_lines" +msgid "" +"Too many tasks! Refusing to process a tasklist with more than `1000` lines." +msgstr "יותר מידי משימות. אני לא יכול לקבל מסמך שיש בו יותר מאלף שורות." + +#: src/modules/tasklist/cog.py:476 +msgctxt "cmd:tasks_upload|error:decoding" +msgid "" +"Could not decode attached tasklist. Please make sure it is saved with the " +"`UTF-8` encoding." +msgstr "אני לא הצלחתי לקרוא את המסמך. אתה בטוח ששמת אותו בתור קובץ `UTF-8`?" + +#: src/modules/tasklist/cog.py:523 +#, possible-python-brace-format +msgctxt "cmd:tasks_upload|resp:success" +msgid "{tick} Updated your tasklist." +msgstr "{tick} הרשימה שלך עודכנה בהצלחה." + +#: src/modules/tasklist/cog.py:535 +msgctxt "cmd:tasks_edit" +msgid "edit" +msgstr "ערוך" + +#: src/modules/tasklist/cog.py:538 +msgctxt "cmd:tasks_edit|desc" +msgid "Edit a task in your tasklist." +msgstr "ערוך מטלה מהרשימה שלך." + +#: src/modules/tasklist/cog.py:542 +msgctxt "cmd:tasks_edit|param:taskstr" +msgid "task" +msgstr "מטלה" + +#: src/modules/tasklist/cog.py:543 +msgctxt "cmd:tasks_edit|param:new_content" +msgid "new_task" +msgstr "מטלה_חדשה" + +#: src/modules/tasklist/cog.py:544 +msgctxt "cmd:tasks_edit|param:new_parent" +msgid "new_parent" +msgstr "הורה_חדשה" + +#: src/modules/tasklist/cog.py:547 +msgctxt "cmd:tasks_edit|param:taskstr|desc" +msgid "Which task do you want to update?" +msgstr "איזו מטלה אתם רוצים לעדכן?" + +#: src/modules/tasklist/cog.py:548 +msgctxt "cmd:tasks_edit|param:new_content|desc" +msgid "What do you want to change the task to?" +msgstr "למה אתם רוצים לשנות את המטלה?" + +#: src/modules/tasklist/cog.py:549 +msgctxt "cmd:tasks_edit|param:new_parent|desc" +msgid "Which task do you want to be the new parent?" +msgstr "איזו מטלה אתם רוצים לקבוע בתור ההורה החדש?" + +#: src/modules/tasklist/cog.py:568 +#, possible-python-brace-format +msgctxt "cmd:tasks_edit|error:parse_taskstr" +msgid "Could not find target task number `{input}` in your tasklist." +msgstr "לא הצלחתי למצוא את המטלה מספר `{input}` ברשימה שלך." + +#: src/modules/tasklist/cog.py:584 +#, possible-python-brace-format +msgctxt "cmd:tasks_edit|error:parse_parent" +msgid "Could not find new parent task number `{input}` in your tasklist." +msgstr "לא הצלחתי למצוא את המטלת הורה מספר `{input}` ברשימה שלך." + +#: src/modules/tasklist/cog.py:603 +#, possible-python-brace-format +msgctxt "cmd:tasks_edit|resp:success|desc" +msgid "{tick} Task `{label}` updated." +msgstr "{tick} המטלה `{label}` עודכנה בהצלחה." + +#: src/modules/tasklist/cog.py:625 +msgctxt "ui:tasklist_single_editor|title" +msgid "Edit Task" +msgstr "ערוך מטלה" + +#: src/modules/tasklist/cog.py:640 +msgctxt "cmd:tasks_clear" +msgid "clear" +msgstr "נקה" + +#: src/modules/tasklist/cog.py:641 +msgctxt "cmd:tasks_clear|desc" +msgid "Clear your tasklist." +msgstr "נקה את רשימת המטלות." + +#: src/modules/tasklist/cog.py:651 +msgctxt "cmd:tasks_clear|resp:success" +msgid "Your tasklist has been cleared." +msgstr "רשימת המטלות שלך נוקתה בהצלחה." + +#: src/modules/tasklist/cog.py:659 +msgctxt "cmd:tasks_remove" +msgid "remove" +msgstr "הסר" + +#: src/modules/tasklist/cog.py:662 +msgctxt "cmd:tasks_remove|desc" +msgid "" +"Remove tasks matching all the provided conditions. (E.g. remove tasks " +"completed before today)." +msgstr "" +"הסר מטלות שמתאימות לתנאים שניתנו לי (לדוגמא מטלות שהושלמו לפני היום וכו')" + +#: src/modules/tasklist/cog.py:666 +msgctxt "cmd:tasks_remove|param:taskidstr" +msgid "tasks" +msgstr "מטלות" + +#: src/modules/tasklist/cog.py:667 +msgctxt "cmd:tasks_remove|param:created_before" +msgid "created_before" +msgstr "הושלמו_לפני" + +#: src/modules/tasklist/cog.py:668 +msgctxt "cmd:tasks_remove|param:updated_before" +msgid "updated_before" +msgstr "עודכנו_לפני" + +#: src/modules/tasklist/cog.py:669 +msgctxt "cmd:tasks_remove|param:completed" +msgid "completed" +msgstr "הושלמו" + +#: src/modules/tasklist/cog.py:670 +msgctxt "cmd:tasks_remove|param:cascade" +msgid "cascade" +msgstr "מפל" + +#: src/modules/tasklist/cog.py:675 +msgctxt "cmd:tasks_remove|param:taskidstr|desc" +msgid "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-)." +msgstr "טווח של רשימת מטלות להסרה (לדוגמא 1-15, 8.1.1.1-20 וכו')." + +#: src/modules/tasklist/cog.py:679 +msgctxt "cmd:tasks_remove|param:created_before|desc" +msgid "Only delete tasks created before the selected time." +msgstr "הסר רק משימות שנוספט לפני זמן ספציפי." + +#: src/modules/tasklist/cog.py:683 +msgctxt "cmd:tasks_remove|param:updated_before|desc" +msgid "" +"Only deleted tasks update (i.e. completed or edited) before the selected " +"time." +msgstr "מחק רק משימות שעודכנו (הושלמו או נערכו) לפני זמן ספציפי." + +#: src/modules/tasklist/cog.py:687 +msgctxt "cmd:tasks_remove|param:completed" +msgid "Only delete tasks which are (not) complete." +msgstr "מחק רק משימות שלא הושלמו." + +#: src/modules/tasklist/cog.py:691 +msgctxt "cmd:tasks_remove|param:cascade" +msgid "Whether to recursively remove subtasks of removed tasks." +msgstr "האם למחוק סאב-מטלות מאותה המטלה שנמחקה." + +#: src/modules/tasklist/cog.py:760 +#, possible-python-brace-format +msgctxt "cmd:tasks_remove|resp:success" +msgid "{tick} Deleted task `{label}`" +msgid_plural "{tick} Deleted `{count}` tasks from your tasklist." +msgstr[0] "{tick} מטלה אחת נמחקה מהרשימה שלך." +msgstr[1] "{tick} שתי מטלות נמחקו מהרשימה שלך." +msgstr[2] "{tick} הרבה מרשימות נמחקו מהרשימה שלך." +msgstr[3] "{tick} `{count}` מטלות נמחקו מהרשימה שלך." + +#: src/modules/tasklist/cog.py:778 +msgctxt "cmd:tasks_tick" +msgid "tick" +msgstr "סימון" + +#: src/modules/tasklist/cog.py:779 +msgctxt "cmd:tasks_tick|desc" +msgid "Mark the given tasks as completed." +msgstr "סמן את המטלות שסומנו שמושלמות." + +#: src/modules/tasklist/cog.py:782 +msgctxt "cmd:tasks_tick|param:taskidstr" +msgid "tasks" +msgstr "מטלות" + +#: src/modules/tasklist/cog.py:783 +msgctxt "cmd:tasks_tick|param:cascade" +msgid "cascade" +msgstr "מפל" + +#: src/modules/tasklist/cog.py:788 +msgctxt "cmd:tasks_tick|param:taskidstr|desc" +msgid "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-)." +msgstr "טווח של רשימת מטלות להסרה (לדוגמא 1-15, 8.1.1.1-20 וכו')." + +#: src/modules/tasklist/cog.py:792 +msgctxt "cmd:tasks_tick|param:cascade|desc" +msgid "Whether to also mark all subtasks as complete." +msgstr "האם לסמן גם את כל הסאב-מטלות כשמושלמות." + +#: src/modules/tasklist/cog.py:836 +#, possible-python-brace-format +msgctxt "cmd:tasks_tick|resp:success" +msgid "{tick} Marked `{label}` as complete." +msgid_plural "{tick} Marked `{count}` tasks as complete." +msgstr[0] "{tick} המטלה `{label}` עודכנה בהצלחה." +msgstr[1] "{tick} שתי מטלות סומנו שמושלמות מהרשימה שלך." +msgstr[2] "{tick} הרבה מרשימות סומנו שמושלמות ברשימה שלך." +msgstr[3] "{tick} `{count}` מטלות סומנו שמושלמות מהרשימה שלך." + +#: src/modules/tasklist/cog.py:854 +msgctxt "cmd:tasks_untick" +msgid "untick" +msgstr "הסר סימון" + +#: src/modules/tasklist/cog.py:855 +msgctxt "cmd:tasks_untick|desc" +msgid "Mark the given tasks as incomplete." +msgstr "סמן את המטלות שסומנו כלא מושלמות." + +#: src/modules/tasklist/cog.py:858 +msgctxt "cmd:tasks_untick|param:taskidstr" +msgid "taskids" +msgstr "תז מטלות" + +#: src/modules/tasklist/cog.py:859 +msgctxt "cmd:tasks_untick|param:cascade" +msgid "cascade" +msgstr "מפל" + +#: src/modules/tasklist/cog.py:864 +msgctxt "cmd:tasks_untick|param:taskidstr|desc" +msgid "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-)." +msgstr "טווח של רשימת מטלות להסרה (לדוגמא 1-15, 8.1.1.1-20 וכו')." + +#: src/modules/tasklist/cog.py:868 +msgctxt "cmd:tasks_untick|param:cascade|desc" +msgid "Whether to also mark all subtasks as incomplete." +msgstr "האם לסמן גם את כל הסאב-מטלות כלא מושלמות." + +#: src/modules/tasklist/cog.py:909 +#, possible-python-brace-format +msgctxt "cmd:tasks_untick|resp:success" +msgid "{tick} Marked `{label}` as incomplete." +msgid_plural "{tick} Marked `{count}` tasks as incomplete." +msgstr[0] "{tick} המטלה `{label}` עודכנה בהצלחה כלא מושלמת." +msgstr[1] "{tick} שתי מטלות סומנו כלא מושלמות מהרשימה שלך." +msgstr[2] "{tick} הרבה מרשימות סומנו כלא מושלמות ברשימה שלך." +msgstr[3] "{tick} `{count}` מטלות סומנו כלא מושלמות מהרשימה שלך." + +#: src/modules/tasklist/cog.py:933 +msgctxt "cmd:configure_tasklist" +msgid "tasklist" +msgstr "רשימת מטלות" + +#: src/modules/tasklist/cog.py:934 +msgctxt "cmd:configure_tasklist|desc" +msgid "Tasklist configuration panel" +msgstr "תפריט הגדרות רשימת מטלות" + +#: src/modules/tasklist/cog.py:937 +msgctxt "cmd:configure_tasklist|param:reward" +msgid "reward" +msgstr "פרס" + +#: src/modules/tasklist/cog.py:938 +msgctxt "cmd:configure_tasklist|param:reward_limit" +msgid "reward_limit" +msgstr "מגבלת_פרס" + +#: src/modules/tasklist/cog.py:974 +#, possible-python-brace-format +msgctxt "cmd:configure_tasklist|resp:success|desc" +msgid "" +"Members will now be rewarded {coin}**{amount}** for each task they complete " +"up to a maximum of `{limit}` tasks per 24h." +msgstr "" +"משתמשים יקבלו מעכשיו {coin}**{amount}** עבור כל משימה שהם השלימו עד " +"ל`{limit}` כל יממה." + +#: src/modules/tasklist/tasklist.py:264 +#, possible-python-brace-format +msgctxt "tasklist|parse:multi-range|error:parents_match" +msgid "Parents don't match in range `{range}`" +msgstr "ההורים לא מתאימים לטווח `{range}`" + +#: src/modules/tasklist/tasklist.py:286 +#, possible-python-brace-format +msgctxt "tasklist|parse:multi-range|error:parse" +msgid "Could not parse `{range}` as a task number or range." +msgstr "לא הצלחתי להבין את `{range}` " + +#: src/modules/tasklist/tasklist.py:317 +#, possible-python-brace-format +msgctxt "modal:tasklist_bulk_editor|error:parse_task" +msgid "" +"Malformed taskline!\n" +"`{input}`" +msgstr "" +"משהו לא בסדר!\n" +"`{input}`" + +#: src/modules/tasklist/tasklist.py:329 +msgctxt "modal:tasklist_bulk_editor|error:task_too_long" +msgid "Please keep your tasks under 100 characters!" +msgstr "אנא שמרו על מטלות קצרות מ100 תווים!" + +#: src/modules/tasklist/ui.py:39 +msgctxt "ui:tasklist_caller|button:tasklist|label" +msgid "Open Tasklist" +msgstr "פתח רשימת מטלות" + +#: src/modules/tasklist/ui.py:57 +msgctxt "modal:tasklist_single_editor|field:task|label" +msgid "Task content" +msgstr "תוכן מטלה" + +#: src/modules/tasklist/ui.py:69 +msgctxt "modal:tasklist_single_editor|field:parent|label" +msgid "Parent Task" +msgstr "מטלת הורה" + +#: src/modules/tasklist/ui.py:73 +msgctxt "modal:tasklist_single_editor|field:parent|placeholder" +msgid "Enter a task number, e.g. 2.1" +msgstr "הכנס את מספר המטלה, לדוגמא 2.1" + +#: src/modules/tasklist/ui.py:104 +msgctxt "modal:tasklist_bulk_editor|field:tasklist|label" +msgid "Tasklist" +msgstr "רשימת מטלות" + +#: src/modules/tasklist/ui.py:108 +msgctxt "modal:tasklist_bulk_editor|field:tasklist|placeholder" +msgid "" +"- [ ] This is task 1, unfinished.\n" +"- [x] This is task 2, finished.\n" +" - [ ] This is subtask 2.1." +msgstr "" +"- [ ] זו מטלה ראשונה שלא הושלמה.\n" +"- [x] זו מטרה שנייה שהושלמה וגם ההורה של המטלה הבאה.\n" +"- [ ] זו סאב-מטלה 2.1." + +#: src/modules/tasklist/ui.py:130 +msgctxt "modal:tasklist_bulk_editor" +msgid "Tasklist Editor" +msgstr "עורך מטלות" + +#: src/modules/tasklist/ui.py:188 +msgctxt "ui:tasklist|menu:main|mode:toggle|placeholder" +msgid "Select to Toggle" +msgstr "הקש כדי לפתוח" + +#: src/modules/tasklist/ui.py:192 +#, possible-python-brace-format +msgctxt "ui:tasklist|menu:sub|mode:toggle|placeholder" +msgid "Toggle from {label}.*" +msgstr "נפתח מ {label}.*" + +#: src/modules/tasklist/ui.py:198 +msgctxt "ui:tasklist|menu:main|mode:edit|placeholder" +msgid "Select to Edit" +msgstr "בחר כדי לערוך" + +#: src/modules/tasklist/ui.py:202 +#, possible-python-brace-format +msgctxt "ui:tasklist|menu:sub|mode:edit|placeholder" +msgid "Edit from {label}.*" +msgstr "נערך מ{label}.*" + +#: src/modules/tasklist/ui.py:208 +msgctxt "ui:tasklist|menu:main|mode:delete|placeholder" +msgid "Select to Delete" +msgstr "בחר כדי למחוק" + +#: src/modules/tasklist/ui.py:212 +#, possible-python-brace-format +msgctxt "ui:tasklist|menu:sub|mode:delete|placeholder" +msgid "Delete from {label}.*" +msgstr "מחק מ{label}.*" + +#: src/modules/tasklist/ui.py:408 +#, possible-python-brace-format +msgctxt "ui:tasklist_single_editor|field:parent|error:parse_id" +msgid "" +"Could not find the given parent task number `{input}` in your tasklist." +msgstr "לא הצלחתי למצוא את המטלה הראשית `{input}` ברשימה שלך." + +#: src/modules/tasklist/ui.py:422 +#, possible-python-brace-format +msgctxt "ui:tasklist_single_editor|field:parent|error:multiple_matching" +msgid "" +"Multiple tasks matching given parent task `{input}`. Please use a task " +"number instead!" +msgstr "הרבה מטלות מתאימות ל `{input}`. בחר מספר במקום." + +#: src/modules/tasklist/ui.py:429 +#, possible-python-brace-format +msgctxt "ui:tasklist_single_editor|field:parent|error:no_matching" +msgid "No tasks matching given parent task `{input}`." +msgstr "אין מטלות שמתאימות להורה `{input}`." + +#: src/modules/tasklist/ui.py:500 +msgctxt "ui:tasklist|menu:edit|modal:title" +msgid "Edit task" +msgstr "ערוך מטלה" + +#: src/modules/tasklist/ui.py:593 +msgctxt "ui:tasklist_single_editor|title" +msgid "Add task" +msgstr "הוסף מטלה" + +#: src/modules/tasklist/ui.py:626 +msgctxt "ui:tasklist|button:edit_mode|label" +msgid "Edit" +msgstr "ערוך" + +#: src/modules/tasklist/ui.py:642 +msgctxt "ui:tasklist|button:delete_mode|label" +msgid "Delete" +msgstr "מחק" + +#: src/modules/tasklist/ui.py:658 +msgctxt "ui:tasklist|button:toggle_mode|label" +msgid "Toggle" +msgstr "פתח" + +#: src/modules/tasklist/ui.py:675 +msgctxt "ui:tasklist|button:edit_bulk|error:too_long" +msgid "" +"Your tasklist is too long to be edited in a Discord text input! Use the save" +" button and {cmds[tasks upload]} instead." +msgstr "" +"רשימת המטלות שלך ארוכה מידי כדי לערוך בדיסקורד. לחץ שמור והשתמש ב " +"{cmds[tasks upload]} במקום." + +#: src/modules/tasklist/ui.py:689 +msgctxt "ui:tasklist|button:edit_bulk|label" +msgid "Bulk Edit" +msgstr "עריכה בכמות גדולה" + +#: src/modules/tasklist/ui.py:702 +msgctxt "ui:tasklist|button:clear|label" +msgid "Clear Tasklist" +msgstr "נקה רשימת מטלות" + +#: src/modules/tasklist/ui.py:721 +#, possible-python-brace-format +msgctxt "ui:tasklist|button:save|dm:contents" +msgid "Your tasklist as of {now} is attached. Click here to jump back: {jump}" +msgstr "רשימת המטלות שלך מ{now} צורפה. לחץ פה כדי לחזור אחורה: {jump}" + +#: src/modules/tasklist/ui.py:734 +msgctxt "ui:tasklist|button:save|error:dms" +msgid "Could not DM you! Do you have me blocked? Tasklist attached below." +msgstr "" +"לא הצלחתי לשלוח לך הודעה פרטית! יכול להיות שחסמת אותי מההגדרות של דיסקורד? " +"בכל מקרה, הרשימה שלך צורפה פה למטה." + +#: src/modules/tasklist/ui.py:779 +msgctxt "ui:tasklist|error:wrong_user" +msgid "This is not your tasklist!" +msgstr "זו לא הרשימה שלך." + +#: src/modules/tasklist/ui.py:821 +#, possible-python-brace-format +msgctxt "ui:tasklist|embed|author" +msgid "{name}'s tasklist ({completed}/{total} complete)" +msgstr "רשימת המטלות של {name} ({completed}/{total} complete)" + +#: src/modules/tasklist/ui.py:843 +msgctxt "ui:tasklist|embed|description" +msgid "" +"**You have no tasks on your tasklist!**\n" +"Add a task with {cmds[tasks new]}, or by pressing the {new_button} button below." +msgstr "" +"**אין לך מטלות ברשימה**\n" +"הוסף מטלות עם {cmds[tasks new]}, או באמצעות לחיצה על {new_button}. " + +#: src/modules/tasklist/settings.py:33 +msgctxt "guildset:task_reward" +msgid "task_reward" +msgstr "פרס_מטלה" + +#: src/modules/tasklist/settings.py:36 +msgctxt "guildset:task_reward|desc" +msgid "Number of LionCoins given for each completed task." +msgstr "מספר מטבעות שאתן למשתמש עבור כל מטלה שהושלמה." + +#: src/modules/tasklist/settings.py:40 +msgctxt "guildset:task_reward|long_desc" +msgid "" +"The number of coins members will be rewarded each time they complete a task " +"on their tasklist." +msgstr "מספר המטבעות שמשתמשים יקבלו כל פעם שהם משלימים מטלה מהרשימה שלהם." + +#: src/modules/tasklist/settings.py:44 +msgctxt "guildset:task_reward|accepts" +msgid "The number of LionCoins to reward per task." +msgstr "מספר המטבעות לתת לכל מטלה." + +#: src/modules/tasklist/settings.py:56 +#, possible-python-brace-format +msgctxt "guildset:task_reward|response" +msgid "" +"Members will now be rewarded {coin}**{amount}** for each completed task." +msgstr "המשתמשים של השרת יקבלו {coin}**{amount}** על כל מטלה שהם ישלימו." + +#: src/modules/tasklist/settings.py:65 +#, possible-python-brace-format +msgctxt "guildset:task_reward|formatted" +msgid "{coin}**{amount}** per task." +msgstr "{coin}**{amount}** עבור כל מטלה." + +#: src/modules/tasklist/settings.py:73 +msgctxt "guildset:task_reward_limit" +msgid "task_reward_limit" +msgstr "מגבלת_מטבעות_לכל_מטלה" + +#: src/modules/tasklist/settings.py:76 +msgctxt "guildset:task_reward_limit|desc" +msgid "Maximum number of task rewards given per 24h." +msgstr "מספר המטלות המקסימלי שזכאי לפרס ביממה." + +#: src/modules/tasklist/settings.py:80 +msgctxt "guildset:task_reward_limit|long_desc" +msgid "" +"Maximum number of times in each 24h period that members will be rewarded for" +" completing a task." +msgstr "" +"מספר הפעמים המקסימלי כל יממה שמשתמשים יוכלו לקבל פרס על כל מטלה שהם ישלימו " +"בשרת." + +#: src/modules/tasklist/settings.py:85 +msgctxt "guildset:task_reward_limit|accepts" +msgid "The maximum number of tasks to reward LC for per 24h." +msgstr "המספר המקסימלי של משימות שיקבלו מטבעות כל 24 שעות." + +#: src/modules/tasklist/settings.py:97 +#, possible-python-brace-format +msgctxt "guildset:task_reward_limit|response" +msgid "" +"Members will now be rewarded for task completion at most **{amount}** times " +"per 24h." +msgstr "המשתמשים יקבלו מעכשיו פרס רק **{amount}** פעמים ביממה." + +#: src/modules/tasklist/settings.py:106 +#, possible-python-brace-format +msgctxt "guildset:task_reward_limit|formatted" +msgid "`{number}` per 24 hours." +msgstr "`{number}` ביממה." + +#: src/modules/tasklist/settings.py:113 +msgctxt "guildset:tasklist_channels" +msgid "tasklist_channels" +msgstr "ערוצי_מטלות" + +#: src/modules/tasklist/settings.py:116 +msgctxt "guildset:tasklist_channels|desc" +msgid "Channels in which to publicly display member tasklists." +msgstr "ערוצים ציבוריים שבהם משתמשים יכולים להשתמש ברשימות שלהם." + +#: src/modules/tasklist/settings.py:120 +#, possible-python-brace-format +msgctxt "guildset:tasklist_channels|long_desc" +msgid "" +"A member's tasklist (from {cmds[tasklist]}) is usually only visible to the " +"member themselves. If set, tasklists opened in `tasklist_channels` will be " +"visible to all members, and the interface will have a much longer expiry " +"period. If a category is provided, this will apply to all channels under the" +" category." +msgstr "" +"רשימת המטלות (שאפשר למצוא ב {cmds[tasklist]}) בדר\"כ פרטית וניתנת לצפייה רק " +"על ידי המשתמש עצמו. אם האופציה הזו פעילה, רשימת המטלות שיפתחו בערוצים " +"שהוגדרו יהיו ניתנים לצפייה וציבוריים לכל המשתמשים בשרת, והרשימות יהיו פתוחות" +" לזמן הרבה יותר ארוך. שימו לב שאפילו ניתן לסמן קטגוריות שלמות, לדוגמא, אפשר " +"להוסיף את הקטגוריה של החדרים הפרטיים ואז כולם יוכלו לשתף רשימת מטלות אחד עם " +"השני." + +#: src/modules/tasklist/settings.py:127 +msgctxt "guildset:tasklist_channels|accepts" +msgid "Comma separated list of tasklist channel names or ids." +msgstr "רשימה מופרדת עם פסיקים של הערוצים המוגדרים שערוצי רשימת מטלות." + +#: src/modules/tasklist/settings.py:144 +#, possible-python-brace-format +msgctxt "guildset:tasklist_channels|set_response|set" +msgid "" +"Tasklists will now be publicly displayed in the following channels: " +"{channels}" +msgstr "רשימת המטלות יהיו ציבוריות בערוצים הבאים: {channels}" + +#: src/modules/tasklist/settings.py:149 +msgctxt "guildset:tasklist_channels|set_response|unset" +msgid "Member tasklists will never be publicly displayed." +msgstr "רשימת המטלות של המשתמשים לעולם לא תהייה ציבורית." + +#: src/modules/tasklist/settings.py:158 +msgctxt "guildset:tasklist_channels|set_using" +msgid "Channel selector below." +msgstr "בחירת ערוצים בתחתית." + +#: src/modules/tasklist/settings.py:289 +msgctxt "ui:tasklist_config|button:close|label" +msgid "Close" +msgstr "סגור" + +#: src/modules/tasklist/settings.py:290 +msgctxt "ui:tasklist_config|button:reset|label" +msgid "Reset" +msgstr "אפס" + +#: src/modules/tasklist/settings.py:293 +msgctxt "ui:tasklist_config|menu:channels|placeholder" +msgid "Set Tasklist Channels" +msgstr "קבע ערוצי מטלות" + +#: src/modules/tasklist/settings.py:311 +msgctxt "ui:tasklist_config|embed|title" +msgid "Tasklist Configuration Panel" +msgstr "תפריט הגדרות רשימת מטלות" + +#: src/modules/tasklist/settings.py:320 +msgctxt "dash:tasklist|name" +msgid "Tasklist Configuration ({commands[configure tasklist]})" +msgstr "תפריט רשימת מטלות ({commands[configure tasklist]})" + +#: src/modules/tasklist/settings.py:323 +msgctxt "dash:tasklist|dropdown|placeholder" +msgid "Tasklist Options Panel" +msgstr "תפריט הגדרות רשימת מטלות" diff --git a/locales/he_IL/LC_MESSAGES/test.po b/locales/he_IL/LC_MESSAGES/test.po new file mode 100644 index 00000000..d94cc828 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/test.po @@ -0,0 +1,83 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/test/test.py:47 src/modules/test/test.py:54 +msgid "test" +msgstr "test" + +#: src/modules/test/test.py:55 +msgid "Test" +msgstr "Test" + +#: src/modules/test/test.py:62 +msgid "editor" +msgstr "עורך" + +#: src/modules/test/test.py:63 +msgid "Test message editor" +msgstr "Test message editor" + +#: src/modules/test/test.py:89 +msgid "test_ephemeral" +msgstr "test_ephemeral" + +#: src/modules/test/test.py:90 +msgid "Test ephemeral delete and edit" +msgstr "Test ephemeral delete and edit" + +#: src/modules/test/test.py:102 +msgid "colours" +msgstr "צבעים" + +#: src/modules/test/test.py:103 +msgid "Test Ansi colours" +msgstr "Test Ansi colours" + +#: src/modules/test/test.py:123 +msgid "fail" +msgstr "נכשל" + +#: src/modules/test/test.py:130 +msgid "pager" +msgstr "pager" + +#: src/modules/test/test.py:158 +msgid "pager2" +msgstr "pager2" + +#: src/modules/test/test.py:189 +msgid "prettyusers" +msgstr "prettyusers" + +#: src/modules/test/test.py:239 +msgid "dmview" +msgstr "dmview" + +#: src/modules/test/test.py:250 +msgid "multiview" +msgstr "multiview" + +#: src/modules/test/test.py:267 +msgid "stats-card" +msgstr "כרטיס-סטטיסטיקה" diff --git a/locales/he_IL/LC_MESSAGES/text-tracker.po b/locales/he_IL/LC_MESSAGES/text-tracker.po new file mode 100644 index 00000000..c3418ede --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/text-tracker.po @@ -0,0 +1,246 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/tracking/text/cog.py:249 +msgctxt "cmd:configure_message_exp" +msgid "message_exp" +msgstr "נקודות_הודעה" + +#: src/tracking/text/cog.py:252 +msgctxt "cmd:configure_message_exp|desc" +msgid "Configure Message Tracking & Experience" +msgstr "ערוך ניתור ונקודות ניסיון מהודעות" + +#: src/tracking/text/cog.py:315 +msgctxt "cmd:leo_configure_exp_rates" +msgid "experience_rates" +msgstr "קצב_נקודות_ניסיון" + +#: src/tracking/text/cog.py:318 +msgctxt "cmd:leo_configure_exp_rates|desc" +msgid "Global experience rate configuration" +msgstr "עריכת קצב נקודות ניסיון גלובליות " + +#: src/tracking/text/ui.py:45 +msgctxt "ui:text_tracker_config|menu:untracked_channels|placeholder" +msgid "Select Untracked Channels" +msgstr "בחר ערוצים ללא מעקב" + +#: src/tracking/text/ui.py:52 +msgctxt "ui:text_tracker_config|embed|title" +msgid "Message Tracking Configuration Panel" +msgstr "תפריט הגדרות מעקב אחרי הודעות" + +#: src/tracking/text/ui.py:89 +msgctxt "dash:text_tracking|title" +msgid "Message XP configuration ({commands[configure message_exp]})" +msgstr "תפריט נקודות ניסיון ({commands[configure message_exp]})" + +#: src/tracking/text/ui.py:93 +msgctxt "dash:text_tracking|dropdown|placeholder" +msgid "Message XP Panel" +msgstr "תפריט נקודות ניסיון מהודעות" + +#: src/tracking/text/settings.py:33 +msgctxt "guildset:xp_per_period" +msgid "xp_per_5min" +msgstr "נקודות_כל_5דקות" + +#: src/tracking/text/settings.py:36 +msgctxt "guildset:xp_per_period|desc" +msgid "" +"How much XP members will be given every 5 minute period they are active." +msgstr "כמה נקודות ניסיון משתמשים יקבלו כל חמש דקות שהם פעילים." + +#: src/tracking/text/settings.py:40 +msgctxt "guildset:xp_per_period|long_desc" +msgid "" +"Amount of message XP to give members for each 5 minute period in which they " +"are active (send a message). Note that this XP is only given *once* per " +"period." +msgstr "" +"כמות נקודות הניסיון שמשתמשים יקבלו כל חמש דקות שהם פעילים. (פעם בחמש דקות)." + +#: src/tracking/text/settings.py:45 +msgctxt "guildset:xp_per_period|accepts" +msgid "Number of message XP to reward per 5 minute active period." +msgstr "כמות נקודות הניסיון לכל 5 דקות פעילות" + +#: src/tracking/text/settings.py:57 +#, possible-python-brace-format +msgctxt "guildset:xp_per_period|set_response" +msgid "" +"For every **5** minutes they are active (i.e. in which they send a message)," +" members will now be given **{amount}** XP." +msgstr "" +"לכל חמש דקות שהם פעילים (זאת אומרת כשהם שולחים הודעה), כל המשתמשים יקבלו " +"**{amount}** נקודות ניסיון." + +#: src/tracking/text/settings.py:65 +msgctxt "guildset:word_xp" +msgid "xp_per_100words" +msgstr "נקודות_לכל_100מילים" + +#: src/tracking/text/settings.py:68 +msgctxt "guildset:word_xp|desc" +msgid "How much XP members will be given per hundred words they write." +msgstr "כמה נקודות ניסיון משתמשים יקבלו על כל מאה מילים שהם כותבים." + +#: src/tracking/text/settings.py:72 +msgctxt "guildset:word_xp|long_desc" +msgid "" +"Amount of message XP to be given (additionally to the XP per period) for " +"each hundred words. Useful for rewarding communication." +msgstr "" +"כמות נקודות הניסיון שאתן לכל 100 מילים. מעולה כדי לתגמל על שימוש בשרת." + +#: src/tracking/text/settings.py:77 +msgctxt "guildset:word_xp|accepts" +msgid "Number of XP to reward per hundred words sent." +msgstr "כמות נקודות ניסיון שמשתמש יקבל כל 100 מילים שישלחו בשרת" + +#: src/tracking/text/settings.py:89 +#, possible-python-brace-format +msgctxt "guildset:word_xp|set_response" +msgid "" +"For every **100** words they send, members will now be rewarded an " +"additional **{amount}** XP." +msgstr "" +"לכל 100 מילים שהם ישלחו, המשתמשים יקבלו **{amount}** נקודות ניסיון נוספות." + +#: src/tracking/text/settings.py:95 +msgctxt "guildset:untracked_text_channels" +msgid "untracked_text_channels" +msgstr "ערוציטקסט_לא_נצפים" + +#: src/tracking/text/settings.py:98 +msgctxt "guildset:untracked_text_channels|desc" +msgid "Channels in which Message XP will not be given." +msgstr "ערוצים שבהם לא אחשיב הודעות." + +#: src/tracking/text/settings.py:102 +msgctxt "guildset:untracked_text_channels|long_desc" +msgid "" +"Messages sent in these channels will not count towards a member's message " +"XP. If a category is selected, then all channels under the category will " +"also be untracked." +msgstr "" +"פעילות בערוצים האלו לא יחשבו בתור נקודות ניסיון. אם קטגוריה נבחרה, כל " +"הערוצים תחתה לא יחשבו." + +#: src/tracking/text/settings.py:107 +msgctxt "guildset:untracked_text_channels|accepts" +msgid "Comma separated list of untracked text channel names or ids." +msgstr "רשימה מופרדת עם פסיקים של הערוצים המוגדרים כערוצים לא נעקבים." + +#: src/tracking/text/settings.py:111 +msgctxt "guildset:untracked_text_channels|notset" +msgid "Not Set (all text channels will be tracked.)" +msgstr "לא נקבע. (כל הערוצי טקסט ייחשבו)" + +#: src/tracking/text/settings.py:128 +#, possible-python-brace-format +msgctxt "guildset:untracked_text_channels|set_response|set" +msgid "" +"Messages in or under the following channels will be ignored: {channels}" +msgstr "הודעות בערוצים הבאים יתעלמו על ידי: {channels}" + +#: src/tracking/text/settings.py:133 +msgctxt "guildset:untracked_text_channels|set_response|notset" +msgid "Message XP will now be tracked in every channel." +msgstr "נקודות ניסיון של הודעות יתקבלו עכשיו מכל הערוצים בשרת." + +#: src/tracking/text/settings.py:142 +msgctxt "guildset:untracked_text_channels|set_using" +msgid "Channel selector below" +msgstr "בחירת ערוצים בתחתית." + +#: src/tracking/text/settings.py:173 +msgctxt "botset:xp_per_period" +msgid "xp_per_5min" +msgstr "נקודות_כל_5דקות" + +#: src/tracking/text/settings.py:176 +msgctxt "botset:xp_per_period|desc" +msgid "" +"How much global XP members will be given every 5 minute period they are " +"active." +msgstr "כמה נקודות ניסיון גלובליות משתמשים יקבלו כל חמש דקות שהם פעילים." + +#: src/tracking/text/settings.py:180 +msgctxt "botset:xp_per_period|long_desc" +msgid "" +"Amount of global message XP to give members for each 5 minute period in " +"which they are active (send a message). Note that this XP is only given " +"*once* per period." +msgstr "" +"כמות נקודות הניסיון הגלובליות שמשתמשים יקבלו כל חמש דקות שהם פעילים. (פעם " +"בחמש דקות)." + +#: src/tracking/text/settings.py:186 +msgctxt "botset:xp_per_period|accepts" +msgid "Number of message XP to reward per 5 minute active period." +msgstr "כמות נקודות הניסיון לכל 5 דקות פעילות" + +#: src/tracking/text/settings.py:198 +#, possible-python-brace-format +msgctxt "leoset:xp_per_period|set_response" +msgid "" +"For every **5** minutes they are active (i.e. in which they send a message)," +" all users will now be given **{amount}** global XP." +msgstr "" +"לכל חמש דקות שהם פעילים (זאת אומרת כשהם שולחים הודעה), כל המשתמשים יקבלו " +"**{amount}** נקודות ניסיון גלובליות." + +#: src/tracking/text/settings.py:206 +msgctxt "botset:word_xp" +msgid "xp_per_100words" +msgstr "נקודות_לכל_100מילים" + +#: src/tracking/text/settings.py:209 +msgctxt "botset:word_xp|desc" +msgid "How much global XP members will be given per hundred words they write." +msgstr "כמה נקודות ניסיון גלובליות משתמשים יקבלו על כל מאה מילים שהם כותבים." + +#: src/tracking/text/settings.py:213 +msgctxt "botset:word_xp|long_desc" +msgid "" +"Amount of global message XP to be given (additionally to the XP per period) " +"for each hundred words. Useful for rewarding communication." +msgstr "כמות נקודות ניסיון גלובליות לתת לכל 100 מילים." + +#: src/tracking/text/settings.py:218 +msgctxt "botset:word_xp|accepts" +msgid "Number of XP to reward per hundred words sent." +msgstr "כמות נקודות ניסיון שמשתמש יקבל כל 100 מילים שישלחו בשרת" + +#: src/tracking/text/settings.py:230 +#, possible-python-brace-format +msgctxt "leoset:word_xp|set_response" +msgid "" +"For every **100** words they send, users will now be rewarded an additional " +"**{amount}** global XP." +msgstr "" +"לכל 100 מילים שהם ישלחו, המשתמשים יקבלו **{amount}** נקודות ניסיון גלובליות " +"נוספות." diff --git a/locales/he_IL/LC_MESSAGES/timer-gui.po b/locales/he_IL/LC_MESSAGES/timer-gui.po new file mode 100644 index 00000000..053f89fc --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/timer-gui.po @@ -0,0 +1,37 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/gui/cards/timer.py:73 +msgctxt "skin:timer|field:date_text" +msgid "Use /now to show what you are working on!" +msgstr "השתמש ב /now כדי להראות לכולם על מה אתה עובד כרגע!" + +#: src/gui/cards/timer.py:89 +msgctxt "skin:timer|stage:focus|field:stage_text" +msgid "FOCUS" +msgstr "פוקוס" + +#: src/gui/cards/timer.py:103 +msgctxt "skin:timer|stage:break|field:stage_text" +msgid "BREAK" +msgstr "הפסקה" diff --git a/locales/he_IL/LC_MESSAGES/user_config.po b/locales/he_IL/LC_MESSAGES/user_config.po new file mode 100644 index 00000000..a587f8e0 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/user_config.po @@ -0,0 +1,106 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/user_config/cog.py:38 +msgctxt "userset:timezone" +msgid "timezone" +msgstr "אזור זמן" + +#: src/modules/user_config/cog.py:41 +msgctxt "userset:timezone|desc" +msgid "Timezone in which to display statistics." +msgstr "אזור הזמן שבו אציג סטטיסטיקות" + +#: src/modules/user_config/cog.py:45 +msgctxt "userset:timezone|long_desc" +msgid "" +"All personal time-related features of StudyLion will use this timezone for " +"you, including personal statistics. Note that leaderboards will still be " +"shown in the server's own timezone." +msgstr "" +"כל הפיצ'רים של הבוט שצריכים אזור זמן קבוע ישתמשו באזור זמן הזה, גם האופציותצ" +" האישית. שים לב שלוח השיאים יהיה באזור הזמן שנקבע על ידי מנהלי השרת עצמו." + +#: src/modules/user_config/cog.py:60 +#, possible-python-brace-format +msgctxt "userset:timezone|response:set" +msgid "Your personal timezone has been set to `{timezone}`." +msgstr "אזור הזמן האישי של השרת נקבע ל`{timezone}`." + +#: src/modules/user_config/cog.py:65 +msgctxt "userset:timezone|response:unset" +msgid "" +"You have unset your timezone. Statistics will be displayed in the server " +"timezone." +msgstr "" +"בחרת להסיר את אזור הזמן שלך. הסטטיסטיקות יוצגו מעכשיו באזור הזמן של השרת " +"עצמו." + +#: src/modules/user_config/cog.py:81 +msgctxt "cmd:userconfig" +msgid "my" +msgstr "שלי" + +#: src/modules/user_config/cog.py:82 +msgctxt "cmd:userconfig|desc" +msgid "User configuration commands." +msgstr "פקודות ניהול למשתמש." + +#: src/modules/user_config/cog.py:89 +msgctxt "cmd:userconfig_timezone" +msgid "timezone" +msgstr "אזור זמן" + +#: src/modules/user_config/cog.py:92 +msgctxt "cmd:userconfig_timezone|desc" +msgid "" +"Set your personal timezone, used for displaying stats and setting reminders." +msgstr "בחר את אזור הזמן שלך, נחוץ כדי לראות סטטיסטיקות ותזכורים." + +#: src/modules/user_config/cog.py:96 +msgctxt "cmd:userconfig_timezone|param:timezone" +msgid "timezone" +msgstr "אזור זמן" + +#: src/modules/user_config/cog.py:101 +msgctxt "cmd:userconfig_timezone|param:timezone|desc" +msgid "What timezone are you in? Try typing your country or continent." +msgstr "מה האזור זמן שלך? נסה להכניס יבשת או מדינה (באנגלית)." + +#: src/modules/user_config/cog.py:117 +#, possible-python-brace-format +msgctxt "cmd:userconfig_timezone|response:set" +msgid "Your timezone is currently set to {timezone}" +msgstr "אזור הזמן שלך כרגע הוא {timezone}" + +#: src/modules/user_config/cog.py:121 +msgctxt "cmd:userconfig_timezone|button:reset|label" +msgid "Reset" +msgstr "אפס" + +#: src/modules/user_config/cog.py:133 +#, possible-python-brace-format +msgctxt "cmd:userconfig_timezone|response:unset" +msgid "Your timezone is not set. Using the server timezone `{timezone}`." +msgstr "" +"אזור הזמן שלך לא נקבע. אני משתמש באזור הזמן של השרת עצמו, `{timezone}`." diff --git a/locales/he_IL/LC_MESSAGES/utils.po b/locales/he_IL/LC_MESSAGES/utils.po new file mode 100644 index 00000000..dcfae8b5 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/utils.po @@ -0,0 +1,529 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/utils/cog.py:18 +msgctxt "cmd:page" +msgid "page" +msgstr "עמוד" + +#: src/utils/cog.py:21 +msgctxt "cmd:page|desc" +msgid "" +"Jump to a given page of the ouput of a previous command in this channel." +msgstr "קפוץ לעמוד ספציפי של התוצאות של הפקודה הקודמת בערוץ הזה." + +#: src/utils/cog.py:34 +msgctxt "cmd:page|error:no_pager" +msgid "No pager listening in this channel!" +msgstr "אין פייגר שמקשיב לערוץ הזה" + +#: src/utils/cog.py:45 +msgctxt "cmd:page_next" +msgid "next" +msgstr "הבא" + +#: src/utils/cog.py:46 +msgctxt "cmd:page_next|desc" +msgid "Jump to the next page of output." +msgstr "קפוץ לעמוד הבא של התוצאות." + +#: src/utils/cog.py:52 +msgctxt "cmd:page_prev" +msgid "prev" +msgstr "הקודם" + +#: src/utils/cog.py:53 +msgctxt "cmd:page_prev|desc" +msgid "Jump to the previous page of output." +msgstr "קפוץ לעמוד הקודם של התוצאות." + +#: src/utils/cog.py:59 +msgctxt "cmd:page_first" +msgid "first" +msgstr "ראשון" + +#: src/utils/cog.py:60 +msgctxt "cmd:page_first|desc" +msgid "Jump to the first page of output." +msgstr "קפוץ לעמוד הראשון של התוצאה" + +#: src/utils/cog.py:66 +msgctxt "cmd:page_last" +msgid "last" +msgstr "אחרון" + +#: src/utils/cog.py:67 +msgctxt "cmd:page_last|desc" +msgid "Jump to the last page of output." +msgstr "קפוץ לעמוד האחרון של התוצאה" + +#: src/utils/cog.py:73 +msgctxt "cmd:page_select" +msgid "select" +msgstr "בחר" + +#: src/utils/cog.py:74 +msgctxt "cmd:page_select|desc" +msgid "Select a page of the output to jump to." +msgstr "בחר עמוד ספציפי לקפוץ אליו" + +#: src/utils/cog.py:77 +msgctxt "cmd:page_select|param:page" +msgid "page" +msgstr "עמוד" + +#: src/utils/cog.py:80 +msgctxt "cmd:page_select|param:page|desc" +msgid "The page name or number to jump to." +msgstr "ציין מספר עמוד לקפוץ אליו" + +#: src/utils/cog.py:86 +msgctxt "cmd:page_select|error:no_pager" +msgid "No pager listening in this channel!" +msgstr "אין פייגר שמקשיב לערוץ הזה" + +#: src/utils/cog.py:97 +msgctxt "cmd:page_select|acmpl|error:no_pager" +msgid "No active pagers in this channel!" +msgstr "אין פייגר שמקשיב לערוץ הזה" + +#: src/utils/transformers.py:43 +#, possible-python-brace-format +msgctxt "utils:parse_dur|error" +msgid "Cannot parse `{value}` as a duration." +msgstr "לא הצלחתי להבין את `{value}` בתור ערך זמן." + +#: src/utils/transformers.py:68 +#, possible-python-brace-format +msgctxt "util:Duration|acmpl|error" +msgid "Cannot extract duration from \"{partial}\"" +msgstr "לא הצלחתי להבין את \"{partial}\"" + +#: src/utils/lib.py:670 +msgctxt "util:parse_dur|regex:day" +msgid "(?P\\d+)\\s*(?:(d)|(day))" +msgstr "(?P\\d+)\\s*(?:(d)|(day))" + +#: src/utils/lib.py:677 +msgctxt "util:parse_dur|regex:hour" +msgid "(?P\\d+)\\s*(?:(h)|(hour))" +msgstr "(?P\\d+)\\s*(?:(h)|(hour))" + +#: src/utils/lib.py:684 +msgctxt "util:parse_dur|regex:minute" +msgid "(?P\\d+)\\s*(?:(m)|(min))" +msgstr "(?P\\d+)\\s*(?:(m)|(min))" + +#: src/utils/lib.py:691 +msgctxt "util:parse_dur|regex:second" +msgid "(?P\\d+)\\s*(?:(s)|(sec))" +msgstr "(?P\\d+)\\s*(?:(s)|(sec))" + +#: src/utils/ui/config.py:35 +msgctxt "ui:configui|modal:edit|title" +msgid "Setting Editor" +msgstr "עורך הגדרות" + +#: src/utils/ui/config.py:75 +msgctxt "ui:configui|check|not_permitted" +msgid "You have insufficient server permissions to use this UI!" +msgstr "אין לך הרשאות מתאימות בשרת עצמו כדי להשתמש בתפריט הזה!" + +#: src/utils/ui/config.py:153 +msgctxt "ui:configui|button:edit|label" +msgid "Edit" +msgstr "ערוך" + +#: src/utils/ui/config.py:192 +msgctxt "ui:guild_config_base|button:reset|label" +msgid "Reset" +msgstr "אפס" + +#: src/utils/ui/config.py:327 +msgctxt "ui:dashboard|error:section_too_long" +msgid "" +"Oops, the settings in this configuration section are too large, and I can " +"not display them here! Please view the settings in the linked configuration " +"panel instead." +msgstr "" +"אופס, ההגרות בתפריט הזה גדולות מידי, ואני לא יכול להראות אותן כאן! אנא צפו " +"בהגדרות בתפריט ההגדרות במקום." + +#. List of valid keys indicating movement to the next page +#: src/utils/ui/pagers.py:50 +msgctxt "cmd:page|pager:Pager|options:next" +msgid "n, nxt, next, forward, +" +msgstr "הבא, הבא, הבא, הבא, +" + +#. List of valid keys indicating movement to the previous page +#: src/utils/ui/pagers.py:53 +msgctxt "cmd:page|pager:Pager|options:prev" +msgid "p, prev, back, -" +msgstr "הקודם, הקודם, הקודם, -" + +#. List of valid keys indicating movement to the first page +#: src/utils/ui/pagers.py:56 +msgctxt "cmd:page|pager:Pager|options:first" +msgid "f, first, one, start" +msgstr "ראשון, ראשון, ראשון, התחל" + +#. List of valid keys indicating movement to the last page +#: src/utils/ui/pagers.py:59 +msgctxt "cmd:page|pager:Pager|options:last" +msgid "l, last, end" +msgstr "אחרון, אחרון, אחרון" + +#: src/utils/ui/pagers.py:273 +#, possible-python-brace-format +msgctxt "cmd:page|pager:Pager|error:parse" +msgid "Could not understand page specification `{value}`." +msgstr "לא הצלחתי להבין את `{value}`." + +#: src/utils/ui/pagers.py:302 +#, possible-python-brace-format +msgctxt "cmd:page|acmpl|pager:Pager|choice:last" +msgid "Last: Page {page}/{total}" +msgstr "אחרון: עמוד {page}/{total}" + +#: src/utils/ui/pagers.py:307 +#, possible-python-brace-format +msgctxt "cmd:page|acmpl|pager:Pager|choice:current" +msgid "Current: Page {page}/{total}" +msgstr "עכשווי: עמוד {page}/{total}" + +#: src/utils/ui/pagers.py:319 +#, possible-python-brace-format +msgctxt "cmd:page|acmpl|pager:Pager|choice:general" +msgid "Page {page}" +msgstr "עמוד {page}" + +#: src/utils/ui/pagers.py:353 +#, possible-python-brace-format +msgctxt "cmd:page|acmpl|pager:Page|choice:select" +msgid "Selected: Page {page}/{total}" +msgstr "בחר: עמוד {page}/{total}" + +#: src/utils/ui/pagers.py:363 +msgctxt "cmd:page|acmpl|pager:Page|error:parse" +msgid "No matching pages!" +msgstr "אין עמודים שמתאימים!" + +#: src/utils/ui/msgeditor.py:75 +msgctxt "ui:msg_editor|error:empty" +msgid "Rendering failed! The message content and embed cannot both be empty." +msgstr "ההעלאה נכשלה! ההודעה והembed לא יכולים להיות ריקים." + +#: src/utils/ui/msgeditor.py:86 +#, possible-python-brace-format +msgctxt "ui:msg_editor|error:embed_failed" +msgid "" +"Rendering failed! Could not parse the embed.\n" +"Error: {error}" +msgstr "" +"ההעלאה נכשלה! ההודעה והembed לא קריאים.\n" +"שגיאה: {error}" + +#: src/utils/ui/msgeditor.py:104 +#, possible-python-brace-format +msgctxt "ui:msg_editor|error:invalid_change" +msgid "" +"Rendering failed! The message was not modified.\n" +"Error: `{text}`" +msgstr "" +"ההעלאה נכשלה! ההודעה והembed לא שונו.\n" +"שגיאה: {text}" + +#: src/utils/ui/msgeditor.py:123 +msgctxt "ui:msg_editor|modal:content|field:content|label" +msgid "Message Content" +msgstr "תוכן הודעה" + +#: src/utils/ui/msgeditor.py:132 +msgctxt "ui:msg_editor|modal:content|title" +msgid "Content Editor" +msgstr "עורך תוכן" + +#: src/utils/ui/msgeditor.py:150 +msgctxt "ui:msg_editor|button:edit|label" +msgid "Edit Content" +msgstr "ערוך תוכן" + +#: src/utils/ui/msgeditor.py:162 +msgctxt "ui:msg_editor|button:add_embed|sample_embed|title" +msgid "Title Placeholder" +msgstr "תופס מקום לכותרת" + +#: src/utils/ui/msgeditor.py:163 +msgctxt "ui:msg_editor|button:add_embed|sample_embed|description" +msgid "Description Placeholder" +msgstr "תופס מקום לתיאור" + +#: src/utils/ui/msgeditor.py:174 +msgctxt "ui:msg_editor|button:add_embed|label" +msgid "Add Embed" +msgstr "הוסף embed" + +#: src/utils/ui/msgeditor.py:192 +msgctxt "ui:msg_editor|modal:body|field:content|label" +msgid "Message Content" +msgstr "תוכן הודעה" + +#: src/utils/ui/msgeditor.py:203 +msgctxt "ui:msg_editor|modal:body|field:desc|label" +msgid "Embed Description" +msgstr "תיאור embed" + +#: src/utils/ui/msgeditor.py:214 +msgctxt "ui:msg_editor|modal:body|field:title|label" +msgid "Embed Title" +msgstr "כותרת embed" + +#: src/utils/ui/msgeditor.py:225 +msgctxt "ui:msg_editor|modal:body|field:colour|label" +msgid "Embed Colour" +msgstr "צבע embed" + +#: src/utils/ui/msgeditor.py:240 +msgctxt "ui:msg_editor|modal:body|title" +msgid "Message Body Editor" +msgstr "עורך תוכן הודעה" + +#: src/utils/ui/msgeditor.py:265 +msgctxt "ui:msg_editor|button:body|error:invalid_colour" +msgid "" +"Invalid colour format! Please enter colours as hex codes, e.g. `#E67E22`" +msgstr "צבע לא נכון! הכנס hex `#E67E22` לדוגמא" + +#: src/utils/ui/msgeditor.py:285 +msgctxt "ui:msg_editor|button:body|label" +msgid "Body" +msgstr "גוף" + +#: src/utils/ui/msgeditor.py:302 +msgctxt "ui:msg_editor|modal:author|field:name|label" +msgid "Author Name" +msgstr "שם כותב" + +#: src/utils/ui/msgeditor.py:313 +msgctxt "ui:msg_editor|modal:author|field:link|label" +msgid "Author URL" +msgstr "לינק לכותב" + +#: src/utils/ui/msgeditor.py:323 +msgctxt "ui:msg_editor|modal:author|field:image|label" +msgid "Author Image URL" +msgstr "תמונה של הכותב" + +#: src/utils/ui/msgeditor.py:334 +msgctxt "ui:msg_editor|modal:author|title" +msgid "Embed Author Editor" +msgstr "עורך כותב" + +#: src/utils/ui/msgeditor.py:360 +msgctxt "ui:msg_editor|button:author|label" +msgid "Author" +msgstr "כותב" + +#: src/utils/ui/msgeditor.py:377 +msgctxt "ui:msg_editor|modal:footer|field:text|label" +msgid "Footer Text" +msgstr "טקסט פוטר" + +#: src/utils/ui/msgeditor.py:388 +msgctxt "ui:msg_editor|modal:footer|field:image|label" +msgid "Footer Image URL" +msgstr "לינק תמונה פוטר" + +#: src/utils/ui/msgeditor.py:398 +msgctxt "ui:msg_editor|modal:footer|field:timestamp|label" +msgid "Embed Timestamp (in ISO format)" +msgstr "נקודת זמן (ISO format)" + +#: src/utils/ui/msgeditor.py:410 +msgctxt "ui:msg_editor|modal:footer|title" +msgid "Embed Footer Editor" +msgstr "עורך כותב פוטר" + +#: src/utils/ui/msgeditor.py:429 +msgctxt "ui:msg_editor|button:footer|error:invalid_timestamp" +msgid "Invalid timestamp! Please enter the timestamp in ISO format." +msgstr "אנא הכנס נקודת זמן בISO" + +#: src/utils/ui/msgeditor.py:449 +msgctxt "ui:msg_editor|button:footer|label" +msgid "Footer" +msgstr "פוטר" + +#: src/utils/ui/msgeditor.py:467 +msgctxt "ui:msg_editor|modal:images|field:thumb|label" +msgid "Thumbnail Image URL" +msgstr "לינק לתמונה" + +#: src/utils/ui/msgeditor.py:477 +msgctxt "ui:msg_editor|modal:images|field:image|label" +msgid "Embed Image URL" +msgstr "לינק תמונה בembed" + +#: src/utils/ui/msgeditor.py:487 +msgctxt "ui:msg_editor|modal:images|title" +msgid "Embed images Editor" +msgstr "עורך תמונה" + +#: src/utils/ui/msgeditor.py:517 +msgctxt "ui:msg_editor|button:images|label" +msgid "Images" +msgstr "תמונות" + +#: src/utils/ui/msgeditor.py:535 +msgctxt "ui:msg_editor|modal:add_field|field:position|label" +msgid "Field number to insert at" +msgstr "מספר אזור להכניס ב" + +#: src/utils/ui/msgeditor.py:545 +msgctxt "ui:msg_editor|modal:add_field|field:name|label" +msgid "Field name" +msgstr "שם" + +#: src/utils/ui/msgeditor.py:555 +msgctxt "ui:msg_editor|modal:add_field|field:value|label" +msgid "Field value" +msgstr "ערך" + +#: src/utils/ui/msgeditor.py:565 +msgctxt "ui:msg_editor|modal:add_field|field:inline|label" +msgid "Whether the field is inline" +msgstr "האם התוכן בInline" + +#: src/utils/ui/msgeditor.py:569 +msgctxt "ui:msg_editor|modal:add_field|field:inline|placeholder" +msgid "True/False" +msgstr "כן/לא" + +#: src/utils/ui/msgeditor.py:582 +msgctxt "ui:msg_editor|modal:add_field|title" +msgid "Add Embed Field" +msgstr "הוסף תוכן embed" + +#: src/utils/ui/msgeditor.py:602 +msgctxt "ui:msg_editor|modal:add_field|error:position_not_int" +msgid "The field position must be an integer!" +msgstr "המיקום של האזור חייב להיות מספר שלם!" + +#: src/utils/ui/msgeditor.py:621 +msgctxt "ui:msg_editor|button:add_field|label" +msgid "Add Field" +msgstr "הוסף אזור" + +#: src/utils/ui/msgeditor.py:637 +msgctxt "ui:msg_editor|format_field|name_placeholder" +msgid "-" +msgstr "-" + +#: src/utils/ui/msgeditor.py:666 +msgctxt "ui:msg_editor|modal:edit_field|field:name|label" +msgid "Field name" +msgstr "שם" + +#: src/utils/ui/msgeditor.py:677 +msgctxt "ui:msg_editor|modal:edit_field|field:value|label" +msgid "Field value" +msgstr "ערך" + +#: src/utils/ui/msgeditor.py:688 +msgctxt "ui:msg_editor|modal:edit_field|field:inline|label" +msgid "Whether the field is inline" +msgstr "האם התוכן בInline" + +#: src/utils/ui/msgeditor.py:692 +msgctxt "ui:msg_editor|modal:edit_field|field:inline|placeholder" +msgid "True/False" +msgstr "כן/לא" + +#: src/utils/ui/msgeditor.py:704 +msgctxt "ui:msg_editor|modal:edit_field|title" +msgid "Edit Embed Field" +msgstr "ערוך תוכן embed" + +#: src/utils/ui/msgeditor.py:733 +msgctxt "ui:msg_editor|menu:edit_field|placeholder" +msgid "Edit Embed Field" +msgstr "ערוך תוכן embed" + +#: src/utils/ui/msgeditor.py:772 +msgctxt "ui:msg_deleteor|menu:delete_field|placeholder" +msgid "Remove Embed Field" +msgstr "הסר תוכן embed" + +#: src/utils/ui/msgeditor.py:808 +msgctxt "ui:msg_editor|button:save|label" +msgid "Save" +msgstr "שמור" + +#: src/utils/ui/msgeditor.py:833 +msgctxt "ui:msg_editor|button:download|label" +msgid "Download" +msgstr "הורד" + +#: src/utils/ui/msgeditor.py:852 +msgctxt "ui:msg_editor|button:undo|label" +msgid "Undo" +msgstr "חזרו" + +#: src/utils/ui/msgeditor.py:872 +msgctxt "ui:msg_editor|button:redo|label" +msgid "Redo" +msgstr "שחזר" + +#: src/utils/ui/msgeditor.py:891 +msgctxt "ui:msg_editor|button:quit|confirm" +msgid "You have unsaved changes! Are you sure you want to quit?" +msgstr "יש לך שינויים שלא שמרת, אתה בטוח שאתה רוצה לעזוב עכשיו?" + +#: src/utils/ui/msgeditor.py:896 +msgctxt "ui:msg_editor|button:quit|confirm|button:yes" +msgid "Yes, Quit Now" +msgstr "כן, עזוב עכשיו" + +#: src/utils/ui/msgeditor.py:902 +msgctxt "ui:msg_editor|button:quit|confirm|button:no" +msgid "No, Go Back" +msgstr "לא, חזור אחורה" + +#: src/utils/ui/msgeditor.py:996 +msgctxt "ui:msg_editor|timeout_warning|title" +msgid "Warning!" +msgstr "זהירות!" + +#: src/utils/ui/msgeditor.py:1000 +#, possible-python-brace-format +msgctxt "ui:msg_editor|timeout_warning|desc" +msgid "" +"This interface will time out {timestamp}. Press 'Continue' below to keep " +"editing." +msgstr "התפריט יפוג ב {timestamp}. לחץ \"המשך\" למטה כדי להמשיך לערוך." + +#: src/utils/ui/msgeditor.py:1009 +msgctxt "ui:msg_editor|timeout_warning|continue" +msgid "Continue" +msgstr "המשך" diff --git a/locales/he_IL/LC_MESSAGES/video.po b/locales/he_IL/LC_MESSAGES/video.po new file mode 100644 index 00000000..983875ba --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/video.po @@ -0,0 +1,361 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/modules/video_channels/settingui.py:57 +msgctxt "ui:video_config|menu:channels|placeholder" +msgid "Select Video Channels" +msgstr "בחר ערוצי מצלמה" + +#: src/modules/video_channels/settingui.py:82 +msgctxt "ui:video_config|menu:exempt|placeholder" +msgid "Select Exempt Roles" +msgstr "בחר רולים שלא יושפעו" + +#: src/modules/video_channels/settingui.py:109 +msgctxt "ui:video_config|menu:video_blacklist|placeholder" +msgid "Select Blacklist Role" +msgstr "בחר רול לרשימה השחורה" + +#: src/modules/video_channels/settingui.py:117 +msgctxt "ui:video_config|embed|title" +msgid "Video Channel Configuration Panel" +msgstr "תפריט הגדרות ערוצי מצלמה" + +#: src/modules/video_channels/settingui.py:156 +msgctxt "dash:video|title" +msgid "Video Channel Settings ({commands[configure video_channels]})" +msgstr "הגדרות ערוצי מצלמה ({commands[configure video_channels]})" + +#: src/modules/video_channels/settingui.py:160 +msgctxt "dash:video|option|name" +msgid "Video Channel Panel" +msgstr "תפריט ערוצי מצלמה" + +#: src/modules/video_channels/cog.py:229 +msgctxt "video_watchdog|kick_blacklisted_member|audit_reason" +msgid "Removing video blacklisted member from a video channel." +msgstr "מסיר משתמש שברשימה השחורה מהערוץ הקולי." + +#: src/modules/video_channels/cog.py:246 +msgctxt "video_watchdog|kick_blacklisted_member|notification|title" +msgid "You have been disconnected." +msgstr "נותקת מהערוץ." + +#: src/modules/video_channels/cog.py:250 +#, possible-python-brace-format +msgctxt "video_watchdog|kick_blacklisted_member|notification|desc" +msgid "" +"You were disconnected from the video channel {channel} because you are " +"blacklisted from video channels in **{server}**." +msgstr "נותקת מהערוץ {channel} כי אתה נמצא ברשימה השחורה בשרת **{server}**." + +#: src/modules/video_channels/cog.py:290 +#, possible-python-brace-format +msgctxt "video_watchdog|join_task|jump_field" +msgid "[Click to jump back]({link})" +msgstr "[לחץ כדי לחזור אחורה]({link})" + +#: src/modules/video_channels/cog.py:297 +msgctxt "video_watchdog|join_task|initial_request:title" +msgid "Please enable your video!" +msgstr "אנא הפעל את המצלמת וידאו שלך!" + +#: src/modules/video_channels/cog.py:301 +#, possible-python-brace-format +msgctxt "video_watchdog|join_task|initial_request:description" +msgid "" +"**You have joined the video channel {channel}!**\n" +"Please **enable your video** or **leave the channel** or you will be disconnected {timestamp} and potentially **blacklisted**." +msgstr "" +"הצטרפת לערוץ {channel}!\n" +"בבקשה תפעיל את המצלמה שלך או שאני אצטרך לנתק אותך מהחדר {timestamp}, ואם תעשה את זה יותר מידי פעמים בלי להפעיל את המצלמה תחסם מלהשתמש בחדרים האלו! " + +#: src/modules/video_channels/cog.py:316 +msgctxt "video_watchdog|join_task|thanks:title" +msgid "Thanks for enabling your video!" +msgstr "תודה שהפעלת את המצלמה!" + +#: src/modules/video_channels/cog.py:323 +msgctxt "video_watchdog|join_task|bye:title" +msgid "Thanks for leaving the channel promptly!" +msgstr "תודה שעזבת את הערוץ!" + +#: src/modules/video_channels/cog.py:367 +msgctxt "video_watchdog|join_task|kick_after_grace|audit_reason" +msgid "Member never enabled their video in video channel." +msgstr "המשתמש לעולם לא הפעיל את המצלמה שלו בערוץ." + +#: src/modules/video_channels/cog.py:385 +#, possible-python-brace-format +msgctxt "video_watchdog|join_task|kick_after_grace|ticket_reason" +msgid "Failed to enable their video in time in the video channel {channel}" +msgstr "נכשל לפתוח את המצלמה שלהם בערוץ וידאו {channel}" + +#: src/modules/video_channels/cog.py:403 +msgctxt "video_watchdog|join_task|kick_after_grace|warning|title" +msgid "You have received a warning!" +msgstr "קיבלת אזהרה!" + +#: src/modules/video_channels/cog.py:407 +#, possible-python-brace-format +msgctxt "video_watchdog|join_task|kick_after_grace|warning|desc" +msgid "" +"**You must enable your camera in camera-only rooms.**\n" +"You have been disconnected from the video {channel} for not enabling your camera." +msgstr "" +"**אתם חייבים להשתמש במצלמה בערוצי המצלמת וידאו**\n" +"נותקתם מהערוץ {channel} מאחר שלא השתמשתם במצלמה. " + +#: src/modules/video_channels/cog.py:422 +msgctxt "video_watchdog|join_task|kick_after_grace|blacklist|title" +msgid "You have been blacklisted!" +msgstr "נכנסת לרשימה השחורה!" + +#: src/modules/video_channels/cog.py:426 +msgctxt "video_watchdog|join_task|kick_after_grace|blacklist|desc" +msgid "You have been blacklisted from the video channels in this server." +msgstr "נחסמת מהלהשתמש בערוצי וידאו בשרת הזה." + +#: src/modules/video_channels/cog.py:459 +#, possible-python-brace-format +msgctxt "video_watchdog|disabled_video_kick|audit_reason" +msgid "" +"Disconnected for disabling video for more than {number} seconds in video " +"channel." +msgstr "נותק מאחר והמצלמה לא הייתה פתוחה יותר מ{number} שניות." + +#: src/modules/video_channels/cog.py:474 +msgctxt "video_watchdog|disabled_video_kick|notification|title" +msgid "You have been disconnected." +msgstr "נותקת מהערוץ." + +#: src/modules/video_channels/cog.py:478 +#, possible-python-brace-format +msgctxt "video_watchdog|disabled_video_kick|notification|desc" +msgid "" +"You were disconnected from the video channel {channel} because you disabled your video.\n" +"Please keep your video on at all times, and leave the channel if you need to disable it!" +msgstr "" +"נותקת מהערוץ {channel} כי ביטלת את המצלמה שלך\n" +"אנא דאג להפעיל את המצלמה כל הזמן, ואם תרצה לכבות אותה, עזוב את הערוץ." + +#: src/modules/video_channels/cog.py:510 +msgctxt "cmd:configure_video" +msgid "video_channels" +msgstr "ערוצי_מצלמה" + +#: src/modules/video_channels/cog.py:512 +msgctxt "cmd:configure_video|desc" +msgid "Configure video-only channels and blacklisting." +msgstr "הגדרות של חדרי מצלמה ורשימות שחורות" + +#: src/modules/video_channels/settings.py:29 +msgctxt "guildset:video_channels" +msgid "video_channels" +msgstr "ערוצי_מצלמה" + +#: src/modules/video_channels/settings.py:32 +msgctxt "guildset:video_channels|desc" +msgid "List of voice channels and categories in which to enforce video." +msgstr "רשימה של ערוצי מצלמה וקטגוריות שבהם חייבים להפעיל את המצלמה." + +#: src/modules/video_channels/settings.py:36 +msgctxt "guildset:video_channels|long_desc" +msgid "" +"Member will be required to turn on their video in these channels.\n" +"If they do not enable their video with `15` seconds of joining, they will be asked to enable it through a notification in direct messages or the `alert_channel`. If they still have not enabled it after the `video_grace_period` has passed, they will be kicked from the channel. Further, after the first offence (which is considered a warning), they will be given the `video_blacklist` role, if configured, which will stop them from joining video channels.\n" +"As usual, if a category is configured, this will apply to all voice channels under the category." +msgstr "" +"משתמשים חייבים להפעיל את המצלמה שלהם בערוצים האלו. אם הם לא מצליחים להפעיל " +"את המצלמה שלהם תוך 15 שניות, הם יקבלו הודעה פרטית או הודעה בערוץ_הודעות " +"שעדכתם בהגדות. אם זמן יעבור והם עדיין לא יפתחו את המצלמה שלהם, הם יקבלו " +"חסימה לפי משך הזמן שהקצבתם בהגדרות." + +#: src/modules/video_channels/settings.py:50 +msgctxt "guildset:video_channels|accepts" +msgid "Comma separated channel ids or names." +msgstr "שמות או מספר זהות של ערוצים מופרדים בפסיקים" + +#: src/modules/video_channels/settings.py:67 +#, possible-python-brace-format +msgctxt "guildset:video_channels|set_response:set" +msgid "" +"Members will be asked to turn on their video in the following channels: " +"{channels}" +msgstr "משתמשים יצטרכו להדליק את המצלמות שלהם בערוצים הבאים: {channels}" + +#: src/modules/video_channels/settings.py:72 +msgctxt "guildset:video_channels|set_response:unset" +msgid "Members will not be asked to turn on their video in any channels." +msgstr "משתמשים לא יצטרכו להדליק את המצלמות שלהם בשום ערוץ." + +#: src/modules/video_channels/settings.py:105 +msgctxt "guildset:video_blacklist" +msgid "video_blacklist" +msgstr "מצלמה_רשימה_שחורה" + +#: src/modules/video_channels/settings.py:108 +msgctxt "guildset:video_blacklist|desc" +msgid "Role given when members are blacklisted from video channels." +msgstr "רול שינתן למשתמשים שהצטרפו לרשימה השחורה של החדרי מצלמות." + +#: src/modules/video_channels/settings.py:112 +msgctxt "guildset:video_blacklist|long_desc" +msgid "" +"This role will be automatically given after a member has failed to keep their video enabled in a video channel (see above).\n" +"Members who have this role will not be able to join configured video channels. The role permissions may be freely configured by server admins to place further restrictions on the offender.\n" +"The role may also be manually assigned, to the same effect.\n" +"If this role is not set, no video blacklist will occur, and members will only be kicked from the channel and warned." +msgstr "" +"הרול ינתן אוטומטית עבור אנשים שלא הצליחו להפעיל את הצמלמה שלהם הערוצי המצלמות.\n" +"משתמשים שיש להם את הרול הזה לא יוכלו להיכנס לערוצי המצלמה. בתור אדמינים, תוכלו לערוץ את הרול הזה איך שבא לכם, כדי לשמור על הסדר של השרת שלכם." + +#: src/modules/video_channels/settings.py:123 +msgctxt "guildset:video_blacklist|accepts" +msgid "Blacklist role name or id." +msgstr "רול או מספר זהות של רשימה שחורה." + +#: src/modules/video_channels/settings.py:138 +#, possible-python-brace-format +msgctxt "guildset:video_blacklist|set_response:set" +msgid "Members who fail to keep their video on will be given {role}" +msgstr "משתמשים שנכשלים לפתוח את המצלמה שלהם יקבלו את הרול {role}" + +#: src/modules/video_channels/settings.py:143 +msgctxt "guildset:video_blacklist|set_response:unset" +msgid "" +"Members will no longer be automatically blacklisted from video channels." +msgstr "משתמשים כבר לא יכנסו לרשימה השחורה בצורה אוטומטית." + +#: src/modules/video_channels/settings.py:155 +msgctxt "guildset:video_blacklist|formatted:unset" +msgid "Not Set. (Members will not be automatically blacklisted.)" +msgstr "לא הופעל. (משתמשים לא יכנסו לרשימה השחורה אוטומטית)" + +#: src/modules/video_channels/settings.py:162 +msgctxt "guildset:video_durations" +msgid "video_blacklist_durations" +msgstr "וידאו_רשימהשחורה_משךזמן" + +#: src/modules/video_channels/settings.py:165 +msgctxt "guildset:video_durations|desc" +msgid "Sequence of durations for automatic video blacklists." +msgstr "רשימה של משכים שבהם כל חסימה והוספה לרשימה השחורה תימשך" + +#: src/modules/video_channels/settings.py:169 +msgctxt "guildset:video_durations|long_desc" +msgid "" +"When `video_blacklist` is set and members fail to turn on their video within the configured `video_grace_period`, they will be automatically blacklisted (i.e. given the `video_blacklist` role).\n" +"This setting describes *how long* the member will be blacklisted for, for each offence.\n" +"E.g. if this is set to `1d, 7d, 30d`, then on the first offence the member will be blacklisted for 1 day, on the second for 7 days, and on the third for 30 days. A subsequent offence will result in an infinite blacklist." +msgstr "" +"כאשר האופציה של הרשימה השחורה מופעילת והם לא מצליחים להדליק את המצלמה שלהם בזמן, הם יקבלו חסימה אוטומטית משימוש בחדרי המצלמות.\n" +"האופציה הזו מתארת את האורך שבו הם יהיו חסומים, לדוגמא: `1d, 7d, 30d`, יחסום אותם ליום, שבוע ואז 30 יום בעבירה השלישית." + +#: src/modules/video_channels/settings.py:181 +msgctxt "guildset:video_durations|accepts" +msgid "Comma separated list of durations." +msgstr "אורכים מופרדים באמצעות פסיק." + +#: src/modules/video_channels/settings.py:208 +#, possible-python-brace-format +msgctxt "guildset:video_durations|set_response:set" +msgid "Members will be automatically blacklisted for: {durations}" +msgstr "משתמשים יכנסו לרשימה השחורה אוטומטית: {durations}." + +#: src/modules/video_channels/settings.py:213 +msgctxt "guildset:video_durations|set_response:unset" +msgid "Video blacklists are now always permanent." +msgstr "הרשימה השחורה של ערוצי המצלמה עכשיו תמידית ולא תוסר לעולם." + +#: src/modules/video_channels/settings.py:221 +msgctxt "guildset:video_grace_period" +msgid "video_grace_period" +msgstr "תקופת_חנינה_חדרמצלמה" + +#: src/modules/video_channels/settings.py:224 +msgctxt "guildset:video_grace_period|desc" +msgid "" +"How long to wait (in seconds) before kicking/blacklist members who don't " +"enable their video." +msgstr "" +"כמה זמן לחכות (בשניות) לפני שאעיף משתמשים שלא הדליקו את המצלמה שלהם מהחדר." + +#: src/modules/video_channels/settings.py:228 +msgctxt "guildset:video_grace_period|long_desc" +msgid "" +"The length of time a member has to enable their video after joining a video " +"channel. After this time, if they have not enabled their video, they will be" +" kicked from the channel and potentially blacklisted from video channels." +msgstr "" +"אורך הזמן שבו משתמש חייב להפעיל את המצלמה שלו לאחר שהצטרף לערוץ מצלמה. אם הם" +" לא מפעילים אותה, הם מסתכנים בחסימה והכנסה לרשימה השחורה, והם לא יוכלו " +"להשתמש בפונקציה הזאתי." + +#: src/modules/video_channels/settings.py:234 +msgctxt "guildset:video_grace_period|accepts" +msgid "How many seconds to wait for a member to enable video." +msgstr "כמה שניות לחכות למשתמשים עד שהם ידליקו את המצלמה שלהם." + +#: src/modules/video_channels/settings.py:248 +#, possible-python-brace-format +msgctxt "guildset:video_grace_period|set_response:set" +msgid "Members will now have **{duration}** to enable their video." +msgstr "למשתמשים עכשיו יהיו **{duration}** להדליק את המצלמה שלהם." + +#: src/modules/video_channels/settings.py:256 +msgctxt "guildset:video_exempt" +msgid "video_exempt" +msgstr "יוצאמןהכלל_וידאו" + +#: src/modules/video_channels/settings.py:259 +msgctxt "guildset:video_exempt|desc" +msgid "List of roles which are exempt from video channels." +msgstr "רשימה של רולים שלא יכללו בניתור ערוצי המצלמה." + +#: src/modules/video_channels/settings.py:263 +msgctxt "guildset:video_exempt|long_desc" +msgid "" +"Members who have **any** of these roles will not be required to enable their" +" video in the `video_channels`. This also overrides the `video_blacklist` " +"role." +msgstr "" +"משתמשים שיש להם כל אחד מהרולים האלו לא יצטרכו להפעיל את המצלמה שלהם בערוצי " +"המצלמה. אופציה זו עוקפת גם את הרשימה השחורה." + +#: src/modules/video_channels/settings.py:269 +msgctxt "guildset:video_exempt|accepts" +msgid "List of exempt role names or ids." +msgstr "רשימה של שמות או מספר מזהה של רולים שלא יכללו." + +#: src/modules/video_channels/settings.py:284 +#, possible-python-brace-format +msgctxt "guildset:video_exempt|set_response:set" +msgid "The following roles will now be exempt from video channels: {roles}" +msgstr "הרולים הבאים יוכלו לעקוף את הדרישות של ערוצי המצלמה: {roles}" + +#: src/modules/video_channels/settings.py:289 +msgctxt "guildset:video_exempt|set_response:unset" +msgid "No members will be exempt from video channel requirements." +msgstr "שום משתמש לא יוכל לעקוף את הדרישות של חדרי המצלמה." diff --git a/locales/he_IL/LC_MESSAGES/voice-tracker.po b/locales/he_IL/LC_MESSAGES/voice-tracker.po new file mode 100644 index 00000000..2de52719 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/voice-tracker.po @@ -0,0 +1,415 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/tracking/voice/cog.py:640 +msgctxt "cmd:now" +msgid "now" +msgstr "עכשיו" + +#: src/tracking/voice/cog.py:643 +msgctxt "cmd:now|desc" +msgid "" +"Describe what you are working on, or see what your friends are working on!" +msgstr "תאר על מה אתה עובד כרגע, וצפה מה חבריך עושים!" + +#: src/tracking/voice/cog.py:647 +msgctxt "cmd:now|param:tag" +msgid "tag" +msgstr "תאג" + +#: src/tracking/voice/cog.py:648 +msgctxt "cmd:now|param:user" +msgid "user" +msgstr "משתמש" + +#: src/tracking/voice/cog.py:649 +msgctxt "cmd:now|param:clear" +msgid "clear" +msgstr "נקה" + +#: src/tracking/voice/cog.py:654 +msgctxt "cmd:now|param:tag|desc" +msgid "Describe what you are working on in 10 characters or less!" +msgstr "תאר על מה אתה עובד ב10 תווים או פחות!" + +#: src/tracking/voice/cog.py:658 +msgctxt "cmd:now|param:user|desc" +msgid "Check what a friend is working on." +msgstr "בדוק על מה חברים שלך עובדים כרגע." + +#: src/tracking/voice/cog.py:662 +msgctxt "cmd:now|param:clear|desc" +msgid "Unset your activity tag (or the target user's tag, for moderators)." +msgstr "בטל את התאג פעילות שלך (או ציין תאג של אחד מהמשתמשים אם אתה המנהל)." + +#: src/tracking/voice/cog.py:689 +msgctxt "cmd:now|target:self|error:target_inactive" +msgid "" +"You have no running session! Join a tracked voice channel to start a " +"session." +msgstr "אין לך סשנים שרצים כרגע, הצטרף לערוץ קולי כדי להתחיל את הסשן שלך!" + +#: src/tracking/voice/cog.py:698 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|error:target_inactive" +msgid "{mention} has no running session!" +msgstr "ל {mention} אין שום סשן כרגע." + +#: src/tracking/voice/cog.py:713 +msgctxt "cmd:now|target:self|mode:clear|success|title" +msgid "Session Tag Cleared" +msgstr "תגית הסשן נוקתה" + +#: src/tracking/voice/cog.py:717 +msgctxt "cmd:now|target:self|mode:clear|success|desc" +msgid "Successfully unset your session tag." +msgstr "ניקיתי את התאגית שלך בהצלחה!" + +#: src/tracking/voice/cog.py:726 +msgctxt "cmd:now|target:other|mode:clear|error:perms|title" +msgid "You can't do that!" +msgstr "אתה לא יכול לעשות את זה!" + +#: src/tracking/voice/cog.py:730 +msgctxt "cmd:now|target:other|mode:clear|error:perms|desc" +msgid "You need to be a moderator to set or clear someone else's session tag." +msgstr "אתה צריך להיות מנהל כדי לקבוע או למחוק סשן תאג של מישהו אחר." + +#: src/tracking/voice/cog.py:740 +msgctxt "cmd:now|target:other|mode:clear|success|title" +msgid "Session Tag Cleared!" +msgstr "תאגית הסשן נוקתה!" + +#: src/tracking/voice/cog.py:744 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|mode:clear|success|desc" +msgid "Cleared {target}'s session tag." +msgstr "ניקיתי את התאג של {target}" + +#: src/tracking/voice/cog.py:756 +msgctxt "cmd:now|target:self|mode:set|success|title" +msgid "Session Tag Set!" +msgstr "תאג לסשן לא נקבע!" + +#: src/tracking/voice/cog.py:760 +#, possible-python-brace-format +msgctxt "cmd:now|target:self|mode:set|success|desc" +msgid "You are now working on `{new_tag}`. Good luck!" +msgstr "אתה עובד על `{new_tag}` עכשיו, בהצלחה!" + +#: src/tracking/voice/cog.py:769 +msgctxt "cmd:now|target:other|mode:set|error:perms|title" +msgid "You can't do that!" +msgstr "אתה לא יכול לעשות את זה!" + +#: src/tracking/voice/cog.py:773 +msgctxt "cmd:now|target:other|mode:set|error:perms|desc" +msgid "You need to be a moderator to set or clear someone else's session tag!" +msgstr "אתה צריך להיות מנהל כדי לקבוע או למחוק סשן תאג של מישהו אחר." + +#: src/tracking/voice/cog.py:783 +msgctxt "cmd:now|target:other|mode:set|success|title" +msgid "Session Tag Set!" +msgstr "תאג לסשן לא נקבע!" + +#: src/tracking/voice/cog.py:787 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|mode:set|success|desc" +msgid "Set {target}'s session tag to `{new_tag}`." +msgstr "שנה את התאג של {target} אל `{new_tag}`." + +#: src/tracking/voice/cog.py:796 +#, possible-python-brace-format +msgctxt "cmd:now|target:self|mode:show_with_tag|desc" +msgid "You have been working on **`{tag}`** in {channel} since {time}!" +msgstr "אתה עובד על **`{tag}`** בערוץ {channel} במשך {time}!" + +#: src/tracking/voice/cog.py:801 +#, possible-python-brace-format +msgctxt "cmd:now|target:self|mode:show_without_tag|desc" +msgid "" +"You have been working in {channel} since {time}!\n" +"\n" +"Use `/now ` to set what you are working on." +msgstr "" +"אתה עובד ב{channel} במשך {time}!\n" +"\n" +" `/now ` כדי להראות לכולם על מה אתה עובד תמשתמש ב." + +#: src/tracking/voice/cog.py:808 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|mode:show_with_tag|desc" +msgid "" +"{target} is current working in {channel}!\n" +"They have been working on **{tag}** since {time}." +msgstr "" +"{target} עובד כרגע בערוץ {channel}!\n" +"הם עובדים על **{tag}** מאז {time}." + +#: src/tracking/voice/cog.py:814 +#, possible-python-brace-format +msgctxt "cmd:now|target:other|mode:show_without_tag|desc" +msgid "{target} has been working in {channel} since {time}!" +msgstr "{target} עובד על **`{tag}`** בערוץ {channel} במשך {time}!" + +#: src/tracking/voice/cog.py:837 +msgctxt "cmd:configure_voice_rates" +msgid "voice_rewards" +msgstr "פרס_ערוץ_קולי" + +#: src/tracking/voice/cog.py:840 +msgctxt "cmd:configure_voice_rates|desc" +msgid "Configure Voice tracking rewards and experience" +msgstr "ערוך מעקב זמנים ונקודות ניסיון" + +#: src/tracking/voice/cog.py:897 +#, possible-python-brace-format +msgctxt "cmd:configure_voice_tracking|mode:voice|resp:success|desc" +msgid "" +"Members will now be rewarded {coin}**{base} (+ {bonus})** per hour they " +"spend (live) in a voice channel, up to a total of **{cap}** hours per server" +" day." +msgstr "" +"משתמשים עכשיו יקבלו {coin}**{base} (+ {bonus})** לכל שעה שהם מבלים בערוץ " +"קולי, והם לא יוכלו לעבור **{cap}** ביממה. " + +#: src/tracking/voice/cog.py:908 +#, possible-python-brace-format +msgctxt "cmd:configure_voice_tracking|mode:study|resp:success|desc" +msgid "" +"Members will now be rewarded {coin}**{base}** per hour of study in this " +"server, with a bonus of {coin}**{bonus}** if they stream of display video, " +"up to a total of **{cap}** hours per server day." +msgstr "" +"משתמשים יקבלו {coin}**{base}** על כל שעה שהם ילמדו בשרת הזה, עם בונוס של " +"{coin}**{bonus}** אם הם פותחים מצלמה או משתפים את המסך שלהם, עם המגבלה של " +"**{cap}** שעות ביום." + +#: src/tracking/voice/settings.py:40 +msgctxt "guildset:untracked_channels" +msgid "untracked_channels" +msgstr "ערוצים_לא_נחשבים" + +#: src/tracking/voice/settings.py:43 +msgctxt "guildset:untracked_channels|desc" +msgid "Channels which will be ignored for statistics tracking." +msgstr "ערוצים שאתעלם מהם כשאעקוב אחרי סטטיסטיקה של אנשים." + +#: src/tracking/voice/settings.py:47 +msgctxt "guildset:untracked_channels|long_desc" +msgid "" +"Activity in these channels will not count towards a member's statistics. If " +"a category is selected, all channels under the category will be untracked." +msgstr "" +"פעילות בערוצים האלו לא יחשבו בתור זמן בסטטיסטיקות של אנשים. אם קטגוריה " +"נבחרה, כל הערוצים תחתה לא יחשבו." + +#: src/tracking/voice/settings.py:52 +msgctxt "guildset:untracked_channels|accepts" +msgid "Comma separated list of untracked channel name/ids." +msgstr "רשימה מופרדת עם פסיקים של הערוצים המוגדרים כערוצים לא נעקבים." + +#: src/tracking/voice/settings.py:56 +msgctxt "guildset:untracked_channels|notset" +msgid "Not Set (all voice channels will be tracked.)" +msgstr "לא נקבע. (כל הערוצי הקול ייחשבו)" + +#: src/tracking/voice/settings.py:73 +msgctxt "guildset:untracked_channels|set" +msgid "Channel selector below." +msgstr "בחירת ערוצים בתחתית." + +#: src/tracking/voice/settings.py:82 +#, possible-python-brace-format +msgctxt "guildset:untracked_channels|set_response|set" +msgid "Activity in the following channels will now be ignored: {channels}" +msgstr "פעילות בערוצים הבאים יתעלמו על ידי: {channels}" + +#: src/tracking/voice/settings.py:89 +msgctxt "guildset:untracked_channels|set_response|unset" +msgid "All voice channels will now be tracked." +msgstr "כל שרתי הקול עכשיו יחשבו לסטטיסטיקה." + +#: src/tracking/voice/settings.py:117 +msgctxt "guildset:hourly_reward" +msgid "hourly_reward" +msgstr "פרס_שעתי" + +#: src/tracking/voice/settings.py:120 +msgctxt "guildset:hourly_reward|mode:voice|desc" +msgid "LionCoins given per hour in a voice channel." +msgstr "מטבעות שניתנות עבור כל שעה בערוץ קול." + +#: src/tracking/voice/settings.py:124 +msgctxt "guildset:hourly_reward|mode:voice|long_desc" +msgid "" +"Number of LionCoins to each member per hour that they stay in a tracked " +"voice channel." +msgstr "מספר מטבעות שכל משתמש יקבל בשעה כשהוא נשאר בערוץ קולי." + +#: src/tracking/voice/settings.py:128 +msgctxt "guildset:hourly_reward|accepts" +msgid "Number of coins to reward per hour in voice." +msgstr "מספר מטבעות שמשתמש יקבל כל שעה בערוץ קול." + +#: src/tracking/voice/settings.py:144 +#, possible-python-brace-format +msgctxt "guildset:hourly_reward|formatted" +msgid "{coin}**{amount}** per hour." +msgstr "{coin}**{amount}** לשעה." + +#: src/tracking/voice/settings.py:159 +#, possible-python-brace-format +msgctxt "guildset:hourly_reward|mode:voice|response" +msgid "Members will be given {coin}**{amount}** per hour in a voice channel!" +msgstr "משתמשים יקבלו {coin}**{amount}** כל שעה בערוץ קולי!" + +#: src/tracking/voice/settings.py:171 +msgctxt "guildset:hourly_reward|mode:study|desc" +msgid "LionCoins given per hour of study." +msgstr "מטבעות שניתנות עבור כל שעה של למידה." + +#: src/tracking/voice/settings.py:175 +msgctxt "guildset:hourly_reward|mode:study|long_desc" +msgid "Number of LionCoins given per hour of study, up to the daily hour cap." +msgstr "מספר מטבעות שיקבלו כל שעת למידה בערוץ קולי עד המגבלה." + +#: src/tracking/voice/settings.py:183 +#, possible-python-brace-format +msgctxt "guildset:hourly_reward|mode:study|response" +msgid "Members will be given {coin}**{amount}** per hour that they study!" +msgstr "משתמשים יקבלו {coin}**{amount}** כל שעה שהם ילמדו בערוץ קולי!" + +#: src/tracking/voice/settings.py:197 +msgctxt "guildset:hourly_live_bonus" +msgid "hourly_live_bonus" +msgstr "בונוס_שעתי_מצלמה" + +#: src/tracking/voice/settings.py:200 +msgctxt "guildset:hourly_live_bonus|desc" +msgid "Bonus Lioncoins given per hour when a member streams or video-chats." +msgstr "בונוס שעתי שמשתמש מקבל כאשר הוא משתמש במצלמה או משתף מסך. " + +#: src/tracking/voice/settings.py:205 +msgctxt "guildset:hourly_live_bonus|long_desc" +msgid "" +"When a member streams or video-chats in a channel they will be given this " +"bonus *additionally* to the `hourly_reward`." +msgstr "" +"כאשר משתמש פותח מצלמה או משתף מסך הם יקבלו את הבונוס הזה בנוסף למה שהם עושים" +" כל שעה." + +#: src/tracking/voice/settings.py:210 +msgctxt "guildset:hourly_live_bonus|accepts" +msgid "Number of bonus coins to reward per hour when live." +msgstr "" +"מספר מטבעות שמשתמש יקבל כל שעה בערוץ קול כשהם פותחים מצלמה או משתפים מסך." + +#: src/tracking/voice/settings.py:226 +#, possible-python-brace-format +msgctxt "guildset:hourly_live_bonus|formatted" +msgid "{coin}**{amount}** bonus per hour when live." +msgstr "{coin}**{amount}** לשעה כשמשתמש פותח מצלמה או משתף מסך." + +#: src/tracking/voice/settings.py:237 +#, possible-python-brace-format +msgctxt "guildset:hourly_live_bonus|response" +msgid "" +"Live members will now *additionally* be given {coin}**{amount}** per hour." +msgstr "משתמשים שמשתפים מדיה יקבלו עכשיו {coin}**{amount}** כל שעה." + +#: src/tracking/voice/settings.py:248 +msgctxt "guildset:daily_voice_cap" +msgid "daily_voice_cap" +msgstr "מגבלת_מטבעות_יומית" + +#: src/tracking/voice/settings.py:251 +msgctxt "guildset:daily_voice_cap|desc" +msgid "Maximum number of hours per day to count for each member." +msgstr "מספר מקסימלי של שעות ביום שיחשבו לכל משתמש." + +#: src/tracking/voice/settings.py:255 +msgctxt "guildset:daily_voice_cap|long_desc" +msgid "" +"Time spend in voice channels over this amount will not be tracked towards " +"the member's statistics. Tracking will resume at the start of the next day. " +"The start of the day is determined by the configured guild timezone." +msgstr "" +"זמן שיעבור אחרי המגלבה הזו לא יחשב בסטטיסטקות של אנשים. אני אחזור לעקוב " +"אחריהם יום אחרי, בחצות. " + +#: src/tracking/voice/settings.py:261 +msgctxt "guildset:daily_voice_cap|accepts" +msgid "The maximum number of voice hours to track per day." +msgstr "מספר השעון המקסימלי שאעקוב אחריו כל יממה." + +#: src/tracking/voice/settings.py:277 +#, possible-python-brace-format +msgctxt "guildset:daily_voice_cap|response" +msgid "" +"Members will be tracked for at most {duration} per day. (**NOTE:** This will" +" not affect members currently in voice channels.)" +msgstr "" +"משתמשים יעקבו לתקופה של מקסימום {duration} ביום. וזה לא ישפיע על אנשים " +"שכרגע לומדים בחדרים." + +#: src/tracking/voice/settings.py:335 +msgctxt "ui:voice_tracker_config|button:close|label" +msgid "Close" +msgstr "סגור" + +#: src/tracking/voice/settings.py:349 +msgctxt "ui:voice_tracker_config|button:reset|label" +msgid "Reset" +msgstr "אפס" + +#: src/tracking/voice/settings.py:362 +msgctxt "ui:voice_tracker_config|menu:untracked_channels|placeholder" +msgid "Set Untracked Channels" +msgstr "בחר ערוצים ללא מעקב" + +#: src/tracking/voice/settings.py:428 src/tracking/voice/settings.py:482 +msgctxt "ui:voice_tracker_config|mode:voice|embed|title" +msgid "Voice Tracker Configuration Panel" +msgstr "תפריט הגדרות ערוצי מצלמה" + +#: src/tracking/voice/settings.py:433 src/tracking/voice/settings.py:487 +msgctxt "ui:voice_tracker_config|mode:study|embed|title" +msgid "Study Tracker Configuration Panel" +msgstr "תפריט הגדרות ערוצי לימודים" + +#: src/tracking/voice/settings.py:472 +msgctxt "ui:voice_tracker_config|menu:untracked_channels|placeholder" +msgid "Select Untracked Channels" +msgstr "בחר ערוצים ללא מעקב" + +#: src/tracking/voice/settings.py:528 +msgctxt "dash:voice_tracker|title" +msgid "Voice Tracker Configuration ({commands[configure voice_rewards]})" +msgstr "הגדרות מעקב קולי ({commands[configure voice_rewards]})" + +#: src/tracking/voice/settings.py:532 +msgctxt "dash:voice_tracking|dropdown|placeholder" +msgid "Voice Activity Panel" +msgstr "תפריט פעילות חדרי קול" diff --git a/locales/he_IL/LC_MESSAGES/wards.po b/locales/he_IL/LC_MESSAGES/wards.po new file mode 100644 index 00000000..550540e7 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/wards.po @@ -0,0 +1,96 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# Ari Horesh, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Ari Horesh, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/wards.py:79 +msgctxt "ward:sys_admin|failed" +msgid "You must be a bot owner to do this!" +msgstr "אתה צריך להיות הבעלים של הבוט כדי לעשות את זה!" + +#: src/wards.py:95 +msgctxt "ward:high_management|failed" +msgid "" +"You must have the `ADMINISTRATOR` permission in this server to do this!" +msgstr "אתה צריך הראשות אדמין `ADMINISTRATOR` בשרת כדי לעשות את זה. " + +#: src/wards.py:111 +msgctxt "ward:low_management|failed" +msgid "You must have the `MANAGE_GUILD` permission in this server to do this!" +msgstr "אתה צריך הראשות ניהול `MANAGE_GUILD` בשרת כדי לעשות את זה. " + +#: src/wards.py:123 +msgctxt "ward:moderator|failed" +msgid "" +"You must have the configured moderator role, or `MANAGE_GUILD` permissions " +"to do this." +msgstr "" +"חייב להיות לכם רול של מנהלים, או הרשאה `MANAGE_GUILD` כדי לעשות את זה." + +#: src/wards.py:149 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:bot_managed" +msgid "I cannot manage {role} because it is managed by another bot!" +msgstr "אני לא יכול לנהל את {role} כי הוא מנוהל על ידי בוט אחר בשרת." + +#: src/wards.py:156 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:integration" +msgid "I cannot manage {role} because it is managed by a server integration." +msgstr "אני לא יכול לנהל את {role} כי הוא מנוהל על ידי בוט אחר בשרת." + +#: src/wards.py:163 +msgctxt "ward:equippable_role|error:default_role" +msgid "I cannot manage the server's default role." +msgstr "אני לא יכול לערוך את הרול ברירת מחדל של השרת." + +#: src/wards.py:170 +msgctxt "ward:equippable_role|error:no_perms" +msgid "I need the `MANAGE_ROLES` permission before I can manage roles!" +msgstr "אני צריך את ההרשאה `MANAGE_ROLES` כדי לנהל את הרולים של השרת הזה." + +#: src/wards.py:177 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:my_top_role" +msgid "I cannot assign or remove {role} because it is above my top role!" +msgstr "" +"אני לא יכול לתת או להסיר את {role} מאחר והוא מעל הרול שלי ברשימת הרולים של " +"השרת שלכם!" + +#: src/wards.py:184 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:not_assignable" +msgid "I don't have sufficient permissions to assign or remove {role}." +msgstr "אין לי מספיק הראשות כדי לתת או להסיר את הרול {role}." + +#: src/wards.py:192 +msgctxt "ward:equippable_role|error:actor_perms" +msgid "You need the `MANAGE_ROLES` permission before you can configure roles!" +msgstr "אתה צריך את ההרשאה `MANAGE_ROLES` כדי לנהל את הרולים של השרת הזה." + +#: src/wards.py:199 +#, possible-python-brace-format +msgctxt "ward:equippable_role|error:actor_top_role" +msgid "You cannot configure {role} because it is above your top role!" +msgstr "" +"אתה לא יכול לתת או להסיר את {role} מאחר והוא מעל הרול שלך ברשימת הרולים של " +"השרת שלכם!" diff --git a/locales/he_IL/LC_MESSAGES/weekly-gui.po b/locales/he_IL/LC_MESSAGES/weekly-gui.po new file mode 100644 index 00000000..d09469f9 --- /dev/null +++ b/locales/he_IL/LC_MESSAGES/weekly-gui.po @@ -0,0 +1,101 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Interitio, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-08-27 16:37+0300\n" +"PO-Revision-Date: 2023-08-28 13:43+0000\n" +"Last-Translator: Interitio, 2023\n" +"Language-Team: Hebrew (Israel) (https://app.transifex.com/leobot/teams/174919/he_IL/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: he_IL\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#: src/gui/cards/weekly.py:52 +msgctxt "skin:weeklystats|mode:study|title" +msgid "STUDY HOURS" +msgstr "שעות למידה" + +#: src/gui/cards/weekly.py:56 +msgctxt "skin:weeklystats|mode:voice|title" +msgid "VOICE CHANNEL ACTIVITY" +msgstr "פעילות בחדרי קול" + +#: src/gui/cards/weekly.py:60 +msgctxt "skin:weeklystats|mode:text|title" +msgid "MESSAGE ACTIVITY" +msgstr "פעילות הודעות" + +#: src/gui/cards/weekly.py:64 +msgctxt "skin::weeklystats|mode:anki|title" +msgid "CARDS REVIEWED" +msgstr "קלפים שנעשו" + +#: src/gui/cards/weekly.py:137 +msgctxt "skin:weeklystats|weekdays" +msgid "M,T,W,T,F,S,S" +msgstr "ש,ש,ר,ח,ש,ש,ר" + +#: src/gui/cards/weekly.py:207 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:study|summary:this_week" +msgid "THIS WEEK: {amount} HOURS" +msgstr "השבוע הנוכחי {amount} שעות" + +#: src/gui/cards/weekly.py:211 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:voice|summary:this_week" +msgid "THIS WEEK: {amount} HOURS" +msgstr "השבוע הנוכחי {amount} שעות" + +#: src/gui/cards/weekly.py:215 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:text|summary:this_week" +msgid "THIS WEEK: {amount} MESSAGES" +msgstr "השבוע הנוכחי {amount} הודעות" + +#: src/gui/cards/weekly.py:219 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:text|summary:this_week" +msgid "THIS WEEK: {amount} CARDS" +msgstr "השבוע הנוכחי {amount} קלפים" + +#: src/gui/cards/weekly.py:240 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:study|summary:last_week" +msgid "LAST WEEK: {amount} HOURS" +msgstr "שבוע שעבר {amount} שעות" + +#: src/gui/cards/weekly.py:244 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:voice|summary:last_week" +msgid "LAST WEEK: {amount} HOURS" +msgstr "שבוע שעבר {amount} שעות" + +#: src/gui/cards/weekly.py:248 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:text|summary:last_week" +msgid "LAST WEEK: {amount} MESSAGES" +msgstr "החודש הקודם {amount} הודעות" + +#: src/gui/cards/weekly.py:252 +#, possible-python-brace-format +msgctxt "skin:weeklystats|mode:text|summary:last_week" +msgid "LAST WEEK: {amount} CARDS" +msgstr "החודש הקודם {amount} קלפים" + +#: src/gui/cards/weekly.py:272 +#, possible-python-brace-format +msgctxt "skin:weeklystats|footer" +msgid "Weekly Statistics • As of {day} {month} • {name} {discrim}" +msgstr "סטטיסטיקה שבועית • מתאריך {day} {month} • {name} {discrim}" diff --git a/locales/templates/Pomodoro.pot b/locales/templates/Pomodoro.pot index 676f42c8..106d1b03 100644 --- a/locales/templates/Pomodoro.pot +++ b/locales/templates/Pomodoro.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,41 +18,41 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/modules/pomodoro/timer.py:50 +#: src/modules/pomodoro/timer.py:51 msgctxt "timer|stage:break|name" msgid "BREAK" msgstr "" -#: src/modules/pomodoro/timer.py:51 +#: src/modules/pomodoro/timer.py:52 msgctxt "timer|stage:focus|name" msgid "FOCUS" msgstr "" -#: src/modules/pomodoro/timer.py:155 +#: src/modules/pomodoro/timer.py:158 #, possible-python-brace-format msgctxt "timer|webhook|name" msgid "{bot_name} Pomodoro" msgstr "" -#: src/modules/pomodoro/timer.py:159 +#: src/modules/pomodoro/timer.py:162 msgctxt "timer|webhook|audit_reason" msgid "Pomodoro Notifications" msgstr "" -#: src/modules/pomodoro/timer.py:170 +#: src/modules/pomodoro/timer.py:173 msgctxt "timer|webhook|error:insufficient_permissions" msgid "" "I require the `MANAGE_WEBHOOKS` permission to send pomodoro notifications " "here!" msgstr "" -#: src/modules/pomodoro/timer.py:229 +#: src/modules/pomodoro/timer.py:232 #, possible-python-brace-format msgctxt "timer|default_base_name" msgid "Timer {pattern}" msgstr "" -#: src/modules/pomodoro/timer.py:403 +#: src/modules/pomodoro/timer.py:406 #, possible-python-brace-format msgctxt "timer|kicked_message" msgid "" @@ -64,20 +64,20 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/modules/pomodoro/timer.py:496 +#: src/modules/pomodoro/timer.py:499 #, possible-python-brace-format msgctxt "timer|status|stage:focus|statusline" msgid "{channel} is now in **FOCUS**! Good luck, **BREAK** starts {timestamp}" msgstr "" -#: src/modules/pomodoro/timer.py:501 +#: src/modules/pomodoro/timer.py:504 #, possible-python-brace-format msgctxt "timer|status|stage:break|statusline" msgid "" "{channel} is now on **BREAK**! Take a rest, **FOCUS** starts {timestamp}" msgstr "" -#: src/modules/pomodoro/timer.py:533 +#: src/modules/pomodoro/timer.py:536 #, possible-python-brace-format msgctxt "timer|status|warningline" msgid "" @@ -85,13 +85,13 @@ msgid "" "next stage." msgstr "" -#: src/modules/pomodoro/timer.py:552 +#: src/modules/pomodoro/timer.py:555 #, possible-python-brace-format msgctxt "timer|status|stopped:auto" msgid "Timer stopped! Join {channel} to start the timer." msgstr "" -#: src/modules/pomodoro/timer.py:557 +#: src/modules/pomodoro/timer.py:560 msgctxt "timer|status|stopped:manual" msgid "Timer stopped! Press `Start` to restart the timer." msgstr "" @@ -116,254 +116,285 @@ msgctxt "dash:stats|dropdown|placeholder" msgid "Pomodoro Timer Panel" msgstr "" -#: src/modules/pomodoro/cog.py:83 +#: src/modules/pomodoro/cog.py:82 msgctxt "cmd_check:ready|failed" msgid "" "I am currently restarting! The Pomodoro timers will be unavailable until I " "have restarted. Thank you for your patience!" msgstr "" -#: src/modules/pomodoro/cog.py:321 -msgctxt "cmd:pomodoro" -msgid "timers" -msgstr "" - #: src/modules/pomodoro/cog.py:322 -msgctxt "cmd:pomodoro|desc" -msgid "Base group for all pomodoro timer commands." +msgctxt "cmd:timer" +msgid "timer" msgstr "" -#: src/modules/pomodoro/cog.py:330 -msgctxt "cmd:pomodoro_status" -msgid "show" +#: src/modules/pomodoro/cog.py:323 +msgctxt "cmd:timer|desc" +msgid "Show your current (or selected) pomodoro timer." msgstr "" -#: src/modules/pomodoro/cog.py:331 -msgctxt "cmd:pomodoro_status|desc" -msgid "Display the status of a single pomodoro timer." -msgstr "" - -#: src/modules/pomodoro/cog.py:334 -msgctxt "cmd:pomodoro_status|param:channel" +#: src/modules/pomodoro/cog.py:326 +msgctxt "cmd:timer|param:channel" msgid "timer_channel" msgstr "" -#: src/modules/pomodoro/cog.py:339 -msgctxt "cmd:pomodoro_status|param:channel|desc" -msgid "The channel for which you want to view the timer." +#: src/modules/pomodoro/cog.py:331 +msgctxt "cmd:timer|param:channel|desc" +msgid "Select a timer to display (by selecting the timer voice channel)" msgstr "" -#: src/modules/pomodoro/cog.py:357 +#: src/modules/pomodoro/cog.py:353 src/modules/pomodoro/cog.py:423 #, possible-python-brace-format -msgctxt "cmd:pomodoro_status|error:no_timer" -msgid "The channel {channel} does not have a timer set up!" +msgctxt "cmd:timer|error:no_timers|desc" +msgid "" +"**This server has no timers set up!**\n" +"Ask an admin to set up and configure a timer with {create_cmd} first, or " +"rent a private room with {room_cmd} and create one yourself!" msgstr "" #: src/modules/pomodoro/cog.py:367 -msgctxt "cmd:pomodoro_list" -msgid "list" -msgstr "" - -#: src/modules/pomodoro/cog.py:368 -msgctxt "cmd:pomodoro_list|desc" -msgid "List the available pomodoro timers." -msgstr "" - -#: src/modules/pomodoro/cog.py:391 #, possible-python-brace-format -msgctxt "cmd:pomodoro_list|error:no_timers" +msgctxt "cmd:timer|error:no_channel|desc" msgid "" -"No timers have been setup in this server!\n" -"You can ask an admin to create one with {command}, or rent a private room " -"and create one yourself!" +"**I don't know what timer to show you.**\n" +"No channel selected and you are not in a voice channel! Use {timers_cmd} to " +"list the available timers in this server." msgstr "" -#: src/modules/pomodoro/cog.py:404 -msgctxt "cmd:pomodoro_list|error:no_visible_timers" -msgid "There are no timers you can join in this server!" -msgstr "" - -#: src/modules/pomodoro/cog.py:414 +#: src/modules/pomodoro/cog.py:380 #, possible-python-brace-format -msgctxt "cmd:pomodoro_list|embed:timer_list|title" -msgid "Pomodoro Timers in **{guild}**" +msgctxt "cmd:timer|error:no_timer_in_channel" +msgid "" +"The channel {channel} is not a pomodoro timer room!\n" +"Use {timers_cmd} to list the available timers in this server." msgstr "" -#: src/modules/pomodoro/cog.py:423 +#: src/modules/pomodoro/cog.py:396 +msgctxt "cmd:timers" +msgid "timers" +msgstr "" + +#: src/modules/pomodoro/cog.py:397 +msgctxt "cmd:timers|desc" +msgid "List the available pomodoro timer rooms." +msgstr "" + +#: src/modules/pomodoro/cog.py:436 #, possible-python-brace-format -msgctxt "cmd:pomodoro_list|status:stopped_auto" +msgctxt "cmd:timer|error:no_visible_timers|desc" +msgid "" +"**There are no available pomodoro timers!**\n" +"Ask an admin to set up a new timer with {create_cmd}, or rent a private room " +"with {room_cmd} and create one yourself!" +msgstr "" + +#: src/modules/pomodoro/cog.py:449 +#, possible-python-brace-format +msgctxt "cmd:timers|embed:timer_list|title" +msgid "Pomodoro Timer Rooms in **{guild}**" +msgstr "" + +#: src/modules/pomodoro/cog.py:458 +#, possible-python-brace-format +msgctxt "cmd:timers|status:stopped_auto" msgid "" "`{pattern}` timer is stopped with no members!\n" "Join {channel} to restart it." msgstr "" -#: src/modules/pomodoro/cog.py:428 +#: src/modules/pomodoro/cog.py:464 #, possible-python-brace-format -msgctxt "cmd:pomodoro_list|status:stopped_manual" +msgctxt "cmd:timers|status:stopped_manual" msgid "" "`{pattern}` timer is stopped with `{members}` members!\n" "Join {channel} and press `Start` to start it!" msgstr "" -#: src/modules/pomodoro/cog.py:435 +#: src/modules/pomodoro/cog.py:471 #, possible-python-brace-format -msgctxt "cmd:pomodoro_list|status:running_focus" +msgctxt "cmd:timers|status:running_focus" msgid "" "`{pattern}` timer is running with `{members}` members!\n" "Currently **focusing**, with break starting {timestamp}" msgstr "" -#: src/modules/pomodoro/cog.py:441 +#: src/modules/pomodoro/cog.py:477 #, possible-python-brace-format -msgctxt "cmd:pomodoro_list|status:running_break" +msgctxt "cmd:timers|status:running_break" msgid "" "`{pattern}` timer is running with `{members}` members!\n" "Currently **resting**, with focus starting {timestamp}" msgstr "" -#: src/modules/pomodoro/cog.py:455 -msgctxt "cmd:pomodoro_admin" -msgid "admin" +#: src/modules/pomodoro/cog.py:491 +msgctxt "cmd:pomodoro" +msgid "pomodoro" msgstr "" -#: src/modules/pomodoro/cog.py:456 -msgctxt "cmd:pomodoro_admin|desc" -msgid "Command group for pomodoro admin controls." +#: src/modules/pomodoro/cog.py:492 +msgctxt "cmd:pomodoro|desc" +msgid "Create and configure pomodoro timer rooms." msgstr "" -#: src/modules/pomodoro/cog.py:462 +#: src/modules/pomodoro/cog.py:499 msgctxt "cmd:pomodoro_create" msgid "create" msgstr "" -#: src/modules/pomodoro/cog.py:465 +#: src/modules/pomodoro/cog.py:502 msgctxt "cmd:pomodoro_create|desc" -msgid "Create a new Pomodoro timer. Requires admin permissions." +msgid "Create a new Pomodoro timer. Requires manage channel permissions." msgstr "" -#: src/modules/pomodoro/cog.py:469 +#: src/modules/pomodoro/cog.py:506 msgctxt "cmd:pomodoro_create|param:channel" msgid "timer_channel" msgstr "" -#: src/modules/pomodoro/cog.py:475 +#: src/modules/pomodoro/cog.py:512 msgctxt "cmd:pomodoro_create|param:channel|desc" msgid "" "Voice channel to create the timer in. (Defaults to your current channel, or " "makes a new one.)" msgstr "" -#: src/modules/pomodoro/cog.py:504 -msgctxt "cmd:pomodoro_create|error:insufficient_perms" -msgid "Only server administrators can create timers!" -msgstr "" - -#: src/modules/pomodoro/cog.py:531 -msgctxt "cmd:pomodoro_create|error:channel_create_failed|title" +#: src/modules/pomodoro/cog.py:557 +msgctxt "cmd:pomodoro_create|new_channel|error:your_insufficient_perms|title" msgid "Could not create pomodoro voice channel!" msgstr "" -#: src/modules/pomodoro/cog.py:535 -msgctxt "cmd:pomodoro_create|error:channel_create|desc" +#: src/modules/pomodoro/cog.py:561 +msgctxt "cmd:pomodoro_create|new_channel|error:your_insufficient_perms" +msgid "" +"No `timer_channel` was provided, and you lack the 'Manage Channels` " +"permission required to create a new timer room!" +msgstr "" + +#: src/modules/pomodoro/cog.py:572 +msgctxt "cmd:pomodoro_create|new_channel|error:my_insufficient_perms|title" +msgid "Could not create pomodoro voice channel!" +msgstr "" + +#: src/modules/pomodoro/cog.py:576 +msgctxt "cmd:pomodoro_create|new_channel|error:my_insufficient_perms|desc" +msgid "" +"No `timer_channel` was provided, and I lack the 'Manage Channels' permission " +"required to create a new voice channel." +msgstr "" + +#: src/modules/pomodoro/cog.py:587 +msgctxt "cmd:pomodoro_create|new_channel|default_name" +msgid "Timer" +msgstr "" + +#: src/modules/pomodoro/cog.py:591 +msgctxt "cmd:pomodoro_create|new_channel|audit_reason" +msgid "Creating Pomodoro Voice Channel" +msgstr "" + +#: src/modules/pomodoro/cog.py:600 +msgctxt "cmd:pomodoro_create|new_channel|error:channel_create_failed|title" +msgid "Could not create pomodoro voice channel!" +msgstr "" + +#: src/modules/pomodoro/cog.py:604 +msgctxt "cmd:pomodoro_create|new_channel|error:channel_create_failed|desc" msgid "" "Failed to create a new pomodoro voice channel due to an unknown Discord " "communication error. Please try creating the channel manually and pass it to " "the `timer_channel` argument of this command." msgstr "" -#: src/modules/pomodoro/cog.py:549 -msgctxt "cmd:pomodoro_create|error:channel_create_permissions|title" -msgid "Could not create pomodoro voice channel!" -msgstr "" - -#: src/modules/pomodoro/cog.py:553 -msgctxt "cmd:pomodoro_create|error:channel_create_permissions|desc" -msgid "" -"No `timer_channel` was provided, and I lack the `MANAGE_CHANNELS` permission " -"needed to create a new voice channel." -msgstr "" - -#: src/modules/pomodoro/cog.py:567 +#: src/modules/pomodoro/cog.py:621 #, possible-python-brace-format -msgctxt "cmd:pomodoro_create|error:timer_exists" -msgid "" -"A timer already exists in {channel}! Use `/pomodoro admin edit` to modify it." +msgctxt "cmd:pomodoro_create|add_timer|error:timer_exists" +msgid "A timer already exists in {channel}! Reconfigure it with {edit_cmd}." msgstr "" -#: src/modules/pomodoro/cog.py:606 +#: src/modules/pomodoro/cog.py:635 +#, possible-python-brace-format +msgctxt "cmd:pomodoro_create|add_timer|error:your_insufficient_perms" +msgid "" +"You must have the 'Manage Channel' permission in {channel} in order to add a " +"timer there!" +msgstr "" + +#: src/modules/pomodoro/cog.py:684 msgctxt "cmd:pomodoro_create|response:success|content" msgid "Timer created successfully! Use the panel below to reconfigure." msgstr "" -#: src/modules/pomodoro/cog.py:612 +#: src/modules/pomodoro/cog.py:690 msgctxt "cmd:pomodoro_destroy" msgid "destroy" msgstr "" -#: src/modules/pomodoro/cog.py:615 +#: src/modules/pomodoro/cog.py:693 msgctxt "cmd:pomodoro_destroy|desc" -msgid "" -"Delete a pomodoro timer from a voice channel. Requires admin permissions." +msgid "Remove a pomodoro timer from a voice channel." msgstr "" -#: src/modules/pomodoro/cog.py:619 +#: src/modules/pomodoro/cog.py:697 msgctxt "cmd:pomodoro_destroy|param:channel" msgid "timer_channel" msgstr "" -#: src/modules/pomodoro/cog.py:622 +#: src/modules/pomodoro/cog.py:700 msgctxt "cmd:pomodoro_destroy|param:channel" -msgid "Channel with the timer to delete." +msgid "Select a timer voice channel to remove the timer from." msgstr "" -#: src/modules/pomodoro/cog.py:640 +#: src/modules/pomodoro/cog.py:718 msgctxt "cmd:pomodoro_destroy|error:no_timer" msgid "This channel doesn't have an attached pomodoro timer!" msgstr "" -#: src/modules/pomodoro/cog.py:655 +#: src/modules/pomodoro/cog.py:731 msgctxt "cmd:pomodoro_destroy|error:insufficient_perms|owned" msgid "" "You need to be an administrator or own this channel to remove this timer!" msgstr "" -#: src/modules/pomodoro/cog.py:665 +#: src/modules/pomodoro/cog.py:740 +#, possible-python-brace-format msgctxt "cmd:pomodoro_destroy|error:insufficient_perms|notowned" -msgid "You need to be a server administrator to remove this timer!" +msgid "" +"You need to have the `Manage Channels` permission in {channel} to remove " +"this timer!" msgstr "" -#: src/modules/pomodoro/cog.py:677 +#: src/modules/pomodoro/cog.py:751 #, possible-python-brace-format msgctxt "cmd:pomdoro_destroy|response:success|description" msgid "Timer successfully removed from {channel}." msgstr "" -#: src/modules/pomodoro/cog.py:683 +#: src/modules/pomodoro/cog.py:757 msgctxt "cmd:pomodoro_edit" msgid "edit" msgstr "" -#: src/modules/pomodoro/cog.py:686 +#: src/modules/pomodoro/cog.py:760 msgctxt "cmd:pomodoro_edit|desc" -msgid "Edit a Timer" +msgid "Reconfigure a pomodoro timer." msgstr "" -#: src/modules/pomodoro/cog.py:690 +#: src/modules/pomodoro/cog.py:764 msgctxt "cmd:pomodoro_edit|param:channel" msgid "timer_channel" msgstr "" -#: src/modules/pomodoro/cog.py:696 +#: src/modules/pomodoro/cog.py:770 msgctxt "cmd:pomodoro_edit|param:channel|desc" -msgid "Channel holding the timer to edit." +msgid "Select a timer voice channel to reconfigure." msgstr "" -#: src/modules/pomodoro/cog.py:737 +#: src/modules/pomodoro/cog.py:811 msgctxt "cmd:pomodoro_edit|error:no_timer" msgid "This channel doesn't have an attached pomodoro timer to edit!" msgstr "" -#: src/modules/pomodoro/cog.py:750 +#: src/modules/pomodoro/cog.py:824 msgctxt "cmd:pomodoro_edit|error:insufficient_perms|role:other" msgid "" "Insufficient permissions to modifiy this timer!\n" @@ -371,28 +402,28 @@ msgid "" "manager role." msgstr "" -#: src/modules/pomodoro/cog.py:771 +#: src/modules/pomodoro/cog.py:845 msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:admin" msgid "You need to be a guild admin to modify this option!" msgstr "" -#: src/modules/pomodoro/cog.py:776 +#: src/modules/pomodoro/cog.py:850 msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:owner" msgid "You need to be a channel owner or guild admin to modify this option!" msgstr "" -#: src/modules/pomodoro/cog.py:781 +#: src/modules/pomodoro/cog.py:855 msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:manager" msgid "" "You need to be a guild admin or have the manager role to modify this option!" msgstr "" -#: src/modules/pomodoro/cog.py:817 +#: src/modules/pomodoro/cog.py:891 msgctxt "cmd:configure_pomodoro" msgid "pomodoro" msgstr "" -#: src/modules/pomodoro/cog.py:818 +#: src/modules/pomodoro/cog.py:892 msgctxt "cmd:configure_pomodoro|desc" msgid "Configure Pomodoro Timer System" msgstr "" @@ -427,95 +458,100 @@ msgctxt "formatstring:channel_name|key:pattern" msgid "{pattern}" msgstr "" -#: src/modules/pomodoro/options.py:32 +#: src/modules/pomodoro/options.py:33 msgctxt "timerset:voice_channel" msgid "channel" msgstr "" -#: src/modules/pomodoro/options.py:35 +#: src/modules/pomodoro/options.py:36 msgctxt "timerset:voice_channel|desc" msgid "Channel in which to track timer members and send alerts." msgstr "" -#: src/modules/pomodoro/options.py:45 +#: src/modules/pomodoro/options.py:48 msgctxt "timerset:notification_channel" msgid "notification_channel" msgstr "" -#: src/modules/pomodoro/options.py:48 +#: src/modules/pomodoro/options.py:51 msgctxt "timerset:notification_channel|desc" msgid "Channel to which to send timer status cards and notifications." msgstr "" -#: src/modules/pomodoro/options.py:68 +#: src/modules/pomodoro/options.py:73 #, possible-python-brace-format msgctxt "timerset:notification_channel|format:notset" msgid "Not Set (Using {channel})" msgstr "" -#: src/modules/pomodoro/options.py:78 +#: src/modules/pomodoro/options.py:83 msgctxt "timerset:inactivity_threshold|inactivity_threshold" msgid "inactivity_threshold" msgstr "" -#: src/modules/pomodoro/options.py:81 +#: src/modules/pomodoro/options.py:86 msgctxt "timerset:inactivity_threshold|desc" msgid "" "Number of inactive focus+break stages before a member is removed from the " "timer." msgstr "" -#: src/modules/pomodoro/options.py:85 +#: src/modules/pomodoro/options.py:90 msgctxt "timerset:inactivity_threshold|desc" msgid "How many timer cycles before kicking inactive members." msgstr "" -#: src/modules/pomodoro/options.py:101 +#: src/modules/pomodoro/options.py:112 +msgctxt "timerset:inactivity_length|desc" +msgid "The inactivity threshold must be a positive whole number!" +msgstr "" + +#: src/modules/pomodoro/options.py:120 msgctxt "timerset:manager_role" msgid "manager_role" msgstr "" -#: src/modules/pomodoro/options.py:104 +#: src/modules/pomodoro/options.py:123 msgctxt "timerset:manager_role|desc" msgid "Role allowed to start, stop, and edit the focus/break lengths." msgstr "" -#: src/modules/pomodoro/options.py:116 +#: src/modules/pomodoro/options.py:137 msgctxt "timerset:manager_role|format:notset" msgid "Not Set (Only Admins may start/stop or edit pattern)" msgstr "" -#: src/modules/pomodoro/options.py:126 +#: src/modules/pomodoro/options.py:147 msgctxt "timerset:voice_alerts" msgid "voice_alerts" msgstr "" -#: src/modules/pomodoro/options.py:129 +#: src/modules/pomodoro/options.py:150 msgctxt "timerset:voice_alerts|desc" msgid "Whether to join the voice channel and announce focus and break stages." msgstr "" -#: src/modules/pomodoro/options.py:140 +#: src/modules/pomodoro/options.py:162 msgctxt "timerset:base_name" msgid "name" msgstr "" -#: src/modules/pomodoro/options.py:143 +#: src/modules/pomodoro/options.py:165 msgctxt "timerset:base_name|desc" msgid "Timer name, as shown on the timer card." msgstr "" -#: src/modules/pomodoro/options.py:147 +#: src/modules/pomodoro/options.py:169 msgctxt "timerset:base_name|accepts" msgid "Any short name, shown on the timer card." msgstr "" -#: src/modules/pomodoro/options.py:161 +#: src/modules/pomodoro/options.py:184 msgctxt "timerset:channel_name_format" msgid "channel_name" msgstr "" -#: src/modules/pomodoro/options.py:164 +#: src/modules/pomodoro/options.py:187 #, possible-python-brace-format msgctxt "timerset:channel_name_format|desc" msgid "" @@ -523,49 +559,55 @@ msgid "" "and {stage} keys." msgstr "" -#: src/modules/pomodoro/options.py:168 +#: src/modules/pomodoro/options.py:191 #, possible-python-brace-format msgctxt "timerset:channel_name|accepts" msgid "" "Timer channel name, with keys {remaining}, {name}, {pattern}, and {stage}." msgstr "" -#: src/modules/pomodoro/options.py:180 +#: src/modules/pomodoro/options.py:221 +msgctxt "timerset:channel_name_format|error:too_long" +msgid "" +"The provided name is too long! Channel names can be at most `100` characters." +msgstr "" + +#: src/modules/pomodoro/options.py:240 msgctxt "timerset:focus_length" msgid "focus_length" msgstr "" -#: src/modules/pomodoro/options.py:183 +#: src/modules/pomodoro/options.py:243 msgctxt "timerset:focus_length|desc" msgid "Length of the focus stage of the timer in minutes." msgstr "" -#: src/modules/pomodoro/options.py:188 +#: src/modules/pomodoro/options.py:248 msgctxt "timerset:focus_length|accepts" msgid "A positive integer number of minutes." msgstr "" -#: src/modules/pomodoro/options.py:212 +#: src/modules/pomodoro/options.py:273 msgctxt "timerset:focus_length|desc" msgid "Please enter a positive number of minutes." msgstr "" -#: src/modules/pomodoro/options.py:220 +#: src/modules/pomodoro/options.py:281 msgctxt "timerset:break_length" msgid "break_length" msgstr "" -#: src/modules/pomodoro/options.py:223 +#: src/modules/pomodoro/options.py:284 msgctxt "timerset:break_length|desc" msgid "Length of the break stage of the timer in minutes." msgstr "" -#: src/modules/pomodoro/options.py:228 +#: src/modules/pomodoro/options.py:289 msgctxt "timerset:break_length|accepts" msgid "A positive integer number of minutes." msgstr "" -#: src/modules/pomodoro/options.py:252 +#: src/modules/pomodoro/options.py:314 msgctxt "timerset:break_length|desc" msgid "Please enter a positive number of minutes." msgstr "" @@ -690,64 +732,69 @@ msgctxt "ui:timer_status|button:stop|label" msgid "Stop" msgstr "" -#: src/modules/pomodoro/ui/config.py:51 +#: src/modules/pomodoro/ui/config.py:45 +msgctxt "ui:timer_options|error:timer_destroyed" +msgid "This timer no longer exists! Closing option menu." +msgstr "" + +#: src/modules/pomodoro/ui/config.py:68 msgctxt "ui:timer_options|button:edit|label" msgid "Edit" msgstr "" -#: src/modules/pomodoro/ui/config.py:67 +#: src/modules/pomodoro/ui/config.py:84 msgctxt "ui:timer_options|button:voice_alerts|label" msgid "Voice Alerts" msgstr "" -#: src/modules/pomodoro/ui/config.py:88 +#: src/modules/pomodoro/ui/config.py:105 msgctxt "ui:timer_options|button:delete|success|title" msgid "Timer Deleted" msgstr "" -#: src/modules/pomodoro/ui/config.py:92 +#: src/modules/pomodoro/ui/config.py:109 #, possible-python-brace-format msgctxt "ui:timer_options|button:delete|success|description" msgid "The timer in {channel} has been removed." msgstr "" -#: src/modules/pomodoro/ui/config.py:100 +#: src/modules/pomodoro/ui/config.py:117 msgctxt "ui:timer_options|button:delete|label" msgid "Delete" msgstr "" -#: src/modules/pomodoro/ui/config.py:119 +#: src/modules/pomodoro/ui/config.py:136 msgctxt "ui:timer_options|menu:voice_channel|placeholder" msgid "Set Voice Channel" msgstr "" -#: src/modules/pomodoro/ui/config.py:142 +#: src/modules/pomodoro/ui/config.py:159 msgctxt "ui:timer_options|menu:notification_channel|placeholder" msgid "Set Notification Channel" msgstr "" -#: src/modules/pomodoro/ui/config.py:157 +#: src/modules/pomodoro/ui/config.py:174 msgctxt "ui:timer_options|menu:manager_role|placeholder" msgid "Set Manager Role" msgstr "" -#: src/modules/pomodoro/ui/config.py:166 +#: src/modules/pomodoro/ui/config.py:183 #, possible-python-brace-format msgctxt "ui:timer_options|embed|title" msgid "Timer Control Panel for {channel}" msgstr "" -#: src/modules/pomodoro/ui/config.py:173 +#: src/modules/pomodoro/ui/config.py:190 msgctxt "ui:timer_options|embed|footer" msgid "Hover over the option names to view descriptions." msgstr "" -#: src/modules/pomodoro/ui/config.py:185 +#: src/modules/pomodoro/ui/config.py:202 msgctxt "ui:timer_options|embed|field:pattern|name" msgid "Pattern" msgstr "" -#: src/modules/pomodoro/ui/config.py:188 +#: src/modules/pomodoro/ui/config.py:205 #, possible-python-brace-format msgctxt "ui:timer_options|embed|field:pattern|value" msgid "" @@ -755,12 +802,12 @@ msgid "" "**`{break_len} minutes`** break" msgstr "" -#: src/modules/pomodoro/ui/config.py:199 +#: src/modules/pomodoro/ui/config.py:216 msgctxt "ui:timer_options|embed|field:channel_name|name" msgid "Channel Name Preview" msgstr "" -#: src/modules/pomodoro/ui/config.py:203 +#: src/modules/pomodoro/ui/config.py:220 #, possible-python-brace-format msgctxt "ui:timer_options|embed|field:channel_name|value" msgid "" @@ -768,35 +815,35 @@ msgid "" "(The actual channel name may not match due to ratelimits.)" msgstr "" -#: src/modules/pomodoro/ui/config.py:213 +#: src/modules/pomodoro/ui/config.py:230 msgctxt "ui:timer_options|embed|field:issues|name" msgid "Issues" msgstr "" -#: src/modules/pomodoro/ui/config.py:231 +#: src/modules/pomodoro/ui/config.py:248 msgctxt "ui:timer_options|issue:no_voice_channel" msgid "The configured voice channel does not exist! Please update it below." msgstr "" -#: src/modules/pomodoro/ui/config.py:242 +#: src/modules/pomodoro/ui/config.py:259 #, possible-python-brace-format msgctxt "ui:timer_options|issue:cannot_speak" msgid "Voice alerts are on, but I don't have speaking permissions in {channel}" msgstr "" -#: src/modules/pomodoro/ui/config.py:249 +#: src/modules/pomodoro/ui/config.py:266 #, possible-python-brace-format msgctxt "ui:timer_options|issue:cannot_change_name" msgid "" "I cannot update the name of {channel}! (Needs `MANAGE_CHANNELS` permission)" msgstr "" -#: src/modules/pomodoro/ui/config.py:260 +#: src/modules/pomodoro/ui/config.py:277 msgctxt "ui:timer_options|issue:notif_channel_dne" msgid "Configured notification channel does not exist!" msgstr "" -#: src/modules/pomodoro/ui/config.py:269 +#: src/modules/pomodoro/ui/config.py:286 #, possible-python-brace-format msgctxt "ui:timer_options|issue:notif_channel_write" msgid "" @@ -804,7 +851,7 @@ msgid "" "{channel}" msgstr "" -#: src/modules/pomodoro/ui/config.py:277 +#: src/modules/pomodoro/ui/config.py:294 #, possible-python-brace-format msgctxt "ui:timer_options|issues:cannot_make_webhooks" msgid "" diff --git a/locales/templates/babel.pot b/locales/templates/babel.pot index 1054559a..43a4ca71 100644 --- a/locales/templates/babel.pot +++ b/locales/templates/babel.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/config.pot b/locales/templates/config.pot index 2e2c39ba..cc464ce4 100644 --- a/locales/templates/config.pot +++ b/locales/templates/config.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/core_config.pot b/locales/templates/core_config.pot index a4458a79..4c514961 100644 --- a/locales/templates/core_config.pot +++ b/locales/templates/core_config.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -21,3 +21,8 @@ msgstr "" msgctxt "group:configure" msgid "configure" msgstr "" + +#: src/core/config.py:29 +msgctxt "group:configure|desc" +msgid "View and adjust my configuration options." +msgstr "" diff --git a/locales/templates/economy.pot b/locales/templates/economy.pot index 7e295e66..f1459b45 100644 --- a/locales/templates/economy.pot +++ b/locales/templates/economy.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -204,19 +204,19 @@ msgid_plural "Accounts successfully updated." msgstr[0] "" msgstr[1] "" -#: src/modules/economy/cog.py:394 +#: src/modules/economy/cog.py:409 #, possible-python-brace-format msgctxt "cmd:economy_balance|embed:role_lb|author" msgid "Balance sheet for {name}" msgstr "" -#: src/modules/economy/cog.py:400 +#: src/modules/economy/cog.py:415 #, possible-python-brace-format msgctxt "cmd:economy_balance|embed:role_lb|header" msgid "This server has a total balance of {coin_emoji}**{total}**." msgstr "" -#: src/modules/economy/cog.py:408 +#: src/modules/economy/cog.py:423 #, possible-python-brace-format msgctxt "cmd:economy_balance|embed:role_lb|header" msgid "" @@ -224,66 +224,66 @@ msgid "" "balance of {coin_emoji}**{total}**." msgstr "" -#: src/modules/economy/cog.py:420 +#: src/modules/economy/cog.py:435 msgctxt "cmd:economy_balance|embed:role_lb|row_format" msgid "`[{pos:>{numwidth}}]` | `{coins:>{coinwidth}} LC` | {mention}" msgstr "" -#: src/modules/economy/cog.py:448 +#: src/modules/economy/cog.py:463 #, possible-python-brace-format msgctxt "cmd:economy_balance|embed:role_lb|footer" msgid "Page {page}/{total}" msgstr "" -#: src/modules/economy/cog.py:458 +#: src/modules/economy/cog.py:473 #, possible-python-brace-format msgctxt "cmd:economy_balance|embed:role_lb|header" msgid "This server has a total balance of {coin_emoji}**0**." msgstr "" -#: src/modules/economy/cog.py:465 +#: src/modules/economy/cog.py:480 #, possible-python-brace-format msgctxt "cmd:economy_balance|embed:role_lb|header" msgid "The role {role_mention} has a total balance of {coin_emoji}**0**." msgstr "" -#: src/modules/economy/cog.py:485 +#: src/modules/economy/cog.py:500 #, possible-python-brace-format msgctxt "cmd:economy_balance|embed:single|desc" msgid "{mention} currently owns {coin_emoji} {coins}." msgstr "" -#: src/modules/economy/cog.py:495 +#: src/modules/economy/cog.py:510 #, possible-python-brace-format msgctxt "cmd:economy_balance|embed:single|author" msgid "Balance statement for {user}" msgstr "" -#: src/modules/economy/cog.py:504 +#: src/modules/economy/cog.py:519 msgctxt "cmd:economy_reset" msgid "reset" msgstr "" -#: src/modules/economy/cog.py:507 +#: src/modules/economy/cog.py:522 msgctxt "cmd:economy_reset|desc" msgid "" "Reset the coin balance for a target user or role. (See also \"economy " "balance\".)" msgstr "" -#: src/modules/economy/cog.py:511 +#: src/modules/economy/cog.py:526 msgctxt "cmd:economy_reset|param:target" msgid "target" msgstr "" -#: src/modules/economy/cog.py:516 +#: src/modules/economy/cog.py:531 msgctxt "cmd:economy_reset|param:target|desc" msgid "" "Target user or role to view or update. Use @everyone to reset the entire " "guild." msgstr "" -#: src/modules/economy/cog.py:543 +#: src/modules/economy/cog.py:558 #, possible-python-brace-format msgctxt "cmd:economy_reset|confirm:reset_guild|desc" msgid "" @@ -292,17 +292,17 @@ msgid "" "*This is not reversible!*" msgstr "" -#: src/modules/economy/cog.py:551 +#: src/modules/economy/cog.py:566 msgctxt "cmd:economy_reset|confirm:reset_guild|button:confirm" msgid "Yes, reset the economy" msgstr "" -#: src/modules/economy/cog.py:555 +#: src/modules/economy/cog.py:570 msgctxt "cmd:economy_reset|confirm:reset_guild|button:cancel" msgid "Cancel reset" msgstr "" -#: src/modules/economy/cog.py:571 +#: src/modules/economy/cog.py:586 #, possible-python-brace-format msgctxt "cmd:economy_reset|embed:success_guild|desc" msgid "" @@ -310,13 +310,13 @@ msgid "" "**{amount}**." msgstr "" -#: src/modules/economy/cog.py:588 +#: src/modules/economy/cog.py:603 #, possible-python-brace-format msgctxt "cmd:economy_reset|error:no_target|desc" msgid "The role {mention} has no members to reset!" msgstr "" -#: src/modules/economy/cog.py:598 +#: src/modules/economy/cog.py:613 #, possible-python-brace-format msgctxt "cmd:economy_reset|confirm:reset_role|desc" msgid "" @@ -324,17 +324,17 @@ msgid "" "**{count}** members will be affected." msgstr "" -#: src/modules/economy/cog.py:607 +#: src/modules/economy/cog.py:622 msgctxt "cmd:economy_reset|confirm:reset_role|button:confirm" msgid "Yes, complete economy reset" msgstr "" -#: src/modules/economy/cog.py:611 +#: src/modules/economy/cog.py:626 msgctxt "cmd:economy_reset|confirm:reset_role|button:cancel" msgid "Cancel" msgstr "" -#: src/modules/economy/cog.py:628 +#: src/modules/economy/cog.py:643 #, possible-python-brace-format msgctxt "cmd:economy_reset|embed:success_role|desc" msgid "" @@ -342,58 +342,81 @@ msgid "" "**{amount}**." msgstr "" -#: src/modules/economy/cog.py:650 +#: src/modules/economy/cog.py:665 #, possible-python-brace-format msgctxt "cmd:economy_reset|embed:success_user|desc" msgid "{mention}'s balance has been reset to {coin_emoji}**{amount}**." msgstr "" -#: src/modules/economy/cog.py:660 +#: src/modules/economy/cog.py:675 msgctxt "cmd:send" msgid "send" msgstr "" -#: src/modules/economy/cog.py:663 +#: src/modules/economy/cog.py:678 msgctxt "cmd:send|desc" msgid "Gift the target user a certain number of LionCoins." msgstr "" -#: src/modules/economy/cog.py:667 +#: src/modules/economy/cog.py:682 msgctxt "cmd:send|param:target" msgid "target" msgstr "" -#: src/modules/economy/cog.py:668 +#: src/modules/economy/cog.py:683 msgctxt "cmd:send|param:amount" msgid "amount" msgstr "" -#: src/modules/economy/cog.py:669 +#: src/modules/economy/cog.py:684 msgctxt "cmd:send|param:note" msgid "note" msgstr "" -#: src/modules/economy/cog.py:672 +#: src/modules/economy/cog.py:687 msgctxt "cmd:send|param:target|desc" msgid "User to send the gift to" msgstr "" -#: src/modules/economy/cog.py:673 +#: src/modules/economy/cog.py:688 msgctxt "cmd:send|param:amount|desc" msgid "Number of coins to send" msgstr "" -#: src/modules/economy/cog.py:674 +#: src/modules/economy/cog.py:689 msgctxt "cmd:send|param:note|desc" msgid "Optional note to add to the gift." msgstr "" -#: src/modules/economy/cog.py:698 +#: src/modules/economy/cog.py:713 msgctxt "cmd:send|error:not_allowed" msgid "Sorry, this server has disabled LionCoin transfers!" msgstr "" -#: src/modules/economy/cog.py:723 +#: src/modules/economy/cog.py:722 +msgctxt "cmd:send|error:sending-to-self" +msgid "" +"What is this, tax evasion?\n" +"(You can not send coins to yourself.)" +msgstr "" + +#: src/modules/economy/cog.py:732 +msgctxt "cmd:send|error:sending-to-leo" +msgid "" +"I appreciate it, but you need it more than I do!\n" +"(You cannot send coins to bots.)" +msgstr "" + +#: src/modules/economy/cog.py:742 +#, possible-python-brace-format +msgctxt "cmd:send|error:sending-to-bot" +msgid "" +"{target} appreciates the gesture, but said they don't have any use for " +"{coin}.\n" +"(You cannot send coins to bots.)" +msgstr "" + +#: src/modules/economy/cog.py:770 #, possible-python-brace-format msgctxt "cmd:send|error:insufficient" msgid "" @@ -401,19 +424,19 @@ msgid "" "`Current Balance:` {coin_emoji}{balance}" msgstr "" -#: src/modules/economy/cog.py:744 +#: src/modules/economy/cog.py:791 #, possible-python-brace-format msgctxt "cmd:send|embed:gift|title" msgid "{user} sent you a gift!" msgstr "" -#: src/modules/economy/cog.py:748 +#: src/modules/economy/cog.py:795 #, possible-python-brace-format msgctxt "cmd:send|embed:gift|desc" msgid "{mention} sent you {coin_emoji}**{amount}**." msgstr "" -#: src/modules/economy/cog.py:773 +#: src/modules/economy/cog.py:820 #, possible-python-brace-format msgctxt "cmd:send|embed:ack|desc" msgid "" @@ -421,19 +444,19 @@ msgid "" "{mention}!" msgstr "" -#: src/modules/economy/cog.py:783 +#: src/modules/economy/cog.py:830 msgctxt "cmd:send|embed:ack|desc|error:unreachable" msgid "" "Unfortunately, I was not able to message the recipient. Perhaps they have me " "blocked?" msgstr "" -#: src/modules/economy/cog.py:795 +#: src/modules/economy/cog.py:842 msgctxt "cmd:configure_economy" msgid "economy" msgstr "" -#: src/modules/economy/cog.py:798 +#: src/modules/economy/cog.py:845 msgctxt "cmd:configure_economy|desc" msgid "Configure LionCoin Economy" msgstr "" diff --git a/locales/templates/exec.pot b/locales/templates/exec.pot index 00978bef..5eefe627 100644 --- a/locales/templates/exec.pot +++ b/locales/templates/exec.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -30,57 +30,61 @@ msgstr "" msgid "Execute arbitrary code with Exec" msgstr "" -#: src/modules/sysadmin/exec_cog.py:272 +#: src/modules/sysadmin/exec_cog.py:325 msgctxt "command" msgid "eval" msgstr "" -#: src/modules/sysadmin/exec_cog.py:273 +#: src/modules/sysadmin/exec_cog.py:326 msgctxt "command:eval" msgid "Execute arbitrary code with Eval" msgstr "" -#: src/modules/sysadmin/exec_cog.py:276 +#: src/modules/sysadmin/exec_cog.py:329 msgctxt "command:eval|param:string" msgid "Code to evaluate." msgstr "" -#: src/modules/sysadmin/exec_cog.py:283 +#: src/modules/sysadmin/exec_cog.py:336 msgctxt "command" msgid "asyncall" msgstr "" -#: src/modules/sysadmin/exec_cog.py:284 +#: src/modules/sysadmin/exec_cog.py:337 msgctxt "command:asyncall|desc" msgid "Execute arbitrary code on all shards." msgstr "" -#: src/modules/sysadmin/exec_cog.py:287 +#: src/modules/sysadmin/exec_cog.py:340 msgctxt "command:asyncall|param:string" msgid "Cross-shard code to execute. Cannot reference ctx!" msgstr "" -#: src/modules/sysadmin/exec_cog.py:288 +#: src/modules/sysadmin/exec_cog.py:341 msgctxt "command:asyncall|param:target" msgid "Target shard app name, see autocomplete for options." msgstr "" -#: src/modules/sysadmin/exec_cog.py:343 +#: src/modules/sysadmin/exec_cog.py:384 msgid "reload" msgstr "" -#: src/modules/sysadmin/exec_cog.py:344 +#: src/modules/sysadmin/exec_cog.py:385 msgid "Reload a given LionBot extension. Launches an ExecUI." msgstr "" -#: src/modules/sysadmin/exec_cog.py:347 -msgid "Name of the extesion to reload. See autocomplete for options." +#: src/modules/sysadmin/exec_cog.py:388 +msgid "Name of the extension to reload. See autocomplete for options." msgstr "" -#: src/modules/sysadmin/exec_cog.py:379 +#: src/modules/sysadmin/exec_cog.py:389 +msgid "Whether to force an extension reload even if it doesn't exist." +msgstr "" + +#: src/modules/sysadmin/exec_cog.py:425 msgid "shutdown" msgstr "" -#: src/modules/sysadmin/exec_cog.py:380 +#: src/modules/sysadmin/exec_cog.py:426 msgid "Shutdown (or restart) the client." msgstr "" diff --git a/locales/templates/goals-gui.pot b/locales/templates/goals-gui.pot index 1dd5c55e..ebd4186b 100644 --- a/locales/templates/goals-gui.pot +++ b/locales/templates/goals-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,85 +17,85 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: src/gui/cards/goals.py:95 +#: src/gui/cards/goals.py:97 msgctxt "skin:goals|goal:tasks|name" msgid "TASKS DONE" msgstr "" -#: src/gui/cards/goals.py:99 +#: src/gui/cards/goals.py:101 msgctxt "skin:goals|goal:tasks|goal" msgid "GOAL: " msgstr "" -#: src/gui/cards/goals.py:125 +#: src/gui/cards/goals.py:127 msgctxt "skin:goals|goal:attendance|name" msgid "" "ATTENDANCE\n" "RATE" msgstr "" -#: src/gui/cards/goals.py:139 +#: src/gui/cards/goals.py:141 msgctxt "skin:goals|mode:study|goal:middle|above" msgid "STUDIED" msgstr "" -#: src/gui/cards/goals.py:143 +#: src/gui/cards/goals.py:145 msgctxt "skin:goals|mode:study|goal:middle|below" msgid "HOURS" msgstr "" -#: src/gui/cards/goals.py:147 +#: src/gui/cards/goals.py:149 msgctxt "skin:goals|mode:voice|goal:middle|above" msgid "CHATTED" msgstr "" -#: src/gui/cards/goals.py:151 +#: src/gui/cards/goals.py:153 msgctxt "skin:goals|mode:voice|goal:middle|below" msgid "HOURS" msgstr "" -#: src/gui/cards/goals.py:155 +#: src/gui/cards/goals.py:157 msgctxt "skin:goals|mode:text|goal:middle|above" msgid "SENT" msgstr "" -#: src/gui/cards/goals.py:159 +#: src/gui/cards/goals.py:161 msgctxt "skin:goals|mode:text|goal:middle|below" msgid "MESSAGES" msgstr "" -#: src/gui/cards/goals.py:163 +#: src/gui/cards/goals.py:165 msgctxt "skin:goals|mode:anki|goal:middle|above" msgid "REVIEWED" msgstr "" -#: src/gui/cards/goals.py:167 +#: src/gui/cards/goals.py:169 msgctxt "skin:goals|mode:anki|goal:middle|below" msgid "CARDS" msgstr "" -#: src/gui/cards/goals.py:228 +#: src/gui/cards/goals.py:230 #, possible-python-brace-format msgctxt "skin:goals|footer" msgid "As of {day} {month} • {name}" msgstr "" -#: src/gui/cards/goals.py:240 +#: src/gui/cards/goals.py:242 msgctxt "ui:goals|weekly|title" msgid "WEEKLY STATISTICS" msgstr "" -#: src/gui/cards/goals.py:244 +#: src/gui/cards/goals.py:246 msgctxt "ui:goals|weekly|task_header" msgid "GOALS OF THE WEEK" msgstr "" -#: src/gui/cards/goals.py:254 +#: src/gui/cards/goals.py:256 msgctxt "ui:goals|monthly|title" msgid "MONTHLY STATISTICS" msgstr "" -#: src/gui/cards/goals.py:258 +#: src/gui/cards/goals.py:260 msgctxt "ui:goals|monthly|task_header" msgid "GOALS OF THE MONTH" msgstr "" diff --git a/locales/templates/leaderboard-gui.pot b/locales/templates/leaderboard-gui.pot index fc2f7a19..d9de564a 100644 --- a/locales/templates/leaderboard-gui.pot +++ b/locales/templates/leaderboard-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/lion-core.pot b/locales/templates/lion-core.pot index bfa98c84..2677acac 100644 --- a/locales/templates/lion-core.pot +++ b/locales/templates/lion-core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/member_admin.pot b/locales/templates/member_admin.pot index 6d2efe4f..9868296e 100644 --- a/locales/templates/member_admin.pot +++ b/locales/templates/member_admin.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/meta.pot b/locales/templates/meta.pot index d100c0e8..77687e92 100644 --- a/locales/templates/meta.pot +++ b/locales/templates/meta.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -84,8 +84,8 @@ msgid "" "\n" " Other relevant commands for guild configuration below:\n" " `/editshop`: Add/Edit/Remove colour roles from the {coin} shop.\n" -" `/ranks`: Add/Edit/Remove activity ranks.\n" -" `/timer admin`: Add/Edit/Remove Pomodoro timers in voice channels.\n" +" `/ranks`: Add/Edit/Refresh/Remove activity ranks.\n" +" `/pomodoro`: Add/Edit/Remove Pomodoro timers in voice channels.\n" " `/rolemenus`: Allow members to equip roles from customisable messages.\n" " `/economy balance`: Display and modify LionCoin balance for members and " "roles.\n" diff --git a/locales/templates/moderation.pot b/locales/templates/moderation.pot index fe7a276a..609b0bc6 100644 --- a/locales/templates/moderation.pot +++ b/locales/templates/moderation.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -230,7 +230,7 @@ msgstr "" msgctxt "guildset:mod_role|long_desc" msgid "" "Members with the set role will be able to access my configuration panels, " -"and perform some moderation tasks, such us setting up pomodoro timers. " +"and perform some moderation tasks, such as setting up pomodoro timers. " "Moderators cannot reconfigure most bot configuration, or perform operations " "they do not already have permission for in Discord." msgstr "" diff --git a/locales/templates/monthly-gui.pot b/locales/templates/monthly-gui.pot index e4dedadb..a7006170 100644 --- a/locales/templates/monthly-gui.pot +++ b/locales/templates/monthly-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/profile-gui.pot b/locales/templates/profile-gui.pot index b6734ec5..0a3fbac4 100644 --- a/locales/templates/profile-gui.pot +++ b/locales/templates/profile-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/ranks.pot b/locales/templates/ranks.pot index de77f1df..6f0fcf33 100644 --- a/locales/templates/ranks.pot +++ b/locales/templates/ranks.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,32 +17,32 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: src/modules/ranks/cog.py:73 +#: src/modules/ranks/cog.py:76 msgctxt "cmd:configure_ranks|param:rank_type|choice:voice" msgid "Voice" msgstr "" -#: src/modules/ranks/cog.py:74 +#: src/modules/ranks/cog.py:77 msgctxt "cmd:configure_ranks|param:rank_type|choice:xp" msgid "XP" msgstr "" -#: src/modules/ranks/cog.py:75 +#: src/modules/ranks/cog.py:78 msgctxt "cmd:configure_ranks|param:rank_type|choice:message" msgid "Message" msgstr "" -#: src/modules/ranks/cog.py:383 +#: src/modules/ranks/cog.py:406 msgctxt "event:rank_update|embed:notify" msgid "New Activity Rank Attained!" msgstr "" -#: src/modules/ranks/cog.py:494 +#: src/modules/ranks/cog.py:516 msgctxt "rank_refresh|error:roles_dne|desc" msgid "Some ranks have invalid or deleted roles! Please remove them first." msgstr "" -#: src/modules/ranks/cog.py:504 +#: src/modules/ranks/cog.py:526 #, possible-python-brace-format msgctxt "rank_refresh|error:unassignable_roles|desc" msgid "" @@ -50,36 +50,36 @@ msgid "" "{roles}" msgstr "" -#: src/modules/ranks/cog.py:574 +#: src/modules/ranks/cog.py:596 msgctxt "rank_refresh|remove_roles|audit" msgid "Removing invalid rank role." msgstr "" -#: src/modules/ranks/cog.py:588 +#: src/modules/ranks/cog.py:610 #, possible-python-brace-format msgctxt "rank_refresh|remove_roles|small_error" msgid "*Could not remove ranks from {member}*" msgstr "" -#: src/modules/ranks/cog.py:595 +#: src/modules/ranks/cog.py:617 msgctxt "rank_refresh|remove_roles|error:too_many_issues" msgid "" "Too many issues occurred while removing ranks! Please check my permissions " "and try again in a few minutes." msgstr "" -#: src/modules/ranks/cog.py:609 +#: src/modules/ranks/cog.py:631 msgctxt "rank_refresh|add_roles|audit" msgid "Adding rank role from refresh" msgstr "" -#: src/modules/ranks/cog.py:623 +#: src/modules/ranks/cog.py:645 #, possible-python-brace-format msgctxt "rank_refresh|add_roles|small_error" msgid "*Could not add {role} to {member}*" msgstr "" -#: src/modules/ranks/cog.py:630 +#: src/modules/ranks/cog.py:652 msgctxt "rank_refresh|add_roles|error:too_many_issues" msgid "" "Too many issues occurred while adding ranks! Please check my permissions and " @@ -87,22 +87,22 @@ msgid "" msgstr "" #. ---------- Commands ---------- -#: src/modules/ranks/cog.py:655 +#: src/modules/ranks/cog.py:677 msgctxt "cmd:ranks" msgid "ranks" msgstr "" -#: src/modules/ranks/cog.py:687 +#: src/modules/ranks/cog.py:709 msgctxt "cmd:configure_ranks" msgid "ranks" msgstr "" -#: src/modules/ranks/cog.py:688 +#: src/modules/ranks/cog.py:710 msgctxt "cmd:configure_ranks|desc" msgid "Configure Activity Ranks" msgstr "" -#: src/modules/ranks/cog.py:748 +#: src/modules/ranks/cog.py:770 #, possible-python-brace-format msgctxt "" "cmd:configure_ranks|response:updated|setting:notification|withdm_withchannel" @@ -111,20 +111,20 @@ msgid "" "otherwise to {channel}" msgstr "" -#: src/modules/ranks/cog.py:754 +#: src/modules/ranks/cog.py:776 msgctxt "" "cmd:configure_ranks|response:updated|setting:notification|withdm_nochannel" msgid "Rank update notifications will be sent via **direct message**." msgstr "" -#: src/modules/ranks/cog.py:760 +#: src/modules/ranks/cog.py:782 #, possible-python-brace-format msgctxt "" "cmd:configure_ranks|response:updated|setting:notification|nodm_withchannel" msgid "Rank update notifications will be sent to {channel}." msgstr "" -#: src/modules/ranks/cog.py:765 +#: src/modules/ranks/cog.py:787 msgctxt "" "cmd:configure_ranks|response:updated|setting:notification|nodm_nochannel" msgid "Members will not be notified when their activity rank updates." @@ -545,27 +545,27 @@ msgstr "" #: src/modules/ranks/ui/refresh.py:202 #, possible-python-brace-format msgctxt "ui:refresh_ranks|embed|field:remove|value" -msgid "0 {progress} {total}" +msgid "{progress} {done}/{total} removed" msgstr "" -#: src/modules/ranks/ui/refresh.py:212 +#: src/modules/ranks/ui/refresh.py:213 #, possible-python-brace-format msgctxt "ui:refresh_ranks|embed|line:remove" msgid "**Removed invalid ranks:** {done}/{target}" msgstr "" -#: src/modules/ranks/ui/refresh.py:220 +#: src/modules/ranks/ui/refresh.py:221 msgctxt "ui:refresh_ranks|embed|field:add|name" msgid "Giving members their rank roles" msgstr "" -#: src/modules/ranks/ui/refresh.py:224 +#: src/modules/ranks/ui/refresh.py:225 #, possible-python-brace-format msgctxt "ui:refresh_ranks|embed|field:add|value" -msgid "0 {progress} {total}" +msgid "{progress} {done}/{total} given" msgstr "" -#: src/modules/ranks/ui/refresh.py:234 +#: src/modules/ranks/ui/refresh.py:236 #, possible-python-brace-format msgctxt "ui:refresh_ranks|embed|line:add" msgid "**Updated member ranks:** {done}/{target}" @@ -621,27 +621,42 @@ msgctxt "dash:rank|dropdown|placeholder" msgid "Activity Rank Panel" msgstr "" -#: src/modules/ranks/ui/overview.py:92 +#: src/modules/ranks/ui/overview.py:94 msgctxt "ui:rank_overview|button:auto|label" msgid "Auto Create" msgstr "" -#: src/modules/ranks/ui/overview.py:107 +#: src/modules/ranks/ui/overview.py:109 msgctxt "ui:rank_overview|button:refresh|label" msgid "Refresh Member Ranks" msgstr "" -#: src/modules/ranks/ui/overview.py:123 +#: src/modules/ranks/ui/overview.py:121 +msgctxt "ui:rank_overview|button:clear|confirm" +msgid "Are you sure you want to **delete all activity ranks** in this server?" +msgstr "" + +#: src/modules/ranks/ui/overview.py:126 +msgctxt "ui:rank_overview|button:clear|confirm|button:yes" +msgid "Yes, clear ranks" +msgstr "" + +#: src/modules/ranks/ui/overview.py:132 +msgctxt "ui:rank_overview|button:clear|confirm|button:no" +msgid "Cancel" +msgstr "" + +#: src/modules/ranks/ui/overview.py:148 msgctxt "ui:rank_overview|button:clear|label" msgid "Clear Ranks" msgstr "" -#: src/modules/ranks/ui/overview.py:153 +#: src/modules/ranks/ui/overview.py:178 msgctxt "ui:rank_overview|button:create|label" msgid "Create Rank" msgstr "" -#: src/modules/ranks/ui/overview.py:169 +#: src/modules/ranks/ui/overview.py:194 #, possible-python-brace-format msgctxt "ui:rank_overview|menu:roles|error:above_caller" msgid "" @@ -649,24 +664,24 @@ msgid "" "may only manage roles below your top role." msgstr "" -#: src/modules/ranks/ui/overview.py:175 +#: src/modules/ranks/ui/overview.py:200 msgctxt "ui:rank_overview|menu:roles|error:above_caller|title" msgid "Insufficient permissions!" msgstr "" -#: src/modules/ranks/ui/overview.py:208 +#: src/modules/ranks/ui/overview.py:233 msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:is_default" msgid "The @everyone role cannot be removed, and cannot be a rank!" msgstr "" -#: src/modules/ranks/ui/overview.py:213 +#: src/modules/ranks/ui/overview.py:238 msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:is_managed" msgid "" "The role is managed by another application or integration, and cannot be a " "rank!" msgstr "" -#: src/modules/ranks/ui/overview.py:218 +#: src/modules/ranks/ui/overview.py:243 msgctxt "" "ui:rank_overview|menu:roles|error:not_assignable|suberror:no_permissions" msgid "" @@ -674,34 +689,62 @@ msgid "" "manage ranks!" msgstr "" -#: src/modules/ranks/ui/overview.py:223 +#: src/modules/ranks/ui/overview.py:248 msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:above_me" msgid "" "This role is above my top role in the role hierarchy, so I cannot add or " "remove it!" msgstr "" -#: src/modules/ranks/ui/overview.py:229 +#: src/modules/ranks/ui/overview.py:254 msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:other" msgid "I am not able to manage the selected role, so it cannot be a rank!" msgstr "" -#: src/modules/ranks/ui/overview.py:235 +#: src/modules/ranks/ui/overview.py:260 msgctxt "ui:rank_overview|menu:roles|error:not_assignable|title" msgid "Could not create rank!" msgstr "" -#: src/modules/ranks/ui/overview.py:259 +#: src/modules/ranks/ui/overview.py:284 msgctxt "ui:rank_overview|menu:roles|placeholder" msgid "Create from role" msgstr "" -#: src/modules/ranks/ui/overview.py:276 +#: src/modules/ranks/ui/overview.py:301 msgctxt "ui:rank_overview|menu:ranks|placeholder" msgid "View or edit rank" msgstr "" -#: src/modules/ranks/ui/overview.py:362 +#: src/modules/ranks/ui/overview.py:387 +msgctxt "ui:rank_overview|embed|field:note|name" +msgid "Note" +msgstr "" + +#: src/modules/ranks/ui/overview.py:393 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|field:note|value:with_season" +msgid "Ranks are determined by activity since {timestamp}." +msgstr "" + +#: src/modules/ranks/ui/overview.py:400 +#, possible-python-brace-format +msgctxt "ui:rank_overview|embed|field:note|value:without_season" +msgid "" +"Ranks are determined by *all-time* statistics.\n" +"To reward ranks from a later time (e.g. to have monthly/quarterly/yearly " +"ranks) set the `season_start` with {stats_cmd}" +msgstr "" + +#: src/modules/ranks/ui/overview.py:407 +msgctxt "ui:rank_overview|embed|field:note|value|voice_addendum" +msgid "" +"Also note that ranks will only be updated when a member leaves a tracked " +"voice channel! Use the **Refresh Member Ranks** button below to update all " +"members manually." +msgstr "" + +#: src/modules/ranks/ui/overview.py:415 msgctxt "ui:rank_overview|embed:noranks|desc" msgid "" "No activity ranks have been set up!\n" @@ -709,19 +752,19 @@ msgid "" "xp ranks, or select a role or press Create below!" msgstr "" -#: src/modules/ranks/ui/overview.py:370 +#: src/modules/ranks/ui/overview.py:423 #, possible-python-brace-format msgctxt "ui:rank_overview|embed|title|type:voice" msgid "Voice Ranks in {guild_name}" msgstr "" -#: src/modules/ranks/ui/overview.py:375 +#: src/modules/ranks/ui/overview.py:428 #, possible-python-brace-format msgctxt "ui:rank_overview|embed|title|type:xp" msgid "XP ranks in {guild_name}" msgstr "" -#: src/modules/ranks/ui/overview.py:380 +#: src/modules/ranks/ui/overview.py:433 #, possible-python-brace-format msgctxt "ui:rank_overview|embed|title|type:message" msgid "Message ranks in {guild_name}" diff --git a/locales/templates/reminders.pot b/locales/templates/reminders.pot index 2169351e..efc7a880 100644 --- a/locales/templates/reminders.pot +++ b/locales/templates/reminders.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,27 +18,356 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: src/modules/reminders/cog.py:93 +#: src/modules/reminders/cog.py:114 +#, possible-python-brace-format +msgctxt "create_reminder|error:past" +msgid "The provided reminder time {timestamp} is in the past!" +msgstr "" + +#: src/modules/reminders/cog.py:123 +msgctxt "create_reminder|error:too_fast" +msgid "You cannot set a repeating reminder with a period less than 10 minutes." +msgstr "" + +#: src/modules/reminders/cog.py:133 +msgctxt "create_reminder|error:too_many" +msgid "Sorry, you have reached the maximum of `25` reminders." +msgstr "" + +#: src/modules/reminders/cog.py:149 +msgctxt "create_reminder|error:cannot_dm" +msgid "" +"I cannot direct message you! Do you have me blocked or direct messages " +"closed?" +msgstr "" + +#: src/modules/reminders/cog.py:186 +#, possible-python-brace-format +msgctxt "parse_timestamp|error:parse" +msgid "" +"Could not parse `{given}` as a valid reminder time. Try entering the time in " +"the form `HH:MM` or `YYYY-MM-DD HH:MM`." +msgstr "" + +#: src/modules/reminders/cog.py:329 +msgctxt "cmd:reminders" +msgid "reminders" +msgstr "" + +#: src/modules/reminders/cog.py:332 +msgctxt "cmd:reminders|desc" +msgid "View and set your reminders." +msgstr "" + +#: src/modules/reminders/cog.py:353 +msgctxt "cmd:remindme" +msgid "remindme" +msgstr "" + +#: src/modules/reminders/cog.py:354 +msgctxt "cmd:remindme|desc" +msgid "View and set task reminders." +msgstr "" + +#: src/modules/reminders/cog.py:361 +msgctxt "cmd:reminders_cancel" +msgid "cancel" +msgstr "" + +#: src/modules/reminders/cog.py:364 +msgctxt "cmd:reminders_cancel|desc" +msgid "" +"Cancel a single reminder. Use /reminders to clear or cancel multiple " +"reminders." +msgstr "" + +#: src/modules/reminders/cog.py:368 +msgctxt "cmd:reminders_cancel|param:reminder" +msgid "reminder" +msgstr "" + +#: src/modules/reminders/cog.py:373 +msgctxt "cmd:reminders_cancel|param:reminder|desc" +msgid "Start typing, then select a reminder to cancel." +msgstr "" + +#: src/modules/reminders/cog.py:392 +msgctxt "cmd:reminders_cancel|error:no_reminders" +msgid "There are no reminders to cancel!" +msgstr "" + +#: src/modules/reminders/cog.py:416 +msgctxt "cmd:reminders_cancel|error:no_match" +msgid "" +"I am not sure which reminder you want to cancel. Please try again, selecting " +"a reminder from the list of choices." +msgstr "" + +#: src/modules/reminders/cog.py:429 +msgctxt "cmd:reminders_cancel|embed:success|desc" +msgid "Reminder successfully cancelled." +msgstr "" + +#: src/modules/reminders/cog.py:446 +msgctxt "cmd:reminders_cancel|acmpl:reminder|error:no_reminders" +msgid "There are no reminders to cancel!" +msgstr "" + +#: src/modules/reminders/cog.py:476 +#, possible-python-brace-format +msgctxt "cmd:reminders_cancel|acmpl:reminder|error:no_matches" +msgid "You do not have any reminders matching \"{partial}\"" +msgstr "" + +#: src/modules/reminders/cog.py:484 +msgctxt "cmd:remindme_at" +msgid "at" +msgstr "" + +#: src/modules/reminders/cog.py:487 +msgctxt "cmd:remindme_at|desc" +msgid "Schedule a reminder for a particular time." +msgstr "" + +#: src/modules/reminders/cog.py:491 +msgctxt "cmd:remindme_at|param:time" +msgid "time" +msgstr "" + +#: src/modules/reminders/cog.py:492 +msgctxt "cmd:remindme_at|param:reminder" +msgid "reminder" +msgstr "" + +#: src/modules/reminders/cog.py:493 +msgctxt "cmd:remindme_at|param:every" +msgid "repeat_every" +msgstr "" + +#: src/modules/reminders/cog.py:498 +msgctxt "cmd:remindme_at|param:time|desc" +msgid "When you want to be reminded. (E.g. `4pm` or `16:00`)." +msgstr "" + +#: src/modules/reminders/cog.py:502 +msgctxt "cmd:remindme_at|param:reminder|desc" +msgid "What should the reminder be?" +msgstr "" + +#: src/modules/reminders/cog.py:506 +msgctxt "cmd:remindme_at|param:every|desc" +msgid "How often to repeat this reminder." +msgstr "" + +#: src/modules/reminders/cog.py:533 +msgctxt "cmd:remindme_at|error|title" +msgid "Could not create reminder!" +msgstr "" + +#: src/modules/reminders/cog.py:564 +#, possible-python-brace-format +msgctxt "cmd:remindme_at|acmpl:time|error:parse" +msgid "" +"Cannot parse \"{partial}\" as a time. Try the format HH:MM or YYYY-MM-DD HH:" +"MM" +msgstr "" + +#: src/modules/reminders/cog.py:571 +msgctxt "cmd:remindme_in" +msgid "in" +msgstr "" + +#: src/modules/reminders/cog.py:574 +msgctxt "cmd:remindme_in|desc" +msgid "Schedule a reminder for a given amount of time in the future." +msgstr "" + +#: src/modules/reminders/cog.py:578 +msgctxt "cmd:remindme_in|param:time" +msgid "time" +msgstr "" + +#: src/modules/reminders/cog.py:579 +msgctxt "cmd:remindme_in|param:reminder" +msgid "reminder" +msgstr "" + +#: src/modules/reminders/cog.py:580 +msgctxt "cmd:remindme_in|param:every" +msgid "repeat_every" +msgstr "" + +#: src/modules/reminders/cog.py:585 +msgctxt "cmd:remindme_in|param:time|desc" +msgid "How far into the future to set the reminder (e.g. 1 day 10h 5m)." +msgstr "" + +#: src/modules/reminders/cog.py:589 +msgctxt "cmd:remindme_in|param:reminder|desc" +msgid "What should the reminder be?" +msgstr "" + +#: src/modules/reminders/cog.py:593 +msgctxt "cmd:remindme_in|param:every|desc" +msgid "How often to repeat this reminder. (e.g. 1 day, or 2h)" +msgstr "" + +#: src/modules/reminders/cog.py:619 +msgctxt "cmd:remindme_in|error|title" +msgid "Could not create reminder!" +msgstr "" + +#: src/modules/reminders/ui.py:47 +msgctxt "ui:reminderlist|button:clear|confirm|title" +msgid "Are You Sure?" +msgstr "" + +#: src/modules/reminders/ui.py:50 +#, possible-python-brace-format +msgctxt "ui:reminderlist|button:clear|confirm|desc" +msgid "Are you sure you want to delete your `{count}` reminder?" +msgid_plural "Are you sure you want to clear your `{count}` reminders?" +msgstr[0] "" +msgstr[1] "" + +#: src/modules/reminders/ui.py:57 +msgctxt "ui:reminderlist|button:clear|confirm|button:yes" +msgid "Yes, clear my reminders" +msgstr "" + +#: src/modules/reminders/ui.py:68 +msgctxt "ui:reminderlist|button:clear|success|desc" +msgid "Your reminders have been cleared!" +msgstr "" + +#: src/modules/reminders/ui.py:77 +msgctxt "ui:reminderlist|button:clear|confirm|button:cancel" +msgid "Cancel" +msgstr "" + +#: src/modules/reminders/ui.py:89 +msgctxt "ui:reminderlist|button:clear|label" +msgid "Clear Reminders" +msgstr "" + +#: src/modules/reminders/ui.py:110 +msgctxt "ui:reminderlist|button:new|modal|field:time|label" +msgid "When would you like to be reminded?" +msgstr "" + +#: src/modules/reminders/ui.py:120 +msgctxt "ui:reminderlist|button:new|modal|field:repeat|label" +msgid "How often should the reminder repeat?" +msgstr "" + +#: src/modules/reminders/ui.py:124 +msgctxt "ui:reminderlist|button:new|modal|field:repeat|placeholder" +msgid "1 day 10 hours 5 minutes (Leave empty for no repeat.)" +msgstr "" + +#: src/modules/reminders/ui.py:133 +msgctxt "ui:reminderlist|button:new|modal|field:content|label" +msgid "What should I remind you?" +msgstr "" + +#: src/modules/reminders/ui.py:144 +msgctxt "ui:reminderlist|button:new|modal|title" +msgid "Set a Reminder" +msgstr "" + +#: src/modules/reminders/ui.py:157 +#, possible-python-brace-format +msgctxt "ui:reminderlist|button:new|modal|parse|error:interval" +msgid "Cannot parse '{value}' as a duration." +msgstr "" + +#: src/modules/reminders/ui.py:180 +msgctxt "ui:reminderlist|button:new|label" +msgid "New Reminder" +msgstr "" + +#: src/modules/reminders/ui.py:208 +msgctxt "ui:reminderlist|select:remove|placeholder" +msgid "Select to cancel" +msgstr "" + +#: src/modules/reminders/ui.py:264 +msgctxt "ui:reminderlist|embed:list|author" +msgid "Your reminders" +msgstr "" + +#: src/modules/reminders/ui.py:270 +msgctxt "ui:reminderlist|embed:list|footer" +msgid "Click a reminder to jump back to the context!" +msgstr "" + +#: src/modules/reminders/ui.py:277 +msgctxt "ui:reminderlist|embed:no_reminders|title" +msgid "You have no reminders set!" +msgstr "" + +#: src/modules/reminders/ui.py:286 +msgctxt "ui:reminderlist|embed|tips:name" +msgid "Reminder Tips" +msgstr "" + +#: src/modules/reminders/ui.py:290 +#, possible-python-brace-format +msgctxt "ui:reminderlist|embed|tips:value" +msgid "" +"- Use {at_cmd} to set a reminder at a known time (e.g. `at 10 am`).\n" +"- Use {in_cmd} to set a reminder in a certain time (e.g. `in 2 hours`).\n" +"- Both commands support repeating reminders using the `every` parameter.\n" +"- Remember to tell me your timezone with {timezone_cmd} if you haven't " +"already!" +msgstr "" + +#: src/modules/reminders/data.py:63 +msgctxt "reminder_set|title" +msgid "Reminder Set!" +msgstr "" + +#: src/modules/reminders/data.py:67 +#, possible-python-brace-format +msgctxt "reminder_set|desc" +msgid "" +"At {timestamp} I will remind you about:\n" +"> {content}" +msgstr "" + +#: src/modules/reminders/data.py:79 +msgctxt "reminder_set|field:repeat|name" +msgid "Repeats" +msgstr "" + +#: src/modules/reminders/data.py:83 +#, possible-python-brace-format +msgctxt "reminder_set|field:repeat|value" +msgid "" +"This reminder will repeat every `{interval}` (after the first reminder)." +msgstr "" + +#: src/modules/reminders/data.py:94 msgctxt "reminder|embed" msgid "You asked me to remind you!" msgstr "" -#: src/modules/reminders/cog.py:101 +#: src/modules/reminders/data.py:102 msgctxt "reminder|embed" msgid "Context?" msgstr "" -#: src/modules/reminders/cog.py:103 +#: src/modules/reminders/data.py:104 msgctxt "reminder|embed" msgid "Click Here" msgstr "" -#: src/modules/reminders/cog.py:110 +#: src/modules/reminders/data.py:111 msgctxt "reminder|embed" msgid "Next reminder" msgstr "" -#: src/modules/reminders/cog.py:134 +#: src/modules/reminders/data.py:135 #, possible-python-brace-format msgctxt "reminder|formatted|interval" msgid "Every day" @@ -46,7 +375,7 @@ msgid_plural "Every `{days}` days" msgstr[0] "" msgstr[1] "" -#: src/modules/reminders/cog.py:143 +#: src/modules/reminders/data.py:144 #, possible-python-brace-format msgctxt "reminder|formatted|interval" msgid "Every hour" @@ -54,305 +383,8 @@ msgid_plural "Every `{hours}` hours" msgstr[0] "" msgstr[1] "" -#: src/modules/reminders/cog.py:152 +#: src/modules/reminders/data.py:153 #, possible-python-brace-format msgctxt "reminder|formatted|interval" msgid "Every `{duration}`" msgstr "" - -#: src/modules/reminders/cog.py:352 -msgctxt "cmd:reminders" -msgid "reminders" -msgstr "" - -#. No help string -#: src/modules/reminders/cog.py:359 -msgctxt "cmd:reminders_show" -msgid "show" -msgstr "" - -#: src/modules/reminders/cog.py:362 -msgctxt "cmd:reminders_show|desc" -msgid "Display your current reminders." -msgstr "" - -#: src/modules/reminders/cog.py:378 -msgctxt "cmd:reminders_show|close_elsewhere" -msgid "Closing since the list was opened elsewhere." -msgstr "" - -#: src/modules/reminders/cog.py:390 -msgctxt "cmd:reminders_clear" -msgid "clear" -msgstr "" - -#: src/modules/reminders/cog.py:393 -msgctxt "cmd:reminders_clear|desc" -msgid "Clear your reminder list." -msgstr "" - -#: src/modules/reminders/cog.py:411 -msgctxt "cmd:reminders_clear|error:no_reminders" -msgid "You have no reminders to clear!" -msgstr "" - -#: src/modules/reminders/cog.py:420 -msgctxt "cmd:reminders_clear|confirm|title" -msgid "Are You Sure?" -msgstr "" - -#: src/modules/reminders/cog.py:423 -#, possible-python-brace-format -msgctxt "cmd:reminders_clear|confirm|desc" -msgid "Are you sure you want to delete your `{count}` reminder?" -msgid_plural "Are you sure you want to clear your `{count}` reminders?" -msgstr[0] "" -msgstr[1] "" - -#: src/modules/reminders/cog.py:429 -msgctxt "cmd:reminders_clear|confirm|button:yes" -msgid "Yes, clear my reminders" -msgstr "" - -#: src/modules/reminders/cog.py:438 -msgctxt "cmd:reminders_clear|success|desc" -msgid "Your reminders have been cleared!" -msgstr "" - -#: src/modules/reminders/cog.py:447 -msgctxt "cmd:reminders_clear|confirm|button:cancel" -msgid "Cancel" -msgstr "" - -#: src/modules/reminders/cog.py:457 -msgctxt "cmd:reminders_cancel" -msgid "cancel" -msgstr "" - -#: src/modules/reminders/cog.py:460 -msgctxt "cmd:reminders_cancel|desc" -msgid "" -"Cancel a single reminder. Use the menu in \"reminder show\" to cancel " -"multiple reminders." -msgstr "" - -#: src/modules/reminders/cog.py:464 -msgctxt "cmd:reminders_cancel|param:reminder" -msgid "reminder" -msgstr "" - -#: src/modules/reminders/cog.py:469 -msgctxt "cmd:reminders_cancel|param:reminder|desc" -msgid "Start typing, then select a reminder to cancel." -msgstr "" - -#: src/modules/reminders/cog.py:488 -msgctxt "cmd:reminders_cancel|error:no_reminders" -msgid "There are no reminders to cancel!" -msgstr "" - -#: src/modules/reminders/cog.py:512 -msgctxt "cmd:reminders_cancel|error:no_match" -msgid "" -"I am not sure which reminder you want to cancel. Please try again, selecting " -"a reminder from the list of choices." -msgstr "" - -#: src/modules/reminders/cog.py:525 -msgctxt "cmd:reminders_cancel|embed:success|desc" -msgid "Reminder successfully cancelled." -msgstr "" - -#: src/modules/reminders/cog.py:542 -msgctxt "cmd:reminders_cancel|acmpl:reminder|error:no_reminders" -msgid "There are no reminders to cancel!" -msgstr "" - -#: src/modules/reminders/cog.py:572 -#, possible-python-brace-format -msgctxt "cmd:reminders_cancel|acmpl:reminder|error:no_matches" -msgid "You do not have any reminders matching \"{partial}\"" -msgstr "" - -#: src/modules/reminders/cog.py:580 -msgctxt "cmd:remindme" -msgid "remindme" -msgstr "" - -#: src/modules/reminders/cog.py:587 -msgctxt "cmd:remindme_at" -msgid "at" -msgstr "" - -#: src/modules/reminders/cog.py:590 -msgctxt "cmd:remindme_at|desc" -msgid "Schedule a reminder for a particular time." -msgstr "" - -#: src/modules/reminders/cog.py:594 -msgctxt "cmd:remindme_at|param:time" -msgid "time" -msgstr "" - -#: src/modules/reminders/cog.py:595 -msgctxt "cmd:remindme_at|param:reminder" -msgid "reminder" -msgstr "" - -#: src/modules/reminders/cog.py:596 -msgctxt "cmd:remindme_at|param:every" -msgid "repeat_every" -msgstr "" - -#: src/modules/reminders/cog.py:599 -msgctxt "cmd:remindme_at|param:time|desc" -msgid "When you want to be reminded. (E.g. `4pm` or `16:00`)." -msgstr "" - -#: src/modules/reminders/cog.py:600 -msgctxt "cmd:remindme_at|param:reminder|desc" -msgid "What should the reminder be?" -msgstr "" - -#: src/modules/reminders/cog.py:601 -msgctxt "cmd:remindme_at|param:every|desc" -msgid "How often to repeat this reminder." -msgstr "" - -#: src/modules/reminders/cog.py:619 -msgctxt "cmd_remindme_at|error:too_many|desc" -msgid "Sorry, you have reached the maximum of `25` reminders!" -msgstr "" - -#: src/modules/reminders/cog.py:623 -msgctxt "cmd_remindme_at|error:too_many|title" -msgid "Could not create reminder!" -msgstr "" - -#: src/modules/reminders/cog.py:636 -msgctxt "cmd_remindme_at|error:too_fast|desc" -msgid "You cannot set a repeating reminder with a period less than 10 minutes." -msgstr "" - -#: src/modules/reminders/cog.py:640 -msgctxt "cmd_remindme_at|error:too_fast|title" -msgid "Could not create reminder!" -msgstr "" - -#: src/modules/reminders/cog.py:658 -#, possible-python-brace-format -msgctxt "cmd:remindme_at|error:parse_time|desc" -msgid "" -"Could not parse provided time `{given}`. Try entering e.g. `4 pm` or `16:00`." -msgstr "" - -#: src/modules/reminders/cog.py:662 -msgctxt "cmd:remindme_at|error:parse_time|title" -msgid "Could not create reminder!" -msgstr "" - -#: src/modules/reminders/cog.py:673 -msgctxt "cmd:remindme_at|error:past_time|desc" -msgid "Provided time is in the past!" -msgstr "" - -#: src/modules/reminders/cog.py:677 -msgctxt "cmd:remindme_at|error:past_time|title" -msgid "Could not create reminder!" -msgstr "" - -#: src/modules/reminders/cog.py:702 -#, possible-python-brace-format -msgctxt "cmd:remindme_in|success|title" -msgid "Reminder Set at {timestamp}" -msgstr "" - -#: src/modules/reminders/cog.py:713 -msgctxt "cmd:remindme_in" -msgid "in" -msgstr "" - -#: src/modules/reminders/cog.py:716 -msgctxt "cmd:remindme_in|desc" -msgid "Schedule a reminder for a given amount of time in the future." -msgstr "" - -#: src/modules/reminders/cog.py:720 -msgctxt "cmd:remindme_in|param:time" -msgid "time" -msgstr "" - -#: src/modules/reminders/cog.py:721 -msgctxt "cmd:remindme_in|param:reminder" -msgid "reminder" -msgstr "" - -#: src/modules/reminders/cog.py:722 -msgctxt "cmd:remindme_in|param:every" -msgid "repeat_every" -msgstr "" - -#: src/modules/reminders/cog.py:725 -msgctxt "cmd:remindme_in|param:time|desc" -msgid "How far into the future to set the reminder (e.g. 1 day 10h 5m)." -msgstr "" - -#: src/modules/reminders/cog.py:726 -msgctxt "cmd:remindme_in|param:reminder|desc" -msgid "What should the reminder be?" -msgstr "" - -#: src/modules/reminders/cog.py:727 -msgctxt "cmd:remindme_in|param:every|desc" -msgid "How often to repeat this reminder. (e.g. 1 day, or 2h)" -msgstr "" - -#: src/modules/reminders/cog.py:745 -msgctxt "cmd_remindme_in|error:too_many|desc" -msgid "Sorry, you have reached the maximum of `25` reminders!" -msgstr "" - -#: src/modules/reminders/cog.py:749 -msgctxt "cmd_remindme_in|error:too_many|title" -msgid "Could not create reminder!" -msgstr "" - -#: src/modules/reminders/cog.py:762 -msgctxt "cmd_remindme_in|error:too_fast|desc" -msgid "You cannot set a repeating reminder with a period less than 10 minutes." -msgstr "" - -#: src/modules/reminders/cog.py:766 -msgctxt "cmd_remindme_in|error:too_fast|title" -msgid "Could not create reminder!" -msgstr "" - -#: src/modules/reminders/cog.py:792 -#, possible-python-brace-format -msgctxt "cmd:remindme_in|success|title" -msgid "Reminder Set {timestamp}" -msgstr "" - -#: src/modules/reminders/cog.py:853 -msgctxt "ui:reminderlist|select:remove|placeholder" -msgid "Select to cancel." -msgstr "" - -#: src/modules/reminders/cog.py:929 -#, possible-python-brace-format -msgctxt "ui:reminderlist|embed:list|author" -msgid "{name}'s reminders" -msgstr "" - -#: src/modules/reminders/cog.py:935 -msgctxt "ui:reminderlist|embed:list|footer" -msgid "Click a reminder twice to jump to the context!" -msgstr "" - -#: src/modules/reminders/cog.py:942 -#, possible-python-brace-format -msgctxt "ui:reminderlist|embed:no_reminders|desc" -msgid "" -"You have no reminders to display!\n" -"Use {remindme} to create a new reminder." -msgstr "" diff --git a/locales/templates/rolemenus.pot b/locales/templates/rolemenus.pot index 86dbafb9..ee890f26 100644 --- a/locales/templates/rolemenus.pot +++ b/locales/templates/rolemenus.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/rooms.pot b/locales/templates/rooms.pot index 1cb8c19a..72574608 100644 --- a/locales/templates/rooms.pot +++ b/locales/templates/rooms.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -92,8 +92,9 @@ msgid "Create Room Timer" msgstr "" #: src/modules/rooms/roomui.py:236 +#, possible-python-brace-format msgctxt "ui:room_status|button:timer|timer_created" -msgid "Timer created successfully! Use `/pomodoro edit` to configure further." +msgid "Timer created successfully! Use {edit_cmd} to configure further." msgstr "" #: src/modules/rooms/roomui.py:254 @@ -177,83 +178,83 @@ msgctxt "ui:room_status|embed|field:members|name" msgid "Members ({count}/{cap})" msgstr "" -#: src/modules/rooms/cog.py:306 +#: src/modules/rooms/cog.py:321 msgctxt "cmd:room" msgid "room" msgstr "" -#: src/modules/rooms/cog.py:307 +#: src/modules/rooms/cog.py:322 msgctxt "cmd:room|desc" msgid "Base command group for private room configuration." msgstr "" -#: src/modules/rooms/cog.py:314 +#: src/modules/rooms/cog.py:329 msgctxt "cmd:room_rent" msgid "rent" msgstr "" -#: src/modules/rooms/cog.py:317 +#: src/modules/rooms/cog.py:332 msgctxt "cmd:room_rent|desc" msgid "Rent a private voice channel with LionCoins." msgstr "" -#: src/modules/rooms/cog.py:321 +#: src/modules/rooms/cog.py:336 msgctxt "cmd:room_rent|param:days" msgid "days" msgstr "" -#: src/modules/rooms/cog.py:322 +#: src/modules/rooms/cog.py:337 msgctxt "cmd:room_rent|param:members" msgid "members" msgstr "" -#: src/modules/rooms/cog.py:323 +#: src/modules/rooms/cog.py:338 msgctxt "cmd:room_rent|param:name" msgid "name" msgstr "" -#: src/modules/rooms/cog.py:328 +#: src/modules/rooms/cog.py:343 msgctxt "cmd:room_rent|param:days|desc" msgid "Number of days to pre-purchase. (Default: 1)" msgstr "" -#: src/modules/rooms/cog.py:332 +#: src/modules/rooms/cog.py:347 msgctxt "cmd:room_rent|param:members|desc" msgid "Mention the members you want to add to your private room." msgstr "" -#: src/modules/rooms/cog.py:336 +#: src/modules/rooms/cog.py:351 msgctxt "cmd:room_rent|param:name|desc" msgid "Name of your private voice channel." msgstr "" -#: src/modules/rooms/cog.py:354 +#: src/modules/rooms/cog.py:369 msgctxt "cmd:room_rent|error:not_setup" msgid "" "The private room system has not been set up! A private room category needs " "to be set first with `/configure rooms`." msgstr "" -#: src/modules/rooms/cog.py:365 +#: src/modules/rooms/cog.py:380 msgctxt "cmd:room_rent|error:insufficient_perms" msgid "" "I do not have enough permissions to create a new channel under the " "configured private room category!" msgstr "" -#: src/modules/rooms/cog.py:379 +#: src/modules/rooms/cog.py:394 #, possible-python-brace-format msgctxt "cmd:room_rent|error:room_exists" msgid "You already own a private room! Click to visit: {channel}" msgstr "" -#: src/modules/rooms/cog.py:399 +#: src/modules/rooms/cog.py:414 #, possible-python-brace-format msgctxt "cmd:room_rent|error:member_not_found" msgid "Could not find the requested member {mention} in this server!" msgstr "" -#: src/modules/rooms/cog.py:413 +#: src/modules/rooms/cog.py:428 #, possible-python-brace-format msgctxt "cmd:room_rent|error:too_many_members" msgid "" @@ -261,7 +262,7 @@ msgid "" "but the maximum private room size is `{cap}`!" msgstr "" -#: src/modules/rooms/cog.py:427 +#: src/modules/rooms/cog.py:442 #, possible-python-brace-format msgctxt "cmd:room_rent|confirm:purchase" msgid "" @@ -273,18 +274,18 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/modules/rooms/cog.py:452 +#: src/modules/rooms/cog.py:467 #, possible-python-brace-format msgctxt "cmd:room_rent|success" msgid "Successfully created your private room {channel}!" msgstr "" -#: src/modules/rooms/cog.py:457 +#: src/modules/rooms/cog.py:472 msgctxt "cmd:room_rent|success|title" msgid "Private Room Created!" msgstr "" -#: src/modules/rooms/cog.py:491 +#: src/modules/rooms/cog.py:506 #, possible-python-brace-format msgctxt "cmd:room_rent|error:insufficient_funds" msgid "" @@ -296,14 +297,14 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: src/modules/rooms/cog.py:525 +#: src/modules/rooms/cog.py:540 msgctxt "cmd:room_rent|error:my_permissions" msgid "" "Could not create your private room! You were not charged.\n" "I have insufficient permissions to create a private room channel." msgstr "" -#: src/modules/rooms/cog.py:537 +#: src/modules/rooms/cog.py:552 #, possible-python-brace-format msgctxt "cmd:room_rent|error:unknown" msgid "" @@ -312,62 +313,62 @@ msgid "" "`{error}`" msgstr "" -#: src/modules/rooms/cog.py:547 +#: src/modules/rooms/cog.py:562 msgctxt "cmd:room_status" msgid "status" msgstr "" -#: src/modules/rooms/cog.py:550 +#: src/modules/rooms/cog.py:565 msgctxt "cmd:room_status|desc" msgid "Display the status of your current room." msgstr "" -#: src/modules/rooms/cog.py:567 +#: src/modules/rooms/cog.py:582 msgctxt "cmd:room_status|error:no_target" msgid "" "Could not identify target private room! Please re-run the command in the " "private room you wish to view the status of." msgstr "" -#: src/modules/rooms/cog.py:582 +#: src/modules/rooms/cog.py:597 msgctxt "cmd:room_invite" msgid "invite" msgstr "" -#: src/modules/rooms/cog.py:585 +#: src/modules/rooms/cog.py:600 msgctxt "cmd:room_invite|desc" msgid "Add members to your private room." msgstr "" -#: src/modules/rooms/cog.py:589 +#: src/modules/rooms/cog.py:604 msgctxt "cmd:room_invite|param:members" msgid "members" msgstr "" -#: src/modules/rooms/cog.py:594 +#: src/modules/rooms/cog.py:609 msgctxt "cmd:room_invite|param:members|desc" msgid "Mention the members you want to add." msgstr "" -#: src/modules/rooms/cog.py:608 +#: src/modules/rooms/cog.py:623 #, possible-python-brace-format msgctxt "cmd:room_invite|error:no_room" msgid "" "You do not own a private room! Use `/room rent` to rent one with {coin}!" msgstr "" -#: src/modules/rooms/cog.py:629 +#: src/modules/rooms/cog.py:644 #, possible-python-brace-format msgctxt "cmd:room_invite|error:member_not_found" msgid "Could not find the invited member {mention} in this server!" msgstr "" -#: src/modules/rooms/cog.py:640 +#: src/modules/rooms/cog.py:655 msgctxt "cmd:room_invite|error:no_new_members" msgid "All members mentioned are already in the room!" msgstr "" -#: src/modules/rooms/cog.py:654 +#: src/modules/rooms/cog.py:669 #, possible-python-brace-format msgctxt "cmd:room_invite|error:too_many_members" msgid "" @@ -375,89 +376,89 @@ msgid "" "you already have `{current}`, and the member cap is `{cap}`!" msgstr "" -#: src/modules/rooms/cog.py:678 +#: src/modules/rooms/cog.py:693 msgctxt "cmd:room_invite|success|ack" msgid "Members Invited successfully." msgstr "" -#: src/modules/rooms/cog.py:686 +#: src/modules/rooms/cog.py:701 msgctxt "cmd:room_kick" msgid "kick" msgstr "" -#: src/modules/rooms/cog.py:689 +#: src/modules/rooms/cog.py:704 msgctxt "cmd:room_kick|desc" msgid "Remove a members from your private room." msgstr "" -#: src/modules/rooms/cog.py:693 +#: src/modules/rooms/cog.py:708 msgctxt "cmd:room_kick|param:members" msgid "members" msgstr "" -#: src/modules/rooms/cog.py:698 +#: src/modules/rooms/cog.py:713 msgctxt "cmd:room_kick|param:members|desc" msgid "" "Mention the members you want to remove. Also accepts space-separated user " "ids." msgstr "" -#: src/modules/rooms/cog.py:712 +#: src/modules/rooms/cog.py:727 #, possible-python-brace-format msgctxt "cmd:room_kick|error:no_room" msgid "" "You do not own a private room! Use `/room rent` to rent one with {coin}!" msgstr "" -#: src/modules/rooms/cog.py:729 +#: src/modules/rooms/cog.py:744 msgctxt "cmd:room_kick|error:no_matching_members" msgid "None of the mentioned members are in this room!" msgstr "" -#: src/modules/rooms/cog.py:746 +#: src/modules/rooms/cog.py:761 msgctxt "cmd:room_kick|success|ack" msgid "Members removed." msgstr "" -#: src/modules/rooms/cog.py:752 +#: src/modules/rooms/cog.py:767 msgctxt "cmd:room_transfer" msgid "transfer" msgstr "" -#: src/modules/rooms/cog.py:755 +#: src/modules/rooms/cog.py:770 msgctxt "cmd:room_transfer|desc" msgid "Transfer your private room to another room member. Not reversible!" msgstr "" -#: src/modules/rooms/cog.py:759 +#: src/modules/rooms/cog.py:774 msgctxt "cmd:room_transfer|param:new_owner" msgid "new_owner" msgstr "" -#: src/modules/rooms/cog.py:764 +#: src/modules/rooms/cog.py:779 msgctxt "cmd:room_transfer|param:new_owner" msgid "The room member you would like to transfer your room to." msgstr "" -#: src/modules/rooms/cog.py:778 +#: src/modules/rooms/cog.py:793 msgctxt "cmd:room_transfer|error:no_room" msgid "You do not own a private room to transfer!" msgstr "" -#: src/modules/rooms/cog.py:790 +#: src/modules/rooms/cog.py:805 #, possible-python-brace-format msgctxt "cmd:room_transfer|error:target_not_member" msgid "" "{mention} is not a member of your private room! You must invite them first." msgstr "" -#: src/modules/rooms/cog.py:802 +#: src/modules/rooms/cog.py:817 #, possible-python-brace-format msgctxt "cmd:room_transfer|error:target_has_room" msgid "{mention} already owns a room! Members can only own one room at a time." msgstr "" -#: src/modules/rooms/cog.py:811 +#: src/modules/rooms/cog.py:826 #, possible-python-brace-format msgctxt "cmd:room_transfer|confirm|question" msgid "" @@ -465,62 +466,62 @@ msgid "" "{new_owner}? This action is not reversible!" msgstr "" -#: src/modules/rooms/cog.py:831 +#: src/modules/rooms/cog.py:846 #, possible-python-brace-format msgctxt "cmd:room_transfer|success|description" msgid "" "You have successfully transferred ownership of {channel} to {new_owner}." msgstr "" -#: src/modules/rooms/cog.py:837 +#: src/modules/rooms/cog.py:852 msgctxt "cmd:room_deposit" msgid "deposit" msgstr "" -#: src/modules/rooms/cog.py:840 +#: src/modules/rooms/cog.py:855 msgctxt "cmd:room_deposit|desc" msgid "" "Deposit LionCoins in your private room bank to add more days. (Members may " "also deposit!)" msgstr "" -#: src/modules/rooms/cog.py:844 +#: src/modules/rooms/cog.py:859 msgctxt "cmd:room_deposit|param:coins" msgid "coins" msgstr "" -#: src/modules/rooms/cog.py:849 +#: src/modules/rooms/cog.py:864 msgctxt "cmd:room_deposit|param:coins|desc" msgid "Number of coins to deposit." msgstr "" -#: src/modules/rooms/cog.py:869 +#: src/modules/rooms/cog.py:884 msgctxt "cmd:room_deposit|error:no_target" msgid "" "Could not identify target private room! Please re-run the command in the " "private room you wish to contribute to." msgstr "" -#: src/modules/rooms/cog.py:885 +#: src/modules/rooms/cog.py:900 #, possible-python-brace-format msgctxt "cmd:room_deposit|error:insufficient_funds" msgid "" "You cannot deposit {coin}**{amount}**! You only have {coin}**{balance}**." msgstr "" -#: src/modules/rooms/cog.py:906 +#: src/modules/rooms/cog.py:921 #, possible-python-brace-format msgctxt "cmd:room_depost|success" msgid "" "Success! You have contributed {coin}**{amount}** to the private room bank." msgstr "" -#: src/modules/rooms/cog.py:921 +#: src/modules/rooms/cog.py:936 msgctxt "cmd:configure_rooms" msgid "rooms" msgstr "" -#: src/modules/rooms/cog.py:922 +#: src/modules/rooms/cog.py:937 msgctxt "cmd:configure_rooms|desc" msgid "Configure Rented Private Rooms" msgstr "" diff --git a/locales/templates/schedule.pot b/locales/templates/schedule.pot index 5c5ad717..a6426401 100644 --- a/locales/templates/schedule.pot +++ b/locales/templates/schedule.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/settings_base.pot b/locales/templates/settings_base.pot index 800b13e7..ff6959cc 100644 --- a/locales/templates/settings_base.pot +++ b/locales/templates/settings_base.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/shop.pot b/locales/templates/shop.pot index 90df2019..d8a6b050 100644 --- a/locales/templates/shop.pot +++ b/locales/templates/shop.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,84 +23,89 @@ msgid "editshop" msgstr "" #: src/modules/shop/cog.py:117 -msgctxt "group:shop" +msgctxt "cmd:shop" msgid "shop" msgstr "" -#: src/modules/shop/cog.py:123 +#: src/modules/shop/cog.py:118 +msgctxt "cmd:shop|desc" +msgid "Purchase coloures, roles, and other goodies with LionCoins." +msgstr "" + +#: src/modules/shop/cog.py:124 msgctxt "cmd:shop_open" msgid "open" msgstr "" -#: src/modules/shop/cog.py:124 +#: src/modules/shop/cog.py:125 msgctxt "cmd:shop_open|desc" msgid "Open the server shop." msgstr "" -#: src/modules/shop/cog.py:150 +#: src/modules/shop/cog.py:151 msgctxt "cmd:shop_open|error:no_shops" msgid "There is nothing to buy!" msgstr "" -#: src/modules/shop/cog.py:212 +#: src/modules/shop/cog.py:213 msgctxt "ui:stores|button:close|label" msgid "Close" msgstr "" -#: src/modules/shop/cog.py:219 +#: src/modules/shop/cog.py:220 msgctxt "ui:stores|button:close|response|title" msgid "Shop Closed" msgstr "" -#: src/modules/shop/shops/colours.py:104 +#: src/modules/shop/shops/colours.py:105 #, possible-python-brace-format msgctxt "ui:colourstore|menu:buycolours|label" msgid "{name} ({price} LC)" msgstr "" -#: src/modules/shop/shops/colours.py:109 +#: src/modules/shop/shops/colours.py:110 #, possible-python-brace-format msgctxt "ui:colourstore|menu:buycolours|label" msgid "{name} (This is your colour!)" msgstr "" -#: src/modules/shop/shops/colours.py:114 +#: src/modules/shop/shops/colours.py:115 #, possible-python-brace-format msgctxt "ui:colourstore|menu:buycolours|desc" msgid "Colour: {colour}" msgstr "" -#: src/modules/shop/shops/colours.py:119 +#: src/modules/shop/shops/colours.py:120 msgctxt "ui:colourstore|menu:buycolours|desc" msgid "Colour: Unknown" msgstr "" -#: src/modules/shop/shops/colours.py:133 +#: src/modules/shop/shops/colours.py:134 msgctxt "shop:colours|name" msgid "Colour Shop" msgstr "" -#: src/modules/shop/shops/colours.py:172 +#: src/modules/shop/shops/colours.py:173 msgctxt "shop:colour|purchase|error:not_purchasable" msgid "This item may not be purchased!" msgstr "" -#: src/modules/shop/shops/colours.py:185 +#: src/modules/shop/shops/colours.py:186 msgctxt "shop:colour|purchase|error:no_guild" msgid "Could not retrieve the server from Discord!" msgstr "" -#: src/modules/shop/shops/colours.py:195 +#: src/modules/shop/shops/colours.py:196 msgctxt "shop:colour|purchase|error:no_member" msgid "Could not retrieve the member from Discord." msgstr "" -#: src/modules/shop/shops/colours.py:205 +#: src/modules/shop/shops/colours.py:206 msgctxt "shop:colour|purchase|error:no_role" msgid "This colour role could not be found in the server." msgstr "" -#: src/modules/shop/shops/colours.py:214 +#: src/modules/shop/shops/colours.py:215 #, possible-python-brace-format msgctxt "shop:colour|purchase|error:low_balance" msgid "" @@ -108,72 +113,72 @@ msgid "" "Your balance is {coin}{balance}" msgstr "" -#: src/modules/shop/shops/colours.py:229 +#: src/modules/shop/shops/colours.py:230 msgctxt "shop:colour|purchase|error:owned" msgid "You already own this item!" msgstr "" -#: src/modules/shop/shops/colours.py:263 +#: src/modules/shop/shops/colours.py:264 msgctxt "shop:colour|purchase|error:failed_no_role" msgid "This colour role no longer exists!" msgstr "" -#: src/modules/shop/shops/colours.py:270 +#: src/modules/shop/shops/colours.py:271 msgctxt "shop:colour|purchase|error:failed_permissions" msgid "I do not have enough permissions to give you this colour role!" msgstr "" -#: src/modules/shop/shops/colours.py:277 +#: src/modules/shop/shops/colours.py:278 msgctxt "shop:colour|purchase|error:failed_unknown" msgid "An unknown error occurred while giving you this colour role!" msgstr "" -#: src/modules/shop/shops/colours.py:346 +#: src/modules/shop/shops/colours.py:348 msgctxt "grp:editshop_colours" msgid "colours" msgstr "" -#: src/modules/shop/shops/colours.py:351 +#: src/modules/shop/shops/colours.py:353 msgctxt "cmd:editshop_colours_create" msgid "create" msgstr "" -#: src/modules/shop/shops/colours.py:354 +#: src/modules/shop/shops/colours.py:356 msgctxt "cmd:editshop_colours_create|desc" msgid "Create a new colour role with the given colour." msgstr "" -#: src/modules/shop/shops/colours.py:358 +#: src/modules/shop/shops/colours.py:360 msgctxt "cmd:editshop_colours_create|param:colour" msgid "colour" msgstr "" -#: src/modules/shop/shops/colours.py:359 +#: src/modules/shop/shops/colours.py:361 msgctxt "cmd:editshop_colours_create|param:name" msgid "name" msgstr "" -#: src/modules/shop/shops/colours.py:360 +#: src/modules/shop/shops/colours.py:362 msgctxt "cmd:editshop_colours_create|param:price" msgid "price" msgstr "" -#: src/modules/shop/shops/colours.py:365 +#: src/modules/shop/shops/colours.py:367 msgctxt "cmd:editshop_colours_create|param:colour|desc" msgid "What colour should the role be? (As a hex code, e.g. #AB22AB)" msgstr "" -#: src/modules/shop/shops/colours.py:369 +#: src/modules/shop/shops/colours.py:371 msgctxt "cmd:editshop_colours_create|param:name|desc" msgid "What should the colour role be called?" msgstr "" -#: src/modules/shop/shops/colours.py:373 +#: src/modules/shop/shops/colours.py:375 msgctxt "cmd:editshop_colours_create|param:price|desc" msgid "How much should the colour role cost?" msgstr "" -#: src/modules/shop/shops/colours.py:395 +#: src/modules/shop/shops/colours.py:397 #, possible-python-brace-format msgctxt "cmd:editshop_colours_create|error:parse_colour" msgid "" @@ -181,7 +186,7 @@ msgid "" "Please enter the colour as a hex string, e.g. `#FA0BC1`" msgstr "" -#: src/modules/shop/shops/colours.py:405 +#: src/modules/shop/shops/colours.py:407 msgctxt "cmd:editshop_colours_create|error:perms" msgid "" "I do not have permission to create server roles!\n" @@ -189,26 +194,26 @@ msgid "" "editshop colours add` instead." msgstr "" -#: src/modules/shop/shops/colours.py:421 +#: src/modules/shop/shops/colours.py:424 msgctxt "cmd:editshop_colours_create|error:max_colours" msgid "" "This server already has the maximum of `25` colour roles!\n" "Please remove some before adding or creating more." msgstr "" -#: src/modules/shop/shops/colours.py:440 +#: src/modules/shop/shops/colours.py:443 msgctxt "cmd:editshop_colours_create|error:failed_unknown" msgid "" "An unknown Discord error occurred while creating your colour role!\n" "Please try again in a few minutes." msgstr "" -#: src/modules/shop/shops/colours.py:490 +#: src/modules/shop/shops/colours.py:493 msgctxt "cmd:editshop_colours_create|resp:done|title" msgid "Colour Role Created" msgstr "" -#: src/modules/shop/shops/colours.py:494 +#: src/modules/shop/shops/colours.py:497 #, possible-python-brace-format msgctxt "cmd:editshop_colours_create|resp:done|desc" msgid "" @@ -216,80 +221,80 @@ msgid "" "{coin}**{price}**!" msgstr "" -#: src/modules/shop/shops/colours.py:501 +#: src/modules/shop/shops/colours.py:504 msgctxt "cmd:editshop_colours_create|resp:done|field:position_note|value" msgid "" "The new colour role was added below all other roles. Remember a member's " "active colour is determined by their highest coloured role!" msgstr "" -#: src/modules/shop/shops/colours.py:505 +#: src/modules/shop/shops/colours.py:508 msgctxt "cmd:editshop_colours_create|resp:done|field:position_note|name" msgid "Note" msgstr "" -#: src/modules/shop/shops/colours.py:514 +#: src/modules/shop/shops/colours.py:517 msgctxt "cmd:editshop_colours_edit" msgid "edit" msgstr "" -#: src/modules/shop/shops/colours.py:517 +#: src/modules/shop/shops/colours.py:520 msgctxt "cmd:editshop_colours_edit|desc" msgid "Edit the name, colour, or price of a colour role." msgstr "" -#: src/modules/shop/shops/colours.py:521 +#: src/modules/shop/shops/colours.py:524 msgctxt "cmd:editshop_colours_edit|param:role" msgid "role" msgstr "" -#: src/modules/shop/shops/colours.py:522 +#: src/modules/shop/shops/colours.py:525 msgctxt "cmd:editshop_colours_edit|param:name" msgid "name" msgstr "" -#: src/modules/shop/shops/colours.py:523 +#: src/modules/shop/shops/colours.py:526 msgctxt "cmd:editshop_colours_edit|param:colour" msgid "colour" msgstr "" -#: src/modules/shop/shops/colours.py:524 +#: src/modules/shop/shops/colours.py:527 msgctxt "cmd:editshop_colours_edit|param:price" msgid "price" msgstr "" -#: src/modules/shop/shops/colours.py:529 +#: src/modules/shop/shops/colours.py:532 msgctxt "cmd:editshop_colours_edit|param:role|desc" msgid "Select a colour role to edit." msgstr "" -#: src/modules/shop/shops/colours.py:533 +#: src/modules/shop/shops/colours.py:536 msgctxt "cmd:editshop_colours_edit|param:name|desc" msgid "New name to give the colour role." msgstr "" -#: src/modules/shop/shops/colours.py:537 +#: src/modules/shop/shops/colours.py:540 msgctxt "cmd:editshop_colours_edit|param:colour|desc" msgid "New colour for the colour role (as hex, e.g. #AB12AB)." msgstr "" -#: src/modules/shop/shops/colours.py:541 +#: src/modules/shop/shops/colours.py:544 msgctxt "cmd:editshop_colours_edit|param:price|desc" msgid "New price for the colour role." msgstr "" -#: src/modules/shop/shops/colours.py:570 +#: src/modules/shop/shops/colours.py:573 #, possible-python-brace-format msgctxt "cmd:editshop_colours_edit|error:invalid_role" msgid "{mention} is not in the colour role shop!" msgstr "" -#: src/modules/shop/shops/colours.py:584 +#: src/modules/shop/shops/colours.py:587 msgctxt "cmd:editshop_colours_edit|error:no_args" msgid "You must give me one of `name`, `colour`, or `price` to update!" msgstr "" -#: src/modules/shop/shops/colours.py:600 +#: src/modules/shop/shops/colours.py:603 #, possible-python-brace-format msgctxt "cmd:editshop_colours_edit|error:parse_colour" msgid "" @@ -297,82 +302,82 @@ msgid "" "Please enter the colour as a hex string, e.g. `#FA0BC1`" msgstr "" -#: src/modules/shop/shops/colours.py:615 +#: src/modules/shop/shops/colours.py:618 msgctxt "cmd:editshop_colours_edit|error:perms" msgid "I do not have sufficient server permissions to edit this role!" msgstr "" -#: src/modules/shop/shops/colours.py:631 +#: src/modules/shop/shops/colours.py:634 #, possible-python-brace-format msgctxt "cmd:editshop_colours_edit|resp:done|line:price" msgid "{tick} Set price to {coin}**{price}**" msgstr "" -#: src/modules/shop/shops/colours.py:648 +#: src/modules/shop/shops/colours.py:651 #, possible-python-brace-format msgctxt "cmd:editshop_colours_edit|resp:done|line:role" msgid "{tick} Updated role to {mention}" msgstr "" -#: src/modules/shop/shops/colours.py:658 +#: src/modules/shop/shops/colours.py:661 msgctxt "cmd:editshop_colours_edit|resp:done|embed:title" msgid "Colour Role Updated" msgstr "" -#: src/modules/shop/shops/colours.py:664 +#: src/modules/shop/shops/colours.py:667 msgctxt "cmd:editshop_colours_auto" msgid "auto" msgstr "" -#: src/modules/shop/shops/colours.py:665 +#: src/modules/shop/shops/colours.py:668 msgctxt "cmd:editshop_colours_auto|desc" msgid "Automatically create a set of colour roles." msgstr "" -#: src/modules/shop/shops/colours.py:674 +#: src/modules/shop/shops/colours.py:677 msgctxt "cmd:editshop_colours_add" msgid "add" msgstr "" -#: src/modules/shop/shops/colours.py:677 +#: src/modules/shop/shops/colours.py:680 msgctxt "cmd:editshop_colours_add|desc" msgid "Add an existing role to the colour shop." msgstr "" -#: src/modules/shop/shops/colours.py:681 +#: src/modules/shop/shops/colours.py:684 msgctxt "cmd:editshop_colours_add|param:role" msgid "role" msgstr "" -#: src/modules/shop/shops/colours.py:682 +#: src/modules/shop/shops/colours.py:685 msgctxt "cmd:editshop_colours_add|param:price" msgid "price" msgstr "" -#: src/modules/shop/shops/colours.py:687 +#: src/modules/shop/shops/colours.py:690 msgctxt "cmd:editshop_colours_add|param:role|desc" msgid "Select a role to add to the colour shop." msgstr "" -#: src/modules/shop/shops/colours.py:691 +#: src/modules/shop/shops/colours.py:694 msgctxt "cmd:editshop_colours_add|param:price|desc" msgid "How much should this role cost?" msgstr "" -#: src/modules/shop/shops/colours.py:716 +#: src/modules/shop/shops/colours.py:719 msgctxt "cmd:editshop_colours_add|error:max_colours" msgid "" "This server already has the maximum of `25` colour roles!\n" "Please remove some before adding or creating more." msgstr "" -#: src/modules/shop/shops/colours.py:725 +#: src/modules/shop/shops/colours.py:728 #, possible-python-brace-format msgctxt "cmd:editshop_colours_add|error:role_exists" msgid "The role {mention} is already registered as a colour role!" msgstr "" -#: src/modules/shop/shops/colours.py:734 +#: src/modules/shop/shops/colours.py:737 #, possible-python-brace-format msgctxt "cmd:editshop_colours_add|error:role_perms" msgid "" @@ -381,7 +386,7 @@ msgid "" "role." msgstr "" -#: src/modules/shop/shops/colours.py:745 +#: src/modules/shop/shops/colours.py:748 #, possible-python-brace-format msgctxt "cmd:editshop_colours_add|error:caller_perms" msgid "" @@ -390,138 +395,138 @@ msgid "" "role." msgstr "" -#: src/modules/shop/shops/colours.py:754 +#: src/modules/shop/shops/colours.py:760 msgctxt "cmd:editshop_colours_add|error:role_has_admin" msgid "" "I refuse to add an administrator role to the LionCoin shop. That is a really " "bad idea." msgstr "" -#: src/modules/shop/shops/colours.py:775 +#: src/modules/shop/shops/colours.py:781 msgctxt "cmd:editshop_colours_add|resp:done|embed:title" msgid "Colour Role Created" msgstr "" -#: src/modules/shop/shops/colours.py:778 +#: src/modules/shop/shops/colours.py:784 #, possible-python-brace-format msgctxt "cmd:editshop_colours_add|resp:done|embed:desc" msgid "You have added {mention} to the colour shop for {coin}**{price}**!" msgstr "" -#: src/modules/shop/shops/colours.py:786 +#: src/modules/shop/shops/colours.py:792 msgctxt "cmd:editshop_colours_clear" msgid "clear" msgstr "" -#: src/modules/shop/shops/colours.py:789 +#: src/modules/shop/shops/colours.py:795 msgctxt "cmd:editshop_colours_clear|desc" msgid "" "Remove all the colour roles from the shop, and optionally delete the roles." msgstr "" -#: src/modules/shop/shops/colours.py:793 +#: src/modules/shop/shops/colours.py:799 msgctxt "cmd:editshop_colours_clear|param:delete" msgid "delete_roles" msgstr "" -#: src/modules/shop/shops/colours.py:798 +#: src/modules/shop/shops/colours.py:804 msgctxt "cmd:editshop_colours_clear|param:delete|desc" msgid "Also delete the associated roles." msgstr "" -#: src/modules/shop/shops/colours.py:840 +#: src/modules/shop/shops/colours.py:846 msgctxt "cmd:editshop_colours_clear|error:no_colours" msgid "There are no coloured roles to remove!" msgstr "" -#: src/modules/shop/shops/colours.py:884 +#: src/modules/shop/shops/colours.py:890 #, possible-python-brace-format msgctxt "cmd:editshop_colours_clear|resp:done|line:clear" msgid "{tick} Colour shop cleared." msgstr "" -#: src/modules/shop/shops/colours.py:895 +#: src/modules/shop/shops/colours.py:901 #, possible-python-brace-format msgctxt "cmd:editshop_colours_clear|resp:done|line:refunding" msgid "{loading} Refunded **{count}/{total}** members." msgstr "" -#: src/modules/shop/shops/colours.py:901 +#: src/modules/shop/shops/colours.py:907 #, possible-python-brace-format msgctxt "cmd:editshop_colours_clear|resp:done|line:refunded" msgid "{tick} Refunded **{total}/{total}** members." msgstr "" -#: src/modules/shop/shops/colours.py:914 +#: src/modules/shop/shops/colours.py:920 #, possible-python-brace-format msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted_failed" msgid "" "{emoji} Deleted **{count}/{total}** colour roles. (**{failed}** failed!)" msgstr "" -#: src/modules/shop/shops/colours.py:919 +#: src/modules/shop/shops/colours.py:925 #, possible-python-brace-format msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted" msgid "{emoji} Deleted **{count}/{total}** colour roles." msgstr "" -#: src/modules/shop/shops/colours.py:968 +#: src/modules/shop/shops/colours.py:974 msgctxt "cmd:editshop_colours_remove" msgid "remove" msgstr "" -#: src/modules/shop/shops/colours.py:971 +#: src/modules/shop/shops/colours.py:977 msgctxt "cmd:editshop_colours_remove|desc" msgid "Remove a specific colour role from the shop." msgstr "" -#: src/modules/shop/shops/colours.py:975 +#: src/modules/shop/shops/colours.py:981 msgctxt "cmd:editshop_colours_remove|param:role" msgid "role" msgstr "" -#: src/modules/shop/shops/colours.py:976 +#: src/modules/shop/shops/colours.py:982 msgctxt "cmd:editshop_colours_remove" msgid "delete_role" msgstr "" -#: src/modules/shop/shops/colours.py:981 +#: src/modules/shop/shops/colours.py:987 msgctxt "cmd:editshop_colours_remove|param:role|desc" msgid "Select the colour role to remove." msgstr "" -#: src/modules/shop/shops/colours.py:985 +#: src/modules/shop/shops/colours.py:991 msgctxt "cmd:editshop_colours_remove|param:delete_role|desc" msgid "Whether to delete the associated role." msgstr "" -#: src/modules/shop/shops/colours.py:1010 +#: src/modules/shop/shops/colours.py:1016 #, possible-python-brace-format msgctxt "cmd:editshop_colours_remove|error:not_colour" msgid "{mention} is not in the colour role shop!" msgstr "" -#: src/modules/shop/shops/colours.py:1028 +#: src/modules/shop/shops/colours.py:1034 msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" msgid "Successfully deleted the role." msgstr "" -#: src/modules/shop/shops/colours.py:1033 +#: src/modules/shop/shops/colours.py:1039 msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" msgid "I do not have sufficient permissions to delete the role." msgstr "" -#: src/modules/shop/shops/colours.py:1038 +#: src/modules/shop/shops/colours.py:1044 msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" msgid "Failed to delete the role for an unknown reason." msgstr "" -#: src/modules/shop/shops/colours.py:1043 +#: src/modules/shop/shops/colours.py:1049 msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" msgid "Could not find the role in order to delete it." msgstr "" -#: src/modules/shop/shops/colours.py:1054 +#: src/modules/shop/shops/colours.py:1060 #, possible-python-brace-format msgctxt "cmd:editshop_colours_remove|resp:done|embed:desc" msgid "" @@ -529,45 +534,64 @@ msgid "" "{delete_line}" msgstr "" -#: src/modules/shop/shops/colours.py:1114 +#: src/modules/shop/shops/colours.py:1138 msgctxt "ui:colourstore|menu:buycolours|embed:error|title" msgid "Purchase Failed!" msgstr "" -#: src/modules/shop/shops/colours.py:1125 +#: src/modules/shop/shops/colours.py:1149 #, possible-python-brace-format msgctxt "ui:colourstore|menu:buycolours|resp:done|desc" msgid "{tick} You have purchased {mention}" msgstr "" -#: src/modules/shop/shops/colours.py:1160 +#: src/modules/shop/shops/colours.py:1184 msgctxt "ui:colourstore|menu:buycolours|placeholder" msgid "There are no colour roles available to purchase!" msgstr "" -#: src/modules/shop/shops/colours.py:1166 +#: src/modules/shop/shops/colours.py:1190 msgctxt "ui:colourstore|menu:buycolours|placeholder" msgid "Select a colour role to purchase!" msgstr "" -#: src/modules/shop/shops/colours.py:1195 +#: src/modules/shop/shops/colours.py:1236 #, possible-python-brace-format msgctxt "ui:colourstore|embed|line:owned_item" msgid "`[{j:02}]` | `{price} LC` | {mention} (You own this!)" msgstr "" -#: src/modules/shop/shops/colours.py:1200 +#: src/modules/shop/shops/colours.py:1241 #, possible-python-brace-format msgctxt "ui:colourstore|embed|line:item" msgid "`[{j:02}]` | `{price} LC` | {mention}" msgstr "" -#: src/modules/shop/shops/colours.py:1207 +#: src/modules/shop/shops/colours.py:1248 msgctxt "ui:colourstore|embed|desc" msgid "No colour roles available for purchase!" msgstr "" -#: src/modules/shop/shops/colours.py:1210 +#: src/modules/shop/shops/colours.py:1251 msgctxt "ui:colourstore|embed|title" msgid "Colour Role Shop" msgstr "" + +#: src/modules/shop/shops/colours.py:1257 +#, possible-python-brace-format +msgctxt "ui:colourstore|embed|footer:paged" +msgid "Page {current}/{total}" +msgstr "" + +#: src/modules/shop/shops/colours.py:1264 +msgctxt "ui:colourstore|embed|field:warning|name" +msgid "Note!" +msgstr "" + +#: src/modules/shop/shops/colours.py:1268 +#, possible-python-brace-format +msgctxt "ui:colourstore|embed|field:warning|value" +msgid "" +"Purchasing a new colour role will *replace* your currently colour {current} " +"without refund!" +msgstr "" diff --git a/locales/templates/statistics.pot b/locales/templates/statistics.pot index e42ff0e4..d034783d 100644 --- a/locales/templates/statistics.pot +++ b/locales/templates/statistics.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -47,36 +47,34 @@ msgctxt "cmd:leaderboard|desc" msgid "Server leaderboard." msgstr "" -#: src/modules/statistics/cog.py:91 +#: src/modules/statistics/cog.py:89 +#, possible-python-brace-format +msgctxt "cmd:leaderboard|chunking|desc" +msgid "Requesting server member list from Discord, please wait {loading}" +msgstr "" + +#: src/modules/statistics/cog.py:108 msgctxt "cmd:configure_statistics" msgid "statistics" msgstr "" -#: src/modules/statistics/cog.py:92 +#: src/modules/statistics/cog.py:109 msgctxt "cmd:configure_statistics|desc" msgid "Statistics configuration panel" msgstr "" -#: src/modules/statistics/cog.py:95 +#: src/modules/statistics/cog.py:112 msgctxt "cmd:configure_statistics|param:season_start" msgid "season_start" msgstr "" -#: src/modules/statistics/cog.py:100 +#: src/modules/statistics/cog.py:117 msgctxt "cmd:configure_statistics|param:season_start|desc" msgid "" "Time from which to start counting activity for rank badges and season " "leaderboards. (YYYY-MM-DD)" msgstr "" -#: src/modules/statistics/cog.py:130 -#, possible-python-brace-format -msgctxt "cmd:configure_statistics|resp:success|desc" -msgid "" -"Activity ranks and season leaderboard will now be measured from " -"{season_start}." -msgstr "" - #: src/modules/statistics/settings.py:37 msgctxt "settype:stat|output:voice" msgid "`Voice`" @@ -159,171 +157,175 @@ msgctxt "guildset:season_start|long_desc" msgid "" "Activity ranks will be determined based on tracked activity since this time, " "and the leaderboard will display activity since this time by default. Unset " -"to disable seasons and use all-time statistics instead." +"to disable seasons and use all-time statistics instead.\n" +"Provided dates and times are assumed to be in the guild `timezone`, so set " +"this first!" msgstr "" -#: src/modules/statistics/settings.py:101 +#: src/modules/statistics/settings.py:102 msgctxt "guildset:season_start|accepts" msgid "The season start time in the form YYYY-MM-DD HH:MM" msgstr "" -#: src/modules/statistics/settings.py:105 +#: src/modules/statistics/settings.py:106 msgctxt "guildset:season_start|notset" msgid "Not Set (Using all-time statistics)" msgstr "" -#: src/modules/statistics/settings.py:124 +#: src/modules/statistics/settings.py:125 #, possible-python-brace-format msgctxt "guildset:season_start|parse|error:future_time" msgid "Provided season start time {timestamp} is in the future!" msgstr "" -#: src/modules/statistics/settings.py:136 +#: src/modules/statistics/settings.py:137 #, possible-python-brace-format msgctxt "guildset:season_start|set_response|set" msgid "" "The leaderboard season and activity ranks will now count from {timestamp}. " -"Member ranks will update when they are next active. Use {rank_cmd} to " -"refresh immediately." +"Member ranks will update when they are next active.\n" +"Use {rank_cmd} and press **Refresh Member Ranks** to refresh all ranks " +"immediately." msgstr "" -#: src/modules/statistics/settings.py:145 +#: src/modules/statistics/settings.py:147 #, possible-python-brace-format msgctxt "guildset:season_start|set_response|unset" msgid "" "The leaderboard and activity ranks will now count all-time statistics. " -"Member ranks will update when they are next active. Use {rank_cmd} to " -"refresh immediately." +"Member ranks will update when they are next active.\n" +"Use {rank_cmd} and press **Refresh Member Ranks** to refresh all ranks " +"immediately." msgstr "" -#: src/modules/statistics/settings.py:156 +#: src/modules/statistics/settings.py:159 msgctxt "guildset:unranked_roles" msgid "unranked_roles" msgstr "" -#: src/modules/statistics/settings.py:159 +#: src/modules/statistics/settings.py:162 msgctxt "guildset:unranked_roles|desc" msgid "Roles to exclude from the leaderboards." msgstr "" -#: src/modules/statistics/settings.py:163 +#: src/modules/statistics/settings.py:166 msgctxt "guildset:unranked_roles|long_desc" msgid "" "When set, members with *any* of these roles will not appear on the /" "leaderboard ranking list." msgstr "" -#: src/modules/statistics/settings.py:167 +#: src/modules/statistics/settings.py:170 msgctxt "guildset:unranked_roles|accepts" msgid "Comma separated list of unranked role names or ids." msgstr "" -#: src/modules/statistics/settings.py:183 +#: src/modules/statistics/settings.py:186 msgctxt "guildset:unranked_roles|set_using" msgid "Role selector below." msgstr "" -#: src/modules/statistics/settings.py:193 +#: src/modules/statistics/settings.py:196 #, possible-python-brace-format msgctxt "guildset:unranked_roles|set_response|set" msgid "" "Members of the following roles will not appear on the leaderboard: {roles}" msgstr "" -#: src/modules/statistics/settings.py:200 +#: src/modules/statistics/settings.py:203 msgctxt "guildset:unranked_roles|set_response|unset" msgid "You have cleared the unranked role list." msgstr "" -#: src/modules/statistics/settings.py:214 +#: src/modules/statistics/settings.py:217 msgctxt "guildset:visible_stats" msgid "visible_stats" msgstr "" -#: src/modules/statistics/settings.py:217 +#: src/modules/statistics/settings.py:220 msgctxt "guildset:visible_stats|desc" msgid "Which statistics will be visible in the statistics commands." msgstr "" -#: src/modules/statistics/settings.py:221 +#: src/modules/statistics/settings.py:224 msgctxt "guildset:visible_stats|desc" msgid "" "Choose which statistics types to display in the leaderboard and statistics " "commands." msgstr "" -#: src/modules/statistics/settings.py:225 +#: src/modules/statistics/settings.py:228 msgctxt "guildset:visible_stats|accepts" msgid "Voice, Text, Anki" msgstr "" -#: src/modules/statistics/settings.py:246 +#: src/modules/statistics/settings.py:249 msgctxt "guildset:visible_stats|set_using" msgid "Option menu below." msgstr "" -#: src/modules/statistics/settings.py:254 +#: src/modules/statistics/settings.py:257 #, possible-python-brace-format msgctxt "guildset:visible_stats|set_response" msgid "Members will be able to view the following statistics types: {types}" msgstr "" -#: src/modules/statistics/settings.py:264 +#: src/modules/statistics/settings.py:267 msgctxt "guildset:default_stat" msgid "default_stat" msgstr "" -#: src/modules/statistics/settings.py:267 +#: src/modules/statistics/settings.py:270 msgctxt "guildset:default_stat|desc" msgid "Statistic type to display by default in setting dialogues." msgstr "" -#: src/modules/statistics/settings.py:271 +#: src/modules/statistics/settings.py:274 msgctxt "guildset:default_stat|long_desc" msgid "Which statistic type to display by default in setting dialogues." msgstr "" -#: src/modules/statistics/settings.py:304 +#: src/modules/statistics/settings.py:307 msgctxt "ui:statistics_config|menu:unranked_roles|placeholder" msgid "Select Unranked Roles" msgstr "" -#: src/modules/statistics/settings.py:328 +#: src/modules/statistics/settings.py:331 msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:voice" msgid "Voice Activity" msgstr "" -#: src/modules/statistics/settings.py:333 +#: src/modules/statistics/settings.py:336 msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:study" msgid "Study Statistics" msgstr "" -#: src/modules/statistics/settings.py:343 +#: src/modules/statistics/settings.py:346 msgctxt "ui:statistics_config|menu:visible_stats|item:text" msgid "Message Activity" msgstr "" -#: src/modules/statistics/settings.py:351 +#: src/modules/statistics/settings.py:354 msgctxt "ui:statistics_config|menu:visible_stats|item:anki" msgid "Anki Reviews" msgstr "" -#: src/modules/statistics/settings.py:362 +#: src/modules/statistics/settings.py:365 msgctxt "ui:statistics_config|menu:visible_stats|placeholder" msgid "Select Visible Statistics" msgstr "" -#: src/modules/statistics/settings.py:383 +#: src/modules/statistics/settings.py:386 msgctxt "ui:statistics_config|embed|title" msgid "Statistics Configuration Panel" msgstr "" -#: src/modules/statistics/settings.py:405 +#: src/modules/statistics/settings.py:408 msgctxt "dash:stats|title" msgid "Activity Statistics Configuration ({commands[configure statistics]})" msgstr "" -#: src/modules/statistics/settings.py:409 +#: src/modules/statistics/settings.py:412 msgctxt "dash:stats|dropdown|placeholder" msgid "Activity Statistics Panel" msgstr "" @@ -480,68 +482,68 @@ msgctxt "modal:goal_editor|monthly|title" msgid "Monthly goal editor" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:499 +#: src/modules/statistics/ui/weeklymonthly.py:503 msgctxt "ui:weeklymonthly|button:edit_goals|label" msgid "Edit Goals" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:515 +#: src/modules/statistics/ui/weeklymonthly.py:519 #, possible-python-brace-format msgctxt "ui:weeklymonthly|menu:period|monthly|label" msgid "{month} {year}" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:530 +#: src/modules/statistics/ui/weeklymonthly.py:534 #, possible-python-brace-format msgctxt "ui:weeklymonthly|menu:period|weekly|label" msgid "{year} W{week}" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:534 +#: src/modules/statistics/ui/weeklymonthly.py:538 #, possible-python-brace-format msgctxt "ui:weeklymonthly|menu:period|weekly|desc" msgid "" "{start_day} {start_month} {start_year} to {end_day} {end_month} {end_year}" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:612 +#: src/modules/statistics/ui/weeklymonthly.py:616 msgctxt "ui:weeklymonthly|button:period|close|label" msgid "Close Selector" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:617 +#: src/modules/statistics/ui/weeklymonthly.py:621 msgctxt "ui:weeklymonthly|button:period|weekly|label" msgid "Select Week" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:622 +#: src/modules/statistics/ui/weeklymonthly.py:626 msgctxt "ui:weeklymonthly|button:period|monthly|label" msgid "Select Month" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:687 +#: src/modules/statistics/ui/weeklymonthly.py:691 msgctxt "ui:weeklymonthly|menu:period|weekly|placeholder" msgid "Select a week to display" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:692 +#: src/modules/statistics/ui/weeklymonthly.py:696 msgctxt "ui:weeklymonthly|menu:period|monthly|placeholder" msgid "Select a month to display" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:714 +#: src/modules/statistics/ui/weeklymonthly.py:718 msgctxt "ui:WeeklyMonthly|button:global|resp:success" msgid "" "You will now see combined statistics from all your servers (where " "applicable)! Press again to revert." msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:727 +#: src/modules/statistics/ui/weeklymonthly.py:731 msgctxt "ui:WeeklyMonthly|button:global|mode:local" msgid "Server Statistics" msgstr "" -#: src/modules/statistics/ui/weeklymonthly.py:732 +#: src/modules/statistics/ui/weeklymonthly.py:736 msgctxt "ui:WeeklyMonthly|button:global|mode:global" msgid "Global Statistics" msgstr "" @@ -611,92 +613,101 @@ msgid "" "again to revert." msgstr "" -#: src/modules/statistics/ui/leaderboard.py:231 +#: src/modules/statistics/ui/leaderboard.py:250 msgctxt "ui:leaderboard|menu:stats|placeholder" msgid "Select Activity Type" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:240 +#: src/modules/statistics/ui/leaderboard.py:259 msgctxt "ui:leaderboard|menu:stats|item:voice" msgid "Voice Activity" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:251 +#: src/modules/statistics/ui/leaderboard.py:270 msgctxt "ui:leaderboard|menu:stats|item:study" msgid "Study Statistics" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:262 +#: src/modules/statistics/ui/leaderboard.py:281 msgctxt "ui:leaderboard|menu:stats|item:message" msgid "Message Activity" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:273 +#: src/modules/statistics/ui/leaderboard.py:292 msgctxt "ui:leaderboard|menu;stats|item:anki" msgid "Anki Cards Reviewed" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:327 +#: src/modules/statistics/ui/leaderboard.py:346 msgctxt "ui:leaderboard|button:season|label" msgid "This Season" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:331 +#: src/modules/statistics/ui/leaderboard.py:350 msgctxt "ui:leaderboard|button:day|label" msgid "Today" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:335 +#: src/modules/statistics/ui/leaderboard.py:354 msgctxt "ui:leaderboard|button:week|label" msgid "This Week" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:339 +#: src/modules/statistics/ui/leaderboard.py:358 msgctxt "ui:leaderboard|button:month|label" msgid "This Month" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:343 +#: src/modules/statistics/ui/leaderboard.py:362 msgctxt "ui:leaderboard|button:alltime|label" msgid "All Time" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:347 +#: src/modules/statistics/ui/leaderboard.py:366 msgctxt "ui:leaderboard|button:jump|label" msgid "Jump" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:362 +#: src/modules/statistics/ui/leaderboard.py:381 msgctxt "ui:leaderboard|button:jump|input:title" msgid "Jump to page" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:366 +#: src/modules/statistics/ui/leaderboard.py:385 msgctxt "ui:leaderboard|button:jump|input:question" msgid "Page number to jump to" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:377 +#: src/modules/statistics/ui/leaderboard.py:396 msgctxt "ui:leaderboard|button:jump|error:invalid_page" msgid "Invalid page number, please try again!" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:428 +#: src/modules/statistics/ui/leaderboard.py:442 +#, possible-python-brace-format +msgctxt "ui:leaderboard|since" +msgid "Counting statistics since {timestamp}" +msgstr "" + +#: src/modules/statistics/ui/leaderboard.py:453 +#, possible-python-brace-format msgctxt "ui:leaderboard|mode:voice|message:empty|desc" -msgid "There has been no voice activity in this period!" +msgid "There has been no voice activity since {timestamp}" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:433 +#: src/modules/statistics/ui/leaderboard.py:458 +#, possible-python-brace-format msgctxt "ui:leaderboard|mode:text|message:empty|desc" -msgid "There has been no message activity in this period!" +msgid "There has been no message activity since {timestamp}" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:438 +#: src/modules/statistics/ui/leaderboard.py:463 +#, possible-python-brace-format msgctxt "ui:leaderboard|mode:anki|message:empty|desc" -msgid "There have been no Anki cards reviewed in this period!" +msgid "There have been no Anki cards reviewed since {timestamp}" msgstr "" -#: src/modules/statistics/ui/leaderboard.py:444 +#: src/modules/statistics/ui/leaderboard.py:472 msgctxt "ui:leaderboard|message:empty|title" msgid "Leaderboard Empty!" msgstr "" diff --git a/locales/templates/stats-gui.pot b/locales/templates/stats-gui.pot index 8400f5a2..8099bcd1 100644 --- a/locales/templates/stats-gui.pot +++ b/locales/templates/stats-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/sysadmin.pot b/locales/templates/sysadmin.pot index d9cf2b30..c09da5d5 100644 --- a/locales/templates/sysadmin.pot +++ b/locales/templates/sysadmin.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/tasklist.pot b/locales/templates/tasklist.pot index 2d72608b..2190ec80 100644 --- a/locales/templates/tasklist.pot +++ b/locales/templates/tasklist.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -53,291 +53,323 @@ msgctxt "argtype:Before|opt:THISMONTH" msgid "This Month" msgstr "" -#: src/modules/tasklist/cog.py:225 +#: src/modules/tasklist/cog.py:205 +msgctxt "summon_tasklist|error:insufficient_perms|title" +msgid "Uh-Oh, I cannot do that here!" +msgstr "" + +#: src/modules/tasklist/cog.py:209 +msgctxt "summon_tasklist|error:insufficient_perms|desc" +msgid "" +"This channel is configured as a tasklist channel, but I lack the " +"`EMBED_LINKS` or `SEND_MESSAGES` permission here! If you believe this is " +"unintentional, please contact a server administrator." +msgstr "" + +#: src/modules/tasklist/cog.py:258 msgctxt "cmd:tasklist" msgid "tasklist" msgstr "" -#: src/modules/tasklist/cog.py:228 +#: src/modules/tasklist/cog.py:261 msgctxt "cmd:tasklist|desc" msgid "Open your tasklist." msgstr "" -#: src/modules/tasklist/cog.py:237 +#: src/modules/tasklist/cog.py:270 msgctxt "group:tasks" msgid "tasks" msgstr "" -#: src/modules/tasklist/cog.py:238 +#: src/modules/tasklist/cog.py:271 msgctxt "group:tasks|desc" msgid "Base command group for tasklist commands." msgstr "" -#: src/modules/tasklist/cog.py:260 +#: src/modules/tasklist/cog.py:293 msgctxt "argtype:taskid|error:no_tasks" msgid "Tasklist empty! No matching tasks." msgstr "" -#: src/modules/tasklist/cog.py:305 +#: src/modules/tasklist/cog.py:330 +msgctxt "argtype:taskid|match:all" +msgid "All tasks" +msgstr "" + +#: src/modules/tasklist/cog.py:348 #, possible-python-brace-format msgctxt "argtype:taskid|error:parse_multi" msgid "(Warning: {error})" msgstr "" -#: src/modules/tasklist/cog.py:339 +#: src/modules/tasklist/cog.py:382 #, possible-python-brace-format msgctxt "argtype:taskid|error:no_matching" msgid "No tasks matching '{partial}'!" msgstr "" -#: src/modules/tasklist/cog.py:359 +#: src/modules/tasklist/cog.py:402 msgctxt "cmd:tasks_new" msgid "new" msgstr "" -#: src/modules/tasklist/cog.py:362 +#: src/modules/tasklist/cog.py:405 msgctxt "cmd:tasks_new|desc" msgid "Add a new task to your tasklist." msgstr "" -#: src/modules/tasklist/cog.py:366 +#: src/modules/tasklist/cog.py:409 msgctxt "cmd:tasks_new|param:content" msgid "task" msgstr "" -#: src/modules/tasklist/cog.py:367 +#: src/modules/tasklist/cog.py:410 msgctxt "cmd:tasks_new|param:parent" msgid "parent" msgstr "" -#: src/modules/tasklist/cog.py:370 +#: src/modules/tasklist/cog.py:413 msgctxt "cmd:tasks_new|param:content|desc" msgid "Content of your new task." msgstr "" -#: src/modules/tasklist/cog.py:371 +#: src/modules/tasklist/cog.py:414 msgctxt "cmd:tasks_new|param:parent" msgid "Parent of this task." msgstr "" -#: src/modules/tasklist/cog.py:391 +#: src/modules/tasklist/cog.py:434 #, possible-python-brace-format msgctxt "cmd:tasks_new|error:parse_parent" msgid "Could not find parent task number `{input}` in your tasklist." msgstr "" -#: src/modules/tasklist/cog.py:406 +#: src/modules/tasklist/cog.py:449 #, possible-python-brace-format msgctxt "cmd:tasks_new|resp:success" msgid "{tick} Created task `{label}`." msgstr "" -#: src/modules/tasklist/cog.py:418 +#: src/modules/tasklist/cog.py:461 msgctxt "cmd:tasks_upload" msgid "upload" msgstr "" -#: src/modules/tasklist/cog.py:421 +#: src/modules/tasklist/cog.py:464 msgctxt "cmd:tasks_upload|desc" msgid "Upload a list of tasks to append to or replace your tasklist." msgstr "" -#: src/modules/tasklist/cog.py:425 +#: src/modules/tasklist/cog.py:468 msgctxt "cmd:tasks_upload|param:tasklist" msgid "tasklist" msgstr "" -#: src/modules/tasklist/cog.py:426 +#: src/modules/tasklist/cog.py:469 msgctxt "cmd:tasks_upload|param:append" msgid "append" msgstr "" -#: src/modules/tasklist/cog.py:431 +#: src/modules/tasklist/cog.py:474 msgctxt "cmd:tasks_upload|param:tasklist|desc" msgid "" "Text file containing a (standard markdown formatted) checklist of tasks to " "add or append." msgstr "" -#: src/modules/tasklist/cog.py:435 +#: src/modules/tasklist/cog.py:478 msgctxt "cmd:tasks_upload|param:append|desc" msgid "" "Whether to append the given tasks or replace your entire tasklist. Defaults " "to True." msgstr "" -#: src/modules/tasklist/cog.py:451 +#: src/modules/tasklist/cog.py:494 msgctxt "cmd:tasks_upload|error:not_text" msgid "The attached tasklist must be a text file!" msgstr "" -#: src/modules/tasklist/cog.py:459 +#: src/modules/tasklist/cog.py:502 msgctxt "cmd:tasks_upload|error:too_large" msgid "The attached tasklist was too large!" msgstr "" -#: src/modules/tasklist/cog.py:470 +#: src/modules/tasklist/cog.py:513 msgctxt "cmd:tasks_upload|error:too_many_lines" msgid "" "Too many tasks! Refusing to process a tasklist with more than `1000` lines." msgstr "" -#: src/modules/tasklist/cog.py:476 +#: src/modules/tasklist/cog.py:519 msgctxt "cmd:tasks_upload|error:decoding" msgid "" "Could not decode attached tasklist. Please make sure it is saved with the " "`UTF-8` encoding." msgstr "" -#: src/modules/tasklist/cog.py:523 +#: src/modules/tasklist/cog.py:566 #, possible-python-brace-format msgctxt "cmd:tasks_upload|resp:success" msgid "{tick} Updated your tasklist." msgstr "" -#: src/modules/tasklist/cog.py:535 +#: src/modules/tasklist/cog.py:578 msgctxt "cmd:tasks_edit" msgid "edit" msgstr "" -#: src/modules/tasklist/cog.py:538 +#: src/modules/tasklist/cog.py:581 msgctxt "cmd:tasks_edit|desc" msgid "Edit a task in your tasklist." msgstr "" -#: src/modules/tasklist/cog.py:542 +#: src/modules/tasklist/cog.py:585 msgctxt "cmd:tasks_edit|param:taskstr" msgid "task" msgstr "" -#: src/modules/tasklist/cog.py:543 +#: src/modules/tasklist/cog.py:586 msgctxt "cmd:tasks_edit|param:new_content" msgid "new_task" msgstr "" -#: src/modules/tasklist/cog.py:544 +#: src/modules/tasklist/cog.py:587 msgctxt "cmd:tasks_edit|param:new_parent" msgid "new_parent" msgstr "" -#: src/modules/tasklist/cog.py:547 +#: src/modules/tasklist/cog.py:590 msgctxt "cmd:tasks_edit|param:taskstr|desc" msgid "Which task do you want to update?" msgstr "" -#: src/modules/tasklist/cog.py:548 +#: src/modules/tasklist/cog.py:591 msgctxt "cmd:tasks_edit|param:new_content|desc" msgid "What do you want to change the task to?" msgstr "" -#: src/modules/tasklist/cog.py:549 +#: src/modules/tasklist/cog.py:592 msgctxt "cmd:tasks_edit|param:new_parent|desc" msgid "Which task do you want to be the new parent?" msgstr "" -#: src/modules/tasklist/cog.py:568 +#: src/modules/tasklist/cog.py:611 #, possible-python-brace-format msgctxt "cmd:tasks_edit|error:parse_taskstr" msgid "Could not find target task number `{input}` in your tasklist." msgstr "" -#: src/modules/tasklist/cog.py:584 +#: src/modules/tasklist/cog.py:627 #, possible-python-brace-format msgctxt "cmd:tasks_edit|error:parse_parent" msgid "Could not find new parent task number `{input}` in your tasklist." msgstr "" -#: src/modules/tasklist/cog.py:603 +#: src/modules/tasklist/cog.py:646 #, possible-python-brace-format msgctxt "cmd:tasks_edit|resp:success|desc" msgid "{tick} Task `{label}` updated." msgstr "" -#: src/modules/tasklist/cog.py:625 +#: src/modules/tasklist/cog.py:668 msgctxt "ui:tasklist_single_editor|title" msgid "Edit Task" msgstr "" -#: src/modules/tasklist/cog.py:640 +#: src/modules/tasklist/cog.py:683 msgctxt "cmd:tasks_clear" msgid "clear" msgstr "" -#: src/modules/tasklist/cog.py:641 +#: src/modules/tasklist/cog.py:684 msgctxt "cmd:tasks_clear|desc" msgid "Clear your tasklist." msgstr "" -#: src/modules/tasklist/cog.py:651 +#: src/modules/tasklist/cog.py:694 msgctxt "cmd:tasks_clear|resp:success" msgid "Your tasklist has been cleared." msgstr "" -#: src/modules/tasklist/cog.py:659 +#: src/modules/tasklist/cog.py:702 msgctxt "cmd:tasks_remove" msgid "remove" msgstr "" -#: src/modules/tasklist/cog.py:662 +#: src/modules/tasklist/cog.py:705 msgctxt "cmd:tasks_remove|desc" msgid "" "Remove tasks matching all the provided conditions. (E.g. remove tasks " "completed before today)." msgstr "" -#: src/modules/tasklist/cog.py:666 +#: src/modules/tasklist/cog.py:709 msgctxt "cmd:tasks_remove|param:taskidstr" msgid "tasks" msgstr "" -#: src/modules/tasklist/cog.py:667 +#: src/modules/tasklist/cog.py:710 msgctxt "cmd:tasks_remove|param:created_before" msgid "created_before" msgstr "" -#: src/modules/tasklist/cog.py:668 +#: src/modules/tasklist/cog.py:711 msgctxt "cmd:tasks_remove|param:updated_before" msgid "updated_before" msgstr "" -#: src/modules/tasklist/cog.py:669 +#: src/modules/tasklist/cog.py:712 msgctxt "cmd:tasks_remove|param:completed" msgid "completed" msgstr "" -#: src/modules/tasklist/cog.py:670 +#: src/modules/tasklist/cog.py:713 msgctxt "cmd:tasks_remove|param:cascade" msgid "cascade" msgstr "" -#: src/modules/tasklist/cog.py:675 +#: src/modules/tasklist/cog.py:718 msgctxt "cmd:tasks_remove|param:taskidstr|desc" -msgid "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-)." +msgid "" +"List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-), or `-` " +"to remove all." msgstr "" -#: src/modules/tasklist/cog.py:679 +#: src/modules/tasklist/cog.py:722 msgctxt "cmd:tasks_remove|param:created_before|desc" msgid "Only delete tasks created before the selected time." msgstr "" -#: src/modules/tasklist/cog.py:683 +#: src/modules/tasklist/cog.py:726 msgctxt "cmd:tasks_remove|param:updated_before|desc" msgid "" "Only deleted tasks update (i.e. completed or edited) before the selected " "time." msgstr "" -#: src/modules/tasklist/cog.py:687 +#: src/modules/tasklist/cog.py:730 msgctxt "cmd:tasks_remove|param:completed" msgid "Only delete tasks which are (not) complete." msgstr "" -#: src/modules/tasklist/cog.py:691 +#: src/modules/tasklist/cog.py:734 msgctxt "cmd:tasks_remove|param:cascade" msgid "Whether to recursively remove subtasks of removed tasks." msgstr "" -#: src/modules/tasklist/cog.py:760 +#: src/modules/tasklist/cog.py:766 src/modules/tasklist/cog.py:861 +#: src/modules/tasklist/cog.py:936 +#, possible-python-brace-format +msgctxt "cmd:tasks_remove_cmd|error:no_matching" +msgid "No tasks on your tasklist match `{input}`" +msgstr "" + +#: src/modules/tasklist/cog.py:790 +msgctxt "cmd:tasks_remove_cmd|error:no_matching" +msgid "No tasks on your tasklist matching all the given conditions!" +msgstr "" + +#: src/modules/tasklist/cog.py:803 #, possible-python-brace-format msgctxt "cmd:tasks_remove|resp:success" msgid "{tick} Deleted task `{label}`" @@ -345,37 +377,39 @@ msgid_plural "{tick} Deleted `{count}` tasks from your tasklist." msgstr[0] "" msgstr[1] "" -#: src/modules/tasklist/cog.py:778 +#: src/modules/tasklist/cog.py:821 msgctxt "cmd:tasks_tick" msgid "tick" msgstr "" -#: src/modules/tasklist/cog.py:779 +#: src/modules/tasklist/cog.py:822 msgctxt "cmd:tasks_tick|desc" msgid "Mark the given tasks as completed." msgstr "" -#: src/modules/tasklist/cog.py:782 +#: src/modules/tasklist/cog.py:825 msgctxt "cmd:tasks_tick|param:taskidstr" msgid "tasks" msgstr "" -#: src/modules/tasklist/cog.py:783 +#: src/modules/tasklist/cog.py:826 msgctxt "cmd:tasks_tick|param:cascade" msgid "cascade" msgstr "" -#: src/modules/tasklist/cog.py:788 +#: src/modules/tasklist/cog.py:831 msgctxt "cmd:tasks_tick|param:taskidstr|desc" -msgid "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-)." +msgid "" +"List of task numbers or ranges to tick (e.g. 1, 2, 5-7, 8.1-3, 9-) or '-' to " +"tick all." msgstr "" -#: src/modules/tasklist/cog.py:792 +#: src/modules/tasklist/cog.py:835 msgctxt "cmd:tasks_tick|param:cascade|desc" msgid "Whether to also mark all subtasks as complete." msgstr "" -#: src/modules/tasklist/cog.py:836 +#: src/modules/tasklist/cog.py:879 #, possible-python-brace-format msgctxt "cmd:tasks_tick|resp:success" msgid "{tick} Marked `{label}` as complete." @@ -383,37 +417,39 @@ msgid_plural "{tick} Marked `{count}` tasks as complete." msgstr[0] "" msgstr[1] "" -#: src/modules/tasklist/cog.py:854 +#: src/modules/tasklist/cog.py:897 msgctxt "cmd:tasks_untick" msgid "untick" msgstr "" -#: src/modules/tasklist/cog.py:855 +#: src/modules/tasklist/cog.py:898 msgctxt "cmd:tasks_untick|desc" msgid "Mark the given tasks as incomplete." msgstr "" -#: src/modules/tasklist/cog.py:858 +#: src/modules/tasklist/cog.py:901 msgctxt "cmd:tasks_untick|param:taskidstr" msgid "taskids" msgstr "" -#: src/modules/tasklist/cog.py:859 +#: src/modules/tasklist/cog.py:902 msgctxt "cmd:tasks_untick|param:cascade" msgid "cascade" msgstr "" -#: src/modules/tasklist/cog.py:864 +#: src/modules/tasklist/cog.py:907 msgctxt "cmd:tasks_untick|param:taskidstr|desc" -msgid "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-)." +msgid "" +"List of task numbers or ranges to untick (e.g. 1, 2, 5-7, 8.1-3, 9-) or '-' " +"to untick all." msgstr "" -#: src/modules/tasklist/cog.py:868 +#: src/modules/tasklist/cog.py:911 msgctxt "cmd:tasks_untick|param:cascade|desc" msgid "Whether to also mark all subtasks as incomplete." msgstr "" -#: src/modules/tasklist/cog.py:909 +#: src/modules/tasklist/cog.py:952 #, possible-python-brace-format msgctxt "cmd:tasks_untick|resp:success" msgid "{tick} Marked `{label}` as incomplete." @@ -421,27 +457,27 @@ msgid_plural "{tick} Marked `{count}` tasks as incomplete." msgstr[0] "" msgstr[1] "" -#: src/modules/tasklist/cog.py:933 +#: src/modules/tasklist/cog.py:976 msgctxt "cmd:configure_tasklist" msgid "tasklist" msgstr "" -#: src/modules/tasklist/cog.py:934 +#: src/modules/tasklist/cog.py:977 msgctxt "cmd:configure_tasklist|desc" msgid "Tasklist configuration panel" msgstr "" -#: src/modules/tasklist/cog.py:937 +#: src/modules/tasklist/cog.py:980 msgctxt "cmd:configure_tasklist|param:reward" msgid "reward" msgstr "" -#: src/modules/tasklist/cog.py:938 +#: src/modules/tasklist/cog.py:981 msgctxt "cmd:configure_tasklist|param:reward_limit" msgid "reward_limit" msgstr "" -#: src/modules/tasklist/cog.py:974 +#: src/modules/tasklist/cog.py:1017 #, possible-python-brace-format msgctxt "cmd:configure_tasklist|resp:success|desc" msgid "" @@ -449,19 +485,19 @@ msgid "" "up to a maximum of `{limit}` tasks per 24h." msgstr "" -#: src/modules/tasklist/tasklist.py:264 +#: src/modules/tasklist/tasklist.py:267 #, possible-python-brace-format msgctxt "tasklist|parse:multi-range|error:parents_match" msgid "Parents don't match in range `{range}`" msgstr "" -#: src/modules/tasklist/tasklist.py:286 +#: src/modules/tasklist/tasklist.py:289 #, possible-python-brace-format msgctxt "tasklist|parse:multi-range|error:parse" msgid "Could not parse `{range}` as a task number or range." msgstr "" -#: src/modules/tasklist/tasklist.py:317 +#: src/modules/tasklist/tasklist.py:320 #, possible-python-brace-format msgctxt "modal:tasklist_bulk_editor|error:parse_task" msgid "" @@ -469,7 +505,7 @@ msgid "" "`{input}`" msgstr "" -#: src/modules/tasklist/tasklist.py:329 +#: src/modules/tasklist/tasklist.py:332 msgctxt "modal:tasklist_bulk_editor|error:task_too_long" msgid "Please keep your tasks under 100 characters!" msgstr "" @@ -545,13 +581,13 @@ msgctxt "ui:tasklist|menu:sub|mode:delete|placeholder" msgid "Delete from {label}.*" msgstr "" -#: src/modules/tasklist/ui.py:408 +#: src/modules/tasklist/ui.py:409 #, possible-python-brace-format msgctxt "ui:tasklist_single_editor|field:parent|error:parse_id" msgid "Could not find the given parent task number `{input}` in your tasklist." msgstr "" -#: src/modules/tasklist/ui.py:422 +#: src/modules/tasklist/ui.py:423 #, possible-python-brace-format msgctxt "ui:tasklist_single_editor|field:parent|error:multiple_matching" msgid "" @@ -559,77 +595,77 @@ msgid "" "number instead!" msgstr "" -#: src/modules/tasklist/ui.py:429 +#: src/modules/tasklist/ui.py:430 #, possible-python-brace-format msgctxt "ui:tasklist_single_editor|field:parent|error:no_matching" msgid "No tasks matching given parent task `{input}`." msgstr "" -#: src/modules/tasklist/ui.py:500 +#: src/modules/tasklist/ui.py:501 msgctxt "ui:tasklist|menu:edit|modal:title" msgid "Edit task" msgstr "" -#: src/modules/tasklist/ui.py:593 +#: src/modules/tasklist/ui.py:596 msgctxt "ui:tasklist_single_editor|title" msgid "Add task" msgstr "" -#: src/modules/tasklist/ui.py:626 +#: src/modules/tasklist/ui.py:629 msgctxt "ui:tasklist|button:edit_mode|label" msgid "Edit" msgstr "" -#: src/modules/tasklist/ui.py:642 +#: src/modules/tasklist/ui.py:645 msgctxt "ui:tasklist|button:delete_mode|label" msgid "Delete" msgstr "" -#: src/modules/tasklist/ui.py:658 +#: src/modules/tasklist/ui.py:661 msgctxt "ui:tasklist|button:toggle_mode|label" msgid "Toggle" msgstr "" -#: src/modules/tasklist/ui.py:675 +#: src/modules/tasklist/ui.py:678 msgctxt "ui:tasklist|button:edit_bulk|error:too_long" msgid "" "Your tasklist is too long to be edited in a Discord text input! Use the save " "button and {cmds[tasks upload]} instead." msgstr "" -#: src/modules/tasklist/ui.py:689 +#: src/modules/tasklist/ui.py:692 msgctxt "ui:tasklist|button:edit_bulk|label" msgid "Bulk Edit" msgstr "" -#: src/modules/tasklist/ui.py:702 +#: src/modules/tasklist/ui.py:705 msgctxt "ui:tasklist|button:clear|label" msgid "Clear Tasklist" msgstr "" -#: src/modules/tasklist/ui.py:721 +#: src/modules/tasklist/ui.py:724 #, possible-python-brace-format msgctxt "ui:tasklist|button:save|dm:contents" msgid "Your tasklist as of {now} is attached. Click here to jump back: {jump}" msgstr "" -#: src/modules/tasklist/ui.py:734 +#: src/modules/tasklist/ui.py:737 msgctxt "ui:tasklist|button:save|error:dms" msgid "Could not DM you! Do you have me blocked? Tasklist attached below." msgstr "" -#: src/modules/tasklist/ui.py:779 +#: src/modules/tasklist/ui.py:782 msgctxt "ui:tasklist|error:wrong_user" msgid "This is not your tasklist!" msgstr "" -#: src/modules/tasklist/ui.py:821 +#: src/modules/tasklist/ui.py:824 #, possible-python-brace-format msgctxt "ui:tasklist|embed|author" msgid "{name}'s tasklist ({completed}/{total} complete)" msgstr "" -#: src/modules/tasklist/ui.py:843 +#: src/modules/tasklist/ui.py:846 msgctxt "ui:tasklist|embed|description" msgid "" "**You have no tasks on your tasklist!**\n" diff --git a/locales/templates/test.pot b/locales/templates/test.pot index 9a93260c..330d6555 100644 --- a/locales/templates/test.pot +++ b/locales/templates/test.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,62 +17,66 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: src/modules/test/test.py:47 src/modules/test/test.py:54 +#: src/modules/test/test.py:59 src/modules/test/test.py:66 msgid "test" msgstr "" -#: src/modules/test/test.py:55 +#: src/modules/test/test.py:67 msgid "Test" msgstr "" -#: src/modules/test/test.py:62 +#: src/modules/test/test.py:74 msgid "editor" msgstr "" -#: src/modules/test/test.py:63 +#: src/modules/test/test.py:75 msgid "Test message editor" msgstr "" -#: src/modules/test/test.py:89 +#: src/modules/test/test.py:101 msgid "test_ephemeral" msgstr "" -#: src/modules/test/test.py:90 +#: src/modules/test/test.py:102 msgid "Test ephemeral delete and edit" msgstr "" -#: src/modules/test/test.py:102 +#: src/modules/test/test.py:114 msgid "colours" msgstr "" -#: src/modules/test/test.py:103 +#: src/modules/test/test.py:115 msgid "Test Ansi colours" msgstr "" -#: src/modules/test/test.py:123 +#: src/modules/test/test.py:135 msgid "fail" msgstr "" -#: src/modules/test/test.py:130 +#: src/modules/test/test.py:143 +msgid "failui" +msgstr "" + +#: src/modules/test/test.py:150 msgid "pager" msgstr "" -#: src/modules/test/test.py:158 +#: src/modules/test/test.py:178 msgid "pager2" msgstr "" -#: src/modules/test/test.py:189 +#: src/modules/test/test.py:209 msgid "prettyusers" msgstr "" -#: src/modules/test/test.py:239 +#: src/modules/test/test.py:259 msgid "dmview" msgstr "" -#: src/modules/test/test.py:250 +#: src/modules/test/test.py:270 msgid "multiview" msgstr "" -#: src/modules/test/test.py:267 +#: src/modules/test/test.py:287 msgid "stats-card" msgstr "" diff --git a/locales/templates/text-tracker.pot b/locales/templates/text-tracker.pot index eceb8502..734e1335 100644 --- a/locales/templates/text-tracker.pot +++ b/locales/templates/text-tracker.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,22 +17,22 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: src/tracking/text/cog.py:249 +#: src/tracking/text/cog.py:254 msgctxt "cmd:configure_message_exp" msgid "message_exp" msgstr "" -#: src/tracking/text/cog.py:252 +#: src/tracking/text/cog.py:257 msgctxt "cmd:configure_message_exp|desc" msgid "Configure Message Tracking & Experience" msgstr "" -#: src/tracking/text/cog.py:315 +#: src/tracking/text/cog.py:320 msgctxt "cmd:leo_configure_exp_rates" msgid "experience_rates" msgstr "" -#: src/tracking/text/cog.py:318 +#: src/tracking/text/cog.py:323 msgctxt "cmd:leo_configure_exp_rates|desc" msgid "Global experience rate configuration" msgstr "" diff --git a/locales/templates/timer-gui.pot b/locales/templates/timer-gui.pot index 4e9742e2..3a3c1ca8 100644 --- a/locales/templates/timer-gui.pot +++ b/locales/templates/timer-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/user_config.pot b/locales/templates/user_config.pot index 45939276..e6bc395f 100644 --- a/locales/templates/user_config.pot +++ b/locales/templates/user_config.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/utils.pot b/locales/templates/utils.pot index 8349da9c..6bca2f4a 100644 --- a/locales/templates/utils.pot +++ b/locales/templates/utils.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -103,34 +103,34 @@ msgctxt "cmd:page_select|acmpl|error:no_pager" msgid "No active pagers in this channel!" msgstr "" -#: src/utils/transformers.py:43 +#: src/utils/transformers.py:45 #, possible-python-brace-format msgctxt "utils:parse_dur|error" msgid "Cannot parse `{value}` as a duration." msgstr "" -#: src/utils/transformers.py:68 +#: src/utils/transformers.py:71 #, possible-python-brace-format msgctxt "util:Duration|acmpl|error" msgid "Cannot extract duration from \"{partial}\"" msgstr "" -#: src/utils/lib.py:670 +#: src/utils/lib.py:678 msgctxt "util:parse_dur|regex:day" msgid "(?P\\d+)\\s*(?:(d)|(day))" msgstr "" -#: src/utils/lib.py:677 +#: src/utils/lib.py:685 msgctxt "util:parse_dur|regex:hour" msgid "(?P\\d+)\\s*(?:(h)|(hour))" msgstr "" -#: src/utils/lib.py:684 +#: src/utils/lib.py:692 msgctxt "util:parse_dur|regex:minute" msgid "(?P\\d+)\\s*(?:(m)|(min))" msgstr "" -#: src/utils/lib.py:691 +#: src/utils/lib.py:699 msgctxt "util:parse_dur|regex:second" msgid "(?P\\d+)\\s*(?:(s)|(sec))" msgstr "" diff --git a/locales/templates/video.pot b/locales/templates/video.pot index ad30d39b..7a90a3ce 100644 --- a/locales/templates/video.pot +++ b/locales/templates/video.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/voice-tracker.pot b/locales/templates/voice-tracker.pot index 578b9ee3..ace47871 100644 --- a/locales/templates/voice-tracker.pot +++ b/locales/templates/voice-tracker.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,129 +17,129 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: src/tracking/voice/cog.py:640 +#: src/tracking/voice/cog.py:649 msgctxt "cmd:now" msgid "now" msgstr "" -#: src/tracking/voice/cog.py:643 +#: src/tracking/voice/cog.py:652 msgctxt "cmd:now|desc" msgid "" "Describe what you are working on, or see what your friends are working on!" msgstr "" -#: src/tracking/voice/cog.py:647 +#: src/tracking/voice/cog.py:656 msgctxt "cmd:now|param:tag" msgid "tag" msgstr "" -#: src/tracking/voice/cog.py:648 +#: src/tracking/voice/cog.py:657 msgctxt "cmd:now|param:user" msgid "user" msgstr "" -#: src/tracking/voice/cog.py:649 +#: src/tracking/voice/cog.py:658 msgctxt "cmd:now|param:clear" msgid "clear" msgstr "" -#: src/tracking/voice/cog.py:654 +#: src/tracking/voice/cog.py:663 msgctxt "cmd:now|param:tag|desc" msgid "Describe what you are working on in 10 characters or less!" msgstr "" -#: src/tracking/voice/cog.py:658 +#: src/tracking/voice/cog.py:667 msgctxt "cmd:now|param:user|desc" msgid "Check what a friend is working on." msgstr "" -#: src/tracking/voice/cog.py:662 +#: src/tracking/voice/cog.py:671 msgctxt "cmd:now|param:clear|desc" msgid "Unset your activity tag (or the target user's tag, for moderators)." msgstr "" -#: src/tracking/voice/cog.py:689 +#: src/tracking/voice/cog.py:698 msgctxt "cmd:now|target:self|error:target_inactive" msgid "" "You have no running session! Join a tracked voice channel to start a session." msgstr "" -#: src/tracking/voice/cog.py:698 +#: src/tracking/voice/cog.py:707 #, possible-python-brace-format msgctxt "cmd:now|target:other|error:target_inactive" msgid "{mention} has no running session!" msgstr "" -#: src/tracking/voice/cog.py:713 +#: src/tracking/voice/cog.py:722 msgctxt "cmd:now|target:self|mode:clear|success|title" msgid "Session Tag Cleared" msgstr "" -#: src/tracking/voice/cog.py:717 +#: src/tracking/voice/cog.py:726 msgctxt "cmd:now|target:self|mode:clear|success|desc" msgid "Successfully unset your session tag." msgstr "" -#: src/tracking/voice/cog.py:726 +#: src/tracking/voice/cog.py:735 msgctxt "cmd:now|target:other|mode:clear|error:perms|title" msgid "You can't do that!" msgstr "" -#: src/tracking/voice/cog.py:730 +#: src/tracking/voice/cog.py:739 msgctxt "cmd:now|target:other|mode:clear|error:perms|desc" msgid "You need to be a moderator to set or clear someone else's session tag." msgstr "" -#: src/tracking/voice/cog.py:740 +#: src/tracking/voice/cog.py:749 msgctxt "cmd:now|target:other|mode:clear|success|title" msgid "Session Tag Cleared!" msgstr "" -#: src/tracking/voice/cog.py:744 +#: src/tracking/voice/cog.py:753 #, possible-python-brace-format msgctxt "cmd:now|target:other|mode:clear|success|desc" msgid "Cleared {target}'s session tag." msgstr "" -#: src/tracking/voice/cog.py:756 +#: src/tracking/voice/cog.py:765 msgctxt "cmd:now|target:self|mode:set|success|title" msgid "Session Tag Set!" msgstr "" -#: src/tracking/voice/cog.py:760 +#: src/tracking/voice/cog.py:769 #, possible-python-brace-format msgctxt "cmd:now|target:self|mode:set|success|desc" msgid "You are now working on `{new_tag}`. Good luck!" msgstr "" -#: src/tracking/voice/cog.py:769 +#: src/tracking/voice/cog.py:778 msgctxt "cmd:now|target:other|mode:set|error:perms|title" msgid "You can't do that!" msgstr "" -#: src/tracking/voice/cog.py:773 +#: src/tracking/voice/cog.py:782 msgctxt "cmd:now|target:other|mode:set|error:perms|desc" msgid "You need to be a moderator to set or clear someone else's session tag!" msgstr "" -#: src/tracking/voice/cog.py:783 +#: src/tracking/voice/cog.py:792 msgctxt "cmd:now|target:other|mode:set|success|title" msgid "Session Tag Set!" msgstr "" -#: src/tracking/voice/cog.py:787 +#: src/tracking/voice/cog.py:796 #, possible-python-brace-format msgctxt "cmd:now|target:other|mode:set|success|desc" msgid "Set {target}'s session tag to `{new_tag}`." msgstr "" -#: src/tracking/voice/cog.py:796 +#: src/tracking/voice/cog.py:805 #, possible-python-brace-format msgctxt "cmd:now|target:self|mode:show_with_tag|desc" msgid "You have been working on **`{tag}`** in {channel} since {time}!" msgstr "" -#: src/tracking/voice/cog.py:801 +#: src/tracking/voice/cog.py:810 #, possible-python-brace-format msgctxt "cmd:now|target:self|mode:show_without_tag|desc" msgid "" @@ -148,7 +148,7 @@ msgid "" "Use `/now ` to set what you are working on." msgstr "" -#: src/tracking/voice/cog.py:808 +#: src/tracking/voice/cog.py:817 #, possible-python-brace-format msgctxt "cmd:now|target:other|mode:show_with_tag|desc" msgid "" @@ -156,23 +156,23 @@ msgid "" "They have been working on **{tag}** since {time}." msgstr "" -#: src/tracking/voice/cog.py:814 +#: src/tracking/voice/cog.py:823 #, possible-python-brace-format msgctxt "cmd:now|target:other|mode:show_without_tag|desc" msgid "{target} has been working in {channel} since {time}!" msgstr "" -#: src/tracking/voice/cog.py:837 +#: src/tracking/voice/cog.py:846 msgctxt "cmd:configure_voice_rates" msgid "voice_rewards" msgstr "" -#: src/tracking/voice/cog.py:840 +#: src/tracking/voice/cog.py:849 msgctxt "cmd:configure_voice_rates|desc" msgid "Configure Voice tracking rewards and experience" msgstr "" -#: src/tracking/voice/cog.py:897 +#: src/tracking/voice/cog.py:906 #, possible-python-brace-format msgctxt "cmd:configure_voice_tracking|mode:voice|resp:success|desc" msgid "" @@ -181,7 +181,7 @@ msgid "" "day." msgstr "" -#: src/tracking/voice/cog.py:908 +#: src/tracking/voice/cog.py:917 #, possible-python-brace-format msgctxt "cmd:configure_voice_tracking|mode:study|resp:success|desc" msgid "" diff --git a/locales/templates/wards.pot b/locales/templates/wards.pot index 4cd71a6f..4a1694ab 100644 --- a/locales/templates/wards.pot +++ b/locales/templates/wards.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locales/templates/weekly-gui.pot b/locales/templates/weekly-gui.pot index 3212c0eb..6558ba12 100644 --- a/locales/templates/weekly-gui.pot +++ b/locales/templates/weekly-gui.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-28 22:43+0300\n" +"POT-Creation-Date: 2023-09-13 08:47+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/requirements.txt b/requirements.txt index 56555fc6..a34bcc40 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,7 +3,7 @@ cachetools==4.2.2 configparser==5.0.2 discord.py iso8601==0.1.16 -psycopg +psycopg[pool] pytz==2021.1 topggpy psutil diff --git a/src/analytics/snapshot.py b/src/analytics/snapshot.py index 565280e1..789439eb 100644 --- a/src/analytics/snapshot.py +++ b/src/analytics/snapshot.py @@ -22,7 +22,7 @@ async def shard_snapshot(): snap = ShardSnapshot( guild_count=len(bot.guilds), voice_count=sum(len(channel.members) for guild in bot.guilds for channel in guild.voice_channels), - member_count=sum(len(guild.members) for guild in bot.guilds), + member_count=sum(guild.member_count for guild in bot.guilds), user_count=len(set(m.id for guild in bot.guilds for m in guild.members)) ) return snap diff --git a/src/babel/cog.py b/src/babel/cog.py index bd535a3e..8f18ddf9 100644 --- a/src/babel/cog.py +++ b/src/babel/cog.py @@ -230,14 +230,15 @@ class BabelCog(LionCog): supported = self.bot.translator.supported_locales formatted = [] for locale in supported: - name = locale_names.get(locale.replace('_', '-'), None) - if name: - localestr = f"{locale} ({t(name)})" + names = locale_names.get(locale.replace('_', '-'), None) + if names: + local_name, native_name = names + localestr = f"{native_name} ({t(local_name)})" else: localestr = locale formatted.append((locale, localestr)) - matching = {item for item in formatted if partial in item[1]} + matching = {item for item in formatted if partial in item[1] or partial in item[0]} if matching: choices = [ appcmds.Choice(name=localestr, value=locale) diff --git a/src/babel/enums.py b/src/babel/enums.py index 6ab77a74..9e73da33 100644 --- a/src/babel/enums.py +++ b/src/babel/enums.py @@ -38,37 +38,44 @@ class LocaleMap(Enum): hebrew = 'he-IL' +# Original Discord names locale_names = { - 'en-US': _p('localenames|locale:en-US', "American English"), - 'en-GB': _p('localenames|locale:en-GB', "British English"), - 'bg': _p('localenames|locale:bg', "Bulgarian"), - 'zh-CN': _p('localenames|locale:zh-CN', "Chinese"), - 'zh-TW': _p('localenames|locale:zh-TW', "Taiwan Chinese"), - 'hr': _p('localenames|locale:hr', "Croatian"), - 'cs': _p('localenames|locale:cs', "Czech"), - 'da': _p('localenames|locale:da', "Danish"), - 'nl': _p('localenames|locale:nl', "Dutch"), - 'fi': _p('localenames|locale:fi', "Finnish"), - 'fr': _p('localenames|locale:fr', "French"), - 'de': _p('localenames|locale:de', "German"), - 'el': _p('localenames|locale:el', "Greek"), - 'hi': _p('localenames|locale:hi', "Hindi"), - 'hu': _p('localenames|locale:hu', "Hungarian"), - 'it': _p('localenames|locale:it', "Italian"), - 'ja': _p('localenames|locale:ja', "Japanese"), - 'ko': _p('localenames|locale:ko', "Korean"), - 'lt': _p('localenames|locale:lt', "Lithuanian"), - 'no': _p('localenames|locale:no', "Norwegian"), - 'pl': _p('localenames|locale:pl', "Polish"), - 'pt-BR': _p('localenames|locale:pt-BR', "Brazil Portuguese"), - 'ro': _p('localenames|locale:ro', "Romanian"), - 'ru': _p('localenames|locale:ru', "Russian"), - 'es-ES': _p('localenames|locale:es-ES', "Spain Spanish"), - 'sv-SE': _p('localenames|locale:sv-SE', "Swedish"), - 'th': _p('localenames|locale:th', "Thai"), - 'tr': _p('localenames|locale:tr', "Turkish"), - 'uk': _p('localenames|locale:uk', "Ukrainian"), - 'vi': _p('localenames|locale:vi', "Vietnamese"), - 'he': _p('localenames|locale:he', "Hebrew"), - 'he-IL': _p('localenames|locale:he_IL', "Hebrew (Israel)"), + 'id': (_p('localenames|locale:id', "Indonesian"), "Bahasa Indonesia"), + 'da': (_p('localenames|locale:da', "Danish"), "Dansk"), + 'de': (_p('localenames|locale:de', "German"), "Deutsch"), + 'en-GB': (_p('localenames|locale:en-GB', "English, UK"), "English, UK"), + 'en-US': (_p('localenames|locale:en-US', "English, US"), "English, US"), + 'es-ES': (_p('localenames|locale:es-ES', "Spanish"), "Español"), + 'fr': (_p('localenames|locale:fr', "French"), "Français"), + 'hr': (_p('localenames|locale:hr', "Croatian"), "Hrvatski"), + 'it': (_p('localenames|locale:it', "Italian"), "Italiano"), + 'lt': (_p('localenames|locale:lt', "Lithuanian"), "Lietuviškai"), + 'hu': (_p('localenames|locale:hu', "Hungarian"), "Magyar"), + 'nl': (_p('localenames|locale:nl', "Dutch"), "Nederlands"), + 'no': (_p('localenames|locale:no', "Norwegian"), "Norsk"), + 'pl': (_p('localenames|locale:pl', "Polish"), "Polski"), + 'pt-BR': (_p('localenames|locale:pt-BR', "Portuguese, Brazilian"), "Português do Brasil"), + 'ro': (_p('localenames|locale:ro', "Romanian, Romania"), "Română"), + 'fi': (_p('localenames|locale:fi', "Finnish"), "Suomi"), + 'sv-SE': (_p('localenames|locale:sv-SE', "Swedish"), "Svenska"), + 'vi': (_p('localenames|locale:vi', "Vietnamese"), "Tiếng Việt"), + 'tr': (_p('localenames|locale:tr', "Turkish"), "Türkçe"), + 'cs': (_p('localenames|locale:cs', "Czech"), "Čeština"), + 'el': (_p('localenames|locale:el', "Greek"), "Ελληνικά"), + 'bg': (_p('localenames|locale:bg', "Bulgarian"), "български"), + 'ru': (_p('localenames|locale:ru', "Russian"), "Pусский"), + 'uk': (_p('localenames|locale:uk', "Ukrainian"), "Українська"), + 'hi': (_p('localenames|locale:hi', "Hindi"), "हिन्दी"), + 'th': (_p('localenames|locale:th', "Thai"), "ไทย"), + 'zh-CN': (_p('localenames|locale:zh-CN', "Chinese, China"), "中文"), + 'ja': (_p('localenames|locale:ja', "Japanese"), "日本語"), + 'zh-TW': (_p('localenames|locale:zh-TW', "Chinese, Taiwan"), "繁體中文"), + 'ko': (_p('localenames|locale:ko', "Korean"), "한국어"), +} + +# More names for languages not supported by Discord +locale_names |= { + 'he': (_p('localenames|locale:he', "Hebrew"), "Hebrew"), + 'he-IL': (_p('localenames|locale:he-IL', "Hebrew"), "Hebrew"), + 'ceaser': (_p('localenames|locale:test', "Test Language"), "dfbtfs"), } diff --git a/src/babel/settings.py b/src/babel/settings.py index bacfda87..47da6afe 100644 --- a/src/babel/settings.py +++ b/src/babel/settings.py @@ -43,9 +43,9 @@ class LocaleSetting(StringSetting): if data is None: formatted = t(_p('settype:locale|formatted:unset', "Unset")) else: - name = locale_names.get(data, None) - if name: - formatted = f"`{data} ({t(name)})`" + if data in locale_names: + local_name, native_name = locale_names[data] + formatted = f"`{native_name} ({t(local_name)})`" else: formatted = f"`{data}`" return formatted diff --git a/src/babel/translator.py b/src/babel/translator.py index 0d4141b3..6e5fe904 100644 --- a/src/babel/translator.py +++ b/src/babel/translator.py @@ -47,33 +47,43 @@ class LeoBabel(Translator): Initialise the gettext translators for the supported_locales. """ self.read_supported() + missing = [] + loaded = [] for locale in self.supported_locales: for domain in self.supported_domains: if locale == SOURCE_LOCALE: continue try: translator = gettext.translation(domain, "locales/", languages=[locale]) + loaded.append(f"Loaded translator for ") except OSError: # Presume translation does not exist - logger.warning(f"Could not load translator for supported ") - pass - else: - logger.debug(f"Loaded translator for ") - self.translators[locale][domain] = translator + missing.append(f"Could not load translator for supported ") + translator = null + + self.translators[locale][domain] = translator + if missing: + logger.warning('\n'.join(("Missing Translators:", *missing))) + if loaded: + logger.debug('\n'.join(("Loaded Translators:", *loaded))) async def unload(self): self.translators.clear() def get_translator(self, locale, domain): if locale == SOURCE_LOCALE: - return null - - translator = self.translators[locale].get(domain, None) - if translator is None: - logger.warning( - f"Translator missing for requested and . Setting NullTranslator." - ) - self.translators[locale][domain] = null + translator = null + elif locale in self.supported_locales and domain in self.supported_domains: + translator = self.translators[locale].get(domain, None) + if translator is None: + # This should never really happen because we already loaded the supported translators + logger.warning( + f"Translator missing for supported " + "and . Setting NullTranslator." + ) + translator = self.translators[locale][domain] = null + else: + # Unsupported translator = null return translator diff --git a/src/bot.py b/src/bot.py index a12ce61e..49dceb11 100644 --- a/src/bot.py +++ b/src/bot.py @@ -9,6 +9,7 @@ from meta import LionBot, conf, sharding, appname, shard_talk from meta.app import shardname from meta.logger import log_context, log_action_stack, setup_main_logger from meta.context import ctx_bot +from meta.monitor import ComponentMonitor, StatusLevel, ComponentStatus from data import Database @@ -21,7 +22,7 @@ for name in conf.config.options('LOGGING_LEVELS', no_defaults=True): logging.getLogger(name).setLevel(conf.logging_levels[name]) -setup_main_logger() +logging_queue = setup_main_logger() logger = logging.getLogger(__name__) @@ -29,6 +30,25 @@ logger = logging.getLogger(__name__) db = Database(conf.data['args']) +async def _data_monitor() -> ComponentStatus: + """ + Component monitor callback for the database. + """ + data = { + 'stats': str(db.pool.get_stats()) + } + if not db.pool._opened: + level = StatusLevel.WAITING + info = "(WAITING) Database Pool is not opened." + elif db.pool._closed: + level = StatusLevel.ERRORED + info = "(ERROR) Database Pool is closed." + else: + level = StatusLevel.OKAY + info = "(OK) Database Pool statistics: {stats}" + return ComponentStatus(level, info, info, data) + + async def main(): log_action_stack.set(("Initialising",)) logger.info("Initialising StudyLion") @@ -69,9 +89,13 @@ async def main(): shard_count=sharding.shard_count, help_command=None, proxy=conf.bot.get('proxy', None), - translator=translator + translator=translator, + chunk_guilds_at_startup=False, ) as lionbot: ctx_bot.set(lionbot) + lionbot.system_monitor.add_component( + ComponentMonitor('Database', _data_monitor) + ) try: log_context.set(f"APP: {appname}") logger.info("StudyLion initialised, starting!", extra={'action': 'Starting'}) diff --git a/src/core/config.py b/src/core/config.py index 2f14fc37..0468c715 100644 --- a/src/core/config.py +++ b/src/core/config.py @@ -26,6 +26,7 @@ class ConfigCog(LionCog): @cmds.hybrid_group( name=_p('group:configure', "configure"), + description=_p('group:configure|desc', "View and adjust my configuration options."), ) @appcmds.guild_only @appcmds.default_permissions(manage_guild=True) diff --git a/src/core/data.py b/src/core/data.py index 5acf46de..9870f671 100644 --- a/src/core/data.py +++ b/src/core/data.py @@ -179,9 +179,6 @@ class CoreData(Registry, name="core"): mod_log_channel = Integer() alert_channel = Integer() - studyban_role = Integer() - max_study_bans = Integer() - min_workout_length = Integer() workout_reward = Integer() @@ -209,6 +206,8 @@ class CoreData(Registry, name="core"): video_studyban = Bool() video_grace_period = Integer() + studyban_role = Integer() + greeting_channel = Integer() greeting_message = String() returning_message = String() diff --git a/src/core/lion_member.py b/src/core/lion_member.py index 1f3c91b1..fb944e76 100644 --- a/src/core/lion_member.py +++ b/src/core/lion_member.py @@ -85,6 +85,8 @@ class LionMember(Timezoned): """ if member.display_name != self.data.display_name: await self.data.update(display_name=member.display_name) + else: + await self.data.refresh() async def fetch_member(self) -> Optional[discord.Member]: """ diff --git a/src/core/setting_types.py b/src/core/setting_types.py index 7bc1710d..96c31364 100644 --- a/src/core/setting_types.py +++ b/src/core/setting_types.py @@ -49,16 +49,20 @@ class CoinSetting(IntegerSetting): if num > cls._max: t = ctx_translator.get().t - raise UserInputError(t(_p( - 'settype:coin|parse|error:too_large', - "Provided number of coins was too high!" - ))) from None + raise UserInputError( + t(_p( + 'settype:coin|parse|error:too_large', + "You cannot set this to more than {coin}**{max}**!" + )).format(coin=conf.emojis.coin, max=cls._max) + ) from None elif num < cls._min: t = ctx_translator.get().t - raise UserInputError(t(_p( - 'settype:coin|parse|error:too_large', - "Provided number of coins was too low!" - ))) from None + raise UserInputError( + t(_p( + 'settype:coin|parse|error:too_small', + "You cannot set this to less than {coin}**{min}**!" + )).format(coin=conf.emojis.coin, min=cls._min) + ) from None return num diff --git a/src/gui b/src/gui index 3952086f..ba9ace6c 160000 --- a/src/gui +++ b/src/gui @@ -1 +1 @@ -Subproject commit 3952086fb0453d2bced6bceb37713cbfb70b3836 +Subproject commit ba9ace6ced300123c53287ff1ba4dbd106d1cc46 diff --git a/src/meta/LionBot.py b/src/meta/LionBot.py index 55b30345..ca699ffb 100644 --- a/src/meta/LionBot.py +++ b/src/meta/LionBot.py @@ -7,10 +7,13 @@ import discord from discord.utils import MISSING from discord.ext.commands import Bot, Cog, HybridCommand, HybridCommandError from discord.ext.commands.errors import CommandInvokeError, CheckFailure -from discord.app_commands.errors import CommandInvokeError as appCommandInvokeError +from discord.app_commands.errors import CommandInvokeError as appCommandInvokeError, TransformerError from aiohttp import ClientSession from data import Database +from utils.lib import tabulate +from gui.errors import RenderingException +from babel.translator import ctx_locale from .config import Conf from .logger import logging_context, log_context, log_action_stack, log_wrap, set_logging_context @@ -18,6 +21,7 @@ from .context import context from .LionContext import LionContext from .LionTree import LionTree from .errors import HandledException, SafeCancellation +from .monitor import SystemMonitor, ComponentMonitor, StatusLevel, ComponentStatus if TYPE_CHECKING: from core import CoreCog @@ -45,9 +49,40 @@ class LionBot(Bot): self.core: Optional['CoreCog'] = None self.translator = translator + self.system_monitor = SystemMonitor() + self.monitor = ComponentMonitor('LionBot', self._monitor_status) + self.system_monitor.add_component(self.monitor) + self._locks = WeakValueDictionary() self._running_events = set() + async def _monitor_status(self): + if self.is_closed(): + level = StatusLevel.ERRORED + info = "(ERROR) Websocket is closed" + data = {} + elif self.is_ws_ratelimited(): + level = StatusLevel.WAITING + info = "(WAITING) Websocket is ratelimited" + data = {} + elif not self.is_ready(): + level = StatusLevel.STARTING + info = "(STARTING) Not yet ready" + data = {} + else: + level = StatusLevel.OKAY + info = ( + "(OK) " + "Logged in with {guild_count} guilds, " + ", websocket latency {latency}, and {events} running events." + ) + data = { + 'guild_count': len(self.guilds), + 'latency': self.latency, + 'events': len(self._running_events), + } + return ComponentStatus(level, info, info, data) + async def setup_hook(self) -> None: log_context.set(f"APP: {self.application_id}") await self.app_ipc.connect() @@ -160,6 +195,17 @@ class LionBot(Bot): raise original except HandledException: pass + except TransformerError as e: + msg = str(e) + if msg: + try: + await ctx.error_reply(msg) + except Exception: + pass + logger.debug( + f"Caught a transformer error: {repr(e)}", + extra={'action': 'BotError', 'with_ctx': True} + ) except SafeCancellation: if original.msg: try: @@ -183,7 +229,7 @@ class LionBot(Bot): extra={'action': 'BotError', 'with_ctx': True} ) except discord.HTTPException: - logger.warning( + logger.error( f"Caught an unhandled 'HTTPException' while executing: {cmd_str}", exc_info=True, extra={'action': 'BotError', 'with_ctx': True} @@ -192,23 +238,60 @@ class LionBot(Bot): pass except asyncio.TimeoutError: pass - except Exception: + except RenderingException as e: + logger.info(f"Command failed due to RenderingException: {repr(e)}") + embed = self.tree.rendersplat(e) + try: + await ctx.error_reply(embed=embed) + except discord.HTTPException: + pass + except Exception as e: logger.exception( f"Caught an unknown CommandInvokeError while executing: {cmd_str}", extra={'action': 'BotError', 'with_ctx': True} ) - error_embed = discord.Embed(title="Something went wrong!") + error_embed = discord.Embed( + title="Something went wrong!", + colour=discord.Colour.dark_red() + ) error_embed.description = ( "An unexpected error occurred while processing your command!\n" - "Our development team has been notified, and the issue should be fixed soon.\n" - "If the error persists, please contact our support team and give them the following number: " - f"`{ctx.interaction.id if ctx.interaction else ctx.message.id}`" - ) + "Our development team has been notified, and the issue will be addressed soon.\n" + "If the error persists, or you have any questions, please contact our [support team]({link}) " + "and give them the extra details below." + ).format(link=self.config.bot.support_guild) + details = {} + details['error'] = f"`{repr(e)}`" + if ctx.interaction: + details['interactionid'] = f"`{ctx.interaction.id}`" + if ctx.command: + details['cmd'] = f"`{ctx.command.qualified_name}`" + if ctx.author: + details['author'] = f"`{ctx.author.id}` -- `{ctx.author}`" + details['locale'] = f"`{ctx_locale.get()}`" + if ctx.guild: + details['guild'] = f"`{ctx.guild.id}` -- `{ctx.guild.name}`" + details['my_guild_perms'] = f"`{ctx.guild.me.guild_permissions.value}`" + if ctx.author: + ownerstr = ' (owner)' if ctx.author.id == ctx.guild.owner_id else '' + details['author_guild_perms'] = f"`{ctx.author.guild_permissions.value}{ownerstr}`" + if ctx.channel.type is discord.enums.ChannelType.private: + details['channel'] = "`Direct Message`" + elif ctx.channel: + details['channel'] = f"`{ctx.channel.id}` -- `{ctx.channel.name}`" + details['my_channel_perms'] = f"`{ctx.channel.permissions_for(ctx.guild.me).value}`" + if ctx.author: + details['author_channel_perms'] = f"`{ctx.channel.permissions_for(ctx.author).value}`" + details['shard'] = f"`{self.shardname}`" + details['log_stack'] = f"`{log_action_stack.get()}`" + + table = '\n'.join(tabulate(*details.items())) + error_embed.add_field(name='Details', value=table) try: await ctx.error_reply(embed=error_embed) - except Exception: + except discord.HTTPException: pass finally: exception.original = HandledException(exception.original) @@ -232,3 +315,29 @@ class LionBot(Bot): def add_command(self, command): if not hasattr(command, '_placeholder_group_'): super().add_command(command) + + def request_chunking_for(self, guild): + if not guild.chunked: + return asyncio.create_task( + self._connection.chunk_guild(guild, wait=False, cache=True), + name=f"Background chunkreq for {guild.id}" + ) + + async def on_interaction(self, interaction: discord.Interaction): + """ + Adds the interaction author to guild cache if appropriate. + + This gets run a little bit late, so it is possible the interaction gets handled + without the author being in case. + """ + guild = interaction.guild + user = interaction.user + if guild is not None and user is not None and isinstance(user, discord.Member): + if not guild.get_member(user.id): + guild._add_member(user) + if guild is not None and not guild.chunked: + # Getting an interaction in the guild is a good enough reason to request chunking + logger.info( + f"Unchunked guild requesting chunking after interaction." + ) + self.request_chunking_for(guild) diff --git a/src/meta/LionContext.py b/src/meta/LionContext.py index 64746a5e..4aab2b19 100644 --- a/src/meta/LionContext.py +++ b/src/meta/LionContext.py @@ -6,6 +6,7 @@ from typing import Optional, TYPE_CHECKING import discord from discord.enums import ChannelType from discord.ext.commands import Context +from babel.translator import ctx_locale if TYPE_CHECKING: from .LionBot import LionBot @@ -35,6 +36,7 @@ FlatContext = namedtuple( 'interaction', 'guild', 'author', + 'channel', 'alias', 'prefix', 'failed') @@ -78,6 +80,7 @@ class LionContext(Context['LionBot']): parts['alias'] = f"\"{self.invoked_with}\"" if self.command_failed: parts['failed'] = self.command_failed + parts['locale'] = f"\"{ctx_locale.get()}\"" return "".format( ' '.join(f"{name}={value}" for name, value in parts.items()) diff --git a/src/meta/LionTree.py b/src/meta/LionTree.py index 9a2dd7ec..5969a01e 100644 --- a/src/meta/LionTree.py +++ b/src/meta/LionTree.py @@ -1,13 +1,19 @@ import logging +import discord from discord import Interaction from discord.app_commands import CommandTree from discord.app_commands.errors import AppCommandError, CommandInvokeError from discord.enums import InteractionType from discord.app_commands.namespace import Namespace -from .logger import logging_context, set_logging_context, log_wrap +from utils.lib import tabulate +from gui.errors import RenderingException +from babel.translator import ctx_locale + +from .logger import logging_context, set_logging_context, log_wrap, log_action_stack from .errors import SafeCancellation +from .config import conf logger = logging.getLogger(__name__) @@ -17,7 +23,7 @@ class LionTree(CommandTree): super().__init__(*args, **kwargs) self._call_tasks = set() - async def on_error(self, interaction, error) -> None: + async def on_error(self, interaction: discord.Interaction, error) -> None: try: if isinstance(error, CommandInvokeError): raise error.original @@ -26,8 +32,73 @@ class LionTree(CommandTree): except SafeCancellation: # Assume this has already been handled pass + except RenderingException as e: + logger.info(f"Tree interaction failed due to rendering exception: {repr(e)}") + embed = self.rendersplat(e) + await self.error_reply(interaction, embed) except Exception: logger.exception(f"Unhandled exception in interaction: {interaction}", extra={'action': 'TreeError'}) + embed = self.bugsplat(interaction, error) + await self.error_reply(interaction, embed) + + async def error_reply(self, interaction, embed): + if not interaction.is_expired(): + try: + if interaction.response.is_done(): + await interaction.followup.send(embed=embed, ephemeral=True) + else: + await interaction.response.send_message(embed=embed, ephemeral=True) + except discord.HTTPException: + pass + + def rendersplat(self, e: RenderingException): + embed = discord.Embed( + title="Resource Currently Unavailable!", + description=( + "Sorry, the graphics service is currently unavailable!\n" + "Please try again in a few minutes.\n" + "If the error persists, please contact our [support team]({link})" + ).format(link=conf.bot.support_guild), + colour=discord.Colour.dark_red() + ) + return embed + + def bugsplat(self, interaction, e): + error_embed = discord.Embed(title="Something went wrong!", colour=discord.Colour.red()) + error_embed.description = ( + "An unexpected error occurred during this interaction!\n" + "Our development team has been notified, and the issue will be addressed soon.\n" + "If the error persists, or you have any questions, please contact our [support team]({link}) " + "and give them the extra details below." + ).format(link=interaction.client.config.bot.support_guild) + details = {} + details['error'] = f"`{repr(e)}`" + details['interactionid'] = f"`{interaction.id}`" + details['interactiontype'] = f"`{interaction.type}`" + if interaction.command: + details['cmd'] = f"`{interaction.command.qualified_name}`" + details['locale'] = f"`{ctx_locale.get()}`" + if interaction.user: + details['user'] = f"`{interaction.user.id}` -- `{interaction.user}`" + if interaction.guild: + details['guild'] = f"`{interaction.guild.id}` -- `{interaction.guild.name}`" + details['my_guild_perms'] = f"`{interaction.guild.me.guild_permissions.value}`" + if interaction.user: + ownerstr = ' (owner)' if interaction.user.id == interaction.guild.owner_id else '' + details['user_guild_perms'] = f"`{interaction.user.guild_permissions.value}{ownerstr}`" + if interaction.channel.type is discord.enums.ChannelType.private: + details['channel'] = "`Direct Message`" + elif interaction.channel: + details['channel'] = f"`{interaction.channel.id}` -- `{interaction.channel.name}`" + details['my_channel_perms'] = f"`{interaction.channel.permissions_for(interaction.guild.me).value}`" + if interaction.user: + details['user_channel_perms'] = f"`{interaction.channel.permissions_for(interaction.user).value}`" + details['shard'] = f"`{interaction.client.shardname}`" + details['log_stack'] = f"`{log_action_stack.get()}`" + + table = '\n'.join(tabulate(*details.items())) + error_embed.add_field(name='Details', value=table) + return error_embed def _from_interaction(self, interaction: Interaction) -> None: @log_wrap(context=f"iid: {interaction.id}", isolate=False) diff --git a/src/meta/config.py b/src/meta/config.py index 621de6f6..58eb6bfa 100644 --- a/src/meta/config.py +++ b/src/meta/config.py @@ -3,7 +3,7 @@ import configparser as cfgp from .args import args -shard_number = args.shard or 0 +shard_number = args.shard class configEmoji(PartialEmoji): __slots__ = ('fallback',) @@ -87,7 +87,10 @@ class Conf: "emoji": configEmoji.from_str, } ) - self.config.read(configfile) + + with open(configfile) as conff: + # Opening with read_file mainly to ensure the file exists + self.config.read_file(conff) self.section_name = section_name if section_name in self.config else 'DEFAULT' diff --git a/src/meta/logger.py b/src/meta/logger.py index 9ace46b1..b2464088 100644 --- a/src/meta/logger.py +++ b/src/meta/logger.py @@ -17,6 +17,7 @@ from .config import conf from . import sharding from .context import context from utils.lib import utc_now +from utils.ratelimits import Bucket, BucketOverFull, BucketFull log_logger = logging.getLogger(__name__) @@ -187,6 +188,14 @@ class LessThanFilter(logging.Filter): # non-zero return means we log this message return 1 if record.levelno < self.max_level else 0 +class ExactLevelFilter(logging.Filter): + def __init__(self, target_level, name=""): + super().__init__(name) + self.target_level = target_level + + def filter(self, record): + return (record.levelno == self.target_level) + class ThreadFilter(logging.Filter): def __init__(self, thread_name): @@ -233,7 +242,6 @@ class ContextInjection(logging.Filter): logging_handler_out = logging.StreamHandler(sys.stdout) logging_handler_out.setLevel(logging.DEBUG) logging_handler_out.setFormatter(log_fmt) -logging_handler_out.addFilter(LessThanFilter(logging.WARNING)) logging_handler_out.addFilter(ContextInjection()) logger.addHandler(logging_handler_out) log_logger.addHandler(logging_handler_out) @@ -258,7 +266,7 @@ class LocalQueueHandler(QueueHandler): class WebHookHandler(logging.StreamHandler): - def __init__(self, webhook_url, prefix="", batch=False, loop=None): + def __init__(self, webhook_url, prefix="", batch=True, loop=None): super().__init__() self.webhook_url = webhook_url self.prefix = prefix @@ -270,6 +278,12 @@ class WebHookHandler(logging.StreamHandler): self.last_batched = None self.waiting = [] + self.bucket = Bucket(20, 40) + self.ignored = 0 + + self.session = None + self.webhook = None + def get_loop(self): if self.loop is None: self.loop = asyncio.new_event_loop() @@ -281,8 +295,14 @@ class WebHookHandler(logging.StreamHandler): self.get_loop().call_soon_threadsafe(self._post, record) def _post(self, record): + if self.session is None: + self.setup() asyncio.create_task(self.post(record)) + def setup(self): + self.session = aiohttp.ClientSession() + self.webhook = Webhook.from_url(self.webhook_url, session=self.session) + async def post(self, record): log_context.set("Webhook Logger") log_action_stack.set(("Logging",)) @@ -314,7 +334,7 @@ class WebHookHandler(logging.StreamHandler): else: await self._send(message, as_file=as_file) except Exception as ex: - print(ex) + print(f"Unexpected error occurred while logging to webhook: {repr(ex)}", file=sys.stderr) async def _schedule_batched(self): if self.batch_task is not None and not (self.batch_task.done() or self.batch_task.cancelled()): @@ -327,7 +347,7 @@ class WebHookHandler(logging.StreamHandler): except asyncio.CancelledError: return except Exception as ex: - print(ex) + print(f"Unexpected error occurred while scheduling batched webhook log: {repr(ex)}", file=sys.stderr) async def _send_batched_now(self): if self.batch_task is not None and not self.batch_task.done(): @@ -342,18 +362,37 @@ class WebHookHandler(logging.StreamHandler): await self._send(batched) async def _send(self, message, as_file=False): - async with aiohttp.ClientSession() as session: - webhook = Webhook.from_url(self.webhook_url, session=session) - if as_file or len(message) > 1900: - with StringIO(message) as fp: - fp.seek(0) - await webhook.send( - f"{self.prefix}\n`{message.splitlines()[0]}`", - file=File(fp, filename="logs.md"), - username=log_app.get() - ) - else: - await webhook.send(self.prefix + '\n' + message, username=log_app.get()) + try: + self.bucket.request() + except BucketOverFull: + # Silently ignore + self.ignored += 1 + return + except BucketFull: + logger.warning( + "Can't keep up! " + "Ignoring records on live-logger {self.webhook.id}." + ) + self.ignored += 1 + return + else: + if self.ignored > 0: + logger.warning( + "Can't keep up! " + f"{self.ignored} live logging records on webhook {self.webhook.id} skipped, continuing." + ) + self.ignored = 0 + + if as_file or len(message) > 1900: + with StringIO(message) as fp: + fp.seek(0) + await self.webhook.send( + f"{self.prefix}\n`{message.splitlines()[0]}`", + file=File(fp, filename="logs.md"), + username=log_app.get() + ) + else: + await self.webhook.send(self.prefix + '\n' + message, username=log_app.get()) handlers = [] @@ -361,8 +400,14 @@ if webhook := conf.logging['general_log']: handler = WebHookHandler(webhook, batch=True) handlers.append(handler) +if webhook := conf.logging['warning_log']: + handler = WebHookHandler(webhook, prefix=conf.logging['warning_prefix'], batch=True) + handler.addFilter(ExactLevelFilter(logging.WARNING)) + handler.setLevel(logging.WARNING) + handlers.append(handler) + if webhook := conf.logging['error_log']: - handler = WebHookHandler(webhook, prefix=conf.logging['error_prefix'], batch=False) + handler = WebHookHandler(webhook, prefix=conf.logging['error_prefix'], batch=True) handler.setLevel(logging.ERROR) handlers.append(handler) diff --git a/src/meta/monitor.py b/src/meta/monitor.py new file mode 100644 index 00000000..474c51f4 --- /dev/null +++ b/src/meta/monitor.py @@ -0,0 +1,139 @@ +import logging +import asyncio +from enum import IntEnum +from collections import deque, ChainMap +import datetime as dt + +logger = logging.getLogger(__name__) + + +class StatusLevel(IntEnum): + ERRORED = -2 + UNSURE = -1 + WAITING = 0 + STARTING = 1 + OKAY = 2 + + @property + def symbol(self): + return symbols[self] + + +symbols = { + StatusLevel.ERRORED: '🟥', + StatusLevel.UNSURE: '🟧', + StatusLevel.WAITING: '⬜', + StatusLevel.STARTING: '🟫', + StatusLevel.OKAY: '🟩', +} + + +class ComponentStatus: + def __init__(self, level: StatusLevel, short_formatstr: str, long_formatstr: str, data: dict = {}): + self.level = level + self.short_formatstr = short_formatstr + self.long_formatstr = long_formatstr + self.data = data + self.created_at = dt.datetime.now(tz=dt.timezone.utc) + + def format_args(self): + extra = { + 'created_at': self.created_at, + 'level': self.level, + 'symbol': self.level.symbol, + } + return ChainMap(extra, self.data) + + @property + def short(self): + return self.short_formatstr.format(**self.format_args()) + + @property + def long(self): + return self.long_formatstr.format(**self.format_args()) + + +class ComponentMonitor: + _name = None + + def __init__(self, name=None, callback=None): + self._callback = callback + self.name = name or self._name + if not self.name: + raise ValueError("ComponentMonitor must have a name") + + async def _make_status(self, *args, **kwargs): + if self._callback is not None: + return await self._callback(*args, **kwargs) + else: + raise NotImplementedError + + async def status(self) -> ComponentStatus: + try: + status = await self._make_status() + except Exception as e: + logger.exception( + f"Status callback for component '{self.name}' failed. This should not happen." + ) + status = ComponentStatus( + level=StatusLevel.UNSURE, + short_formatstr="Status callback for '{name}' failed with error '{error}'", + long_formatstr="Status callback for '{name}' failed with error '{error}'", + data={ + 'name': self.name, + 'error': repr(e) + } + ) + return status + + +class SystemMonitor: + def __init__(self): + self.components = {} + self.recent = deque(maxlen=10) + + def add_component(self, component: ComponentMonitor): + self.components[component.name] = component + return component + + async def request(self): + """ + Request status from each component. + """ + tasks = { + name: asyncio.create_task(comp.status()) + for name, comp in self.components.items() + } + await asyncio.gather(*tasks.values()) + status = { + name: await fut for name, fut in tasks.items() + } + self.recent.append(status) + return status + + async def _format_summary(self, status_dict: dict[str, ComponentStatus]): + """ + Format a one line summary from a status dict. + """ + freq = {level: 0 for level in StatusLevel} + for status in status_dict.values(): + freq[status.level] += 1 + + summary = '\t'.join(f"{level.symbol} {count}" for level, count in freq.items() if count) + return summary + + async def _format_overview(self, status_dict: dict[str, ComponentStatus]): + """ + Format an overview (one line per component) from a status dict. + """ + lines = [] + for name, status in status_dict.items(): + lines.append(f"{status.level.symbol} {name}: {status.short}") + summary = await self._format_summary(status_dict) + return '\n'.join((summary, *lines)) + + async def get_summary(self): + return await self._format_summary(await self.request()) + + async def get_overview(self): + return await self._format_overview(await self.request()) diff --git a/src/modules/__init__.py b/src/modules/__init__.py index eb5b2eb3..ec4cbdb6 100644 --- a/src/modules/__init__.py +++ b/src/modules/__init__.py @@ -9,10 +9,10 @@ active = [ '.ranks', '.reminders', '.shop', - '.tasklist', '.statistics', '.pomodoro', '.rooms', + '.tasklist', '.rolemenus', '.member_admin', '.moderation', diff --git a/src/modules/economy/cog.py b/src/modules/economy/cog.py index e428e5b0..9e72e4ce 100644 --- a/src/modules/economy/cog.py +++ b/src/modules/economy/cog.py @@ -190,7 +190,7 @@ class Economy(LionCog): # First fetch the members which currently exist query = self.bot.core.data.Member.table.select_where(guildid=ctx.guild.id) query.select('userid').with_no_adapter() - if 2 * len(targets) < len(ctx.guild.members): + if 2 * len(targets) < ctx.guild.member_count: # More efficient to fetch the targets explicitly query.where(userid=list(targetids)) existent_rows = await query @@ -381,13 +381,28 @@ class Economy(LionCog): if role: query = MemModel.table.select_where( (MemModel.guildid == role.guild.id) & (MemModel.coins != 0) - ) - query.order_by('coins', ORDER.DESC) + ).with_no_adapter() if not role.is_default(): # Everyone role is handled differently for data efficiency ids = [target.id for target in targets] query = query.where(userid=ids) - rows = await query + + # First get a summary + summary = await query.select( + _count='COUNT(*)', + _coin_total='SUM(coins)', + ) + record = summary[0] + count = record['_count'] + total = record['_coin_total'] + if count > 0: + # Then get the top 1000 members + query._columns = () + query.order_by('coins', ORDER.DESC) + query.limit(1000) + rows = await query.select('userid', 'coins') + else: + rows = [] name = t(_p( 'cmd:economy_balance|embed:role_lb|author', @@ -400,7 +415,7 @@ class Economy(LionCog): "This server has a total balance of {coin_emoji}**{total}**." )).format( coin_emoji=cemoji, - total=sum(row['coins'] for row in rows) + total=total ) else: header = t(_p( @@ -408,9 +423,9 @@ class Economy(LionCog): "{role_mention} has `{count}` members with non-zero balance, " "with a total balance of {coin_emoji}**{total}**." )).format( - count=len(targets), + count=count, role_mention=role.mention, - total=sum(row['coins'] for row in rows), + total=total, coin_emoji=cemoji ) @@ -476,7 +491,7 @@ class Economy(LionCog): else: # If we have a single target, show their current balance, with a short transaction history. user = targets[0] - row = await self.bot.core.data.Member.fetch(ctx.guild.id, user.id) + row = await self.bot.core.data.Member.fetch(ctx.guild.id, user.id, cached=False) embed = discord.Embed( colour=discord.Colour.orange(), @@ -675,7 +690,7 @@ class Economy(LionCog): ) @appcmds.guild_only() async def send_cmd(self, ctx: LionContext, - target: discord.User | discord.Member, + target: discord.Member, amount: appcmds.Range[int, 1, MAX_COINS], note: Optional[str] = None): """ @@ -690,17 +705,49 @@ class Economy(LionCog): t = self.bot.translator.t + error = None if not ctx.lguild.config.get('allow_transfers').value: - await ctx.interaction.response.send_message( - embed=error_embed( - t(_p( - 'cmd:send|error:not_allowed', - "Sorry, this server has disabled LionCoin transfers!" - )) - ) + error = error_embed( + t(_p( + 'cmd:send|error:not_allowed', + "Sorry, this server has disabled LionCoin transfers!" + )) ) + elif target == ctx.author: + # Funny response + error = discord.Embed( + colour=discord.Colour.brand_red(), + description=t(_p( # TRANSLATOR NOTE: Easter egg/Funny error, translate as you wish. + 'cmd:send|error:sending-to-self', + "What is this, tax evasion?\n" + "(You can not send coins to yourself.)" + )) + ) + elif target == ctx.guild.me: + # Funny response + error = discord.Embed( + colour=discord.Colour.orange(), + description=t(_p( # TRANSLATOR NOTE: Easter egg/Funny error, translate as you wish. + 'cmd:send|error:sending-to-leo', + "I appreciate it, but you need it more than I do!\n" + "(You cannot send coins to bots.)" + )) + ) + elif target.bot: + # Funny response + error = discord.Embed( + colour=discord.Colour.brand_red(), + description=t(_p( # TRANSLATOR NOTE: Easter egg/Funny error, translate as you wish. + 'cmd:send|error:sending-to-bot', + "{target} appreciates the gesture, but said they don't have any use for {coin}.\n" + "(You cannot send coins to bots.)" + )).format(target=target.mention, coin=self.bot.config.emojis.coin) + ) + if error is not None: + await ctx.interaction.response.send_message(embed=error, ephemeral=True) return + # Ensure the target member exists Member = self.bot.core.data.Member target_lion = await self.bot.core.lions.fetch_member(ctx.guild.id, target.id) @@ -778,7 +825,7 @@ class Economy(LionCog): ) ) if failed: - embed.description = t(_p( + embed.description += '\n' + t(_p( 'cmd:send|embed:ack|desc|error:unreachable', "Unfortunately, I was not able to message the recipient. Perhaps they have me blocked?" )) diff --git a/src/modules/economy/data.py b/src/modules/economy/data.py index ff4c32c2..da4a62df 100644 --- a/src/modules/economy/data.py +++ b/src/modules/economy/data.py @@ -8,6 +8,7 @@ from core.data import CoreData from utils.data import TemporaryTable, SAFECOINS +# TODO: Add Rank transaction type and tables. class TransactionType(Enum): """ Schema diff --git a/src/modules/member_admin/cog.py b/src/modules/member_admin/cog.py index 6d57f222..6887ed6d 100644 --- a/src/modules/member_admin/cog.py +++ b/src/modules/member_admin/cog.py @@ -181,15 +181,17 @@ class MemberAdminCog(LionCog): finally: self._adding_roles.discard((member.guild.id, member.id)) - @LionCog.listener('on_member_remove') + @LionCog.listener('on_raw_member_remove') @log_wrap(action="Farewell") - async def admin_member_farewell(self, member: discord.Member): + async def admin_member_farewell(self, payload: discord.RawMemberRemoveEvent): # Ignore members that just joined - if (member.guild.id, member.id) in self._adding_roles: + guildid = payload.guild_id + userid = payload.user.id + if (guildid, userid) in self._adding_roles: return # Set lion last_left, creating the lion_member if needed - lion = await self.bot.core.lions.fetch_member(member.guild.id, member.id) + lion = await self.bot.core.lions.fetch_member(guildid, userid) await lion.data.update(last_left=utc_now()) # Save member roles @@ -197,18 +199,21 @@ class MemberAdminCog(LionCog): self.bot.db.conn = conn async with conn.transaction(): await self.data.past_roles.delete_where( - guildid=member.guild.id, - userid=member.id + guildid=guildid, + userid=userid ) # Insert current member roles - if member.roles: + print(type(payload.user)) + if isinstance(payload.user, discord.Member) and payload.user.roles: + member = payload.user await self.data.past_roles.insert_many( ('guildid', 'userid', 'roleid'), - *((member.guild.id, member.id, role.id) for role in member.roles) + *((guildid, userid, role.id) for role in member.roles) ) logger.debug( - f"Stored persisting roles for member in ." + f"Stored persisting roles for member in ." ) + # TODO: Event log, and include info about unchunked members @LionCog.listener('on_guild_join') async def admin_init_guild(self, guild: discord.Guild): diff --git a/src/modules/member_admin/settings.py b/src/modules/member_admin/settings.py index d175c275..deaba142 100644 --- a/src/modules/member_admin/settings.py +++ b/src/modules/member_admin/settings.py @@ -173,7 +173,7 @@ class MemberAdminSettings(SettingGroup): '{guild_name}': guild.name, '{guild_icon}': guild.icon.url if guild.icon else member.default_avatar.url, '{studying_count}': str(active), - '{member_count}': len(guild.members), + '{member_count}': guild.member_count, } recurse_map( @@ -297,7 +297,7 @@ class MemberAdminSettings(SettingGroup): '{guild_name}': guild.name, '{guild_icon}': guild.icon.url if guild.icon else member.default_avatar.url, '{studying_count}': str(active), - '{member_count}': str(len(guild.members)), + '{member_count}': str(guild.member_count), '{last_time}': str(last_seen or member.joined_at.timestamp()), } diff --git a/src/modules/member_admin/settingui.py b/src/modules/member_admin/settingui.py index cf08a161..91e0e93e 100644 --- a/src/modules/member_admin/settingui.py +++ b/src/modules/member_admin/settingui.py @@ -210,7 +210,7 @@ class MemberAdminUI(ConfigUI): t = self.bot.translator.t title = t(_p( 'ui:memberadmin|embed|title', - "Member Admin Configuration Panel" + "Greetings and Initial Roles Panel" )) embed = discord.Embed( title=title, diff --git a/src/modules/meta/cog.py b/src/modules/meta/cog.py index e5cc5f4f..b865148d 100644 --- a/src/modules/meta/cog.py +++ b/src/modules/meta/cog.py @@ -32,6 +32,6 @@ class MetaCog(LionCog): ctx.bot, ctx.author, ctx.guild, - show_admin=await low_management(ctx.bot, ctx.author), + show_admin=await low_management(ctx.bot, ctx.author, ctx.guild), ) await ui.run(ctx.interaction) diff --git a/src/modules/meta/help_sections.py b/src/modules/meta/help_sections.py index 55ed6ac9..b5c19672 100644 --- a/src/modules/meta/help_sections.py +++ b/src/modules/meta/help_sections.py @@ -20,9 +20,9 @@ cmd_map = { "cmd_send": "send", "cmd_shop": "shop open", "cmd_room": "room rent", - "cmd_reminders": "remindme in", + "cmd_reminders": "reminders", "cmd_tasklist": "tasklist", - "cmd_timers": "timers list", + "cmd_timers": "timers", "cmd_schedule": "schedule", "cmd_dashboard": "dashboard" } @@ -79,8 +79,8 @@ admin_extra = _p( Other relevant commands for guild configuration below: `/editshop`: Add/Edit/Remove colour roles from the {coin} shop. - `/ranks`: Add/Edit/Remove activity ranks. - `/timer admin`: Add/Edit/Remove Pomodoro timers in voice channels. + `/ranks`: Add/Edit/Refresh/Remove activity ranks. + `/pomodoro`: Add/Edit/Remove Pomodoro timers in voice channels. `/rolemenus`: Allow members to equip roles from customisable messages. `/economy balance`: Display and modify LionCoin balance for members and roles. """ diff --git a/src/modules/moderation/settings.py b/src/modules/moderation/settings.py index 68143313..a4a8a157 100644 --- a/src/modules/moderation/settings.py +++ b/src/modules/moderation/settings.py @@ -128,7 +128,7 @@ class ModerationSettings(SettingGroup): _long_desc = _p( 'guildset:mod_role|long_desc', "Members with the set role will be able to access my configuration panels, " - "and perform some moderation tasks, such us setting up pomodoro timers. " + "and perform some moderation tasks, such as setting up pomodoro timers. " "Moderators cannot reconfigure most bot configuration, " "or perform operations they do not already have permission for in Discord." ) diff --git a/src/modules/pomodoro/cog.py b/src/modules/pomodoro/cog.py index 0836552d..a86e9156 100644 --- a/src/modules/pomodoro/cog.py +++ b/src/modules/pomodoro/cog.py @@ -10,6 +10,7 @@ from discord import app_commands as appcmds from meta import LionCog, LionBot, LionContext from meta.logger import log_wrap from meta.sharding import THIS_SHARD +from meta.monitor import ComponentMonitor, ComponentStatus, StatusLevel from utils.lib import utc_now from wards import low_management_ward @@ -21,7 +22,6 @@ from .settings import TimerSettings from .settingui import TimerConfigUI from .timer import Timer from .options import TimerOptions -from .ui import TimerStatusUI from .ui.config import TimerOptionsUI _p = babel._p @@ -43,12 +43,25 @@ class TimerCog(LionCog): self.bot = bot self.data = bot.db.load_registry(TimerData()) self.settings = TimerSettings() + self.monitor = ComponentMonitor('TimerCog', self._monitor) + self.timer_options = TimerOptions() self.ready = False self.timers = defaultdict(dict) + async def _monitor(self): + if not self.ready: + level = StatusLevel.STARTING + info = "(STARTING) Not ready. {timers} timers loaded." + else: + level = StatusLevel.OKAY + info = "(OK) {timers} timers loaded." + data = dict(timers=len(self.timers)) + return ComponentStatus(level, info, info, data) + async def cog_load(self): + self.bot.system_monitor.add_component(self.monitor) await self.data.init() self.bot.core.guild_config.register_model_setting(self.settings.PomodoroChannel) @@ -319,29 +332,24 @@ class TimerCog(LionCog): await timer.destroy(**kwargs) # ----- Timer Commands ----- - @cmds.hybrid_group( - name=_p('cmd:pomodoro', "timers"), - description=_p('cmd:pomodoro|desc', "Base group for all pomodoro timer commands.") - ) - @cmds.guild_only() - async def pomodoro_group(self, ctx: LionContext): - ... # -- User Display Commands -- - @pomodoro_group.command( - name=_p('cmd:pomodoro_status', "show"), - description=_p('cmd:pomodoro_status|desc', "Display the status of a single pomodoro timer.") + @cmds.hybrid_command( + name=_p('cmd:timer', "timer"), + description=_p('cmd:timer|desc', "Show your current (or selected) pomodoro timer.") ) @appcmds.rename( - channel=_p('cmd:pomodoro_status|param:channel', "timer_channel") + channel=_p('cmd:timer|param:channel', "timer_channel") ) @appcmds.describe( channel=_p( - 'cmd:pomodoro_status|param:channel|desc', - "The channel for which you want to view the timer." + 'cmd:timer|param:channel|desc', + "Select a timer to display (by selecting the timer voice channel)" ) ) - async def cmd_pomodoro_status(self, ctx: LionContext, channel: discord.VoiceChannel): + @cmds.guild_only() + async def cmd_timer(self, ctx: LionContext, + channel: Optional[discord.VoiceChannel] = None): t = self.bot.translator.t if not ctx.guild: @@ -349,27 +357,64 @@ class TimerCog(LionCog): if not ctx.interaction: return - # Check if a timer exists in the given channel - timer = self.get_channel_timer(channel.id) - if timer is None: - embed = discord.Embed( + timers: list[Timer] = list(self.get_guild_timers(ctx.guild.id).values()) + error: Optional[discord.Embed] = None + + if not timers: + # Guild has no timers + error = discord.Embed( colour=discord.Colour.brand_red(), description=t(_p( - 'cmd:pomodoro_status|error:no_timer', - "The channel {channel} does not have a timer set up!" - )).format(channel=channel.mention) + 'cmd:timer|error:no_timers|desc', + "**This server has no timers set up!**\n" + "Ask an admin to set up and configure a timer with {create_cmd} first, " + "or rent a private room with {room_cmd} and create one yourself!" + )).format(create_cmd=self.bot.core.mention_cmd('pomodoro create'), + room_cmd=self.bot.core.mention_cmd('rooms rent')) ) - await ctx.reply(embed=embed, ephemeral=True) - else: - # Display the timer status ephemerally - status = await timer.current_status(with_notify=False, with_warnings=False) - await ctx.reply(**status.send_args, ephemeral=True) + elif channel is None: + if ctx.author.voice and ctx.author.voice.channel: + channel = ctx.author.voice.channel + else: + error = discord.Embed( + colour=discord.Colour.brand_red(), + description=t(_p( + 'cmd:timer|error:no_channel|desc', + "**I don't know what timer to show you.**\n" + "No channel selected and you are not in a voice channel! " + "Use {timers_cmd} to list the available timers in this server." + )).format(timers_cmd=self.bot.core.mention_cmd('timers')) + ) - @pomodoro_group.command( - name=_p('cmd:pomodoro_list', "list"), - description=_p('cmd:pomodoro_list|desc', "List the available pomodoro timers.") + if channel is not None: + timer = self.get_channel_timer(channel.id) + if timer is None: + error = discord.Embed( + colour=discord.Colour.brand_red(), + description=t(_p( + 'cmd:timer|error:no_timer_in_channel', + "The channel {channel} is not a pomodoro timer room!\n" + "Use {timers_cmd} to list the available timers in this server." + )).format( + channel=channel.mention, + timers_cmd=self.bot.core.mention_cmd('timers') + ) + ) + else: + # Display the timer status ephemerally + await ctx.interaction.response.defer(thinking=True, ephemeral=True) + status = await timer.current_status(with_notify=False, with_warnings=False) + await ctx.interaction.edit_original_response(**status.edit_args) + + if error is not None: + await ctx.reply(embed=error, ephemeral=True) + + @cmds.hybrid_command( + name=_p('cmd:timers', "timers"), + description=_p('cmd:timers|desc', "List the available pomodoro timer rooms.") ) - async def cmd_pomodoro_list(self, ctx: LionContext): + @cmds.guild_only() + async def cmd_timers(self, ctx: LionContext): t = self.bot.translator.t if not ctx.guild: @@ -378,6 +423,8 @@ class TimerCog(LionCog): return timers = list(self.get_guild_timers(ctx.guild.id).values()) + + # Extra filter here to exclude owned timers, but include ones the author is a member of visible_timers = [ timer for timer in timers if timer.channel and timer.channel.permissions_for(ctx.author).connect @@ -385,26 +432,29 @@ class TimerCog(LionCog): ] if not timers: - # No timers in this guild! + # No timers in the guild embed = discord.Embed( colour=discord.Colour.brand_red(), description=t(_p( - 'cmd:pomodoro_list|error:no_timers', - "No timers have been setup in this server!\n" - "You can ask an admin to create one with {command}, " - "or rent a private room and create one yourself!" - )).format(command='`/pomodoro admin create`') + 'cmd:timer|error:no_timers|desc', + "**This server has no timers set up!**\n" + "Ask an admin to set up and configure a timer with {create_cmd} first, " + "or rent a private room with {room_cmd} and create one yourself!" + )).format(create_cmd=self.bot.core.mention_cmd('pomodoro create'), + room_cmd=self.bot.core.mention_cmd('rooms rent')) ) - # TODO: Update command mention when we have command mentions await ctx.reply(embed=embed, ephemeral=True) elif not visible_timers: # Timers exist, but the member can't see any embed = discord.Embed( colour=discord.Colour.brand_red(), description=t(_p( - 'cmd:pomodoro_list|error:no_visible_timers', - "There are no timers you can join in this server!" - )) + 'cmd:timer|error:no_visible_timers|desc', + "**There are no available pomodoro timers!**\n" + "Ask an admin to set up a new timer with {create_cmd}, " + "or rent a private room with {room_cmd} and create one yourself!" + )).format(create_cmd=self.bot.core.mention_cmd('pomodoro create'), + room_cmd=self.bot.core.mention_cmd('rooms rent')) ) await ctx.reply(embed=embed, ephemeral=True) else: @@ -412,8 +462,8 @@ class TimerCog(LionCog): embed = discord.Embed( colour=discord.Colour.orange(), title=t(_p( - 'cmd:pomodoro_list|embed:timer_list|title', - "Pomodoro Timers in **{guild}**" + 'cmd:timers|embed:timer_list|title', + "Pomodoro Timer Rooms in **{guild}**" )).format(guild=ctx.guild.name), ) for timer in visible_timers: @@ -421,25 +471,26 @@ class TimerCog(LionCog): if stage is None: if timer.auto_restart: lazy_status = _p( - 'cmd:pomodoro_list|status:stopped_auto', - "`{pattern}` timer is stopped with no members!\nJoin {channel} to restart it." + 'cmd:timers|status:stopped_auto', + "`{pattern}` timer is stopped with no members!\n" + "Join {channel} to restart it." ) else: lazy_status = _p( - 'cmd:pomodoro_list|status:stopped_manual', + 'cmd:timers|status:stopped_manual', "`{pattern}` timer is stopped with `{members}` members!\n" "Join {channel} and press `Start` to start it!" ) else: if stage.focused: lazy_status = _p( - 'cmd:pomodoro_list|status:running_focus', + 'cmd:timers|status:running_focus', "`{pattern}` timer is running with `{members}` members!\n" "Currently **focusing**, with break starting {timestamp}" ) else: lazy_status = _p( - 'cmd:pomodoro_list|status:running_break', + 'cmd:timers|status:running_break', "`{pattern}` timer is running with `{members}` members!\n" "Currently **resting**, with focus starting {timestamp}" ) @@ -453,18 +504,19 @@ class TimerCog(LionCog): await ctx.reply(embed=embed, ephemeral=False) # -- Admin Commands -- - @pomodoro_group.group( - name=_p('cmd:pomodoro_admin', "admin"), - desc=_p('cmd:pomodoro_admin|desc', "Command group for pomodoro admin controls.") + @cmds.hybrid_group( + name=_p('cmd:pomodoro', "pomodoro"), + description=_p('cmd:pomodoro|desc', "Create and configure pomodoro timer rooms.") ) - async def pomodoro_admin_group(self, ctx: LionContext): + @cmds.guild_only() + async def pomodoro_group(self, ctx: LionContext): ... - @pomodoro_admin_group.command( + @pomodoro_group.command( name=_p('cmd:pomodoro_create', "create"), description=_p( 'cmd:pomodoro_create|desc', - "Create a new Pomodoro timer. Requires admin permissions." + "Create a new Pomodoro timer. Requires manage channel permissions." ) ) @appcmds.rename( @@ -497,17 +549,15 @@ class TimerCog(LionCog): if not ctx.interaction: return - # Check permissions - if not ctx.author.guild_permissions.administrator: - embed = discord.Embed( - colour=discord.Colour.brand_red(), - description=t(_p( - 'cmd:pomodoro_create|error:insufficient_perms', - "Only server administrators can create timers!" - )) - ) - await ctx.reply(embed=embed, ephemeral=True) - return + # Get private room if applicable + room_cog = self.bot.get_cog('RoomCog') + if room_cog is None: + logger.warning("Running pomodoro create without private room cog loaded!") + private_room = None + else: + rooms = room_cog.get_rooms(ctx.guild.id, ctx.author.id) + cid = next((cid for cid, room in rooms.items() if room.data.ownerid == ctx.author.id), None) + private_room = ctx.guild.get_channel(cid) if cid is not None else None # If a voice channel was not given, attempt to resolve it or make one if channel is None: @@ -516,112 +566,155 @@ class TimerCog(LionCog): channel = ctx.channel elif ctx.author.voice and ctx.author.voice.channel: channel = ctx.author.voice.channel + elif not ctx.author.guild_permissions.manage_channels: + embed = discord.Embed( + colour=discord.Colour.brand_red(), + title=t(_p( + 'cmd:pomodoro_create|new_channel|error:your_insufficient_perms|title', + "Could not create pomodoro voice channel!" + )), + description=t(_p( + 'cmd:pomodoro_create|new_channel|error:your_insufficient_perms', + "No `timer_channel` was provided, and you lack the 'Manage Channels` permission " + "required to create a new timer room!" + )) + ) + await ctx.reply(embed=embed, ephemeral=True) + elif not ctx.guild.me.guild_permissions.manage_channels: + # Error + embed = discord.Embed( + colour=discord.Colour.brand_red(), + title=t(_p( + 'cmd:pomodoro_create|new_channel|error:my_insufficient_perms|title', + "Could not create pomodoro voice channel!" + )), + description=t(_p( + 'cmd:pomodoro_create|new_channel|error:my_insufficient_perms|desc', + "No `timer_channel` was provided, and I lack the 'Manage Channels' permission " + "required to create a new voice channel." + )) + ) + await ctx.reply(embed=embed, ephemeral=True) else: # Attempt to create new channel in current category - if ctx.guild.me.guild_permissions.manage_channels: - try: - channel = await ctx.guild.create_voice_channel( - name=name or "Timer", - reason="Creating Pomodoro Voice Channel", - category=ctx.channel.category - ) - except discord.HTTPException: - embed = discord.Embed( - colour=discord.Colour.brand_red(), - title=t(_p( - 'cmd:pomodoro_create|error:channel_create_failed|title', - "Could not create pomodoro voice channel!" - )), - description=t(_p( - 'cmd:pomodoro_create|error:channel_create|desc', - "Failed to create a new pomodoro voice channel due to an unknown " - "Discord communication error. " - "Please try creating the channel manually and pass it to the " - "`timer_channel` argument of this command." - )) - ) - await ctx.reply(embed=embed, ephemeral=True) - return - else: - # Error + try: + channel = await ctx.guild.create_voice_channel( + name=name or t(_p( + 'cmd:pomodoro_create|new_channel|default_name', + "Timer" + )), + reason=t(_p( + 'cmd:pomodoro_create|new_channel|audit_reason', + "Creating Pomodoro Voice Channel" + )), + category=ctx.channel.category + ) + except discord.HTTPException: embed = discord.Embed( colour=discord.Colour.brand_red(), title=t(_p( - 'cmd:pomodoro_create|error:channel_create_permissions|title', + 'cmd:pomodoro_create|new_channel|error:channel_create_failed|title', "Could not create pomodoro voice channel!" )), description=t(_p( - 'cmd:pomodoro_create|error:channel_create_permissions|desc', - "No `timer_channel` was provided, and I lack the `MANAGE_CHANNELS` permission " - "needed to create a new voice channel." + 'cmd:pomodoro_create|new_channel|error:channel_create_failed|desc', + "Failed to create a new pomodoro voice channel due to an unknown " + "Discord communication error. " + "Please try creating the channel manually and pass it to the " + "`timer_channel` argument of this command." )) ) await ctx.reply(embed=embed, ephemeral=True) - return - # At this point, we have a voice channel - # Make sure a timer does not already exist in the channel - if (self.get_channel_timer(channel.id)) is not None: + if not channel: + # Already handled the creation error + pass + elif (self.get_channel_timer(channel.id)) is not None: + # A timer already exists in the resolved channel embed = discord.Embed( colour=discord.Colour.brand_red(), description=t(_p( - 'cmd:pomodoro_create|error:timer_exists', - "A timer already exists in {channel}! Use `/pomodoro admin edit` to modify it." - )).format(channel=channel.mention) + 'cmd:pomodoro_create|add_timer|error:timer_exists', + "A timer already exists in {channel}! " + "Reconfigure it with {edit_cmd}." + )).format( + channel=channel.mention, + edit_cmd=self.bot.core.mention_cmd('pomodoro edit') + ) ) await ctx.reply(embed=embed, ephemeral=True) - return + elif not channel.permissions_for(ctx.author).manage_channels: + # Note that this takes care of private room owners as well + embed = discord.Embed( + colour=discord.Colour.brand_red(), + description=t(_p( + 'cmd:pomodoro_create|add_timer|error:your_insufficient_perms', + "You must have the 'Manage Channel' permission in {channel} " + "in order to add a timer there!" + )) + ) + await ctx.reply(embed=embed, ephemeral=True) + else: + # Finally, we are sure they can create a timer here + # Build the creation arguments from the rest of the provided args + provided = { + 'focus_length': focus_length * 60, + 'break_length': break_length * 60, + 'inactivity_threshold': inactivity_threshold, + 'voice_alerts': voice_alerts, + 'name': name or channel.name, + 'channel_name': channel_name or None, + } + create_args = {'channelid': channel.id, 'guildid': channel.guild.id} - # Build the creation arguments from the rest of the provided args - provided = { - 'focus_length': focus_length * 60, - 'break_length': break_length * 60, - 'notification_channel': notification_channel, - 'inactivity_threshold': inactivity_threshold, - 'manager_role': manager_role, - 'voice_alerts': voice_alerts, - 'name': name or channel.name, - 'channel_name': channel_name or None, - } + owned = (private_room and (channel == private_room)) + if owned: + provided['manager_role'] = manager_role or ctx.guild.default_role + create_args['notification_channelid'] = channel.id + create_args['ownerid'] = ctx.author.id + else: + provided['notification_channel'] = notification_channel + provided['manager_role'] = manager_role - create_args = {'channelid': channel.id, 'guildid': channel.guild.id} - for param, value in provided.items(): - if value is not None: - setting, _ = _param_options[param] - create_args[setting._column] = setting._data_from_value(channel.id, value) + for param, value in provided.items(): + if value is not None: + setting, _ = _param_options[param] + create_args[setting._column] = setting._data_from_value(channel.id, value) - # Permission checks and input checking done - await ctx.interaction.response.defer(thinking=True) + # Permission checks and input checking done + await ctx.interaction.response.defer(thinking=True) - # Create timer - timer = await self.create_timer(**create_args) + # Create timer + timer = await self.create_timer(**create_args) - # Start timer - await timer.start() + # Start timer + await timer.start() - # Ack with a config UI - ui = TimerOptionsUI(self.bot, timer, TimerRole.ADMIN, callerid=ctx.author.id) - await ui.run( - ctx.interaction, - content=t(_p( - 'cmd:pomodoro_create|response:success|content', - "Timer created successfully! Use the panel below to reconfigure." - )) - ) - await ui.wait() + # Ack with a config UI + ui = TimerOptionsUI( + self.bot, timer, TimerRole.ADMIN if not owned else TimerRole.OWNER, callerid=ctx.author.id + ) + await ui.run( + ctx.interaction, + content=t(_p( + 'cmd:pomodoro_create|response:success|content', + "Timer created successfully! Use the panel below to reconfigure." + )) + ) + await ui.wait() - @pomodoro_admin_group.command( + @pomodoro_group.command( name=_p('cmd:pomodoro_destroy', "destroy"), description=_p( 'cmd:pomodoro_destroy|desc', - "Delete a pomodoro timer from a voice channel. Requires admin permissions." + "Remove a pomodoro timer from a voice channel." ) ) @appcmds.rename( channel=_p('cmd:pomodoro_destroy|param:channel', "timer_channel"), ) @appcmds.describe( - channel=_p('cmd:pomodoro_destroy|param:channel', "Channel with the timer to delete."), + channel=_p('cmd:pomodoro_destroy|param:channel', "Select a timer voice channel to remove the timer from."), ) async def cmd_pomodoro_delete(self, ctx: LionContext, channel: discord.VoiceChannel): t = self.bot.translator.t @@ -646,46 +739,42 @@ class TimerCog(LionCog): return # Check the user has sufficient permissions to delete the timer - # TODO: Should we drop the admin requirement down to manage channel? timer_role = timer.get_member_role(ctx.author) - if timer.owned: - if timer_role < TimerRole.OWNER: - embed = discord.Embed( - colour=discord.Colour.brand_red(), - description=t(_p( - 'cmd:pomodoro_destroy|error:insufficient_perms|owned', - "You need to be an administrator or own this channel to remove this timer!" - )) - ) - await ctx.interaction.response.send_message(embed=embed, ephemeral=True) - return - elif timer_role is not TimerRole.ADMIN: + if timer.owned and timer_role < TimerRole.OWNER: + embed = discord.Embed( + colour=discord.Colour.brand_red(), + description=t(_p( + 'cmd:pomodoro_destroy|error:insufficient_perms|owned', + "You need to be an administrator or own this channel to remove this timer!" + )) + ) + await ctx.interaction.response.send_message(embed=embed, ephemeral=True) + elif timer_role is not TimerRole.ADMIN and not channel.permissions_for(ctx.author).manage_channels: embed = discord.Embed( colour=discord.Colour.brand_red(), description=t(_p( 'cmd:pomodoro_destroy|error:insufficient_perms|notowned', - "You need to be a server administrator to remove this timer!" - )) + "You need to have the `Manage Channels` permission in {channel} to remove this timer!" + )).format(channel=channel.mention) ) await ctx.interaction.response.send_message(embed=embed, ephemeral=True) - return + else: + await ctx.interaction.response.defer(thinking=True) + await self.destroy_timer(timer, reason="Deleted by command") + embed = discord.Embed( + colour=discord.Colour.brand_green(), + description=t(_p( + 'cmd:pomdoro_destroy|response:success|description', + "Timer successfully removed from {channel}." + )).format(channel=channel.mention) + ) + await ctx.interaction.edit_original_response(embed=embed) - await ctx.interaction.response.defer(thinking=True) - await self.destroy_timer(timer, reason="Deleted by command") - embed = discord.Embed( - colour=discord.Colour.brand_green(), - description=t(_p( - 'cmd:pomdoro_destroy|response:success|description', - "Timer successfully removed from {channel}." - )).format(channel=channel.mention) - ) - await ctx.interaction.edit_original_response(embed=embed) - - @pomodoro_admin_group.command( + @pomodoro_group.command( name=_p('cmd:pomodoro_edit', "edit"), description=_p( 'cmd:pomodoro_edit|desc', - "Edit a Timer" + "Reconfigure a pomodoro timer." ) ) @appcmds.rename( @@ -695,7 +784,7 @@ class TimerCog(LionCog): @appcmds.describe( channel=_p( 'cmd:pomodoro_edit|param:channel|desc', - "Channel holding the timer to edit." + "Select a timer voice channel to reconfigure." ), **{param: option._desc for param, (option, _) in _param_options.items()} ) @@ -829,8 +918,6 @@ class TimerCog(LionCog): @low_management_ward async def configure_pomodoro_command(self, ctx: LionContext, pomodoro_channel: Optional[discord.VoiceChannel | discord.TextChannel] = None): - t = self.bot.translator.t - # Type checking guards if not ctx.guild: return diff --git a/src/modules/pomodoro/options.py b/src/modules/pomodoro/options.py index 7cb7f0b1..da2ff06f 100644 --- a/src/modules/pomodoro/options.py +++ b/src/modules/pomodoro/options.py @@ -4,6 +4,7 @@ import discord from meta import LionBot from meta.errors import UserInputError +from utils.lib import replace_multiple from babel.translator import ctx_translator from settings import ModelData from settings.groups import SettingGroup, ModelConfig, SettingDotDict @@ -37,6 +38,8 @@ class TimerOptions(SettingGroup): _model = TimerData.Timer _column = TimerData.Timer.channelid.name + _create_row = False + _allow_object = False @TimerConfig.register_model_setting class NotificationChannel(ModelData, ChannelSetting): @@ -50,6 +53,8 @@ class TimerOptions(SettingGroup): _model = TimerData.Timer _column = TimerData.Timer.notification_channelid.name + _create_row = False + _allow_object = False @classmethod async def _check_value(cls, parent_id: int, value: Optional[discord.abc.GuildChannel], **kwargs): @@ -86,6 +91,7 @@ class TimerOptions(SettingGroup): ) _model = TimerData.Timer _column = TimerData.Timer.inactivity_threshold.name + _create_row = False _min = 0 _max = 64 @@ -94,6 +100,19 @@ class TimerOptions(SettingGroup): def input_formatted(self): return str(self._data) if self._data is not None else '' + @classmethod + async def _parse_string(cls, parent_id, string, **kwargs): + try: + return await super()._parse_string(parent_id, string, **kwargs) + except UserInputError: + t = ctx_translator.get().t + raise UserInputError( + t(_p( + 'timerset:inactivity_length|desc', + "The inactivity threshold must be a positive whole number!" + )) + ) + @TimerConfig.register_model_setting class ManagerRole(ModelData, RoleSetting): setting_id = 'manager_role' @@ -106,6 +125,8 @@ class TimerOptions(SettingGroup): _model = TimerData.Timer _column = TimerData.Timer.manager_roleid.name + _create_row = False + _allow_object = False @classmethod def _format_data(cls, parent_id, data, timer=None, **kwargs): @@ -132,6 +153,7 @@ class TimerOptions(SettingGroup): _model = TimerData.Timer _column = TimerData.Timer.voice_alerts.name + _create_row = False @TimerConfig.register_model_setting class BaseName(ModelData, StringSetting): @@ -153,6 +175,7 @@ class TimerOptions(SettingGroup): _model = TimerData.Timer _column = TimerData.Timer.pretty_name.name + _create_row = False @TimerConfig.register_model_setting class ChannelFormat(ModelData, StringSetting): @@ -172,6 +195,43 @@ class TimerOptions(SettingGroup): _model = TimerData.Timer _column = TimerData.Timer.channel_name.name + _create_row = False + + @classmethod + async def _parse_string(cls, parent_id, string, **kwargs): + # Enforce a length limit on a test-rendered string. + # TODO: Localised formatkey transformation + if string.lower() in ('', 'none', 'default'): + # Special cases for unsetting + return None + + testmap = { + '{remaining}': "10m", + '{name}': "Longish name", + '{stage}': "FOCUS", + '{members}': "25", + '{pattern}': "50/10", + } + testmapped = replace_multiple(string, testmap) + if len(testmapped) > 100: + t = ctx_translator.get().t + raise UserInputError( + t(_p( + 'timerset:channel_name_format|error:too_long', + "The provided name is too long! Channel names can be at most `100` characters." + )) + ) + else: + return string + + @classmethod + def _format_data(cls, parent_id, data, **kwargs): + """ + Overriding format to truncate displayed string. + """ + if data is not None and len(data) > 100: + data = data[:97] + '...' + return super()._format_data(parent_id, data, **kwargs) @TimerConfig.register_model_setting class FocusLength(ModelData, DurationSetting): @@ -191,6 +251,7 @@ class TimerOptions(SettingGroup): _model = TimerData.Timer _column = TimerData.Timer.focus_length.name + _create_row = False _default_multiplier = 60 allow_zero = False @@ -231,6 +292,7 @@ class TimerOptions(SettingGroup): _model = TimerData.Timer _column = TimerData.Timer.break_length.name + _create_row = False _default_multiplier = 60 allow_zero = False diff --git a/src/modules/pomodoro/timer.py b/src/modules/pomodoro/timer.py index 3e4ec7ba..32bbb268 100644 --- a/src/modules/pomodoro/timer.py +++ b/src/modules/pomodoro/timer.py @@ -12,6 +12,7 @@ from utils.lib import MessageArgs, utc_now, replace_multiple from core.lion_guild import LionGuild from core.data import CoreData from babel.translator import ctx_locale +from gui.errors import RenderingException from . import babel, logger from .data import TimerData @@ -45,6 +46,7 @@ class Timer: '_voice_update_lock', '_run_task', '_loop_task', + 'destroyed', ) break_name = _p('timer|stage:break|name', "BREAK") @@ -79,7 +81,10 @@ class Timer: # Main loop task. Should not be cancelled. self._loop_task = None + self.destroyed = False + def __repr__(self): + # TODO: Add lock status and current state and stage return ( "", mentions=', '.join(member.mention for member in needs_kick), tick=self.bot.config.emojis.tick ) @@ -436,7 +441,7 @@ class Timer: if not stage: return - if not self.channel.permissions_for(self.guild.me).speak: + if not self.channel or not self.channel.permissions_for(self.guild.me).speak: return async with self.lguild.voice_lock: @@ -498,7 +503,7 @@ class Timer: "{channel} is now on **BREAK**! Take a rest, **FOCUS** starts {timestamp}" ) stageline = t(lazy_stageline).format( - channel=self.channel.mention, + channel=f"<#{self.data.channelid}>", timestamp=f"" ) return stageline @@ -555,29 +560,27 @@ class Timer: content = t(_p( 'timer|status|stopped:auto', "Timer stopped! Join {channel} to start the timer." - )).format(channel=self.channel.mention) - embed = None + )).format(channel=f"<#{self.data.channelid}>") else: content = t(_p( 'timer|status|stopped:manual', "Timer stopped! Press `Start` to restart the timer." - )).format(channel=self.channel.mention) - embed = None - - card = await get_timer_card(self.bot, self, stage) - await card.render() + )).format(channel=f"<#{self.data.channelid}>") if (ui := self.status_view) is None: ui = self.status_view = TimerStatusUI(self.bot, self, self.channel) await ui.refresh() - return MessageArgs( - content=content, - embed=embed, - file=card.as_file(f"pomodoro_{self.data.channelid}.png"), - view=ui - ) + card = await get_timer_card(self.bot, self, stage) + try: + await card.render() + file = card.as_file(f"pomodoro_{self.data.channelid}.png") + args = MessageArgs(content=content, file=file, view=ui) + except RenderingException: + args = MessageArgs(content=content, view=ui) + + return args @log_wrap(action='Send Timer Status') async def send_status(self, delete_last=True, **kwargs): @@ -676,6 +679,7 @@ class Timer: if repost: await self.send_status(delete_last=False, with_notify=False) + @log_wrap(action='Update Channel Name') async def _update_channel_name(self): """ Submit a task to update the voice channel name. @@ -683,15 +687,19 @@ class Timer: Attempts to ensure that only one task is running at a time. Attempts to wait until the next viable channel update slot (via ratelimit). """ - if self._voice_update_task and not self._voice_update_task.done(): - # Voice update request already submitted + if self._voice_update_lock.locked(): + # Voice update is already running + # Note that if channel editing takes a long time, + # and the lock is waiting on that, + # we may actually miss a channel update in this period. + # Erring on the side of less ratelimits. return async with self._voice_update_lock: if self._last_voice_update: to_wait = ((self._last_voice_update + timedelta(minutes=5)) - utc_now()).total_seconds() if to_wait > 0: - self._voice_update_task = asyncio.create_task(asyncio.sleep(to_wait)) + self._voice_update_task = asyncio.create_task(asyncio.sleep(to_wait), name='timer-voice-wait') try: await self._voice_update_task except asyncio.CancelledError: @@ -706,8 +714,18 @@ class Timer: if new_name == self.channel.name: return - self._last_voice_update = utc_now() - await self.channel.edit(name=self.channel_name) + try: + logger.debug(f"Requesting channel name update for timer {self}") + await self.channel.edit(name=new_name) + except discord.HTTPException: + logger.warning( + f"Voice channel name update failed for timer {self}", + exc_info=True + ) + finally: + # Whether we fail or not, update ratelimit marker + # (Repeatedly sending failing requests is even worse than normal ratelimits.) + self._last_voice_update = utc_now() @log_wrap(action="Stop Timer") async def stop(self, auto_restart=False): @@ -736,7 +754,12 @@ class Timer: if self._run_task and not self._run_task.done(): self._run_task.cancel() channelid = self.data.channelid + if self.channel: + task = asyncio.create_task( + self.channel.edit(name=self.data.pretty_name, reason="Reverting timer channel name") + ) await self.data.delete() + self.destroyed = True if self.last_status_message: try: await self.last_status_message.delete() @@ -770,8 +793,8 @@ class Timer: to_next_stage = (current.end - utc_now()).total_seconds() # TODO: Consider request rate and load - if to_next_stage > 1 * 60 - drift: - time_to_sleep = 1 * 60 + if to_next_stage > 5 * 60 - drift: + time_to_sleep = 5 * 60 else: time_to_sleep = to_next_stage @@ -795,6 +818,7 @@ class Timer: if current.end < utc_now(): self._state = self.current_stage task = asyncio.create_task(self.notify_change_stage(current, self._state)) + background_tasks.add(task) task.add_done_callback(background_tasks.discard) current = self._state elif self.members: diff --git a/src/modules/pomodoro/ui/config.py b/src/modules/pomodoro/ui/config.py index 369cbd61..b4badbb6 100644 --- a/src/modules/pomodoro/ui/config.py +++ b/src/modules/pomodoro/ui/config.py @@ -37,6 +37,23 @@ class TimerOptionsUI(MessageUI): self.timer = timer self.role = role + async def interaction_check(self, interaction: discord.Interaction): + if self.timer.destroyed: + t = self.bot.translator.t + error = t(_p( + 'ui:timer_options|error:timer_destroyed', + "This timer no longer exists! Closing option menu." + )) + embed = discord.Embed( + colour=discord.Colour.brand_red(), + description=error + ) + await interaction.response.send_message(embed=embed, ephemeral=True) + await self.quit() + return False + else: + return await super().interaction_check(interaction) + @button(label="EDIT_PLACEHOLDER", style=ButtonStyle.blurple) async def edit_button(self, press: discord.Interaction, pressed: Button): """ diff --git a/src/modules/ranks/cog.py b/src/modules/ranks/cog.py index 7f3f84dc..f7878c15 100644 --- a/src/modules/ranks/cog.py +++ b/src/modules/ranks/cog.py @@ -1,6 +1,7 @@ from typing import Optional import asyncio import datetime +from weakref import WeakValueDictionary import discord from discord.ext import commands as cmds @@ -16,6 +17,8 @@ from utils.ui import ChoicedEnum, Transformed from utils.lib import utc_now, replace_multiple from utils.ratelimits import Bucket, limit_concurrency from utils.data import TemporaryTable +from modules.economy.cog import Economy +from modules.economy.data import TransactionType from . import babel, logger @@ -126,6 +129,9 @@ class RankCog(LionCog): # pop the guild whenever the season is updated or the rank type changes. self._member_ranks = {} + # Weakly referenced Locks for each guild to serialise rank actions + self._rank_locks: dict[int, asyncio.Lock] = WeakValueDictionary() + async def cog_load(self): await self.data.init() @@ -136,6 +142,13 @@ class RankCog(LionCog): configcog = self.bot.get_cog('ConfigCog') self.crossload_group(self.configure_group, configcog.configure_group) + def ranklock(self, guildid): + lock = self._rank_locks.get(guildid, None) + if lock is None: + lock = self._rank_locks[guildid] = asyncio.Lock() + logger.debug(f"Getting rank lock for guild (locked: {lock.locked()})") + return lock + # ---------- Event handlers ---------- # season_start setting event handler.. clears the guild season rank cache @LionCog.listener('on_guildset_season_start') @@ -255,50 +268,98 @@ class RankCog(LionCog): """ Handle batch of completed message sessions. """ - tasks = [] - # TODO: Thread safety - # TODO: Locking between refresh and individual updates for guildid, userid, messages, guild_xp in session_data: lguild = await self.bot.core.lions.fetch_guild(guildid) rank_type = lguild.config.get('rank_type').value if rank_type in (RankType.MESSAGE, RankType.XP): - if (_members := self._member_ranks.get(guildid, None)) is not None and userid in _members: - session_rank = _members[userid] - session_rank.stat += messages if (rank_type is RankType.MESSAGE) else guild_xp - else: - session_rank = await self.get_member_rank(guildid, userid) + async with self.ranklock(guildid): + if (_members := self._member_ranks.get(guildid, None)) is not None and userid in _members: + session_rank = _members[userid] + session_rank.stat += messages if (rank_type is RankType.MESSAGE) else guild_xp + else: + session_rank = await self.get_member_rank(guildid, userid) - if session_rank.next_rank is not None and session_rank.stat > session_rank.next_rank.required: - tasks.append(asyncio.create_task(self.update_rank(session_rank))) - else: - tasks.append(asyncio.create_task(self._role_check(session_rank))) - - if tasks: - await asyncio.gather(*tasks) + if session_rank.next_rank is not None and session_rank.stat > session_rank.next_rank.required: + task = asyncio.create_task(self.update_rank(session_rank), name='update-message-rank') + else: + task = asyncio.create_task(self._role_check(session_rank), name='rank-role-check') + await task async def _role_check(self, session_rank: SeasonRank): - guild = self.bot.get_guild(session_rank.guildid) - member = guild.get_member(session_rank.userid) - crank = session_rank.current_rank - roleid = crank.roleid if crank else None - last_roleid = session_rank.rankrow.last_roleid - if guild is not None and member is not None and roleid != last_roleid: - new_role = guild.get_role(roleid) if roleid else None - last_role = guild.get_role(last_roleid) if last_roleid else None - new_last_roleid = last_roleid - if guild.me.guild_permissions.manage_roles: - try: - if last_role and last_role.is_assignable(): - await member.remove_roles(last_role) - new_last_roleid = None - if new_role and new_role.is_assignable(): - await member.add_roles(new_role) - new_last_roleid = roleid - except discord.HTTPClient: - pass - if new_last_roleid != last_roleid: - await session_rank.rankrow.update(last_roleid=new_last_roleid) + """ + Update the member's rank roles, if required. + """ + guildid = session_rank.guildid + guild = self.bot.get_guild(guildid) + userid = session_rank.userid + member = guild.get_member(userid) + + if guild is not None and member is not None and guild.me.guild_permissions.manage_roles: + ranks = await self.get_guild_ranks(guildid) + + crank = session_rank.current_rank + current_roleid = crank.roleid if crank else None + + # First gather rank roleids, note that the last_roleid is an 'honourary' roleid + last_roleid = session_rank.rankrow.last_roleid + rank_roleids = {rank.roleid for rank in ranks} + rank_roleids.add(last_roleid) + + # Gather member roleids + mem_roleids = {role.id: role for role in member.roles} + + # Calculate diffs + to_add = guild.get_role(current_roleid) if (current_roleid not in mem_roleids) else None + to_rm = [ + role for roleid, role in mem_roleids.items() + if roleid in rank_roleids and roleid != current_roleid + ] + + # Now update roles + new_last_roleid = last_roleid + + # TODO: Event log here, including errors + to_rm = [role for role in to_rm if role.is_assignable()] + if to_rm: + try: + await member.remove_roles( + *to_rm, + reason="Removing Old Rank Roles", + atomic=True + ) + roleids = ', '.join(str(role.id) for role in to_rm) + logger.info( + f"Removed old rank roles from in : {roleids}" + ) + new_last_roleid = None + except discord.HTTPException: + logger.warning( + f"Unexpected error removing old rank roles from in : {to_rm}", + exc_info=True + ) + + if to_add and to_add.is_assignable(): + try: + await member.add_roles( + to_add, + reason="Rewarding Activity Rank", + atomic=True + ) + logger.info( + f"Rewarded rank role to in ." + ) + new_last_roleid = to_add.id + except discord.HTTPException: + logger.warning( + f"Unexpected error giving in their rank role ", + exc_info=True + ) + + if new_last_roleid != last_roleid: + await session_rank.rankrow.update(last_roleid=new_last_roleid) + + @log_wrap(action="Update Rank") async def update_rank(self, session_rank): # Identify target rank guildid = session_rank.guildid @@ -326,22 +387,61 @@ class RankCog(LionCog): if member is None: return - new_role = guild.get_role(new_rank.roleid) - if last_roleid := session_rank.rankrow.last_roleid: - last_role = guild.get_role(last_roleid) - else: - last_role = None + last_roleid = session_rank.rankrow.last_roleid + # Update ranks if guild.me.guild_permissions.manage_roles: - try: - if last_role and last_role.is_assignable(): - await member.remove_roles(last_role) + # First gather rank roleids, note that the last_roleid is an 'honourary' roleid + rank_roleids = {rank.roleid for rank in ranks} + rank_roleids.add(last_roleid) + + # Gather member roleids + mem_roleids = {role.id: role for role in member.roles} + + # Calculate diffs + to_add = guild.get_role(new_rank.roleid) if (new_rank.roleid not in mem_roleids) else None + to_rm = [ + role for roleid, role in mem_roleids.items() + if roleid in rank_roleids and roleid != new_rank.roleid + ] + + # Now update roles + # TODO: Event log here, including errors + to_rm = [role for role in to_rm if role.is_assignable()] + if to_rm: + try: + await member.remove_roles( + *to_rm, + reason="Removing Old Rank Roles", + atomic=True + ) + roleids = ', '.join(str(role.id) for role in to_rm) + logger.info( + f"Removed old rank roles from in : {roleids}" + ) last_roleid = None - if new_role and new_role.is_assignable(): - await member.add_roles(new_role) - last_roleid = new_role.id - except discord.HTTPException: - pass + except discord.HTTPException: + logger.warning( + f"Unexpected error removing old rank roles from in : {to_rm}", + exc_info=True + ) + + if to_add and to_add.is_assignable(): + try: + await member.add_roles( + to_add, + reason="Rewarding Activity Rank", + atomic=True + ) + logger.info( + f"Rewarded rank role to in ." + ) + last_roleid=to_add.id + except discord.HTTPException: + logger.warning( + f"Unexpected error giving in their rank role ", + exc_info=True + ) # Update MemberRank row column = { @@ -357,6 +457,18 @@ class RankCog(LionCog): session_rank.current_rank = new_rank session_rank.next_rank = next((rank for rank in ranks if rank.required > new_rank.required), None) + # Provide economy reward if required + if new_rank.reward: + economy: Economy = self.bot.get_cog('Economy') + await economy.data.Transaction.execute_transaction( + TransactionType.OTHER, + guildid=guildid, + actorid=guild.me.id, + from_account=None, + to_account=userid, + amount=new_rank.reward + ) + # Send notification await self._notify_rank_update(guildid, userid, new_rank) @@ -415,7 +527,7 @@ class RankCog(LionCog): required = format_stat_range(rank_type, rank.required, short=False) key_map = { - '{role_name}': role.name, + '{role_name}': role.name if role else 'Unknown', '{guild_name}': guild.name, '{user_name}': member.name, '{role_id}': role.id, @@ -427,10 +539,8 @@ class RankCog(LionCog): } return key_map + @log_wrap(action="Voice Rank Hook") async def on_voice_session_complete(self, *session_data): - tasks = [] - # TODO: Thread safety - # TODO: Locking between refresh and individual updates for guildid, userid, duration, guild_xp in session_data: lguild = await self.bot.core.lions.fetch_guild(guildid) unranked_role_setting = await self.bot.get_cog('StatsCog').settings.UnrankedRoles.get(guildid) @@ -441,27 +551,28 @@ class RankCog(LionCog): continue rank_type = lguild.config.get('rank_type').value if rank_type in (RankType.VOICE,): - if (_members := self._member_ranks.get(guildid, None)) is not None and userid in _members: - session_rank = _members[userid] - # TODO: Temporary measure - season_start = lguild.config.get('season_start').value or datetime.datetime(1970, 1, 1) - stat_data = self.bot.get_cog('StatsCog').data - session_rank.stat = (await stat_data.VoiceSessionStats.study_times_since( - guildid, userid, season_start) - )[0] - # session_rank.stat += duration if (rank_type is RankType.VOICE) else guild_xp - else: - session_rank = await self.get_member_rank(guildid, userid) + async with self.ranklock(guildid): + if (_members := self._member_ranks.get(guildid, None)) is not None and userid in _members: + session_rank = _members[userid] + # TODO: Temporary measure + season_start = lguild.config.get('season_start').value or datetime.datetime(1970, 1, 1) + stat_data = self.bot.get_cog('StatsCog').data + session_rank.stat = (await stat_data.VoiceSessionStats.study_times_since( + guildid, userid, season_start) + )[0] + # session_rank.stat += duration if (rank_type is RankType.VOICE) else guild_xp + else: + session_rank = await self.get_member_rank(guildid, userid) - if session_rank.next_rank is not None and session_rank.stat > session_rank.next_rank.required: - tasks.append(asyncio.create_task(self.update_rank(session_rank))) - else: - tasks.append(asyncio.create_task(self._role_check(session_rank))) - if tasks: - await asyncio.gather(*tasks) + if session_rank.next_rank is not None and session_rank.stat > session_rank.next_rank.required: + task = asyncio.create_task(self.update_rank(session_rank), name='voice-rank-update') + else: + task = asyncio.create_task(self._role_check(session_rank), name='voice-role-check') async def on_xp_update(self, *xp_data): - ... + # Currently no-op since xp is given purely by message stats + # Implement if xp ever becomes a combination of message and voice stats + pass @log_wrap(action='interactive rank refresh') async def interactive_rank_refresh(self, interaction: discord.Interaction, guild: discord.Guild): @@ -470,9 +581,10 @@ class RankCog(LionCog): """ t = self.bot.translator.t if not interaction.response.is_done(): - await interaction.response.defer(thinking=True, ephemeral=False) + await interaction.response.defer(thinking=False) ui = RankRefreshUI(self.bot, guild, callerid=interaction.user.id, timeout=None) - await ui.run(interaction) + await ui.send(interaction.channel) + ui.start() # Retrieve fresh rank roles ranks = await self.get_guild_ranks(guild.id, refresh=True) @@ -481,7 +593,15 @@ class RankCog(LionCog): # Ensure guild is chunked if not guild.chunked: - members = await guild.chunk() + try: + members = await asyncio.wait_for(guild.chunk(), timeout=60) + except asyncio.TimeoutError: + error = t(_p( + 'rank_refresh|error:cannot_chunk|desc', + "Could not retrieve member list from Discord. Please try again later." + )) + await ui.set_error(error) + return else: members = guild.members ui.stage_members = True @@ -638,18 +758,18 @@ class RankCog(LionCog): # Save correct member ranks and given roles to data # First clear the member rank data entirely await self.data.MemberRank.table.delete_where(guildid=guild.id) - column = self._get_rankid_column(rank_type) - values = [ - (guild.id, memberid, rank.rankid, rank.roleid) - for memberid, rank in true_member_ranks.items() - ] - await self.data.MemberRank.table.insert_many( - ('guildid', 'userid', column, 'last_roleid'), - *values - ) + if true_member_ranks: + column = self._get_rankid_column(rank_type) + values = [ + (guild.id, memberid, rank.rankid, rank.roleid) + for memberid, rank in true_member_ranks.items() + ] + await self.data.MemberRank.table.insert_many( + ('guildid', 'userid', column, 'last_roleid'), + *values + ) self.flush_guild_ranks(guild.id) await ui.set_done() - await ui.wait() # ---------- Commands ---------- @cmds.hybrid_command(name=_p('cmd:ranks', "ranks")) @@ -671,7 +791,7 @@ class RankCog(LionCog): await ui.wait() else: await ui.reload() - msg = await ui.make_message() + msg = await ui.make_message(show_note=False) await ctx.reply( **msg.send_args, ephemeral=True @@ -740,7 +860,7 @@ class RankCog(LionCog): lines = [] if rank_type_setting in modified: lines.append(rank_type_setting.update_message) - if dm_ranks or rank_channel: + if (dm_ranks is not None) or (rank_channel is not None): if dm_ranks_setting.value: if rank_channel_setting.value: notif_string = t(_p( diff --git a/src/modules/ranks/ui/overview.py b/src/modules/ranks/ui/overview.py index a07a27d2..27cb77d1 100644 --- a/src/modules/ranks/ui/overview.py +++ b/src/modules/ranks/ui/overview.py @@ -6,11 +6,13 @@ from discord.ui.select import select, Select, SelectOption, RoleSelect from discord.ui.button import button, Button, ButtonStyle from meta import conf, LionBot +from meta.errors import ResponseTimedOut from core.data import RankType from data import ORDER -from utils.ui import MessageUI +from utils.ui import MessageUI, Confirm from utils.lib import MessageArgs +from wards import equippable_role from babel.translator import ctx_translator from .. import babel, logger @@ -30,6 +32,7 @@ class RankOverviewUI(MessageUI): self.bot = bot self.guild = guild self.guildid = guild.id + self.cog = bot.get_cog('RankCog') self.lguild = None @@ -98,8 +101,8 @@ class RankOverviewUI(MessageUI): Refresh the current ranks, ensuring that all members have the correct rank. """ - cog = self.bot.get_cog('RankCog') - await cog.interactive_rank_refresh(press, self.guild) + async with self.cog.ranklock(self.guild.id): + await self.cog.interactive_rank_refresh(press, self.guild) async def refresh_button_refresh(self): self.refresh_button.label = self.bot.translator.t(_p( @@ -107,15 +110,38 @@ class RankOverviewUI(MessageUI): "Refresh Member Ranks" )) - @button(label="CLEAR_BUTTON_PLACEHOLDER", style=ButtonStyle.blurple) + @button(label="CLEAR_BUTTON_PLACEHOLDER", style=ButtonStyle.red) async def clear_button(self, press: discord.Interaction, pressed: Button): """ Clear the rank list. """ - await self.rank_model.table.delete_where(guildid=self.guildid) - self.bot.get_cog('RankCog').flush_guild_ranks(self.guild.id) - self.ranks = [] - await self.redraw() + # Confirm deletion + t = self.bot.translator.t + confirm_msg = t(_p( + 'ui:rank_overview|button:clear|confirm', + "Are you sure you want to **delete all activity ranks** in this server?" + )) + confirmui = Confirm(confirm_msg, self._callerid) + confirmui.confirm_button.label = t(_p( + 'ui:rank_overview|button:clear|confirm|button:yes', + "Yes, clear ranks" + )) + confirmui.confirm_button.style = ButtonStyle.red + confirmui.cancel_button.style = ButtonStyle.green + confirmui.cancel_button.label = t(_p( + 'ui:rank_overview|button:clear|confirm|button:no', + "Cancel" + )) + try: + result = await confirmui.ask(press, ephemeral=True) + except ResponseTimedOut: + result = False + if result: + async with self.cog.ranklock(self.guild.id): + await self.rank_model.table.delete_where(guildid=self.guildid) + self.cog.flush_guild_ranks(self.guild.id) + self.ranks = [] + await self.redraw() async def clear_button_refresh(self): self.clear_button.label = self.bot.translator.t(_p( @@ -160,25 +186,11 @@ class RankOverviewUI(MessageUI): or edit an existing rank, or throw an error if the role is @everyone or not manageable by the client. """ + role: discord.Role = selected.values[0] - if role >= selection.user.top_role: - # Do not allow user to manage a role above their own top role - t = self.bot.translator.t - error = t(_p( - 'ui:rank_overview|menu:roles|error:above_caller', - "You have insufficient permissions to assign {mention} as a rank role! " - "You may only manage roles below your top role." - )).format(mention=role.mention) - embed = discord.Embed( - title=t(_p( - 'ui:rank_overview|menu:roles|error:above_caller|title', - "Insufficient permissions!" - )), - description=error, - colour=discord.Colour.brand_red() - ) - await selection.response.send_message(embed=embed, ephemeral=True) - elif role.is_assignable(): + + if role.is_assignable(): + # Create or edit the selected role existing = next((rank for rank in self.ranks if rank.roleid == role.id), None) if existing: # Display and edit the given role @@ -191,6 +203,8 @@ class RankOverviewUI(MessageUI): ) else: # Create new rank based on role + # Need to check the calling author has authority to manage this role + await equippable_role(self.bot, role, selection.user) await RankEditor.create_rank( selection, self.rank_type, @@ -324,7 +338,7 @@ class RankOverviewUI(MessageUI): string = f"{start} msgs" return string - async def make_message(self) -> MessageArgs: + async def make_message(self, show_note=True) -> MessageArgs: t = self.bot.translator.t if self.ranks: @@ -385,6 +399,40 @@ class RankOverviewUI(MessageUI): title=title, description=desc ) + if show_note: + # Add note about season start + note_name = t(_p( + 'ui:rank_overview|embed|field:note|name', + "Note" + )) + season_start = self.lguild.data.season_start + if season_start: + season_str = t(_p( + 'ui:rank_overview|embed|field:note|value:with_season', + "Ranks are determined by activity since {timestamp}." + )).format( + timestamp=discord.utils.format_dt(season_start) + ) + else: + season_str = t(_p( + 'ui:rank_overview|embed|field:note|value:without_season', + "Ranks are determined by *all-time* statistics.\n" + "To reward ranks from a later time (e.g. to have monthly/quarterly/yearly ranks) " + "set the `season_start` with {stats_cmd}" + )).format(stats_cmd=self.bot.core.mention_cmd('configure statistics')) + if self.rank_type is RankType.VOICE: + addendum = t(_p( + 'ui:rank_overview|embed|field:note|value|voice_addendum', + "Also note that ranks will only be updated when a member leaves a tracked voice channel! " + "Use the **Refresh Member Ranks** button below to update all members manually." + )) + season_str = '\n'.join((season_str, addendum)) + embed.add_field( + name=note_name, + value=season_str, + inline=False + ) + return MessageArgs(embed=embed) async def refresh_layout(self): diff --git a/src/modules/ranks/ui/preview.py b/src/modules/ranks/ui/preview.py index 2f437680..7dcca0e4 100644 --- a/src/modules/ranks/ui/preview.py +++ b/src/modules/ranks/ui/preview.py @@ -7,6 +7,7 @@ from discord.ui.button import button, Button, ButtonStyle from meta import conf, LionBot from core.data import RankType +from wards import equippable_role from utils.ui import MessageUI, AButton, AsComponents from utils.lib import MessageArgs, replace_multiple @@ -112,6 +113,7 @@ class RankPreviewUI(MessageUI): await submit.response.defer(thinking=False) if self.parent is not None: asyncio.create_task(self.parent.refresh()) + self.bot.get_cog('RankCog').flush_guild_ranks(self.guild.id) await self.refresh() @button(label="DELETE_PLACEHOLDER", style=ButtonStyle.red) @@ -130,6 +132,7 @@ class RankPreviewUI(MessageUI): role = None await self.rank.delete() + self.bot.get_cog('RankCog').flush_guild_ranks(self.guild.id) mention = role.mention if role else str(self.rank.roleid) @@ -212,25 +215,13 @@ class RankPreviewUI(MessageUI): role: discord.Role = selected.values[0] await selection.response.defer(thinking=True, ephemeral=True) - if role >= selection.user.top_role: - # Do not allow user to manage a role above their own top role - error = t(_p( - 'ui:rank_preview|menu:roles|error:above_caller', - "You have insufficient permissions to assign {mention} as a rank role! " - "You may only manage roles below your top role." - )) - embed = discord.Embed( - title=t(_p( - 'ui:rank_preview|menu:roles|error:above_caller|title', - "Insufficient permissions!" - )), - description=error, - colour=discord.Colour.brand_red() - ) - await selection.response.send_message(embed=embed, ephemeral=True) - elif role.is_assignable(): + if role.is_assignable(): # Update the rank role + # Generic permission check for the new role + await equippable_role(self.bot, role, selection.user) + await self.rank.update(roleid=role.id) + self.bot.get_cog('RankCog').flush_guild_ranks(self.guild.id) if self.parent is not None and not self.parent.is_finished(): asyncio.create_task(self.parent.refresh()) await self.refresh(thinking=selection) diff --git a/src/modules/ranks/ui/refresh.py b/src/modules/ranks/ui/refresh.py index 9289c345..b45b3b6e 100644 --- a/src/modules/ranks/ui/refresh.py +++ b/src/modules/ranks/ui/refresh.py @@ -64,9 +64,12 @@ class RankRefreshUI(MessageUI): def poke(self): self._wakeup.set() + def start(self): + self._loop_task = asyncio.create_task(self._refresh_loop(), name='Rank RefreshUI Monitor') + async def run(self, *args, **kwargs): await super().run(*args, **kwargs) - self._loop_task = asyncio.create_task(self._refresh_loop(), name='refresh ui loop') + self.start() async def cleanup(self): if self._loop_task and not self._loop_task.done(): @@ -199,10 +202,11 @@ class RankRefreshUI(MessageUI): )) value = t(_p( 'ui:refresh_ranks|embed|field:remove|value', - "0 {progress} {total}" + "{progress} {done}/{total} removed" )).format( progress=self.progress_bar(self.removed, 0, self.to_remove), total=self.to_remove, + done=self.removed, ) embed.add_field(name=name, value=value, inline=False) else: @@ -221,10 +225,11 @@ class RankRefreshUI(MessageUI): )) value = t(_p( 'ui:refresh_ranks|embed|field:add|value', - "0 {progress} {total}" + "{progress} {done}/{total} given" )).format( progress=self.progress_bar(self.added, 0, self.to_add), total=self.to_add, + done=self.added, ) embed.add_field(name=name, value=value, inline=False) else: diff --git a/src/modules/reminders/cog.py b/src/modules/reminders/cog.py index 8d88bcd2..03cc087b 100644 --- a/src/modules/reminders/cog.py +++ b/src/modules/reminders/cog.py @@ -12,158 +12,36 @@ Max 25 reminders (propagating Discord restriction) """ from typing import Optional import datetime as dt -from cachetools import TTLCache, LRUCache +from cachetools import TTLCache import discord from discord.ext import commands as cmds from discord import app_commands as appcmds from discord.app_commands import Transform -from discord.ui.select import select, SelectOption from dateutil.parser import parse, ParserError -from data import RowModel, Registry, WeakCache from data.queries import ORDER -from data.columns import Integer, String, Timestamp, Bool from meta import LionBot, LionCog, LionContext +from meta.errors import UserInputError from meta.app import shard_talk, appname_from_shard -from meta.logger import log_wrap, logging_context, set_logging_context +from meta.logger import log_wrap, set_logging_context from babel import ctx_translator, ctx_locale -from utils.lib import parse_duration, utc_now, strfdur, error_embed +from utils.lib import parse_duration, utc_now, strfdur, error_embed, check_dm from utils.monitor import TaskMonitor from utils.transformers import DurationTransformer -from utils.ui import LeoUI, AButton, AsComponents +from utils.ui import AButton, AsComponents from utils.ratelimits import Bucket from . import babel, logger +from .data import ReminderData +from .ui import ReminderList _, _p, _np = babel._, babel._p, babel._np -class ReminderData(Registry, name='reminders'): - class Reminder(RowModel): - """ - Model representing a single reminder. - Since reminders are likely to change across shards, - does not use an explicit reference cache. - - Schema - ------ - CREATE TABLE reminders( - reminderid SERIAL PRIMARY KEY, - userid BIGINT NOT NULL REFERENCES user_config(userid) ON DELETE CASCADE, - remind_at TIMESTAMPTZ NOT NULL, - content TEXT NOT NULL, - message_link TEXT, - interval INTEGER, - created_at TIMESTAMP DEFAULT (now() at time zone 'utc'), - title TEXT, - footer TEXT - ); - CREATE INDEX reminder_users ON reminders (userid); - """ - _tablename_ = 'reminders' - - reminderid = Integer(primary=True) - - userid = Integer() # User which created the reminder - remind_at = Timestamp() # Time when the reminder should be executed - content = String() # Content the user gave us to remind them - message_link = String() # Link to original confirmation message, for context - interval = Integer() # Repeat interval, if applicable - created_at = Timestamp() # Time when this reminder was originally created - title = String() # Title of the final reminder embed, only set in automated reminders - footer = String() # Footer of the final reminder embed, only set in automated reminders - failed = Bool() # Whether the reminder was already attempted and failed - - @property - def timestamp(self) -> int: - """ - Time when this reminder should be executed (next) as an integer timestamp. - """ - return int(self.remind_at.timestamp()) - - @property - def embed(self) -> discord.Embed: - t = ctx_translator.get().t - - embed = discord.Embed( - title=self.title or t(_p('reminder|embed', "You asked me to remind you!")), - colour=discord.Colour.orange(), - description=self.content, - timestamp=self.remind_at - ) - - if self.message_link: - embed.add_field( - name=t(_p('reminder|embed', "Context?")), - value="[{click}]({link})".format( - click=t(_p('reminder|embed', "Click Here")), - link=self.message_link - ) - ) - - if self.interval: - embed.add_field( - name=t(_p('reminder|embed', "Next reminder")), - value=f"" - ) - - if self.footer: - embed.set_footer(text=self.footer) - - return embed - - @property - def formatted(self): - """ - Single-line string format for the reminder, intended for an embed. - """ - t = ctx_translator.get().t - content = self.content - trunc_content = content[:50] + '...' * (len(content) > 50) - - if interval := self.interval: - if not interval % (24 * 60 * 60): - # Exact day case - days = interval // (24 * 60 * 60) - repeat = t(_np( - 'reminder|formatted|interval', - "Every day", - "Every `{days}` days", - days - )).format(days=days) - elif not interval % (60 * 60): - # Exact hour case - hours = interval // (60 * 60) - repeat = t(_np( - 'reminder|formatted|interval', - "Every hour", - "Every `{hours}` hours", - hours - )).format(hours=hours) - else: - # Inexact interval, e.g 10m or 1h 10m. - # Use short duration format - repeat = t(_p( - 'reminder|formatted|interval', - "Every `{duration}`" - )).format(duration=strfdur(interval)) - - repeat = f"({repeat})" - else: - repeat = "" - - return ", [{content}]({jump_link}) {repeat}".format( - jump_link=self.message_link, - content=trunc_content, - timestamp=self.timestamp, - repeat=repeat - ) - - class ReminderMonitor(TaskMonitor[int]): ... @@ -191,7 +69,7 @@ class Reminders(LionCog): # Short term userid -> list[Reminder] cache, mainly for autocomplete self._user_reminder_cache: TTLCache[int, list[ReminderData.Reminder]] = TTLCache(1000, ttl=60) - self._active_reminderlists: dict[int, ReminderListUI] = {} + self._active_reminderlists: dict[int, ReminderList] = {} async def cog_load(self): await self.data.init() @@ -212,6 +90,105 @@ class Reminders(LionCog): # Start firing reminders self.monitor.start() + # ----- Cog API ----- + + async def create_reminder( + self, + userid: int, remind_at: dt.datetime, content: str, + message_link: Optional[str] = None, + interval: Optional[int] = None, + created_at: Optional[dt.datetime] = None, + ) -> ReminderData.Reminder: + """ + Create and schedule a new reminder from user-entered data. + + Raises UserInputError if the requested parameters are invalid. + """ + now = utc_now() + + if remind_at <= now: + t = self.bot.translator.t + raise UserInputError( + t(_p( + 'create_reminder|error:past', + "The provided reminder time {timestamp} is in the past!" + )).format(timestamp=discord.utils.format_dt(remind_at)) + ) + + if interval is not None and interval < 600: + t = self.bot.translator.t + raise UserInputError( + t(_p( + 'create_reminder|error:too_fast', + "You cannot set a repeating reminder with a period less than 10 minutes." + )) + ) + + existing = await self.data.Reminder.fetch_where(userid=userid) + if len(existing) >= 25: + t = self.bot.translator.t + raise UserInputError( + t(_p( + 'create_reminder|error:too_many', + "Sorry, you have reached the maximum of `25` reminders." + )) + ) + + user = self.bot.get_user(userid) + if not user: + user = await self.bot.fetch_user(userid) + if not user: + raise ValueError(f"Target user {userid} does not exist.") + + can_dm = await check_dm(user) + if not can_dm: + t = self.bot.translator.t + raise UserInputError( + t(_p( + 'create_reminder|error:cannot_dm', + "I cannot direct message you! Do you have me blocked or direct messages closed?" + )) + ) + + created_at = created_at or now + + # Passes validation, actually create + reminder = await self.data.Reminder.create( + userid=userid, + remind_at=remind_at, + content=content, + message_link=message_link, + interval=interval, + created_at=created_at, + ) + + # Schedule from executor + await self.talk_schedule(reminder.reminderid).send(self.executor_name, wait_for_reply=False) + + # Dispatch reminder update + await self.dispatch_update_for(userid) + + # Return fresh reminder + return reminder + + async def parse_time_static(self, timestr, timezone): + timestr = timestr.strip() + default = dt.datetime.now(tz=timezone).replace(hour=0, minute=0, second=0, microsecond=0) + if not timestr: + return default + try: + ts = parse(timestr, fuzzy=True, default=default) + except ParserError: + t = self.bot.translator.t + raise UserInputError( + t(_p( + 'parse_timestamp|error:parse', + "Could not parse `{given}` as a valid reminder time. " + "Try entering the time in the form `HH:MM` or `YYYY-MM-DD HH:MM`." + )).format(given=timestr) + ) + return ts + async def get_reminders_for(self, userid: int): """ Retrieve a list of reminders for the given userid, using the cache. @@ -348,116 +325,43 @@ class Reminders(LionCog): # Dispatch for analytics self.bot.dispatch('reminder_sent', reminder) - @cmds.hybrid_group( - name=_p('cmd:reminders', "reminders") - ) - async def reminders_group(self, ctx: LionContext): - pass - - @reminders_group.command( - # No help string - name=_p('cmd:reminders_show', "show"), + @cmds.hybrid_command( + name=_p('cmd:reminders', "reminders"), description=_p( - 'cmd:reminders_show|desc', - "Display your current reminders." + 'cmd:reminders|desc', + "View and set your reminders." ) ) - async def cmd_reminders_show(self, ctx: LionContext): - # No help string + async def cmd_reminders(self, ctx: LionContext): """ Display the reminder widget for this user. """ - t = self.bot.translator.t if not ctx.interaction: return if ctx.author.id in self._active_reminderlists: - await self._active_reminderlists[ctx.author.id].close( - msg=t(_p( - 'cmd:reminders_show|close_elsewhere', - "Closing since the list was opened elsewhere." - )) - ) - ui = ReminderListUI(self.bot, ctx.author) + await self._active_reminderlists[ctx.author.id].quit() + ui = ReminderList(self.bot, ctx.author) try: self._active_reminderlists[ctx.author.id] = ui - await ui.run(ctx.interaction) + await ui.run(ctx.interaction, ephemeral=True) await ui.wait() finally: self._active_reminderlists.pop(ctx.author.id, None) - @reminders_group.command( - name=_p('cmd:reminders_clear', "clear"), - description=_p( - 'cmd:reminders_clear|desc', - "Clear your reminder list." - ) + @cmds.hybrid_group( + name=_p('cmd:remindme', "remindme"), + description=_p('cmd:remindme|desc', "View and set task reminders."), ) - async def cmd_reminders_clear(self, ctx: LionContext): - # No help string - """ - Confirm and then clear all the reminders for this user. - """ - if not ctx.interaction: - return + async def remindme_group(self, ctx: LionContext): + # Base command group for scheduling reminders. + pass - t = self.bot.translator.t - reminders = await self.data.Reminder.fetch_where(userid=ctx.author.id) - if not reminders: - await ctx.reply( - embed=discord.Embed( - description=t(_p( - 'cmd:reminders_clear|error:no_reminders', - "You have no reminders to clear!" - )), - colour=discord.Colour.brand_red() - ), - ephemeral=True - ) - return - - embed = discord.Embed( - title=t(_p('cmd:reminders_clear|confirm|title', "Are You Sure?")), - description=t(_np( - 'cmd:reminders_clear|confirm|desc', - "Are you sure you want to delete your `{count}` reminder?", - "Are you sure you want to clear your `{count}` reminders?", - len(reminders) - )).format(count=len(reminders)) - ) - - @AButton(label=t(_p('cmd:reminders_clear|confirm|button:yes', "Yes, clear my reminders"))) - async def confirm(interaction, press): - await interaction.response.defer() - reminders = await self.data.Reminder.table.delete_where(userid=ctx.author.id) - await self.talk_cancel(*(r['reminderid'] for r in reminders)).send(self.executor_name, wait_for_reply=False) - await ctx.interaction.edit_original_response( - embed=discord.Embed( - description=t(_p( - 'cmd:reminders_clear|success|desc', - "Your reminders have been cleared!" - )), - colour=discord.Colour.brand_green() - ), - view=None - ) - await press.view.close() - await self.dispatch_update_for(ctx.author.id) - - @AButton(label=t(_p('cmd:reminders_clear|confirm|button:cancel', "Cancel"))) - async def deny(interaction, press): - await interaction.response.defer() - await ctx.interaction.delete_original_response() - await press.view.close() - - components = AsComponents(confirm, deny) - await ctx.interaction.response.send_message(embed=embed, view=components, ephemeral=True) - - @reminders_group.command( + @remindme_group.command( name=_p('cmd:reminders_cancel', "cancel"), description=_p( 'cmd:reminders_cancel|desc', - "Cancel a single reminder. Use the menu in \"reminder show\" to cancel multiple reminders." + "Cancel a single reminder. Use /reminders to clear or cancel multiple reminders." ) ) @appcmds.rename( @@ -576,13 +480,6 @@ class Reminders(LionCog): ] return choices - @cmds.hybrid_group( - name=_p('cmd:remindme', "remindme") - ) - async def remindme_group(self, ctx: LionContext): - # Base command group for scheduling reminders. - pass - @remindme_group.command( name=_p('cmd:remindme_at', "at"), description=_p( @@ -596,118 +493,79 @@ class Reminders(LionCog): every=_p('cmd:remindme_at|param:every', "repeat_every"), ) @appcmds.describe( - time=_p('cmd:remindme_at|param:time|desc', "When you want to be reminded. (E.g. `4pm` or `16:00`)."), - reminder=_p('cmd:remindme_at|param:reminder|desc', "What should the reminder be?"), - every=_p('cmd:remindme_at|param:every|desc', "How often to repeat this reminder.") + time=_p( + 'cmd:remindme_at|param:time|desc', + "When you want to be reminded. (E.g. `4pm` or `16:00`)." + ), + reminder=_p( + 'cmd:remindme_at|param:reminder|desc', + "What should the reminder be?" + ), + every=_p( + 'cmd:remindme_at|param:every|desc', + "How often to repeat this reminder." + ) ) async def cmd_remindme_at( self, ctx: LionContext, - time: str, - reminder: str, + time: appcmds.Range[str, 1, 100], + reminder: appcmds.Range[str, 1, 2000], every: Optional[Transform[int, DurationTransformer(60)]] = None ): t = self.bot.translator.t - reminders = await self.data.Reminder.fetch_where(userid=ctx.author.id) - # Guard against too many reminders - if len(reminders) > 25: - await ctx.error_reply( - embed=error_embed( - t(_p( - 'cmd_remindme_at|error:too_many|desc', - "Sorry, you have reached the maximum of `25` reminders!" - )), - title=t(_p( - 'cmd_remindme_at|error:too_many|title', - "Could not create reminder!" - )) - ), - ephemeral=True - ) - return - - # Guard against too frequent reminders - if every is not None and every < 600: - await ctx.reply( - embed=error_embed( - t(_p( - 'cmd_remindme_at|error:too_fast|desc', - "You cannot set a repeating reminder with a period less than 10 minutes." - )), - title=t(_p( - 'cmd_remindme_at|error:too_fast|title', - "Could not create reminder!" - )) - ), - ephemeral=True - ) - return - - # Parse the provided static time - timezone = ctx.lmember.timezone - time = time.strip() - default = dt.datetime.now(tz=timezone).replace(hour=0, minute=0, second=0, microsecond=0) try: - ts = parse(time, fuzzy=True, default=default) - except ParserError: - await ctx.reply( - embed=error_embed( - t(_p( - 'cmd:remindme_at|error:parse_time|desc', - "Could not parse provided time `{given}`. Try entering e.g. `4 pm` or `16:00`." - )).format(given=time), - title=t(_p( - 'cmd:remindme_at|error:parse_time|title', - "Could not create reminder!" - )) - ), - ephemeral=True + timezone = ctx.lmember.timezone + remind_at = await self.parse_time_static(time, timezone) + reminder = await self.create_reminder( + userid=ctx.author.id, + remind_at=remind_at, + content=reminder, + message_link=ctx.message.jump_url, + interval=every, ) - return - if ts < utc_now(): - await ctx.reply( - embed=error_embed( - t(_p( - 'cmd:remindme_at|error:past_time|desc', - "Provided time is in the past!" - )), - title=t(_p( - 'cmd:remindme_at|error:past_time|title', - "Could not create reminder!" - )) - ), - ephemeral=True + embed = reminder.set_response + except UserInputError as e: + embed = discord.Embed( + title=t(_p( + 'cmd:remindme_at|error|title', + "Could not create reminder!" + )), + description=e.msg, + colour=discord.Colour.brand_red() ) - return - # Everything seems to be in order - # Create the reminder - now = utc_now() - rem = await self.data.Reminder.create( - userid=ctx.author.id, - remind_at=ts, - content=reminder, - message_link=ctx.message.jump_url, - interval=every, - created_at=now - ) - # Reminder created, request scheduling from executor shard - await self.talk_schedule(rem.reminderid).send(self.executor_name, wait_for_reply=False) - - # TODO Add repeat to description - embed = discord.Embed( - title=t(_p( - 'cmd:remindme_in|success|title', - "Reminder Set at {timestamp}" - )).format(timestamp=f""), - description=f"> {rem.content}" - ) await ctx.reply( embed=embed, ephemeral=True ) - await self.dispatch_update_for(ctx.author.id) + + @cmd_remindme_at.autocomplete('time') + async def cmd_remindme_at_acmpl_time(self, interaction: discord.Interaction, partial: str): + if interaction.guild: + lmember = await self.bot.core.lions.fetch_member(interaction.guild.id, interaction.user.id) + timezone = lmember.timezone + else: + luser = await self.bot.core.lions.fetch_user(interaction.user.id) + timezone = luser.timezone + + t = self.bot.translator.t + try: + timestamp = await self.parse_time_static(partial, timezone) + choice = appcmds.Choice( + name=timestamp.strftime('%Y-%m-%d %H:%M'), + value=partial + ) + except UserInputError: + choice = appcmds.Choice( + name=t(_p( + 'cmd:remindme_at|acmpl:time|error:parse', + "Cannot parse \"{partial}\" as a time. Try the format HH:MM or YYYY-MM-DD HH:MM" + )).format(partial=partial), + value=partial + ) + return [choice] @remindme_group.command( name=_p('cmd:remindme_in', "in"), @@ -722,228 +580,49 @@ class Reminders(LionCog): every=_p('cmd:remindme_in|param:every', "repeat_every"), ) @appcmds.describe( - time=_p('cmd:remindme_in|param:time|desc', "How far into the future to set the reminder (e.g. 1 day 10h 5m)."), - reminder=_p('cmd:remindme_in|param:reminder|desc', "What should the reminder be?"), - every=_p('cmd:remindme_in|param:every|desc', "How often to repeat this reminder. (e.g. 1 day, or 2h)") + time=_p( + 'cmd:remindme_in|param:time|desc', + "How far into the future to set the reminder (e.g. 1 day 10h 5m)." + ), + reminder=_p( + 'cmd:remindme_in|param:reminder|desc', + "What should the reminder be?" + ), + every=_p( + 'cmd:remindme_in|param:every|desc', + "How often to repeat this reminder. (e.g. 1 day, or 2h)" + ) ) async def cmd_remindme_in( self, ctx: LionContext, time: Transform[int, DurationTransformer(60)], - reminder: appcmds.Range[str, 1, 1000], # TODO: Maximum length 1000? + reminder: appcmds.Range[str, 1, 2000], every: Optional[Transform[int, DurationTransformer(60)]] = None ): t = self.bot.translator.t - reminders = await self.data.Reminder.fetch_where(userid=ctx.author.id) - # Guard against too many reminders - if len(reminders) > 25: - await ctx.error_reply( - embed=error_embed( - t(_p( - 'cmd_remindme_in|error:too_many|desc', - "Sorry, you have reached the maximum of `25` reminders!" - )), - title=t(_p( - 'cmd_remindme_in|error:too_many|title', - "Could not create reminder!" - )) - ), - ephemeral=True + try: + remind_at = utc_now() + dt.timedelta(seconds=time) + reminder = await self.create_reminder( + userid=ctx.author.id, + remind_at=remind_at, + content=reminder, + message_link=ctx.message.jump_url, + interval=every, ) - return - - # Guard against too frequent reminders - if every is not None and every < 600: - await ctx.reply( - embed=error_embed( - t(_p( - 'cmd_remindme_in|error:too_fast|desc', - "You cannot set a repeating reminder with a period less than 10 minutes." - )), - title=t(_p( - 'cmd_remindme_in|error:too_fast|title', - "Could not create reminder!" - )) - ), - ephemeral=True + embed = reminder.set_response + except UserInputError as e: + embed = discord.Embed( + title=t(_p( + 'cmd:remindme_in|error|title', + "Could not create reminder!" + )), + description=e.msg, + colour=discord.Colour.brand_red() ) - return - # Everything seems to be in order - # Create the reminder - now = utc_now() - rem = await self.data.Reminder.create( - userid=ctx.author.id, - remind_at=now + dt.timedelta(seconds=time), - content=reminder, - message_link=ctx.message.jump_url, - interval=every, - created_at=now - ) - - # Reminder created, request scheduling from executor shard - await self.talk_schedule(rem.reminderid).send(self.executor_name, wait_for_reply=False) - - # TODO Add repeat to description - embed = discord.Embed( - title=t(_p( - 'cmd:remindme_in|success|title', - "Reminder Set {timestamp}" - )).format(timestamp=f""), - description=f"> {rem.content}" - ) await ctx.reply( embed=embed, ephemeral=True ) - await self.dispatch_update_for(ctx.author.id) - - -class ReminderListUI(LeoUI): - def __init__(self, bot: LionBot, user: discord.User, **kwargs): - super().__init__(**kwargs) - - self.bot = bot - self.user = user - - cog = bot.get_cog('Reminders') - if cog is None: - raise ValueError("Cannot create a ReminderUI without the Reminder cog!") - self.cog: Reminders = cog - self.userid = user.id - - # Original interaction which sent the UI message - # Since this is an ephemeral UI, we need this to update and delete - self._interaction: Optional[discord.Interaction] = None - self._reminders = [] - - async def cleanup(self): - # Cleanup after an ephemeral UI - # Just close if possible - if self._interaction and not self._interaction.is_expired(): - try: - await self._interaction.delete_original_response() - except discord.HTTPException: - pass - - @select() - async def select_remove(self, interaction: discord.Interaction, selection): - """ - Select a number of reminders to delete. - """ - await interaction.response.defer() - # Hopefully this is a list of reminderids - values = selection.values - # Delete from data - await self.cog.data.Reminder.table.delete_where(reminderid=values) - # Send cancellation - await self.cog.talk_cancel(*values).send(self.cog.executor_name, wait_for_reply=False) - self.cog._user_reminder_cache.pop(self.userid, None) - await self.refresh() - - async def refresh_select_remove(self): - """ - Refresh the select remove component from current state. - """ - t = self.bot.translator.t - - self.select_remove.placeholder = t(_p( - 'ui:reminderlist|select:remove|placeholder', - "Select to cancel." - )) - self.select_remove.options = [ - SelectOption( - label=f"[{i}] {reminder.content[:50] + '...' * (len(reminder.content) > 50)}", - value=reminder.reminderid, - emoji=self.bot.config.emojis.getemoji('clock') - ) - for i, reminder in enumerate(self._reminders, start=1) - ] - self.select_remove.min_values = 1 - self.select_remove.max_values = len(self._reminders) - - async def refresh_reminders(self): - self._reminders = await self.cog.get_reminders_for(self.userid) - - async def refresh(self): - """ - Refresh the UI message and components. - """ - if not self._interaction: - raise ValueError("Cannot refresh ephemeral UI without an origin interaction!") - - await self.refresh_reminders() - await self.refresh_select_remove() - embed = await self.build_embed() - - if self._reminders: - self.set_layout((self.select_remove,)) - else: - self.set_layout() - - try: - if not self._interaction.response.is_done(): - # Fresh message - await self._interaction.response.send_message(embed=embed, view=self, ephemeral=True) - else: - # Update existing message - await self._interaction.edit_original_response(embed=embed, view=self) - except discord.HTTPException: - await self.close() - - async def run(self, interaction: discord.Interaction): - """ - Run the UI responding to the given interaction. - """ - self._interaction = interaction - await self.refresh() - - async def build_embed(self): - """ - Build the reminder list embed. - """ - t = self.bot.translator.t - reminders = self._reminders - - if reminders: - lines = [] - num_len = len(str(len(reminders))) - for i, reminder in enumerate(reminders): - lines.append( - "`[{:<{}}]` | {}".format( - i+1, - num_len, - reminder.formatted - ) - ) - description = '\n'.join(lines) - - embed = discord.Embed( - description=description, - colour=discord.Colour.orange(), - timestamp=utc_now() - ).set_author( - name=t(_p( - 'ui:reminderlist|embed:list|author', - "{name}'s reminders" - )).format(name=self.user.display_name), - icon_url=self.user.avatar - ).set_footer( - text=t(_p( - 'ui:reminderlist|embed:list|footer', - "Click a reminder twice to jump to the context!" - )) - ) - else: - embed = discord.Embed( - description=t(_p( - 'ui:reminderlist|embed:no_reminders|desc', - "You have no reminders to display!\n" - "Use {remindme} to create a new reminder." - )).format( - remindme=self.bot.core.cmd_name_cache['remindme'].mention, - ) - ) - - return embed diff --git a/src/modules/reminders/data.py b/src/modules/reminders/data.py new file mode 100644 index 00000000..d50c1f46 --- /dev/null +++ b/src/modules/reminders/data.py @@ -0,0 +1,165 @@ +import discord + +from data import RowModel, Registry +from data.columns import Integer, String, Timestamp, Bool + +from babel import ctx_translator +from utils.lib import strfdur +from . import babel + + +_, _p, _np = babel._, babel._p, babel._np + + +class ReminderData(Registry, name='reminders'): + class Reminder(RowModel): + """ + Model representing a single reminder. + Since reminders are likely to change across shards, + does not use an explicit reference cache. + + Schema + ------ + CREATE TABLE reminders( + reminderid SERIAL PRIMARY KEY, + userid BIGINT NOT NULL REFERENCES user_config(userid) ON DELETE CASCADE, + remind_at TIMESTAMPTZ NOT NULL, + content TEXT NOT NULL, + message_link TEXT, + interval INTEGER, + created_at TIMESTAMP DEFAULT (now() at time zone 'utc'), + title TEXT, + footer TEXT + ); + CREATE INDEX reminder_users ON reminders (userid); + """ + _tablename_ = 'reminders' + + reminderid = Integer(primary=True) + + userid = Integer() # User which created the reminder + remind_at = Timestamp() # Time when the reminder should be executed + content = String() # Content the user gave us to remind them + message_link = String() # Link to original confirmation message, for context + interval = Integer() # Repeat interval, if applicable + created_at = Timestamp() # Time when this reminder was originally created + title = String() # Title of the final reminder embed, only set in automated reminders + footer = String() # Footer of the final reminder embed, only set in automated reminders + failed = Bool() # Whether the reminder was already attempted and failed + + @property + def timestamp(self) -> int: + """ + Time when this reminder should be executed (next) as an integer timestamp. + """ + return int(self.remind_at.timestamp()) + + @property + def set_response(self) -> discord.Embed: + t = ctx_translator.get().t + embed = discord.Embed( + title=t(_p( + 'reminder_set|title', + "Reminder Set!" + )), + description=t(_p( + 'reminder_set|desc', + "At {timestamp} I will remind you about:\n" + "> {content}" + )).format( + timestamp=discord.utils.format_dt(self.remind_at), + content=self.content, + )[:2048], + colour=discord.Colour.brand_green(), + ) + if self.interval: + embed.add_field( + name=t(_p( + 'reminder_set|field:repeat|name', + "Repeats" + )), + value=t(_p( + 'reminder_set|field:repeat|value', + "This reminder will repeat every `{interval}` (after the first reminder)." + )).format(interval=strfdur(self.interval, short=False)), + inline=False + ) + return embed + + @property + def embed(self) -> discord.Embed: + t = ctx_translator.get().t + + embed = discord.Embed( + title=self.title or t(_p('reminder|embed', "You asked me to remind you!")), + colour=discord.Colour.orange(), + description=self.content, + timestamp=self.remind_at + ) + + if self.message_link: + embed.add_field( + name=t(_p('reminder|embed', "Context?")), + value="[{click}]({link})".format( + click=t(_p('reminder|embed', "Click Here")), + link=self.message_link + ) + ) + + if self.interval: + embed.add_field( + name=t(_p('reminder|embed', "Next reminder")), + value=f"" + ) + + if self.footer: + embed.set_footer(text=self.footer) + + return embed + + @property + def formatted(self): + """ + Single-line string format for the reminder, intended for an embed. + """ + t = ctx_translator.get().t + content = self.content + trunc_content = content[:50] + '...' * (len(content) > 50) + + if interval := self.interval: + if not interval % (24 * 60 * 60): + # Exact day case + days = interval // (24 * 60 * 60) + repeat = t(_np( + 'reminder|formatted|interval', + "Every day", + "Every `{days}` days", + days + )).format(days=days) + elif not interval % (60 * 60): + # Exact hour case + hours = interval // (60 * 60) + repeat = t(_np( + 'reminder|formatted|interval', + "Every hour", + "Every `{hours}` hours", + hours + )).format(hours=hours) + else: + # Inexact interval, e.g 10m or 1h 10m. + # Use short duration format + repeat = t(_p( + 'reminder|formatted|interval', + "Every `{duration}`" + )).format(duration=strfdur(interval)) + + repeat = f"({repeat})" + else: + repeat = "" + + return ", [{content}]({jump_link}) {repeat}".format( + jump_link=self.message_link, + content=trunc_content, + timestamp=self.timestamp, + repeat=repeat + ) diff --git a/src/modules/reminders/ui.py b/src/modules/reminders/ui.py new file mode 100644 index 00000000..e4108c4b --- /dev/null +++ b/src/modules/reminders/ui.py @@ -0,0 +1,304 @@ +from typing import Optional, TYPE_CHECKING +import asyncio +import datetime as dt + +import discord +from discord.ui.select import select, Select, SelectOption +from discord.ui.button import button, Button, ButtonStyle +from discord.ui.text_input import TextInput, TextStyle + +from meta import LionBot +from meta.errors import UserInputError +from utils.lib import utc_now, MessageArgs, parse_duration +from utils.ui import MessageUI, AButton, AsComponents, ConfigEditor + +from . import babel, logger + +_, _p, _np = babel._, babel._p, babel._np + +if TYPE_CHECKING: + from .cog import Reminders + + +class ReminderList(MessageUI): + def __init__(self, bot: LionBot, user: discord.User, **kwargs): + super().__init__(callerid=user.id, **kwargs) + + self.bot = bot + self.user = user + self.userid = user.id + + self.cog: 'Reminders' = bot.get_cog('Reminders') + if self.cog is None: + raise ValueError("Cannot initialise ReminderList without loaded Reminder cog.") + + # UI state + self._reminders = [] + + # ----- UI API ----- + # ----- UI Components ----- + # Clear button + @button(label="CLEAR_BUTTON_PLACEHOLDER", style=ButtonStyle.red) + async def clear_button(self, press: discord.Interaction, pressed: Button): + t = self.bot.translator.t + + reminders = self._reminders + embed = discord.Embed( + title=t(_p('ui:reminderlist|button:clear|confirm|title', "Are You Sure?")), + description=t(_np( + 'ui:reminderlist|button:clear|confirm|desc', + "Are you sure you want to delete your `{count}` reminder?", + "Are you sure you want to clear your `{count}` reminders?", + len(reminders) + )).format(count=len(reminders)), + colour=discord.Colour.dark_orange() + ) + + @AButton(label=t(_p('ui:reminderlist|button:clear|confirm|button:yes', "Yes, clear my reminders"))) + async def confirm(interaction, pressed): + await interaction.response.defer() + reminders = await self.cog.data.Reminder.table.delete_where(userid=self.userid) + await self.cog.talk_cancel(*(r['reminderid'] for r in reminders)).send( + self.cog.executor_name, wait_for_reply=False + ) + await press.edit_original_response( + embed=discord.Embed( + description=t(_p( + 'ui:reminderlist|button:clear|success|desc', + "Your reminders have been cleared!" + )), + colour=discord.Colour.brand_green() + ), + view=None + ) + await pressed.view.close() + await self.cog.dispatch_update_for(self.userid) + + @AButton(label=t(_p('ui:reminderlist|button:clear|confirm|button:cancel', "Cancel"))) + async def deny(interaction, pressed): + await interaction.response.defer() + await press.delete_original_response() + await pressed.view.close() + + components = AsComponents(confirm, deny) + await press.response.send_message(embed=embed, view=components, ephemeral=True) + + async def clear_button_refresh(self): + self.clear_button.label = self.bot.translator.t(_p( + 'ui:reminderlist|button:clear|label', + "Clear Reminders" + )) + + # New reminder button + @button(label="NEW_BUTTON_PLACEHOLDER", style=ButtonStyle.green) + async def new_button(self, press: discord.Interaction, pressed: Button): + """ + Pop up a modal for the user to enter new reminder information. + """ + t = self.bot.translator.t + if press.guild: + lmember = await self.bot.core.lions.fetch_member(press.guild.id, press.user.id) + timezone = lmember.timezone + else: + luser = await self.bot.core.lions.fetch_user(press.user.id) + timezone = luser.timezone + default = dt.datetime.now(tz=timezone).replace(hour=0, minute=0, second=0, microsecond=0) + + time_field = TextInput( + label=t(_p( + 'ui:reminderlist|button:new|modal|field:time|label', + "When would you like to be reminded?" + )), + placeholder=default.strftime('%Y-%m-%d %H:%M'), + required=True, + max_length=100, + ) + + interval_field = TextInput( + label=t(_p( + 'ui:reminderlist|button:new|modal|field:repeat|label', + "How often should the reminder repeat?" + )), + placeholder=t(_p( + 'ui:reminderlist|button:new|modal|field:repeat|placeholder', + "1 day 10 hours 5 minutes (Leave empty for no repeat.)" + )), + required=False, + max_length=100, + ) + + content_field = TextInput( + label=t(_p( + 'ui:reminderlist|button:new|modal|field:content|label', + "What should I remind you?" + )), + required=True, + style=TextStyle.long, + max_length=2000, + ) + + modal = ConfigEditor( + time_field, interval_field, content_field, + title=t(_p( + 'ui:reminderlist|button:new|modal|title', + "Set a Reminder" + )) + ) + + @modal.submit_callback() + async def create_reminder(interaction: discord.Interaction): + remind_at = await self.cog.parse_time_static(time_field.value, timezone) + if intervalstr := interval_field.value: + interval = parse_duration(intervalstr) + if interval is None: + raise UserInputError( + t(_p( + 'ui:reminderlist|button:new|modal|parse|error:interval', + "Cannot parse '{value}' as a duration." + )).format(value=intervalstr) + ) + else: + interval = None + + message = await self._original.original_response() + + reminder = await self.cog.create_reminder( + userid=self.userid, + remind_at=remind_at, + content=content_field.value, + message_link=message.jump_url, + interval=interval, + ) + embed = reminder.set_response + await interaction.response.send_message(embed=embed, ephemeral=True) + + await press.response.send_modal(modal) + + async def new_button_refresh(self): + self.new_button.label = self.bot.translator.t(_p( + 'ui:reminderlist|button:new|label', + "New Reminder" + )) + self.new_button.disabled = (len(self._reminders) >= 25) + + # Cancel menu + @select(cls=Select, placeholder="CANCEL_REMINDER_PLACEHOLDER", min_values=0, max_values=1) + async def cancel_menu(self, selection: discord.Interaction, selected): + """ + Select a number of reminders to delete. + """ + await selection.response.defer() + if selected.values: + # Hopefully this is a list of reminderids + values = selected.values + + # Delete from data + await self.cog.data.Reminder.table.delete_where(reminderid=values) + + # Send cancellation + await self.cog.talk_cancel(*values).send(self.cog.executor_name, wait_for_reply=False) + + self.cog._user_reminder_cache.pop(self.userid, None) + await self.refresh() + + async def cancel_menu_refresh(self): + t = self.bot.translator.t + self.cancel_menu.placeholder = t(_p( + 'ui:reminderlist|select:remove|placeholder', + "Select to cancel" + )) + self.cancel_menu.options = [ + SelectOption( + label=f"[{i}] {reminder.content[:50] + '...' * (len(reminder.content) > 50)}", + value=reminder.reminderid, + emoji=self.bot.config.emojis.getemoji('clock') + ) + for i, reminder in enumerate(self._reminders, start=1) + ] + self.cancel_menu.min_values = 0 + self.cancel_menu.max_values = len(self._reminders) + + # ----- UI Flow ----- + async def refresh_layout(self): + to_refresh = ( + self.cancel_menu_refresh(), + self.new_button_refresh(), + self.clear_button_refresh(), + ) + await asyncio.gather(*to_refresh) + + if self._reminders: + self.set_layout( + (self.new_button, self.clear_button,), + (self.cancel_menu,), + ) + else: + self.set_layout( + (self.new_button,), + ) + + async def make_message(self) -> MessageArgs: + t = self.bot.translator.t + reminders = self._reminders + + if reminders: + lines = [] + num_len = len(str(len(reminders))) + for i, reminder in enumerate(reminders): + lines.append( + "`[{:<{}}]` | {}".format( + i+1, + num_len, + reminder.formatted + ) + ) + description = '\n'.join(lines) + + embed = discord.Embed( + description=description, + colour=discord.Colour.orange(), + timestamp=utc_now() + ).set_author( + name=t(_p( + 'ui:reminderlist|embed:list|author', + "Your reminders" + )), + icon_url=self.user.avatar or self.user.default_avatar + ).set_footer( + text=t(_p( + 'ui:reminderlist|embed:list|footer', + "Click a reminder to jump back to the context!" + )) + ) + else: + embed = discord.Embed( + title=t(_p( + 'ui:reminderlist|embed:no_reminders|title', + "You have no reminders set!" + )).format( + remindme=self.bot.core.cmd_name_cache['remindme'].mention, + ), + colour=discord.Colour.dark_orange(), + ) + embed.add_field( + name=t(_p( + 'ui:reminderlist|embed|tips:name', + "Reminder Tips" + )), + value=t(_p( + 'ui:reminderlist|embed|tips:value', + "- Use {at_cmd} to set a reminder at a known time (e.g. `at 10 am`).\n" + "- Use {in_cmd} to set a reminder in a certain time (e.g. `in 2 hours`).\n" + "- Both commands support repeating reminders using the `every` parameter.\n" + "- Remember to tell me your timezone with {timezone_cmd} if you haven't already!" + )).format( + at_cmd=self.bot.core.mention_cmd('remindme at'), + in_cmd=self.bot.core.mention_cmd('remindme in'), + timezone_cmd=self.bot.core.mention_cmd('my timezone'), + ) + ) + + return MessageArgs(embed=embed) + + async def reload(self): + self._reminders = await self.cog.get_reminders_for(self.userid) diff --git a/src/modules/rolemenus/cog.py b/src/modules/rolemenus/cog.py index 8a875123..3618b4fd 100644 --- a/src/modules/rolemenus/cog.py +++ b/src/modules/rolemenus/cog.py @@ -287,7 +287,7 @@ class RoleMenuCog(LionCog): error = None message = None - splits = msgstr.strip().rsplit('/', maxsplit=2) + splits = msgstr.strip().rsplit('/', maxsplit=2)[-2:] if len(splits) == 2 and splits[0].isdigit() and splits[1].isdigit(): chid, mid = map(int, splits) channel = guild.get_channel(chid) @@ -678,7 +678,7 @@ class RoleMenuCog(LionCog): target_mine = True else: # Parse provided message link into a Message - target_message: discord.Message = await self._parse_msg(message) + target_message: discord.Message = await self._parse_msg(ctx.guild, message) target_mine = (target_message.author == ctx.guild.me) # Check that this message is not already attached to a role menu @@ -747,7 +747,7 @@ class RoleMenuCog(LionCog): message_data['content'] = target_message.content if target_message.embeds: message_data['embed'] = target_message.embeds[0].to_dict() - rawmessage = json.dumps(message_data) + rawmessagedata = json.dumps(message_data) else: if rawmessage is not None: # Attempt to parse rawmessage @@ -971,14 +971,21 @@ class RoleMenuCog(LionCog): ) # TODO: Generate the custom message from the template if it doesn't exist + # TODO: Pathway for setting menu style + if rawmessage is not None: msg_config = target.config.rawmessage content = await msg_config.download_attachment(rawmessage) - data = await msg_config._parse_string(content) + data = await msg_config._parse_string(0, content) update_args[msg_config._column] = data if template is None: update_args[self.data.RoleMenu.templateid.name] = None - ack_lines.append(msg_config.update_message) + ack_lines.append( + t(_p( + 'cmd:rolemenu_edit|parse:custom_message|success', + "Custom menu message updated." + )) + ) # Update the data, if applicable if update_args: @@ -1185,7 +1192,7 @@ class RoleMenuCog(LionCog): label: Optional[appcmds.Range[str, 1, 100]] = None, emoji: Optional[appcmds.Range[str, 0, 100]] = None, description: Optional[appcmds.Range[str, 0, 100]] = None, - price: Optional[appcmds.Range[int, 0, MAX_COINS]] = None, + price: Optional[appcmds.Range[int, -MAX_COINS, MAX_COINS]] = None, duration: Optional[Transform[int, DurationTransformer(60)]] = None, ): # Type checking guards @@ -1356,7 +1363,7 @@ class RoleMenuCog(LionCog): await target.update_message() if target_is_reaction: try: - await self.menu.update_reactons() + await target.update_reactons() except SafeCancellation as e: embed.add_field( name=t(_p( @@ -1441,7 +1448,7 @@ class RoleMenuCog(LionCog): label: Optional[appcmds.Range[str, 1, 100]] = None, emoji: Optional[appcmds.Range[str, 0, 100]] = None, description: Optional[appcmds.Range[str, 0, 100]] = None, - price: Optional[appcmds.Range[int, 0, MAX_COINS]] = None, + price: Optional[appcmds.Range[int, -MAX_COINS, MAX_COINS]] = None, duration: Optional[Transform[int, DurationTransformer(60)]] = None, ): # Type checking wards diff --git a/src/modules/rolemenus/rolemenu.py b/src/modules/rolemenus/rolemenu.py index da25d30c..fcaafdcf 100644 --- a/src/modules/rolemenus/rolemenu.py +++ b/src/modules/rolemenus/rolemenu.py @@ -165,7 +165,7 @@ class RoleMenu: await menu.attach() return menu - async def fetch_message(self, refresh=False): + async def fetch_message(self, refresh=False) -> Optional[discord.Message]: """ Fetch the message the menu is attached to. """ @@ -529,11 +529,17 @@ class RoleMenu: "Role removed" )) ) - if total_refund: + if total_refund > 0: embed.description = t(_p( 'rolemenu|deselect|success:refund|desc', "You have removed **{role}**, and been refunded {coin} **{amount}**." )).format(role=role.name, coin=self.bot.config.emojis.coin, amount=total_refund) + if total_refund < 0: + # TODO: Consider disallowing them from removing roles if their balance would go negative + embed.description = t(_p( + 'rolemenu|deselect|success:negrefund|desc', + "You have removed **{role}**, and have lost {coin} **{amount}**." + )).format(role=role.name, coin=self.bot.config.emojis.coin, amount=-total_refund) else: embed.description = t(_p( 'rolemenu|deselect|success:norefund|desc', @@ -551,7 +557,7 @@ class RoleMenu: raise UserInputError( t(_p( 'rolemenu|select|error:required_role', - "You need to have the **{role}** role to use this!" + "You need to have the role **{role}** required to use this menu!" )).format(role=name) ) @@ -647,7 +653,7 @@ class RoleMenu: "Role equipped" )) ) - if price > 0: + if price: embed.description = t(_p( 'rolemenu|select|success:purchase|desc', "You have purchased the role **{role}** for {coin}**{amount}**" @@ -665,6 +671,7 @@ class RoleMenu: )).format( timestamp=discord.utils.format_dt(expiry) ) + # TODO Event logging return embed async def interactive_selection(self, interaction: discord.Interaction, menuroleid: int): diff --git a/src/modules/rolemenus/roleoptions.py b/src/modules/rolemenus/roleoptions.py index e3ab699c..bdcc8d89 100644 --- a/src/modules/rolemenus/roleoptions.py +++ b/src/modules/rolemenus/roleoptions.py @@ -1,14 +1,17 @@ +from typing import Optional import discord from settings import ModelData from settings.groups import SettingGroup, ModelConfig, SettingDotDict from settings.setting_types import ( - RoleSetting, BoolSetting, StringSetting, DurationSetting, EmojiSetting + RoleSetting, StringSetting, DurationSetting, EmojiSetting ) from core.setting_types import CoinSetting from utils.ui import AButton, AsComponents from meta.errors import UserInputError +from meta import conf from babel.translator import ctx_translator +from constants import MAX_COINS from .data import RoleMenuData from . import babel @@ -74,6 +77,9 @@ class RoleMenuRoleOptions(SettingGroup): "This menu item will now give the role {role}." )).format(role=self.formatted) return resp + else: + raise ValueError("Attempt to call update_message without a value.") + @RoleMenuRoleConfig.register_model_setting class Label(ModelData, StringSetting): @@ -138,7 +144,9 @@ class RoleMenuRoleOptions(SettingGroup): return button @classmethod - async def _parse_string(cls, parent_id, string: str, interaction: discord.Interaction = None, **kwargs): + async def _parse_string(cls, parent_id, string: str, + interaction: Optional[discord.Interaction] = None, + **kwargs): emojistr = await super()._parse_string(parent_id, string, interaction=interaction, **kwargs) if emojistr and interaction is not None: # Use the interaction to test @@ -151,7 +159,7 @@ class RoleMenuRoleOptions(SettingGroup): view=view, ) except discord.HTTPException: - t = interaction.client.translator.t + t = ctx_translator.get().t raise UserInputError(t(_p( 'roleset:emoji|error:test_emoji', "The selected emoji `{emoji}` is invalid or has been deleted." @@ -218,34 +226,43 @@ class RoleMenuRoleOptions(SettingGroup): _display_name = _p('roleset:price', "price") _desc = _p( 'roleset:price|desc', - "Price of the role, in LionCoins." + "Price of the role, in LionCoins. May be negative." ) _long_desc = _p( 'roleset:price|long_desc', - "How much the role costs when selected, in LionCoins." + "How many LionCoins should be deducted from a member's account " + "when they equip this role through this menu.\n" + "The price may be negative, in which case the member will instead be rewarded " + "coins when they equip the role." ) _accepts = _p( 'roleset:price|accepts', - "Amount of coins that the role costs." + "Amount of coins that the role costs when equipped." ) _default = 0 + _min = - MAX_COINS _model = RoleMenuData.RoleMenuRole _column = RoleMenuData.RoleMenuRole.price.name @property def update_message(self) -> str: t = ctx_translator.get().t - value = self.value - if value: + value = self.value or 0 + if value > 0: resp = t(_p( - 'roleset:price|set_response:set', - "This role will now cost {price} to equip." - )).format(price=self.formatted) + 'roleset:price|set_response:positive', + "Equipping this role will now cost {coin}**{price}**." + )).format(price=value, coin=conf.emojis.coin) + elif value == 0: + resp = t(_p( + 'roleset:price|set_response:zero', + "Equipping this role is now free." + )) else: resp = t(_p( - 'roleset:price|set_response:unset', - "This role will now be free to equip from this role menu." - )) + 'roleset:price|set_response:negative', + "Equipping this role will now reward {coin}**{price}**." + )).format(price=-value, coin=conf.emojis.coin) return resp @RoleMenuRoleConfig.register_model_setting diff --git a/src/modules/rolemenus/templates.py b/src/modules/rolemenus/templates.py index 3c93017b..6c28db0d 100644 --- a/src/modules/rolemenus/templates.py +++ b/src/modules/rolemenus/templates.py @@ -174,7 +174,7 @@ async def threecolumn_template(menu) -> MessageArgs: ) async def shop_template(menu) -> MessageArgs: menuroles = menu.roles - width = max(len(str(menurole.config.price.data)) for menurole in menuroles) + width = max(len(str(menurole.config.price.data)) for menurole in menuroles) if menuroles else 0 lines = [] for menurole in menuroles: diff --git a/src/modules/rolemenus/ui/menueditor.py b/src/modules/rolemenus/ui/menueditor.py index 3af0101f..55c949e3 100644 --- a/src/modules/rolemenus/ui/menueditor.py +++ b/src/modules/rolemenus/ui/menueditor.py @@ -190,7 +190,10 @@ class MenuEditor(MessageUI): if not userstr: new_data = None else: - new_data = await instance._parse_string(instance.parent_id, userstr) + new_data = await instance._parse_string( + instance.parent_id, userstr, + guildid=self.menu.data.guildid + ) instance.data = new_data modified.append(instance) if modified: @@ -349,7 +352,9 @@ class MenuEditor(MessageUI): if not userstr: new_data = None else: - new_data = await instance._parse_string(instance.parent_id, userstr, interaction=interaction) + new_data = await instance._parse_string( + instance.parent_id, userstr, interaction=interaction + ) instance.data = new_data modified.append(instance) if modified: @@ -644,7 +649,7 @@ class MenuEditor(MessageUI): self.bot, json.loads(self.menu.data.rawmessage), callback=self._editor_callback, callerid=self._callerid ) self._slaves.append(editor) - await editor.run(interaction) + await editor.run(interaction, ephemeral=True) # Template/Custom Menu @select(cls=Select, placeholder="TEMPLATE_MENU_PLACEHOLDER", min_values=1, max_values=1) @@ -821,20 +826,15 @@ class MenuEditor(MessageUI): """ Display or update the preview message. """ - args = await self.menu.make_args() - view = await self.menu.make_view() if self._preview is not None: try: await self._preview.delete_original_response() except discord.HTTPException: pass self._preview = None - await press.response.send_message( - **args.send_args, - view=view or discord.utils.MISSING, - ephemeral=True - ) + await press.response.defer(thinking=True, ephemeral=True) self._preview = press + await self.update_preview() async def preview_button_refresh(self): t = self.bot.translator.t @@ -887,13 +887,14 @@ class MenuEditor(MessageUI): description=desc ) await selection.edit_original_response(embed=embed) - except discord.HTTPException: + except discord.HTTPException as e: error = discord.Embed( colour=discord.Colour.brand_red(), description=t(_p( 'ui:menu_editor|button:repost|widget:repost|error:post_failed', - "An error ocurred while posting to {channel}. Do I have sufficient permissions?" - )).format(channel=channel.mention) + "An unknown error ocurred while posting to {channel}!\n" + "**Error:** `{exception}`" + )).format(channel=channel.mention, exception=e.text) ) await selection.edit_original_response(embed=error) else: @@ -948,7 +949,7 @@ class MenuEditor(MessageUI): title=title, description=desc ) # Send as response with the repost widget attached - await press.response.send_message(embed=embed, view=AsComponents(repost_widget)) + await press.response.send_message(embed=embed, view=AsComponents(repost_widget), ephemeral=True) async def repost_button_refresh(self): t = self.bot.translator.t @@ -1039,7 +1040,7 @@ class MenuEditor(MessageUI): role_index = int(splits[i-1]) mrole = self.menu.roles[role_index] - error = discord.Embed( + embed = discord.Embed( colour=discord.Colour.brand_red(), title=t(_p( 'ui:menu_editor|error:invald_emoji|title', @@ -1051,7 +1052,7 @@ class MenuEditor(MessageUI): )).format(emoji=mrole.config.emoji.data, label=mrole.config.label.data) ) await mrole.data.update(emoji=None) - await self.channel.send(embed=error) + await self.channel.send(embed=embed) async def _redraw(self, args): try: diff --git a/src/modules/rooms/cog.py b/src/modules/rooms/cog.py index 0bf434d7..9adc4f91 100644 --- a/src/modules/rooms/cog.py +++ b/src/modules/rooms/cog.py @@ -57,6 +57,21 @@ class RoomCog(LionCog): for task in self._ticker_tasks.values(): task.cancel() + def get_rooms(self, guildid: int, userid: Optional[int] = None): + """ + Get the private rooms in the given guild, using cache. + + If `userid` is provided, filters by rooms which the given user is a member or owner of. + """ + guild_rooms = self._room_cache[guildid] + if userid: + rooms = { + cid: room for cid, room in guild_rooms.items() if userid in room.members or userid == room.data.ownerid + } + else: + rooms = guild_rooms + return rooms + async def _prepare_rooms(self, room_data: list[RoomData.Room]): """ Launch or destroy rooms from the provided room data. diff --git a/src/modules/rooms/lib.py b/src/modules/rooms/lib.py index cb35eec9..9e7cd069 100644 --- a/src/modules/rooms/lib.py +++ b/src/modules/rooms/lib.py @@ -29,12 +29,9 @@ member_overwrite = discord.PermissionOverwrite( ) owner_overwrite = discord.PermissionOverwrite.from_pair(*member_overwrite.pair()) owner_overwrite.update( - manage_channels=True, manage_webhooks=True, + manage_channels=True, manage_messages=True, - create_public_threads=True, - create_private_threads=True, - manage_threads=True, move_members=True, ) bot_overwrite = discord.PermissionOverwrite.from_pair(*owner_overwrite.pair()) diff --git a/src/modules/rooms/roomui.py b/src/modules/rooms/roomui.py index 6d6d768c..5d0a6b16 100644 --- a/src/modules/rooms/roomui.py +++ b/src/modules/rooms/roomui.py @@ -233,8 +233,8 @@ class RoomUI(MessageUI): await submit.edit_original_response( content=t(_p( 'ui:room_status|button:timer|timer_created', - "Timer created successfully! Use `/pomodoro edit` to configure further." - )) + "Timer created successfully! Use {edit_cmd} to configure further." + )).format(edit_cmd=self.bot.core.mention_cmd('pomodoro edit')) ) await self.refresh() except UserInputError: diff --git a/src/modules/schedule/cog.py b/src/modules/schedule/cog.py index 75d56642..39b60960 100644 --- a/src/modules/schedule/cog.py +++ b/src/modules/schedule/cog.py @@ -13,6 +13,7 @@ from meta import LionCog, LionBot, LionContext from meta.logger import log_wrap from meta.errors import UserInputError, ResponseTimedOut from meta.sharding import THIS_SHARD +from meta.monitor import ComponentMonitor, ComponentStatus, StatusLevel from utils.lib import utc_now, error_embed from utils.ui import Confirm from utils.data import MULTIVALUE_IN, MEMBERS @@ -38,6 +39,10 @@ class ScheduleCog(LionCog): self.bot = bot self.data: ScheduleData = bot.db.load_registry(ScheduleData()) self.settings = ScheduleSettings() + self.monitor = ComponentMonitor( + 'ScheduleCog', + self._monitor + ) # Whether we are ready to take events self.initialised = asyncio.Event() @@ -57,12 +62,56 @@ class ScheduleCog(LionCog): self.session_channels = self.settings.SessionChannels._cache + async def _monitor(self): + nowid = self.nowid + now = None + now_lock = self.slotlock(nowid) + if not self.initialised.is_set(): + level = StatusLevel.STARTING + info = ( + "(STARTING) " + "Not ready. " + "Spawn task is {spawn}. " + "Spawn lock is {spawn_lock}. " + "Active slots {active}." + ) + elif nowid not in self.active_slots: + level = StatusLevel.UNSURE + info = ( + "(UNSURE) " + "Setup, but current slotid {nowid} not active. " + "Spawn task is {spawn}. " + "Spawn lock is {spawn_lock}. " + "Now lock is {now_lock}. " + "Active slots {active}." + ) + else: + now = self.active_slots[nowid] + level = StatusLevel.OKAY + info = ( + "(OK) " + "Running current slot {now}. " + "Spawn lock is {spawn_lock}. " + "Now lock is {now_lock}. " + "Active slots {active}." + ) + data = { + 'spawn': self.spawn_task, + 'spawn_lock': self.spawn_lock, + 'active': self.active_slots, + 'nowid': nowid, + 'now_lock': now_lock, + 'now': now, + } + return ComponentStatus(level, info, info, data) + @property def nowid(self): now = utc_now() return time_to_slotid(now) async def cog_load(self): + self.bot.system_monitor.add_component(self.monitor) await self.data.init() # Update the session channel cache diff --git a/src/modules/schedule/core/session.py b/src/modules/schedule/core/session.py index cd884c72..da266a9b 100644 --- a/src/modules/schedule/core/session.py +++ b/src/modules/schedule/core/session.py @@ -253,6 +253,12 @@ class ScheduledSession: overwrites = room.overwrites for member in members: mobj = guild.get_member(member.userid) + if not mobj and not guild.chunked: + self.bot.request_chunking_for(guild) + try: + mobj = await guild.fetch_member(member.userid) + except discord.HTTPException: + mobj = None if mobj: overwrites[mobj] = discord.PermissionOverwrite(connect=True, view_channel=True) try: @@ -297,6 +303,13 @@ class ScheduledSession: } for member in members: mobj = guild.get_member(member.userid) + if not mobj and not guild.chunked: + self.bot.request_chunking_for(guild) + try: + mobj = await guild.fetch_member(member.userid) + except discord.HTTPException: + mobj = None + if mobj: overwrites[mobj] = discord.PermissionOverwrite(connect=True, view_channel=True) try: diff --git a/src/modules/schedule/core/timeslot.py b/src/modules/schedule/core/timeslot.py index 1669b780..200c3e1b 100644 --- a/src/modules/schedule/core/timeslot.py +++ b/src/modules/schedule/core/timeslot.py @@ -440,7 +440,7 @@ class TimeSlot: ) def launch(self) -> asyncio.Task: - self.run_task = asyncio.create_task(self.run()) + self.run_task = asyncio.create_task(self.run(), name=f"TimeSlot {self.slotid}") return self.run_task @log_wrap(action="TimeSlot Run") diff --git a/src/modules/shop/cog.py b/src/modules/shop/cog.py index 644d9297..a6885751 100644 --- a/src/modules/shop/cog.py +++ b/src/modules/shop/cog.py @@ -114,8 +114,10 @@ class Shopping(LionCog): return @cmds.hybrid_group( - name=_p('group:shop', 'shop') + name=_p('cmd:shop', 'shop'), + description=_p('cmd:shop|desc', "Purchase coloures, roles, and other goodies with LionCoins.") ) + @appcmds.guild_only async def shop_group(self, ctx: LionContext): return @@ -123,6 +125,7 @@ class Shopping(LionCog): name=_p('cmd:shop_open', 'open'), description=_p('cmd:shop_open|desc', "Open the server shop.") ) + @appcmds.guild_only async def shop_open_cmd(self, ctx: LionContext): """ Opens the shop UI for the current guild. @@ -188,8 +191,8 @@ class StoreManager(ui.LeoUI): Ask the current shop widget to redraw. """ self.page_num %= len(self.stores) - await self.stores[self.page_num].refresh() - await self.stores[self.page_num].redraw() + store = self.stores[self.page_num] + await store.refresh() def make_buttons(self): """ diff --git a/src/modules/shop/shops/base.py b/src/modules/shop/shops/base.py index 99e53836..0222a3b2 100644 --- a/src/modules/shop/shops/base.py +++ b/src/modules/shop/shops/base.py @@ -5,7 +5,7 @@ import discord from discord.ui.button import Button from meta import LionBot, LionCog -from utils import ui +from utils.ui import MessageUI from babel.translator import LazyStr from ..data import ShopData @@ -165,7 +165,7 @@ class Shop: return self._store_cls_(self) -class Store(ui.LeoUI): +class Store(MessageUI): """ ABC for the UI used to interact with a given shop. @@ -174,7 +174,7 @@ class Store(ui.LeoUI): (Note that each Shop instance is specific to a single customer.) """ def __init__(self, shop: Shop, interaction: discord.Interaction, **kwargs): - super().__init__(**kwargs) + super().__init__(callerid=interaction.user.id, **kwargs) # The shop this Store is an interface for # Client, shop, and customer data is taken from here @@ -189,36 +189,10 @@ class Store(ui.LeoUI): self.embed: Optional[discord.Embed] = None # Current interaction to use - self.interaction: discord.Interaction = interaction + self._original = interaction + # ----- UI API ----- def set_store_row(self, row): self.store_row = row for item in row: self.add_item(item) - - async def refresh(self): - """ - Refresh all UI elements. - """ - raise NotImplementedError - - async def redraw(self): - """ - Redraw the store UI. - """ - if self.interaction.is_expired(): - # This is actually possible, - # If the user keeps using the UI, - # but never closes it until the origin interaction expires - raise ValueError("This interaction has expired!") - - if self.embed is None: - await self.refresh() - - await self.interaction.edit_original_response(embed=self.embed, view=self) - - async def make_embed(self): - """ - Embed page for this shop. - """ - raise NotImplementedError diff --git a/src/modules/shop/shops/colours.py b/src/modules/shop/shops/colours.py index 82f9e6a1..a2add0ed 100644 --- a/src/modules/shop/shops/colours.py +++ b/src/modules/shop/shops/colours.py @@ -8,12 +8,13 @@ from discord import app_commands as appcmds from discord.ui.select import select, Select, SelectOption from discord.ui.button import button, Button +from meta import conf from meta import LionCog, LionContext, LionBot from meta.errors import SafeCancellation from meta.logger import log_wrap -from utils import ui -from utils.lib import error_embed +from utils.lib import error_embed, MessageArgs from constants import MAX_COINS +from wards import equippable_role from .. import babel @@ -292,6 +293,7 @@ class ColourShop(Shop): ) except discord.HTTPException: # Possibly Forbidden, or the role doesn't actually exist anymore (cache failure) + # TODO: Event log pass await self.data.MemberInventory.table.delete_where(inventoryid=owned.data.inventoryid) @@ -414,7 +416,8 @@ class ColourShopping(ShopCog): item_type=self._shop_cls_._item_type_, deleted=False ) - if len(current) >= 25: + # Disabled because we can support more than 25 colours + if False and len(current) >= 25: raise SafeCancellation( t(_p( 'cmd:editshop_colours_create|error:max_colours', @@ -709,7 +712,7 @@ class ColourShopping(ShopCog): item_type=self._shop_cls_._item_type_, deleted=False ) - if len(current) >= 25: + if False and len(current) >= 25: raise SafeCancellation( t(_p( 'cmd:editshop_colours_add|error:max_colours', @@ -738,7 +741,7 @@ class ColourShopping(ShopCog): ) # Check that the author has permission to manage this role - if not (ctx.author.guild_permissions.manage_roles and ctx.author.top_role > role): + if not (ctx.author.guild_permissions.manage_roles): raise SafeCancellation( t(_p( 'cmd:editshop_colours_add|error:caller_perms', @@ -747,6 +750,9 @@ class ColourShopping(ShopCog): )).format(mention=role.mention) ) + # Final catch-all with more general error messages + await equippable_role(self.bot, role, ctx.author) + if role.permissions.administrator: raise SafeCancellation( t(_p( @@ -1016,7 +1022,7 @@ class ColourShopping(ShopCog): item = items[0] # Delete the item, respecting the delete setting. - await self.data.ShopItem.table.update_where(itemid=item.itemid, deleted=True) + await self.data.ShopItem.table.update_where(itemid=item.itemid).set(deleted=True) if delete_role: role = ctx.guild.get_role(item.roleid) @@ -1093,6 +1099,24 @@ class ColourStore(Store): """ shop: ColourShop + page_len = 25 + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.pagen = 0 + self.blocks = [[]] + + @property + def page_count(self): + return len(self.blocks) + + @property + def this_page(self): + self.pagen %= self.page_count + return self.blocks[self.pagen] + + # ----- UI Components ----- @select(placeholder="SELECT_PLACEHOLDER") async def select_colour(self, interaction: discord.Interaction, selection: Select): t = self.shop.bot.translator.t @@ -1143,7 +1167,7 @@ class ColourStore(Store): selector = self.select_colour # Get the list of ColourRoleItems that may be purchased - purchasable = self.shop.purchasable() + purchasable = [item for item in self.shop.purchasable() if item in self.this_page] owned = self.shop.owned() option_map: dict[int, SelectOption] = {} @@ -1168,37 +1192,54 @@ class ColourStore(Store): selector.disabled = False selector.options = list(option_map.values()) - async def refresh(self): - """ - Refresh the UI elements - """ + @button(emoji=conf.emojis.forward) + async def next_page_button(self, press: discord.Interaction, pressed: Button): + await press.response.defer() + self.pagen += 1 + await self.refresh() + + @button(emoji=conf.emojis.backward) + async def prev_page_button(self, press: discord.Interaction, pressed: Button): + await press.response.defer() + self.pagen -= 1 + await self.refresh() + + # ----- UI Flow ----- + async def reload(self): + items = self.shop.items + self.blocks = [ + items[i:i+self.page_len] for i in range(0, len(items), self.page_len) + ] or [[]] + + async def refresh_layout(self): await self.select_colour_refresh() - if not self.select_colour.options: - self._layout = [self.store_row] + if self.page_count > 1: + buttons = (self.prev_page_button, *self.store_row, self.next_page_button) else: - self._layout = [(self.select_colour,), self.store_row] + buttons = self.store_row + if not self.select_colour.options: + self._layout = [buttons] + else: + self._layout = [(self.select_colour,), buttons] - self.embed = self.make_embed() - - def make_embed(self): - """ - Embed for this shop. - """ + async def make_message(self) -> MessageArgs: t = self.shop.bot.translator.t + owned = self.shop.owned() if self.shop.items: - owned = self.shop.owned() + page_items = self.this_page + page_start = self.pagen * self.page_len + 1 lines = [] - for i, item in enumerate(self.shop.items): + for i, item in enumerate(page_items): if owned is not None and item.itemid == owned.itemid: line = t(_p( 'ui:colourstore|embed|line:owned_item', "`[{j:02}]` | `{price} LC` | {mention} (You own this!)" - )).format(j=i+1, price=item.price, mention=item.mention) + )).format(j=i+page_start, price=item.price, mention=item.mention) else: line = t(_p( 'ui:colourstore|embed|line:item', "`[{j:02}]` | `{price} LC` | {mention}" - )).format(j=i+1, price=item.price, mention=item.mention) + )).format(j=i+page_start, price=item.price, mention=item.mention) lines.append(line) description = '\n'.join(lines) else: @@ -1210,4 +1251,23 @@ class ColourStore(Store): title=t(_p('ui:colourstore|embed|title', "Colour Role Shop")), description=description ) - return embed + if self.page_count > 1: + footer = t(_p( + 'ui:colourstore|embed|footer:paged', + "Page {current}/{total}" + )).format(current=self.pagen + 1, total=self.page_count) + embed.set_footer(text=footer) + if owned: + embed.add_field( + name=t(_p( + 'ui:colourstore|embed|field:warning|name', + "Note!" + )), + value=t(_p( + 'ui:colourstore|embed|field:warning|value', + "Purchasing a new colour role will *replace* your currently colour " + "{current} without refund!" + )).format(current=owned.mention) + ) + + return MessageArgs(embed=embed) diff --git a/src/modules/statistics/cog.py b/src/modules/statistics/cog.py index b778f039..1ef512d5 100644 --- a/src/modules/statistics/cog.py +++ b/src/modules/statistics/cog.py @@ -1,3 +1,4 @@ +import asyncio import logging from typing import Optional @@ -90,8 +91,12 @@ class StatsCog(LionCog): )).format(loading=self.bot.config.emojis.loading), timestamp=utc_now(), ) - await ctx.interaction.response(embed=waiting_embed) - await ctx.guild.chunk() + await ctx.interaction.response.send_message(embed=waiting_embed) + try: + await asyncio.wait_for(ctx.guild.chunk(), timeout=10) + pass + except asyncio.TimeoutError: + pass else: await ctx.interaction.response.defer(thinking=True) ui = LeaderboardUI(self.bot, ctx.author, ctx.guild) @@ -141,13 +146,7 @@ class StatsCog(LionCog): # Send update ack if modified: - # TODO - description = t(_p( - 'cmd:configure_statistics|resp:success|desc', - "Activity ranks and season leaderboard will now be measured from {season_start}." - )).format( - season_start=setting_season_start.formatted - ) + description = setting_season_start.update_message embed = discord.Embed( colour=discord.Colour.brand_green(), description=description diff --git a/src/modules/statistics/data.py b/src/modules/statistics/data.py index 341c253e..30448701 100644 --- a/src/modules/statistics/data.py +++ b/src/modules/statistics/data.py @@ -539,21 +539,21 @@ class StatsData(Registry): _timestamp = Timestamp() @classmethod - async def fetch_tags(self, guildid: Optional[int], userid: int): - tags = await self.fetch_where(guildid=guildid, userid=userid) + async def fetch_tags(cls, guildid: Optional[int], userid: int): + tags = await cls.fetch_where(guildid=guildid, userid=userid).order_by(cls.tagid) if not tags and guildid is not None: - tags = await self.fetch_where(guildid=None, userid=userid) + tags = await cls.fetch_where(guildid=None, userid=userid) return [tag.tag for tag in tags] @classmethod @log_wrap(action='set_profile_tags') - async def set_tags(self, guildid: Optional[int], userid: int, tags: Iterable[str]): - async with self._connector.connection() as conn: - self._connector.conn = conn + async def set_tags(cls, guildid: Optional[int], userid: int, tags: Iterable[str]): + async with cls._connector.connection() as conn: + cls._connector.conn = conn async with conn.transaction(): - await self.table.delete_where(guildid=guildid, userid=userid) + await cls.table.delete_where(guildid=guildid, userid=userid) if tags: - await self.table.insert_many( + await cls.table.insert_many( ('guildid', 'userid', 'tag'), *((guildid, userid, tag) for tag in tags) ) diff --git a/src/modules/statistics/graphics/goals.py b/src/modules/statistics/graphics/goals.py index b16d9da3..86181bed 100644 --- a/src/modules/statistics/graphics/goals.py +++ b/src/modules/statistics/graphics/goals.py @@ -6,6 +6,7 @@ from meta import LionBot from gui.cards import WeeklyGoalCard, MonthlyGoalCard from gui.base import CardMode from tracking.text.data import TextTrackerData +from modules.schedule.lib import time_to_slotid from .. import logger from ..data import StatsData @@ -81,8 +82,33 @@ async def get_goals_card( middle_completed = (await model.user_messages_between(userid, start, end))[0] # Compute schedule session progress - # TODO - sessions_complete = 0.5 + attendance = None + schedule_cog = bot.get_cog('ScheduleCog') + if schedule_cog: + booking_model = schedule_cog.data.ScheduleSessionMember + startid = time_to_slotid(start) + endid = time_to_slotid(end) + query = booking_model.table.select_where( + booking_model.slotid >= startid, + booking_model.slotid < endid, + userid=userid + ) + if guildid: + query.where(guildid=guildid) + + query.select( + _booked='COUNT(*)', + _attended='COUNT(*) FILTER (WHERE attended)', + ) + query.with_no_adapter() + + records = await query + if records: + record = records[0] + attended = record['_attended'] + booked = record['_booked'] + if booked: + attendance = attended / booked # Get member profile if user: @@ -105,7 +131,7 @@ async def get_goals_card( tasks_goal=goals['task_goal'], studied_hours=middle_completed, studied_goal=middle_goal, - attendance=sessions_complete, + attendance=attendance, goals=tasks, date=today, skin={'mode': mode} diff --git a/src/modules/statistics/graphics/monthly.py b/src/modules/statistics/graphics/monthly.py index 45573f78..c6855a2a 100644 --- a/src/modules/statistics/graphics/monthly.py +++ b/src/modules/statistics/graphics/monthly.py @@ -10,6 +10,7 @@ from tracking.text.data import TextTrackerData from ..data import StatsData from ..lib import apply_month_offset +from .. import logger async def get_monthly_card(bot: LionBot, userid: int, guildid: int, offset: int, mode: CardMode) -> MonthlyStatsCard: @@ -65,6 +66,7 @@ async def get_monthly_card(bot: LionBot, userid: int, guildid: int, offset: int, current_streak = 0 longest_streak = 0 else: + first_session = first_session.astimezone(lion.timezone) first_day = first_session.replace(hour=0, minute=0, second=0, microsecond=0) # first_month = first_day.replace(day=1) @@ -77,7 +79,19 @@ async def get_monthly_card(bot: LionBot, userid: int, guildid: int, offset: int, requests.append(day) # Request times between requested days - day_stats = await req(*reqkey, *requests) + if len(requests) > 1: + day_stats = await req(*reqkey, *requests) + else: + day_stats = [] + logger.warning( + "Requesting monthly card with no active days. " + f"offset={offset} " + f"first_session={first_session} " + f"today={today} " + f"target_end={target_end} " + f"userid={userid} " + f"guildid={guildid}" + ) # Compute current streak and longest streak current_streak = 0 diff --git a/src/modules/statistics/graphics/profile.py b/src/modules/statistics/graphics/profile.py index a642793f..3a413d4a 100644 --- a/src/modules/statistics/graphics/profile.py +++ b/src/modules/statistics/graphics/profile.py @@ -44,7 +44,7 @@ async def get_profile_card(bot: LionBot, userid: int, guildid: int): if crank: roleid = crank.roleid role = guild.get_role(roleid) - name = role.name if role else str(role.id) + name = role.name if role else 'Unknown Rank' minimum = crank.required maximum = nrank.required if nrank else None rangestr = format_stat_range(rank_type, minimum, maximum) @@ -63,7 +63,7 @@ async def get_profile_card(bot: LionBot, userid: int, guildid: int): if nrank: roleid = nrank.roleid role = guild.get_role(roleid) - name = role.name if role else str(role.id) + name = role.name if role else 'Unknown Rank' minimum = nrank.required guild_ranks = await ranks.get_guild_ranks(guildid) diff --git a/src/modules/statistics/settings.py b/src/modules/statistics/settings.py index 236ee0d5..375c577f 100644 --- a/src/modules/statistics/settings.py +++ b/src/modules/statistics/settings.py @@ -94,7 +94,8 @@ class StatisticsSettings(SettingGroup): 'guildset:season_start|long_desc', "Activity ranks will be determined based on tracked activity since this time, " "and the leaderboard will display activity since this time by default. " - "Unset to disable seasons and use all-time statistics instead." + "Unset to disable seasons and use all-time statistics instead.\n" + "Provided dates and times are assumed to be in the guild `timezone`, so set this first!" ) _accepts = _p( 'guildset:season_start|accepts', @@ -134,7 +135,8 @@ class StatisticsSettings(SettingGroup): resp = t(_p( 'guildset:season_start|set_response|set', "The leaderboard season and activity ranks will now count from {timestamp}. " - "Member ranks will update when they are next active. Use {rank_cmd} to refresh immediately." + "Member ranks will update when they are next active.\n" + "Use {rank_cmd} and press **Refresh Member Ranks** to refresh all ranks immediately." )).format( timestamp=self.formatted, rank_cmd=bot.core.mention_cmd('ranks') @@ -143,7 +145,8 @@ class StatisticsSettings(SettingGroup): resp = t(_p( 'guildset:season_start|set_response|unset', "The leaderboard and activity ranks will now count all-time statistics. " - "Member ranks will update when they are next active. Use {rank_cmd} to refresh immediately." + "Member ranks will update when they are next active.\n" + "Use {rank_cmd} and press **Refresh Member Ranks** to refresh all ranks immediately." )).format(rank_cmd=bot.core.mention_cmd('ranks')) return resp diff --git a/src/modules/statistics/ui/leaderboard.py b/src/modules/statistics/ui/leaderboard.py index 4abbbfcc..bf2f9206 100644 --- a/src/modules/statistics/ui/leaderboard.py +++ b/src/modules/statistics/ui/leaderboard.py @@ -75,6 +75,8 @@ class LeaderboardUI(StatsUI): # (type, period) -> (pagen -> Optional[Future[Card]]) self.cache = {} + self.was_chunked: bool = guild.chunked + async def run(self, interaction: discord.Interaction): self._original = interaction @@ -90,6 +92,8 @@ class LeaderboardUI(StatsUI): periods[LBPeriod.DAY] = lguild.today periods[LBPeriod.WEEK] = lguild.week_start periods[LBPeriod.MONTH] = lguild.month_start + alltime = (lguild.data.first_joined_at or interaction.guild.created_at).astimezone(lguild.timezone) + periods[LBPeriod.ALLTIME] = alltime self.period_starts = periods self.focused = True @@ -134,6 +138,7 @@ class LeaderboardUI(StatsUI): # Filter out members which are not in the server and unranked roles and bots # Usually hits cache + self.was_chunked = self.guild.chunked unranked_setting = await self.bot.get_cog('StatsCog').settings.UnrankedRoles.get(self.guild.id) unranked_roleids = set(unranked_setting.data) true_leaderboard = [] @@ -297,42 +302,42 @@ class LeaderboardUI(StatsUI): @button(label="This Season", style=ButtonStyle.grey) async def season_button(self, press: discord.Interaction, pressed: Button): - await press.response.defer(thinking=True) + await press.response.defer(thinking=True, ephemeral=True) self.current_period = LBPeriod.SEASON self.focused = True await self.refresh(thinking=press) @button(label="Today", style=ButtonStyle.grey) async def day_button(self, press: discord.Interaction, pressed: Button): - await press.response.defer(thinking=True) + await press.response.defer(thinking=True, ephemeral=True) self.current_period = LBPeriod.DAY self.focused = True await self.refresh(thinking=press) @button(label="This Week", style=ButtonStyle.grey) async def week_button(self, press: discord.Interaction, pressed: Button): - await press.response.defer(thinking=True) + await press.response.defer(thinking=True, ephemeral=True) self.current_period = LBPeriod.WEEK self.focused = True await self.refresh(thinking=press) @button(label="This Month", style=ButtonStyle.grey) async def month_button(self, press: discord.Interaction, pressed: Button): - await press.response.defer(thinking=True) + await press.response.defer(thinking=True, ephemeral=True) self.current_period = LBPeriod.MONTH self.focused = True await self.refresh(thinking=press) @button(label="All Time", style=ButtonStyle.grey) async def alltime_button(self, press: discord.Interaction, pressed: Button): - await press.response.defer(thinking=True) + await press.response.defer(thinking=True, ephemeral=True) self.current_period = LBPeriod.ALLTIME self.focused = True await self.refresh(thinking=press) @button(emoji=conf.emojis.backward, style=ButtonStyle.grey) async def prev_button(self, press: discord.Interaction, pressed: Button): - await press.response.defer(thinking=True) + await press.response.defer(thinking=True, ephemeral=True) self.pagen -= 1 self.focused = False await self.refresh(thinking=press) @@ -432,28 +437,44 @@ class LeaderboardUI(StatsUI): """ Generate UI message arguments from stored data """ + t = self.bot.translator.t + chunk_warning = t(_p( + 'ui:leaderboard|chunk_warning', + "**Note:** Could not retrieve member list from Discord, so some members may be missing. " + "Try again in a minute!" + )) if self.card is not None: + period_start = self.period_starts[self.current_period] + header = t(_p( + 'ui:leaderboard|since', + "Counting statistics since {timestamp}" + )).format(timestamp=discord.utils.format_dt(period_start)) + if not self.was_chunked: + header = '\n'.join((header, chunk_warning)) args = MessageArgs( embed=None, + content=header, file=self.card.as_file('leaderboard.png') ) else: - t = self.bot.translator.t if self.stat_type is StatType.VOICE: empty_description = t(_p( 'ui:leaderboard|mode:voice|message:empty|desc', - "There has been no voice activity in this period!" + "There has been no voice activity since {timestamp}" )) elif self.stat_type is StatType.TEXT: empty_description = t(_p( 'ui:leaderboard|mode:text|message:empty|desc', - "There has been no message activity in this period!" + "There has been no message activity since {timestamp}" )) elif self.stat_type is StatType.ANKI: empty_description = t(_p( 'ui:leaderboard|mode:anki|message:empty|desc', - "There have been no Anki cards reviewed in this period!" + "There have been no Anki cards reviewed since {timestamp}" )) + empty_description = empty_description.format( + timestamp=discord.utils.format_dt(self.period_starts[self.current_period]) + ) embed = discord.Embed( colour=discord.Colour.orange(), title=t(_p( @@ -462,7 +483,11 @@ class LeaderboardUI(StatsUI): )), description=empty_description ) - args = MessageArgs(embed=embed, files=[]) + args = MessageArgs( + content=chunk_warning if not self.was_chunked else None, + embed=embed, + files=[] + ) return args async def refresh_components(self): diff --git a/src/modules/statistics/ui/weeklymonthly.py b/src/modules/statistics/ui/weeklymonthly.py index 54bd807d..fd295f82 100644 --- a/src/modules/statistics/ui/weeklymonthly.py +++ b/src/modules/statistics/ui/weeklymonthly.py @@ -483,12 +483,16 @@ class WeeklyMonthlyUI(StatsUI): ).with_connection(conn) if modified: - # If either goal type was modified, clear the rendered cache and refresh - for page_key, (goalf, statf) in self._card_cache.items(): - # If the stat period type is the same as the current period type - if page_key[2].period is self._stat_page.period: - self._card_cache[page_key] = (None, statf) - await self.refresh(thinking=interaction) + # Check whether the UI finished while we were interacting + if not self._stopped.done(): + # If either goal type was modified, clear the rendered cache and refresh + for page_key, (goalf, statf) in self._card_cache.items(): + # If the stat period type is the same as the current period type + if page_key[2].period is self._stat_page.period: + self._card_cache[page_key] = (None, statf) + await self.refresh(thinking=interaction) + else: + await interaction.delete_original_response() await press.response.send_modal(modal) async def edit_button_refresh(self): diff --git a/src/modules/sysadmin/exec_cog.py b/src/modules/sysadmin/exec_cog.py index 9d9e7f76..351219c5 100644 --- a/src/modules/sysadmin/exec_cog.py +++ b/src/modules/sysadmin/exec_cog.py @@ -186,6 +186,17 @@ def mk_print(fp: io.StringIO) -> Callable[..., None]: return _print +def mk_status_printer(bot, printer): + async def _status(details=False): + if details: + status = await bot.system_monitor.get_overview() + else: + status = await bot.system_monitor.get_summary() + printer(status) + return status + return _status + + @log_wrap(action="Code Exec") async def _async(to_eval: str, style='exec'): newline = '\n' * ('\n' in to_eval) @@ -202,6 +213,7 @@ async def _async(to_eval: str, style='exec'): scope['ctx'] = ctx = context.get() scope['bot'] = ctx_bot.get() scope['print'] = _print # type: ignore + scope['print_status'] = mk_status_printer(scope['bot'], _print) try: if ctx and ctx.message: @@ -263,10 +275,63 @@ class Exec(LionCog): description=_("Execute arbitrary code with Exec") ) @appcmd.describe( - string="Code to execute." + string="Code to execute.", + target="Cross-shard peer to async on." ) - async def async_cmd(self, ctx: LionContext, *, string: Optional[str] = None): - await ExecUI(ctx, string, ExecStyle.EXEC, ephemeral=False).run() + async def async_cmd(self, ctx: LionContext, + string: Optional[str] = None, + target: Optional[str] = None, + ): + if target is not None: + if string is None: + try: + ctx.interaction, string = await input( + ctx.interaction, "Cross-shard async", "Code to execute?", + style=discord.TextStyle.long + ) + except asyncio.TimeoutError: + return + await ctx.interaction.response.defer(thinking=True) + if target not in shard_talk.peers: + # Invalid target + embed = discord.Embed( + description="Unknown peer {target}", + colour=discord.Colour.brand_red(), + ) + await ctx.interaction.edit_original_response(embed=embed) + else: + # Send to given target + result = await self.talk_async(string).send(target) + if len(result) > 1900: + # Send as file + with StringIO(result) as fp: + fp.seek(0) + file = discord.File(fp, filename=f"output-{target}.md") + await ctx.reply(file=file) + elif result: + await ctx.reply(f"```md\n{result}```") + else: + await ctx.reply("Command completed, and had no output.") + else: + await ExecUI(ctx, string, ExecStyle.EXEC, ephemeral=False).run() + + async def _peer_acmpl(self, interaction: discord.Interaction, partial: str): + """ + Autocomplete utility for peer targets parameters. + """ + appids = set(shard_talk.peers.keys()) + results = [ + appcmd.Choice(name=appid, value=appid) + for appid in appids + if partial.lower() in appid.lower() + ] + if not results: + results = [ + appcmd.Choice(name=f"No peers found matching {partial}", value=partial) + ] + return results + + async_cmd.autocomplete('target')(_peer_acmpl) @commands.hybrid_command( name=_p('command', 'eval'), @@ -298,7 +363,7 @@ class Exec(LionCog): except asyncio.TimeoutError: return if ctx.interaction: - await ctx.interaction.response.defer(thinking=True, ephemeral=True) + await ctx.interaction.response.defer(thinking=True) if target is not None: if target not in shard_talk.peers: embed = discord.Embed(description=f"Unknown peer {target}", colour=discord.Colour.red()) @@ -323,42 +388,35 @@ class Exec(LionCog): await ctx.reply(file=file) else: # Send as message - await ctx.reply(f"```md\n{output}```", ephemeral=True) + await ctx.reply(f"```md\n{output}```") - @asyncall_cmd.autocomplete('target') - async def asyncall_target_acmpl(self, interaction: discord.Interaction, partial: str): - appids = set(shard_talk.peers.keys()) - results = [ - appcmd.Choice(name=appid, value=appid) - for appid in appids - if partial.lower() in appid.lower() - ] - if not results: - results = [ - appcmd.Choice(name=f"No peers found matching {partial}", value="None") - ] - return results + asyncall_cmd.autocomplete('target')(_peer_acmpl) @commands.hybrid_command( name=_('reload'), description=_("Reload a given LionBot extension. Launches an ExecUI.") ) @appcmd.describe( - extension=_("Name of the extesion to reload. See autocomplete for options.") + extension=_("Name of the extension to reload. See autocomplete for options."), + force=_("Whether to force an extension reload even if it doesn't exist.") ) @appcmd.guilds(*guild_ids) - async def reload_cmd(self, ctx: LionContext, extension: str): + async def reload_cmd(self, ctx: LionContext, extension: str, force: Optional[bool] = False): """ This is essentially just a friendly wrapper to reload an extension. It is equivalent to running "await bot.reload_extension(extension)" in eval, with a slightly nicer interface through the autocomplete and error handling. """ - if extension not in self.bot.extensions: + exists = (extension in self.bot.extensions) + if not (force or exists): embed = discord.Embed(description=f"Unknown extension {extension}", colour=discord.Colour.red()) await ctx.reply(embed=embed) else: # Uses an ExecUI to simplify error handling and re-execution - string = f"await bot.reload_extension('{extension}')" + if exists: + string = f"await bot.reload_extension('{extension}')" + else: + string = f"await bot.load_extension('{extension}')" await ExecUI(ctx, string, ExecStyle.EVAL).run() @reload_cmd.autocomplete('extension') diff --git a/src/modules/sysadmin/guild_log.py b/src/modules/sysadmin/guild_log.py index a12d24e2..2e38248a 100644 --- a/src/modules/sysadmin/guild_log.py +++ b/src/modules/sysadmin/guild_log.py @@ -1,3 +1,4 @@ +import asyncio import datetime import discord @@ -22,8 +23,8 @@ class GuildLog(LionCog): embed.set_author(name="Left guild!") # Add more specific information about the guild - embed.add_field(name="Owner", value="{0.name} (ID: {0.id})".format(guild.owner), inline=False) - embed.add_field(name="Members (cached)", value="{}".format(len(guild.members)), inline=False) + embed.add_field(name="Owner", value="<@{}>".format(guild.owner_id), inline=False) + embed.add_field(name="Members", value="{}".format(guild.member_count), inline=False) embed.add_field(name="Now studying in", value="{} guilds".format(len(self.bot.guilds)), inline=False) # Retrieve the guild log channel and log the event @@ -35,39 +36,51 @@ class GuildLog(LionCog): @LionCog.listener('on_guild_join') @log_wrap(action="Log Guild Join") async def log_join_guild(self, guild: discord.Guild): - owner = guild.owner + try: + await asyncio.wait_for(guild.chunk(), timeout=60) + except asyncio.TimeoutError: + pass - bots = 0 - known = 0 - unknown = 0 - other_members = set(mem.id for mem in self.bot.get_all_members() if mem.guild != guild) + # TODO: Add info about when we last joined this guild etc once we have it. - for member in guild.members: - if member.bot: - bots += 1 - elif member.id in other_members: - known += 1 - else: - unknown += 1 + if guild.chunked: + bots = 0 + known = 0 + unknown = 0 + other_members = set(mem.id for mem in self.bot.get_all_members() if mem.guild != guild) + + for member in guild.members: + if member.bot: + bots += 1 + elif member.id in other_members: + known += 1 + else: + unknown += 1 + + mem1 = "people I know" if known != 1 else "person I know" + mem2 = "new friends" if unknown != 1 else "new friend" + mem3 = "bots" if bots != 1 else "bot" + mem4 = "total members" + known = "`{}`".format(known) + unknown = "`{}`".format(unknown) + bots = "`{}`".format(bots) + total = "`{}`".format(guild.member_count) + mem_str = "{0:<5}\t{4},\n{1:<5}\t{5},\n{2:<5}\t{6}, and\n{3:<5}\t{7}.".format( + known, + unknown, + bots, + total, + mem1, + mem2, + mem3, + mem4 + ) + else: + mem_str = ( + "`{count}` total members.\n" + "(Could not chunk guild within `60` seconds.)" + ).format(count=guild.member_count) - mem1 = "people I know" if known != 1 else "person I know" - mem2 = "new friends" if unknown != 1 else "new friend" - mem3 = "bots" if bots != 1 else "bot" - mem4 = "total members" - known = "`{}`".format(known) - unknown = "`{}`".format(unknown) - bots = "`{}`".format(bots) - total = "`{}`".format(guild.member_count) - mem_str = "{0:<5}\t{4},\n{1:<5}\t{5},\n{2:<5}\t{6}, and\n{3:<5}\t{7}.".format( - known, - unknown, - bots, - total, - mem1, - mem2, - mem3, - mem4 - ) created = "".format(int(guild.created_at.timestamp())) embed = discord.Embed( @@ -77,7 +90,7 @@ class GuildLog(LionCog): ) embed.set_author(name="Joined guild!") - embed.add_field(name="Owner", value="{0} (ID: {0.id})".format(owner), inline=False) + embed.add_field(name="Owner", value="<@{}>".format(guild.owner_id), inline=False) embed.add_field(name="Created at", value=created, inline=False) embed.add_field(name="Members", value=mem_str, inline=False) embed.add_field(name="Now studying in", value="{} guilds".format(len(self.bot.guilds)), inline=False) diff --git a/src/modules/tasklist/cog.py b/src/modules/tasklist/cog.py index 230d11ac..88f718aa 100644 --- a/src/modules/tasklist/cog.py +++ b/src/modules/tasklist/cog.py @@ -173,7 +173,17 @@ class TasklistCog(LionCog): if not channel.guild: return True channels = (await self.settings.tasklist_channels.get(channel.guild.id)).value - return (channel in channels) or (channel.category in channels) + # Also allow private rooms + roomcog = self.bot.get_cog('RoomCog') + if roomcog: + private_rooms = roomcog.get_rooms(channel.guild.id) + private_channels = {room.data.channelid for room in private_rooms.values()} + else: + logger.warning( + "Fetching tasklist channels before private room cog is loaded!" + ) + private_channels = {} + return (channel in channels) or (channel.id in private_channels) or (channel.category in channels) async def call_tasklist(self, interaction: discord.Interaction): await interaction.response.defer(thinking=True, ephemeral=True) @@ -184,9 +194,28 @@ class TasklistCog(LionCog): tasklist = await Tasklist.fetch(self.bot, self.data, userid) if await self.is_tasklist_channel(channel): - tasklistui = TasklistUI.fetch(tasklist, channel, guild, timeout=None) - await tasklistui.summon(force=True) - await interaction.delete_original_response() + # Check we have permissions to send a regular message here + my_permissions = channel.permissions_for(guild.me) + if not my_permissions.embed_links or not my_permissions.send_messages: + t = self.bot.translator.t + error = discord.Embed( + colour=discord.Colour.brand_red(), + title=t(_p( + 'summon_tasklist|error:insufficient_perms|title', + "Uh-Oh, I cannot do that here!" + )), + description=t(_p( + 'summon_tasklist|error:insufficient_perms|desc', + "This channel is configured as a tasklist channel, " + "but I lack the `EMBED_LINKS` or `SEND_MESSAGES` permission here! " + "If you believe this is unintentional, please contact a server administrator." + )) + ) + await interaction.edit_original_response(embed=error) + else: + tasklistui = TasklistUI.fetch(tasklist, channel, guild, timeout=None) + await tasklistui.summon(force=True) + await interaction.delete_original_response() else: # Note that this will also close any existing listening tasklists in this channel (for this user) tasklistui = TasklistUI.fetch(tasklist, channel, guild, timeout=600) @@ -212,14 +241,18 @@ class TasklistCog(LionCog): # Now do the rest of the listening channels listening = TasklistUI._live_[userid] - for cid, ui in listening.items(): + for cid, ui in list(listening.items()): if channel and channel.id == cid: + # We already did this channel + continue + if cid not in listening: + # UI closed while we were updating continue try: await ui.refresh() await ui.redraw() except discord.HTTPException: - await tui.close() + await ui.close() @cmds.hybrid_command( name=_p('cmd:tasklist', "tasklist"), @@ -289,6 +322,16 @@ class TasklistCog(LionCog): appcmds.Choice(name=task_string, value=label) for label, task_string in matching ] + elif multi and partial.lower().strip() in ('-', 'all'): + options = [ + appcmds.Choice( + name=t(_p( + 'argtype:taskid|match:all', + "All tasks" + )), + value='-' + ) + ] elif multi and (',' in partial or '-' in partial): # Try parsing input as a multi-list try: @@ -672,7 +715,7 @@ class TasklistCog(LionCog): @appcmds.describe( taskidstr=_p( 'cmd:tasks_remove|param:taskidstr|desc', - "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-)." + "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-), or `-` to remove all." ), created_before=_p( 'cmd:tasks_remove|param:created_before|desc', @@ -718,10 +761,10 @@ class TasklistCog(LionCog): if not taskids: # Explicitly error if none of the ranges matched await ctx.interaction.edit_original_response( - embed=error_embed( + embed=error_embed(t(_p( 'cmd:tasks_remove_cmd|error:no_matching', "No tasks on your tasklist match `{input}`" - ).format(input=taskidstr) + ))).format(input=taskidstr) ) return @@ -742,10 +785,10 @@ class TasklistCog(LionCog): tasks = await self.data.Task.fetch_where(*conditions, userid=ctx.author.id) if not tasks: await ctx.interaction.edit_original_response( - embed=error_embed( + embed=error_embed(t(_p( 'cmd:tasks_remove_cmd|error:no_matching', "No tasks on your tasklist matching all the given conditions!" - ).format(input=taskidstr) + ))).format(input=taskidstr) ) return taskids = [task.taskid for task in tasks] @@ -785,7 +828,7 @@ class TasklistCog(LionCog): @appcmds.describe( taskidstr=_p( 'cmd:tasks_tick|param:taskidstr|desc', - "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-)." + "List of task numbers or ranges to tick (e.g. 1, 2, 5-7, 8.1-3, 9-) or '-' to tick all." ), cascade=_p( 'cmd:tasks_tick|param:cascade|desc', @@ -813,10 +856,10 @@ class TasklistCog(LionCog): if not taskids: # Explicitly error if none of the ranges matched await ctx.interaction.edit_original_response( - embed=error_embed( + embed=error_embed(t(_p( 'cmd:tasks_remove_cmd|error:no_matching', "No tasks on your tasklist match `{input}`" - ).format(input=taskidstr) + ))).format(input=taskidstr) ) return @@ -861,7 +904,7 @@ class TasklistCog(LionCog): @appcmds.describe( taskidstr=_p( 'cmd:tasks_untick|param:taskidstr|desc', - "List of task numbers or ranges to remove (e.g. 1, 2, 5-7, 8.1-3, 9-)." + "List of task numbers or ranges to untick (e.g. 1, 2, 5-7, 8.1-3, 9-) or '-' to untick all." ), cascade=_p( 'cmd:tasks_untick|param:cascade|desc', @@ -888,10 +931,10 @@ class TasklistCog(LionCog): if not taskids: # Explicitly error if none of the ranges matched await ctx.interaction.edit_original_response( - embed=error_embed( + embed=error_embed(t(_p( 'cmd:tasks_remove_cmd|error:no_matching', "No tasks on your tasklist match `{input}`" - ).format(input=taskidstr) + ))).format(input=taskidstr) ) return diff --git a/src/modules/tasklist/tasklist.py b/src/modules/tasklist/tasklist.py index 5156fb04..c91fc7ba 100644 --- a/src/modules/tasklist/tasklist.py +++ b/src/modules/tasklist/tasklist.py @@ -233,6 +233,9 @@ class Tasklist: May raise `UserInputError`. """ + if labelstr.strip().lower() in ('-', 'all'): + return list(self.tasklist.keys()) + labelmap = {label: task.taskid for label, task in self.labelled.items()} splits = labelstr.split(',') diff --git a/src/modules/tasklist/ui.py b/src/modules/tasklist/ui.py index 15eef84b..39acda68 100644 --- a/src/modules/tasklist/ui.py +++ b/src/modules/tasklist/ui.py @@ -381,9 +381,10 @@ class TasklistUI(BasePager): def _format_parent(self, parentid) -> str: parentstr = '' if parentid is not None: - task = self.tasklist.tasklist.get(parentid, None) - if task: - parent_label = self.tasklist.format_label(self.tasklist.labelid(parentid)).strip('.') + pair = next(((label, task) for label, task in self.labelled.items() if task.taskid == parentid), None) + if pair is not None: + label, task = pair + parent_label = self.tasklist.format_label(label).strip('.') parentstr = f"{parent_label}: {task.content}" return parentstr @@ -561,8 +562,8 @@ class TasklistUI(BasePager): label=self.tasklist.format_label(rootlabel).strip('.'), ) children = { - label: taskid - for label, taskid in labelled.items() + label: task + for label, task in labelled.items() if all(i == j for i, j in zip(label, rootlabel)) } this_page = self.this_page @@ -572,11 +573,13 @@ class TasklistUI(BasePager): else: # Only show the children which display page_children = [ - (label, tid) for label, tid in this_page if label in children and tid != rootid + (label, task) for label, task in this_page if label in children and task.taskid != rootid ][:24] if page_children: - block = [(rootlabel, rootid), *page_children] + # Always add the root task + block = [(rootlabel, self.tasklist.tasklist[rootid]), *page_children] else: + # There are no subtree children on the current page block = [] # Special case if the subtree is exactly the same as the page if not (len(block) == len(this_page) and all(i[0] == j[0] for i, j in zip(block, this_page))): diff --git a/src/settings/setting_types.py b/src/settings/setting_types.py index 09f6e2a0..f5c99c5b 100644 --- a/src/settings/setting_types.py +++ b/src/settings/setting_types.py @@ -396,7 +396,7 @@ class RoleSetting(InteractiveSetting[ParentID, int, Union[discord.Role, discord. if data is not None: role = None - guildid = cls._get_guildid(parent_id) + guildid = cls._get_guildid(parent_id, **kwargs) bot = ctx_bot.get() guild = bot.get_guild(guildid) if guild is not None: @@ -409,11 +409,14 @@ class RoleSetting(InteractiveSetting[ParentID, int, Union[discord.Role, discord. async def _parse_string(cls, parent_id, string: str, **kwargs): if not string or string.lower() == 'none': return None + guildid = cls._get_guildid(parent_id, **kwargs) t = ctx_translator.get().t bot = ctx_bot.get() role = None - guild = bot.get_guild(parent_id) + guild = bot.get_guild(guildid) + if guild is None: + raise ValueError("Attempting to parse role string with no guild.") if string.isdigit(): maybe_id = int(string) @@ -1004,7 +1007,7 @@ class TimestampSetting(InteractiveSetting[ParentID, str, dt.datetime]): @property def input_formatted(self) -> str: if self._data: - formatted = self._data.strftime('%Y-%M-%d %H:%M') + formatted = self._data.strftime('%Y-%m-%d %H:%M') else: formatted = '' return formatted diff --git a/src/tracking/text/ui.py b/src/tracking/text/ui.py index 42c89d9e..fa6bfa52 100644 --- a/src/tracking/text/ui.py +++ b/src/tracking/text/ui.py @@ -34,7 +34,7 @@ class TextTrackerConfigUI(ConfigUI): ) async def untracked_channels_menu(self, selection: discord.Interaction, selected): await selection.response.defer() - setting = self.instances[3] + setting = self.instances[2] setting.value = selected.values await setting.write() diff --git a/src/tracking/voice/cog.py b/src/tracking/voice/cog.py index 95dce435..0392320e 100644 --- a/src/tracking/voice/cog.py +++ b/src/tracking/voice/cog.py @@ -99,8 +99,16 @@ class VoiceTrackerCog(LionCog): voice_members = {} # (guildid, userid) -> TrackedVoiceState voice_guilds = set() for guild in self.bot.guilds: + untracked = self.untracked_channels.get(guild.id, ()) for channel in guild.voice_channels: + if channel.id in untracked: + continue + if channel.category_id and channel.category_id in untracked: + continue + for member in channel.members: + if member.bot: + continue voice_members[(guild.id, member.id)] = TrackedVoiceState.from_voice_state(member.voice) voice_guilds.add(guild.id) @@ -299,7 +307,8 @@ class VoiceTrackerCog(LionCog): # Fetch tracked member session state session = self.get_session(member.guild.id, member.id) tstate = session.state - untracked = self.untracked_channels.get(member.guild.id, []) + # This usually pulls from cache, but don't rely on it + untracked = (await self.settings.UntrackedChannels.get(member.guild.id)).data if (bstate.channelid != astate.channelid): # Leaving/Moving/Joining channels @@ -464,8 +473,8 @@ class VoiceTrackerCog(LionCog): return async with self.tracking_lock: - sessions = VoiceSession._active_sessions_.get(guildid) - for session in sessions: + sessions = VoiceSession._active_sessions_.get(guildid, {}) + for session in list(sessions.values()): hourly_rate = await self._calculate_rate(session.guildid, session.userid, session.state) await session.update(new_rate=hourly_rate) diff --git a/src/utils/lib.py b/src/utils/lib.py index 16d89135..1bec50cc 100644 --- a/src/utils/lib.py +++ b/src/utils/lib.py @@ -25,6 +25,8 @@ multiselect_regex = re.compile( tick = '✅' cross = '❌' +MISSING = object() + class MessageArgs: """ @@ -113,7 +115,13 @@ class MessageArgs: @property def send_args(self) -> dict: - return self.kwargs + if self.kwargs.get('view', MISSING) is None: + kwargs = self.kwargs.copy() + kwargs.pop('view') + else: + kwargs = self.kwargs + + return kwargs @property def edit_args(self) -> dict: @@ -804,3 +812,20 @@ def recurse_map(func, obj, loc=[]): else: obj = func(loc, obj) return obj + +async def check_dm(user: discord.User | discord.Member) -> bool: + """ + Check whether we can direct message the given user. + + Assumes the client is initialised. + This uses an always-failing HTTP request, + so we need to be very very very careful that this is not used frequently. + Optimally only at the explicit behest of the user + (i.e. during a user instigated interaction). + """ + try: + await user.send('') + except discord.Forbidden: + return False + except discord.HTTPException: + return True diff --git a/src/utils/ratelimits.py b/src/utils/ratelimits.py index 21c75160..56f25728 100644 --- a/src/utils/ratelimits.py +++ b/src/utils/ratelimits.py @@ -67,9 +67,9 @@ class Bucket: def request(self): self._leak() - if self._level + 1 > self.max_level + 1: + if self._level > self.max_level: raise BucketOverFull - elif self._level + 1 > self.max_level: + elif self._level == self.max_level: self._level += 1 if self._last_full: raise BucketOverFull diff --git a/src/utils/transformers.py b/src/utils/transformers.py index 3014df4d..f4dccba7 100644 --- a/src/utils/transformers.py +++ b/src/utils/transformers.py @@ -40,7 +40,10 @@ class DurationTransformer(Transformer): duration = parse_duration(value) if duration is None: raise UserInputError( - t(_p('utils:parse_dur|error', "Cannot parse `{value}` as a duration.")).format( + t(_p( + 'utils:parse_dur|error', + "Cannot parse `{value}` as a duration." + )).format( value=value ) ) diff --git a/src/utils/ui/leo.py b/src/utils/ui/leo.py index 6d77e13d..7459f0f8 100644 --- a/src/utils/ui/leo.py +++ b/src/utils/ui/leo.py @@ -10,6 +10,8 @@ from discord.ui import Modal, View, Item from meta.logger import log_action_stack, logging_context from meta.errors import SafeCancellation +from gui.errors import RenderingException + from . import logger from ..lib import MessageArgs, error_embed @@ -48,6 +50,16 @@ class LeoUI(View): # TODO: Replace this with a substitutable ViewLayout class self._layout: Optional[tuple[tuple[Item, ...], ...]] = None + @property + def _stopped(self) -> asyncio.Future: + """ + Return an future indicating whether the View has finished interacting. + + Currently exposes a hidden attribute of the underlying View. + May be reimplemented in future. + """ + return self._View__stopped + def to_components(self) -> List[Dict[str, Any]]: """ Extending component generator to apply the set _layout, if it exists. @@ -218,17 +230,29 @@ class LeoUI(View): f"Caught a safe cancellation from LeoUI: {e.details}", extra={'action': 'Cancel'} ) + except RenderingException as e: + logger.info( + f"UI interaction failed due to rendering exception: {repr(e)}" + ) + embed = interaction.client.tree.rendersplat(e) + await interaction.client.tree.error_reply(interaction, embed) except Exception: logger.exception( - f"Unhandled interaction exception occurred in item {item!r} of LeoUI {self!r}", + f"Unhandled interaction exception occurred in item {item!r} of LeoUI {self!r} from interaction: " + f"{interaction.data}", extra={'with_ctx': True, 'action': 'UIError'} ) + # Explicitly handle the bugsplat ourselves + splat = interaction.client.tree.bugsplat(interaction, error) + await interaction.client.tree.error_reply(interaction, splat) class MessageUI(LeoUI): """ Simple single-message LeoUI, intended as a framework for UIs attached to a single interaction response. + + UIs may also be sent as regular messages by using `send(channel)` instead of `run(interaction)`. """ def __init__(self, *args, callerid: Optional[int] = None, **kwargs): @@ -396,8 +420,11 @@ class MessageUI(LeoUI): try: await self._redraw(args) - except discord.HTTPException: - # Unknown communication erorr, nothing we can reliably do. Exit quietly. + except discord.HTTPException as e: + # Unknown communication error, nothing we can reliably do. Exit quietly. + logger.warning( + f"Unexpected UI redraw failure occurred in {self}: {repr(e)}", + ) await self.close() async def cleanup(self): @@ -449,11 +476,20 @@ class LeoModal(Modal): """ try: raise error + except RenderingException as e: + logger.info( + f"Modal submit failed due to rendering exception: {repr(e)}" + ) + embed = interaction.client.tree.rendersplat(e) + await interaction.client.tree.error_reply(interaction, embed) except Exception: logger.exception( - f"Unhandled interaction exception occurred in {self!r}", + f"Unhandled interaction exception occurred in {self!r}. Interaction: {interaction.data}", extra={'with_ctx': True, 'action': 'ModalError'} ) + # Explicitly handle the bugsplat ourselves + splat = interaction.client.tree.bugsplat(interaction, error) + await interaction.client.tree.error_reply(interaction, splat) def error_handler_for(exc): diff --git a/src/wards.py b/src/wards.py index 6198436b..5db46eb9 100644 --- a/src/wards.py +++ b/src/wards.py @@ -21,14 +21,18 @@ async def sys_admin(bot: LionBot, userid: int): return userid in admins -async def high_management(bot: LionBot, member: discord.Member): +async def high_management(bot: LionBot, member: discord.Member, guild: discord.Guild): + if not guild: + return True if await sys_admin(bot, member.id): return True return member.guild_permissions.administrator -async def low_management(bot: LionBot, member: discord.Member): - if await high_management(bot, member): +async def low_management(bot: LionBot, member: discord.Member, guild: discord.Guild): + if not guild: + return True + if await high_management(bot, member, guild): return True return member.guild_permissions.manage_guild @@ -42,20 +46,20 @@ async def sys_admin_iward(interaction: discord.Interaction) -> bool: async def high_management_iward(interaction: discord.Interaction) -> bool: if not interaction.guild: return False - return await high_management(interaction.client, interaction.user) + return await high_management(interaction.client, interaction.user, interaction.guild) async def low_management_iward(interaction: discord.Interaction) -> bool: if not interaction.guild: return False - return await low_management(interaction.client, interaction.user) + return await low_management(interaction.client, interaction.user, interaction.guild) # High level ctx wards async def moderator_ctxward(ctx: LionContext) -> bool: if not ctx.guild: return False - passed = await low_management(ctx.bot, ctx.author) + passed = await low_management(ctx.bot, ctx.author, ctx.guild) if passed: return True modrole = ctx.lguild.data.mod_role @@ -85,7 +89,7 @@ async def sys_admin_ward(ctx: LionContext) -> bool: async def high_management_ward(ctx: LionContext) -> bool: if not ctx.guild: return False - passed = await high_management(ctx.bot, ctx.author) + passed = await high_management(ctx.bot, ctx.author, ctx.guild) if passed: return True else: @@ -101,7 +105,7 @@ async def high_management_ward(ctx: LionContext) -> bool: async def low_management_ward(ctx: LionContext) -> bool: if not ctx.guild: return False - passed = await low_management(ctx.bot, ctx.author) + passed = await low_management(ctx.bot, ctx.author, ctx.guild) if passed: return True else: @@ -192,7 +196,7 @@ async def equippable_role(bot: LionBot, target_role: discord.Role, actor: discor "You need the `MANAGE_ROLES` permission before you can configure roles!" )).format(role=target_role.mention) ) - elif actor.top_role <= target_role and not actor == guild.owner: + elif actor.top_role <= target_role and not actor.id == guild.owner_id: raise UserInputError( t(_p( 'ward:equippable_role|error:actor_top_role',