Merge pull request #48 from StudyLions/rewrite

This commit is contained in:
Interitio
2023-09-13 09:05:57 +03:00
committed by GitHub
118 changed files with 16082 additions and 2002 deletions

View File

@@ -40,8 +40,8 @@ server_host = 127.0.0.1
server_port = 4999 server_port = 4999
[BABEL] [BABEL]
locales = ceaser locales = en-GB, 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 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] [TEXT_TRACKER]
batchsize = 1 batchsize = 1

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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}"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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)"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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}"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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 <t:{last_time}:R>.\",\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 <u:{last_time}:S>.\",\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."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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}"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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 `#<hex>` format e.g. "
"`#AB1325`."
msgstr ""
"`spmf_dpmpvs`: Dpvme opu qbstf dpmpvs! Qmfbtf vtf `#<ify>` 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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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}`"

File diff suppressed because it is too large Load Diff

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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."

File diff suppressed because it is too large Load Diff

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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!"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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!"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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}`."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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<value>\\d+)\\s*(?:(d)|(day))"
msgstr ""
#: src/utils/lib.py:685
msgctxt "util:parse_dur|regex:hour"
msgid "(?P<value>\\d+)\\s*(?:(h)|(hour))"
msgstr ""
#: src/utils/lib.py:692
msgctxt "util:parse_dur|regex:minute"
msgid "(?P<value>\\d+)\\s*(?:(m)|(min))"
msgstr ""
#: src/utils/lib.py:699
msgctxt "util:parse_dur|regex:second"
msgid "(?P<value>\\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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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."

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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 <tag>` to set what you are working on."
msgstr ""
"Zpv ibwf cffo xpsljoh jo {channel} tjodf {time}!\n"
"\n"
"Vtf `/opx <ubh>` 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"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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!"

View File

@@ -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 <EMAIL@ADDRESS>, 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 <you@example.com>\n"
"Language-Team: English <yourteam@example.com>\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}"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,41 +18,41 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\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" msgctxt "timer|stage:break|name"
msgid "BREAK" msgid "BREAK"
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:51 #: src/modules/pomodoro/timer.py:52
msgctxt "timer|stage:focus|name" msgctxt "timer|stage:focus|name"
msgid "FOCUS" msgid "FOCUS"
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:155 #: src/modules/pomodoro/timer.py:158
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timer|webhook|name" msgctxt "timer|webhook|name"
msgid "{bot_name} Pomodoro" msgid "{bot_name} Pomodoro"
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:159 #: src/modules/pomodoro/timer.py:162
msgctxt "timer|webhook|audit_reason" msgctxt "timer|webhook|audit_reason"
msgid "Pomodoro Notifications" msgid "Pomodoro Notifications"
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:170 #: src/modules/pomodoro/timer.py:173
msgctxt "timer|webhook|error:insufficient_permissions" msgctxt "timer|webhook|error:insufficient_permissions"
msgid "" msgid ""
"I require the `MANAGE_WEBHOOKS` permission to send pomodoro notifications " "I require the `MANAGE_WEBHOOKS` permission to send pomodoro notifications "
"here!" "here!"
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:229 #: src/modules/pomodoro/timer.py:232
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timer|default_base_name" msgctxt "timer|default_base_name"
msgid "Timer {pattern}" msgid "Timer {pattern}"
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:403 #: src/modules/pomodoro/timer.py:406
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timer|kicked_message" msgctxt "timer|kicked_message"
msgid "" msgid ""
@@ -64,20 +64,20 @@ msgid_plural ""
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/modules/pomodoro/timer.py:496 #: src/modules/pomodoro/timer.py:499
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timer|status|stage:focus|statusline" msgctxt "timer|status|stage:focus|statusline"
msgid "{channel} is now in **FOCUS**! Good luck, **BREAK** starts {timestamp}" msgid "{channel} is now in **FOCUS**! Good luck, **BREAK** starts {timestamp}"
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:501 #: src/modules/pomodoro/timer.py:504
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timer|status|stage:break|statusline" msgctxt "timer|status|stage:break|statusline"
msgid "" msgid ""
"{channel} is now on **BREAK**! Take a rest, **FOCUS** starts {timestamp}" "{channel} is now on **BREAK**! Take a rest, **FOCUS** starts {timestamp}"
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:533 #: src/modules/pomodoro/timer.py:536
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timer|status|warningline" msgctxt "timer|status|warningline"
msgid "" msgid ""
@@ -85,13 +85,13 @@ msgid ""
"next stage." "next stage."
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:552 #: src/modules/pomodoro/timer.py:555
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timer|status|stopped:auto" msgctxt "timer|status|stopped:auto"
msgid "Timer stopped! Join {channel} to start the timer." msgid "Timer stopped! Join {channel} to start the timer."
msgstr "" msgstr ""
#: src/modules/pomodoro/timer.py:557 #: src/modules/pomodoro/timer.py:560
msgctxt "timer|status|stopped:manual" msgctxt "timer|status|stopped:manual"
msgid "Timer stopped! Press `Start` to restart the timer." msgid "Timer stopped! Press `Start` to restart the timer."
msgstr "" msgstr ""
@@ -116,254 +116,285 @@ msgctxt "dash:stats|dropdown|placeholder"
msgid "Pomodoro Timer Panel" msgid "Pomodoro Timer Panel"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:83 #: src/modules/pomodoro/cog.py:82
msgctxt "cmd_check:ready|failed" msgctxt "cmd_check:ready|failed"
msgid "" msgid ""
"I am currently restarting! The Pomodoro timers will be unavailable until I " "I am currently restarting! The Pomodoro timers will be unavailable until I "
"have restarted. Thank you for your patience!" "have restarted. Thank you for your patience!"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:321
msgctxt "cmd:pomodoro"
msgid "timers"
msgstr ""
#: src/modules/pomodoro/cog.py:322 #: src/modules/pomodoro/cog.py:322
msgctxt "cmd:pomodoro|desc" msgctxt "cmd:timer"
msgid "Base group for all pomodoro timer commands." msgid "timer"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:330 #: src/modules/pomodoro/cog.py:323
msgctxt "cmd:pomodoro_status" msgctxt "cmd:timer|desc"
msgid "show" msgid "Show your current (or selected) pomodoro timer."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:331 #: src/modules/pomodoro/cog.py:326
msgctxt "cmd:pomodoro_status|desc" msgctxt "cmd:timer|param:channel"
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" msgid "timer_channel"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:339 #: src/modules/pomodoro/cog.py:331
msgctxt "cmd:pomodoro_status|param:channel|desc" msgctxt "cmd:timer|param:channel|desc"
msgid "The channel for which you want to view the timer." msgid "Select a timer to display (by selecting the timer voice channel)"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:357 #: src/modules/pomodoro/cog.py:353 src/modules/pomodoro/cog.py:423
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:pomodoro_status|error:no_timer" msgctxt "cmd:timer|error:no_timers|desc"
msgid "The channel {channel} does not have a timer set up!" 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 "" msgstr ""
#: src/modules/pomodoro/cog.py:367 #: 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 #, possible-python-brace-format
msgctxt "cmd:pomodoro_list|error:no_timers" msgctxt "cmd:timer|error:no_channel|desc"
msgid "" msgid ""
"No timers have been setup in this server!\n" "**I don't know what timer to show you.**\n"
"You can ask an admin to create one with {command}, or rent a private room " "No channel selected and you are not in a voice channel! Use {timers_cmd} to "
"and create one yourself!" "list the available timers in this server."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:404 #: src/modules/pomodoro/cog.py:380
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 #, possible-python-brace-format
msgctxt "cmd:pomodoro_list|embed:timer_list|title" msgctxt "cmd:timer|error:no_timer_in_channel"
msgid "Pomodoro Timers in **{guild}**" msgid ""
"The channel {channel} is not a pomodoro timer room!\n"
"Use {timers_cmd} to list the available timers in this server."
msgstr "" 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 #, 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 "" msgid ""
"`{pattern}` timer is stopped with no members!\n" "`{pattern}` timer is stopped with no members!\n"
"Join {channel} to restart it." "Join {channel} to restart it."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:428 #: src/modules/pomodoro/cog.py:464
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:pomodoro_list|status:stopped_manual" msgctxt "cmd:timers|status:stopped_manual"
msgid "" msgid ""
"`{pattern}` timer is stopped with `{members}` members!\n" "`{pattern}` timer is stopped with `{members}` members!\n"
"Join {channel} and press `Start` to start it!" "Join {channel} and press `Start` to start it!"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:435 #: src/modules/pomodoro/cog.py:471
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:pomodoro_list|status:running_focus" msgctxt "cmd:timers|status:running_focus"
msgid "" msgid ""
"`{pattern}` timer is running with `{members}` members!\n" "`{pattern}` timer is running with `{members}` members!\n"
"Currently **focusing**, with break starting {timestamp}" "Currently **focusing**, with break starting {timestamp}"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:441 #: src/modules/pomodoro/cog.py:477
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:pomodoro_list|status:running_break" msgctxt "cmd:timers|status:running_break"
msgid "" msgid ""
"`{pattern}` timer is running with `{members}` members!\n" "`{pattern}` timer is running with `{members}` members!\n"
"Currently **resting**, with focus starting {timestamp}" "Currently **resting**, with focus starting {timestamp}"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:455 #: src/modules/pomodoro/cog.py:491
msgctxt "cmd:pomodoro_admin" msgctxt "cmd:pomodoro"
msgid "admin" msgid "pomodoro"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:456 #: src/modules/pomodoro/cog.py:492
msgctxt "cmd:pomodoro_admin|desc" msgctxt "cmd:pomodoro|desc"
msgid "Command group for pomodoro admin controls." msgid "Create and configure pomodoro timer rooms."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:462 #: src/modules/pomodoro/cog.py:499
msgctxt "cmd:pomodoro_create" msgctxt "cmd:pomodoro_create"
msgid "create" msgid "create"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:465 #: src/modules/pomodoro/cog.py:502
msgctxt "cmd:pomodoro_create|desc" 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 "" msgstr ""
#: src/modules/pomodoro/cog.py:469 #: src/modules/pomodoro/cog.py:506
msgctxt "cmd:pomodoro_create|param:channel" msgctxt "cmd:pomodoro_create|param:channel"
msgid "timer_channel" msgid "timer_channel"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:475 #: src/modules/pomodoro/cog.py:512
msgctxt "cmd:pomodoro_create|param:channel|desc" msgctxt "cmd:pomodoro_create|param:channel|desc"
msgid "" msgid ""
"Voice channel to create the timer in. (Defaults to your current channel, or " "Voice channel to create the timer in. (Defaults to your current channel, or "
"makes a new one.)" "makes a new one.)"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:504 #: src/modules/pomodoro/cog.py:557
msgctxt "cmd:pomodoro_create|error:insufficient_perms" msgctxt "cmd:pomodoro_create|new_channel|error:your_insufficient_perms|title"
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!" msgid "Could not create pomodoro voice channel!"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:535 #: src/modules/pomodoro/cog.py:561
msgctxt "cmd:pomodoro_create|error:channel_create|desc" 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 "" msgid ""
"Failed to create a new pomodoro voice channel due to an unknown Discord " "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 " "communication error. Please try creating the channel manually and pass it to "
"the `timer_channel` argument of this command." "the `timer_channel` argument of this command."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:549 #: src/modules/pomodoro/cog.py:621
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
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:pomodoro_create|error:timer_exists" msgctxt "cmd:pomodoro_create|add_timer|error:timer_exists"
msgid "" msgid "A timer already exists in {channel}! Reconfigure it with {edit_cmd}."
"A timer already exists in {channel}! Use `/pomodoro admin edit` to modify it."
msgstr "" 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" msgctxt "cmd:pomodoro_create|response:success|content"
msgid "Timer created successfully! Use the panel below to reconfigure." msgid "Timer created successfully! Use the panel below to reconfigure."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:612 #: src/modules/pomodoro/cog.py:690
msgctxt "cmd:pomodoro_destroy" msgctxt "cmd:pomodoro_destroy"
msgid "destroy" msgid "destroy"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:615 #: src/modules/pomodoro/cog.py:693
msgctxt "cmd:pomodoro_destroy|desc" msgctxt "cmd:pomodoro_destroy|desc"
msgid "" msgid "Remove a pomodoro timer from a voice channel."
"Delete a pomodoro timer from a voice channel. Requires admin permissions."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:619 #: src/modules/pomodoro/cog.py:697
msgctxt "cmd:pomodoro_destroy|param:channel" msgctxt "cmd:pomodoro_destroy|param:channel"
msgid "timer_channel" msgid "timer_channel"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:622 #: src/modules/pomodoro/cog.py:700
msgctxt "cmd:pomodoro_destroy|param:channel" 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 "" msgstr ""
#: src/modules/pomodoro/cog.py:640 #: src/modules/pomodoro/cog.py:718
msgctxt "cmd:pomodoro_destroy|error:no_timer" msgctxt "cmd:pomodoro_destroy|error:no_timer"
msgid "This channel doesn't have an attached pomodoro timer!" msgid "This channel doesn't have an attached pomodoro timer!"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:655 #: src/modules/pomodoro/cog.py:731
msgctxt "cmd:pomodoro_destroy|error:insufficient_perms|owned" msgctxt "cmd:pomodoro_destroy|error:insufficient_perms|owned"
msgid "" msgid ""
"You need to be an administrator or own this channel to remove this timer!" "You need to be an administrator or own this channel to remove this timer!"
msgstr "" 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" 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 "" msgstr ""
#: src/modules/pomodoro/cog.py:677 #: src/modules/pomodoro/cog.py:751
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:pomdoro_destroy|response:success|description" msgctxt "cmd:pomdoro_destroy|response:success|description"
msgid "Timer successfully removed from {channel}." msgid "Timer successfully removed from {channel}."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:683 #: src/modules/pomodoro/cog.py:757
msgctxt "cmd:pomodoro_edit" msgctxt "cmd:pomodoro_edit"
msgid "edit" msgid "edit"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:686 #: src/modules/pomodoro/cog.py:760
msgctxt "cmd:pomodoro_edit|desc" msgctxt "cmd:pomodoro_edit|desc"
msgid "Edit a Timer" msgid "Reconfigure a pomodoro timer."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:690 #: src/modules/pomodoro/cog.py:764
msgctxt "cmd:pomodoro_edit|param:channel" msgctxt "cmd:pomodoro_edit|param:channel"
msgid "timer_channel" msgid "timer_channel"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:696 #: src/modules/pomodoro/cog.py:770
msgctxt "cmd:pomodoro_edit|param:channel|desc" msgctxt "cmd:pomodoro_edit|param:channel|desc"
msgid "Channel holding the timer to edit." msgid "Select a timer voice channel to reconfigure."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:737 #: src/modules/pomodoro/cog.py:811
msgctxt "cmd:pomodoro_edit|error:no_timer" msgctxt "cmd:pomodoro_edit|error:no_timer"
msgid "This channel doesn't have an attached pomodoro timer to edit!" msgid "This channel doesn't have an attached pomodoro timer to edit!"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:750 #: src/modules/pomodoro/cog.py:824
msgctxt "cmd:pomodoro_edit|error:insufficient_perms|role:other" msgctxt "cmd:pomodoro_edit|error:insufficient_perms|role:other"
msgid "" msgid ""
"Insufficient permissions to modifiy this timer!\n" "Insufficient permissions to modifiy this timer!\n"
@@ -371,28 +402,28 @@ msgid ""
"manager role." "manager role."
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:771 #: src/modules/pomodoro/cog.py:845
msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:admin" msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:admin"
msgid "You need to be a guild admin to modify this option!" msgid "You need to be a guild admin to modify this option!"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:776 #: src/modules/pomodoro/cog.py:850
msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:owner" 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!" msgid "You need to be a channel owner or guild admin to modify this option!"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:781 #: src/modules/pomodoro/cog.py:855
msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:manager" msgctxt "cmd:pomodoro_edit|error:insufficient_permissions|role_needed:manager"
msgid "" msgid ""
"You need to be a guild admin or have the manager role to modify this option!" "You need to be a guild admin or have the manager role to modify this option!"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:817 #: src/modules/pomodoro/cog.py:891
msgctxt "cmd:configure_pomodoro" msgctxt "cmd:configure_pomodoro"
msgid "pomodoro" msgid "pomodoro"
msgstr "" msgstr ""
#: src/modules/pomodoro/cog.py:818 #: src/modules/pomodoro/cog.py:892
msgctxt "cmd:configure_pomodoro|desc" msgctxt "cmd:configure_pomodoro|desc"
msgid "Configure Pomodoro Timer System" msgid "Configure Pomodoro Timer System"
msgstr "" msgstr ""
@@ -427,95 +458,100 @@ msgctxt "formatstring:channel_name|key:pattern"
msgid "{pattern}" msgid "{pattern}"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:32 #: src/modules/pomodoro/options.py:33
msgctxt "timerset:voice_channel" msgctxt "timerset:voice_channel"
msgid "channel" msgid "channel"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:35 #: src/modules/pomodoro/options.py:36
msgctxt "timerset:voice_channel|desc" msgctxt "timerset:voice_channel|desc"
msgid "Channel in which to track timer members and send alerts." msgid "Channel in which to track timer members and send alerts."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:45 #: src/modules/pomodoro/options.py:48
msgctxt "timerset:notification_channel" msgctxt "timerset:notification_channel"
msgid "notification_channel" msgid "notification_channel"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:48 #: src/modules/pomodoro/options.py:51
msgctxt "timerset:notification_channel|desc" msgctxt "timerset:notification_channel|desc"
msgid "Channel to which to send timer status cards and notifications." msgid "Channel to which to send timer status cards and notifications."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:68 #: src/modules/pomodoro/options.py:73
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timerset:notification_channel|format:notset" msgctxt "timerset:notification_channel|format:notset"
msgid "Not Set (Using {channel})" msgid "Not Set (Using {channel})"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:78 #: src/modules/pomodoro/options.py:83
msgctxt "timerset:inactivity_threshold|inactivity_threshold" msgctxt "timerset:inactivity_threshold|inactivity_threshold"
msgid "inactivity_threshold" msgid "inactivity_threshold"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:81 #: src/modules/pomodoro/options.py:86
msgctxt "timerset:inactivity_threshold|desc" msgctxt "timerset:inactivity_threshold|desc"
msgid "" msgid ""
"Number of inactive focus+break stages before a member is removed from the " "Number of inactive focus+break stages before a member is removed from the "
"timer." "timer."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:85 #: src/modules/pomodoro/options.py:90
msgctxt "timerset:inactivity_threshold|desc" msgctxt "timerset:inactivity_threshold|desc"
msgid "How many timer cycles before kicking inactive members." msgid "How many timer cycles before kicking inactive members."
msgstr "" 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" msgctxt "timerset:manager_role"
msgid "manager_role" msgid "manager_role"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:104 #: src/modules/pomodoro/options.py:123
msgctxt "timerset:manager_role|desc" msgctxt "timerset:manager_role|desc"
msgid "Role allowed to start, stop, and edit the focus/break lengths." msgid "Role allowed to start, stop, and edit the focus/break lengths."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:116 #: src/modules/pomodoro/options.py:137
msgctxt "timerset:manager_role|format:notset" msgctxt "timerset:manager_role|format:notset"
msgid "Not Set (Only Admins may start/stop or edit pattern)" msgid "Not Set (Only Admins may start/stop or edit pattern)"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:126 #: src/modules/pomodoro/options.py:147
msgctxt "timerset:voice_alerts" msgctxt "timerset:voice_alerts"
msgid "voice_alerts" msgid "voice_alerts"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:129 #: src/modules/pomodoro/options.py:150
msgctxt "timerset:voice_alerts|desc" msgctxt "timerset:voice_alerts|desc"
msgid "Whether to join the voice channel and announce focus and break stages." msgid "Whether to join the voice channel and announce focus and break stages."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:140 #: src/modules/pomodoro/options.py:162
msgctxt "timerset:base_name" msgctxt "timerset:base_name"
msgid "name" msgid "name"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:143 #: src/modules/pomodoro/options.py:165
msgctxt "timerset:base_name|desc" msgctxt "timerset:base_name|desc"
msgid "Timer name, as shown on the timer card." msgid "Timer name, as shown on the timer card."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:147 #: src/modules/pomodoro/options.py:169
msgctxt "timerset:base_name|accepts" msgctxt "timerset:base_name|accepts"
msgid "Any short name, shown on the timer card." msgid "Any short name, shown on the timer card."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:161 #: src/modules/pomodoro/options.py:184
msgctxt "timerset:channel_name_format" msgctxt "timerset:channel_name_format"
msgid "channel_name" msgid "channel_name"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:164 #: src/modules/pomodoro/options.py:187
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timerset:channel_name_format|desc" msgctxt "timerset:channel_name_format|desc"
msgid "" msgid ""
@@ -523,49 +559,55 @@ msgid ""
"and {stage} keys." "and {stage} keys."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:168 #: src/modules/pomodoro/options.py:191
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "timerset:channel_name|accepts" msgctxt "timerset:channel_name|accepts"
msgid "" msgid ""
"Timer channel name, with keys {remaining}, {name}, {pattern}, and {stage}." "Timer channel name, with keys {remaining}, {name}, {pattern}, and {stage}."
msgstr "" 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" msgctxt "timerset:focus_length"
msgid "focus_length" msgid "focus_length"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:183 #: src/modules/pomodoro/options.py:243
msgctxt "timerset:focus_length|desc" msgctxt "timerset:focus_length|desc"
msgid "Length of the focus stage of the timer in minutes." msgid "Length of the focus stage of the timer in minutes."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:188 #: src/modules/pomodoro/options.py:248
msgctxt "timerset:focus_length|accepts" msgctxt "timerset:focus_length|accepts"
msgid "A positive integer number of minutes." msgid "A positive integer number of minutes."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:212 #: src/modules/pomodoro/options.py:273
msgctxt "timerset:focus_length|desc" msgctxt "timerset:focus_length|desc"
msgid "Please enter a positive number of minutes." msgid "Please enter a positive number of minutes."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:220 #: src/modules/pomodoro/options.py:281
msgctxt "timerset:break_length" msgctxt "timerset:break_length"
msgid "break_length" msgid "break_length"
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:223 #: src/modules/pomodoro/options.py:284
msgctxt "timerset:break_length|desc" msgctxt "timerset:break_length|desc"
msgid "Length of the break stage of the timer in minutes." msgid "Length of the break stage of the timer in minutes."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:228 #: src/modules/pomodoro/options.py:289
msgctxt "timerset:break_length|accepts" msgctxt "timerset:break_length|accepts"
msgid "A positive integer number of minutes." msgid "A positive integer number of minutes."
msgstr "" msgstr ""
#: src/modules/pomodoro/options.py:252 #: src/modules/pomodoro/options.py:314
msgctxt "timerset:break_length|desc" msgctxt "timerset:break_length|desc"
msgid "Please enter a positive number of minutes." msgid "Please enter a positive number of minutes."
msgstr "" msgstr ""
@@ -690,64 +732,69 @@ msgctxt "ui:timer_status|button:stop|label"
msgid "Stop" msgid "Stop"
msgstr "" 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" msgctxt "ui:timer_options|button:edit|label"
msgid "Edit" msgid "Edit"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:67 #: src/modules/pomodoro/ui/config.py:84
msgctxt "ui:timer_options|button:voice_alerts|label" msgctxt "ui:timer_options|button:voice_alerts|label"
msgid "Voice Alerts" msgid "Voice Alerts"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:88 #: src/modules/pomodoro/ui/config.py:105
msgctxt "ui:timer_options|button:delete|success|title" msgctxt "ui:timer_options|button:delete|success|title"
msgid "Timer Deleted" msgid "Timer Deleted"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:92 #: src/modules/pomodoro/ui/config.py:109
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:timer_options|button:delete|success|description" msgctxt "ui:timer_options|button:delete|success|description"
msgid "The timer in {channel} has been removed." msgid "The timer in {channel} has been removed."
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:100 #: src/modules/pomodoro/ui/config.py:117
msgctxt "ui:timer_options|button:delete|label" msgctxt "ui:timer_options|button:delete|label"
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:119 #: src/modules/pomodoro/ui/config.py:136
msgctxt "ui:timer_options|menu:voice_channel|placeholder" msgctxt "ui:timer_options|menu:voice_channel|placeholder"
msgid "Set Voice Channel" msgid "Set Voice Channel"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:142 #: src/modules/pomodoro/ui/config.py:159
msgctxt "ui:timer_options|menu:notification_channel|placeholder" msgctxt "ui:timer_options|menu:notification_channel|placeholder"
msgid "Set Notification Channel" msgid "Set Notification Channel"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:157 #: src/modules/pomodoro/ui/config.py:174
msgctxt "ui:timer_options|menu:manager_role|placeholder" msgctxt "ui:timer_options|menu:manager_role|placeholder"
msgid "Set Manager Role" msgid "Set Manager Role"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:166 #: src/modules/pomodoro/ui/config.py:183
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:timer_options|embed|title" msgctxt "ui:timer_options|embed|title"
msgid "Timer Control Panel for {channel}" msgid "Timer Control Panel for {channel}"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:173 #: src/modules/pomodoro/ui/config.py:190
msgctxt "ui:timer_options|embed|footer" msgctxt "ui:timer_options|embed|footer"
msgid "Hover over the option names to view descriptions." msgid "Hover over the option names to view descriptions."
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:185 #: src/modules/pomodoro/ui/config.py:202
msgctxt "ui:timer_options|embed|field:pattern|name" msgctxt "ui:timer_options|embed|field:pattern|name"
msgid "Pattern" msgid "Pattern"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:188 #: src/modules/pomodoro/ui/config.py:205
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:timer_options|embed|field:pattern|value" msgctxt "ui:timer_options|embed|field:pattern|value"
msgid "" msgid ""
@@ -755,12 +802,12 @@ msgid ""
"**`{break_len} minutes`** break" "**`{break_len} minutes`** break"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:199 #: src/modules/pomodoro/ui/config.py:216
msgctxt "ui:timer_options|embed|field:channel_name|name" msgctxt "ui:timer_options|embed|field:channel_name|name"
msgid "Channel Name Preview" msgid "Channel Name Preview"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:203 #: src/modules/pomodoro/ui/config.py:220
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:timer_options|embed|field:channel_name|value" msgctxt "ui:timer_options|embed|field:channel_name|value"
msgid "" msgid ""
@@ -768,35 +815,35 @@ msgid ""
"(The actual channel name may not match due to ratelimits.)" "(The actual channel name may not match due to ratelimits.)"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:213 #: src/modules/pomodoro/ui/config.py:230
msgctxt "ui:timer_options|embed|field:issues|name" msgctxt "ui:timer_options|embed|field:issues|name"
msgid "Issues" msgid "Issues"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:231 #: src/modules/pomodoro/ui/config.py:248
msgctxt "ui:timer_options|issue:no_voice_channel" msgctxt "ui:timer_options|issue:no_voice_channel"
msgid "The configured voice channel does not exist! Please update it below." msgid "The configured voice channel does not exist! Please update it below."
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:242 #: src/modules/pomodoro/ui/config.py:259
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:timer_options|issue:cannot_speak" msgctxt "ui:timer_options|issue:cannot_speak"
msgid "Voice alerts are on, but I don't have speaking permissions in {channel}" msgid "Voice alerts are on, but I don't have speaking permissions in {channel}"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:249 #: src/modules/pomodoro/ui/config.py:266
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:timer_options|issue:cannot_change_name" msgctxt "ui:timer_options|issue:cannot_change_name"
msgid "" msgid ""
"I cannot update the name of {channel}! (Needs `MANAGE_CHANNELS` permission)" "I cannot update the name of {channel}! (Needs `MANAGE_CHANNELS` permission)"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:260 #: src/modules/pomodoro/ui/config.py:277
msgctxt "ui:timer_options|issue:notif_channel_dne" msgctxt "ui:timer_options|issue:notif_channel_dne"
msgid "Configured notification channel does not exist!" msgid "Configured notification channel does not exist!"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:269 #: src/modules/pomodoro/ui/config.py:286
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:timer_options|issue:notif_channel_write" msgctxt "ui:timer_options|issue:notif_channel_write"
msgid "" msgid ""
@@ -804,7 +851,7 @@ msgid ""
"{channel}" "{channel}"
msgstr "" msgstr ""
#: src/modules/pomodoro/ui/config.py:277 #: src/modules/pomodoro/ui/config.py:294
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:timer_options|issues:cannot_make_webhooks" msgctxt "ui:timer_options|issues:cannot_make_webhooks"
msgid "" msgid ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -21,3 +21,8 @@ msgstr ""
msgctxt "group:configure" msgctxt "group:configure"
msgid "configure" msgid "configure"
msgstr "" msgstr ""
#: src/core/config.py:29
msgctxt "group:configure|desc"
msgid "View and adjust my configuration options."
msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -204,19 +204,19 @@ msgid_plural "Accounts successfully updated."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/modules/economy/cog.py:394 #: src/modules/economy/cog.py:409
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_balance|embed:role_lb|author" msgctxt "cmd:economy_balance|embed:role_lb|author"
msgid "Balance sheet for {name}" msgid "Balance sheet for {name}"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:400 #: src/modules/economy/cog.py:415
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_balance|embed:role_lb|header" msgctxt "cmd:economy_balance|embed:role_lb|header"
msgid "This server has a total balance of {coin_emoji}**{total}**." msgid "This server has a total balance of {coin_emoji}**{total}**."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:408 #: src/modules/economy/cog.py:423
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_balance|embed:role_lb|header" msgctxt "cmd:economy_balance|embed:role_lb|header"
msgid "" msgid ""
@@ -224,66 +224,66 @@ msgid ""
"balance of {coin_emoji}**{total}**." "balance of {coin_emoji}**{total}**."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:420 #: src/modules/economy/cog.py:435
msgctxt "cmd:economy_balance|embed:role_lb|row_format" msgctxt "cmd:economy_balance|embed:role_lb|row_format"
msgid "`[{pos:>{numwidth}}]` | `{coins:>{coinwidth}} LC` | {mention}" msgid "`[{pos:>{numwidth}}]` | `{coins:>{coinwidth}} LC` | {mention}"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:448 #: src/modules/economy/cog.py:463
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_balance|embed:role_lb|footer" msgctxt "cmd:economy_balance|embed:role_lb|footer"
msgid "Page {page}/{total}" msgid "Page {page}/{total}"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:458 #: src/modules/economy/cog.py:473
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_balance|embed:role_lb|header" msgctxt "cmd:economy_balance|embed:role_lb|header"
msgid "This server has a total balance of {coin_emoji}**0**." msgid "This server has a total balance of {coin_emoji}**0**."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:465 #: src/modules/economy/cog.py:480
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_balance|embed:role_lb|header" msgctxt "cmd:economy_balance|embed:role_lb|header"
msgid "The role {role_mention} has a total balance of {coin_emoji}**0**." msgid "The role {role_mention} has a total balance of {coin_emoji}**0**."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:485 #: src/modules/economy/cog.py:500
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_balance|embed:single|desc" msgctxt "cmd:economy_balance|embed:single|desc"
msgid "{mention} currently owns {coin_emoji} {coins}." msgid "{mention} currently owns {coin_emoji} {coins}."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:495 #: src/modules/economy/cog.py:510
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_balance|embed:single|author" msgctxt "cmd:economy_balance|embed:single|author"
msgid "Balance statement for {user}" msgid "Balance statement for {user}"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:504 #: src/modules/economy/cog.py:519
msgctxt "cmd:economy_reset" msgctxt "cmd:economy_reset"
msgid "reset" msgid "reset"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:507 #: src/modules/economy/cog.py:522
msgctxt "cmd:economy_reset|desc" msgctxt "cmd:economy_reset|desc"
msgid "" msgid ""
"Reset the coin balance for a target user or role. (See also \"economy " "Reset the coin balance for a target user or role. (See also \"economy "
"balance\".)" "balance\".)"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:511 #: src/modules/economy/cog.py:526
msgctxt "cmd:economy_reset|param:target" msgctxt "cmd:economy_reset|param:target"
msgid "target" msgid "target"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:516 #: src/modules/economy/cog.py:531
msgctxt "cmd:economy_reset|param:target|desc" msgctxt "cmd:economy_reset|param:target|desc"
msgid "" msgid ""
"Target user or role to view or update. Use @everyone to reset the entire " "Target user or role to view or update. Use @everyone to reset the entire "
"guild." "guild."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:543 #: src/modules/economy/cog.py:558
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_reset|confirm:reset_guild|desc" msgctxt "cmd:economy_reset|confirm:reset_guild|desc"
msgid "" msgid ""
@@ -292,17 +292,17 @@ msgid ""
"*This is not reversible!*" "*This is not reversible!*"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:551 #: src/modules/economy/cog.py:566
msgctxt "cmd:economy_reset|confirm:reset_guild|button:confirm" msgctxt "cmd:economy_reset|confirm:reset_guild|button:confirm"
msgid "Yes, reset the economy" msgid "Yes, reset the economy"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:555 #: src/modules/economy/cog.py:570
msgctxt "cmd:economy_reset|confirm:reset_guild|button:cancel" msgctxt "cmd:economy_reset|confirm:reset_guild|button:cancel"
msgid "Cancel reset" msgid "Cancel reset"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:571 #: src/modules/economy/cog.py:586
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_reset|embed:success_guild|desc" msgctxt "cmd:economy_reset|embed:success_guild|desc"
msgid "" msgid ""
@@ -310,13 +310,13 @@ msgid ""
"**{amount}**." "**{amount}**."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:588 #: src/modules/economy/cog.py:603
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_reset|error:no_target|desc" msgctxt "cmd:economy_reset|error:no_target|desc"
msgid "The role {mention} has no members to reset!" msgid "The role {mention} has no members to reset!"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:598 #: src/modules/economy/cog.py:613
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_reset|confirm:reset_role|desc" msgctxt "cmd:economy_reset|confirm:reset_role|desc"
msgid "" msgid ""
@@ -324,17 +324,17 @@ msgid ""
"**{count}** members will be affected." "**{count}** members will be affected."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:607 #: src/modules/economy/cog.py:622
msgctxt "cmd:economy_reset|confirm:reset_role|button:confirm" msgctxt "cmd:economy_reset|confirm:reset_role|button:confirm"
msgid "Yes, complete economy reset" msgid "Yes, complete economy reset"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:611 #: src/modules/economy/cog.py:626
msgctxt "cmd:economy_reset|confirm:reset_role|button:cancel" msgctxt "cmd:economy_reset|confirm:reset_role|button:cancel"
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:628 #: src/modules/economy/cog.py:643
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_reset|embed:success_role|desc" msgctxt "cmd:economy_reset|embed:success_role|desc"
msgid "" msgid ""
@@ -342,58 +342,81 @@ msgid ""
"**{amount}**." "**{amount}**."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:650 #: src/modules/economy/cog.py:665
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:economy_reset|embed:success_user|desc" msgctxt "cmd:economy_reset|embed:success_user|desc"
msgid "{mention}'s balance has been reset to {coin_emoji}**{amount}**." msgid "{mention}'s balance has been reset to {coin_emoji}**{amount}**."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:660 #: src/modules/economy/cog.py:675
msgctxt "cmd:send" msgctxt "cmd:send"
msgid "send" msgid "send"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:663 #: src/modules/economy/cog.py:678
msgctxt "cmd:send|desc" msgctxt "cmd:send|desc"
msgid "Gift the target user a certain number of LionCoins." msgid "Gift the target user a certain number of LionCoins."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:667 #: src/modules/economy/cog.py:682
msgctxt "cmd:send|param:target" msgctxt "cmd:send|param:target"
msgid "target" msgid "target"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:668 #: src/modules/economy/cog.py:683
msgctxt "cmd:send|param:amount" msgctxt "cmd:send|param:amount"
msgid "amount" msgid "amount"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:669 #: src/modules/economy/cog.py:684
msgctxt "cmd:send|param:note" msgctxt "cmd:send|param:note"
msgid "note" msgid "note"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:672 #: src/modules/economy/cog.py:687
msgctxt "cmd:send|param:target|desc" msgctxt "cmd:send|param:target|desc"
msgid "User to send the gift to" msgid "User to send the gift to"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:673 #: src/modules/economy/cog.py:688
msgctxt "cmd:send|param:amount|desc" msgctxt "cmd:send|param:amount|desc"
msgid "Number of coins to send" msgid "Number of coins to send"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:674 #: src/modules/economy/cog.py:689
msgctxt "cmd:send|param:note|desc" msgctxt "cmd:send|param:note|desc"
msgid "Optional note to add to the gift." msgid "Optional note to add to the gift."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:698 #: src/modules/economy/cog.py:713
msgctxt "cmd:send|error:not_allowed" msgctxt "cmd:send|error:not_allowed"
msgid "Sorry, this server has disabled LionCoin transfers!" msgid "Sorry, this server has disabled LionCoin transfers!"
msgstr "" 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 #, possible-python-brace-format
msgctxt "cmd:send|error:insufficient" msgctxt "cmd:send|error:insufficient"
msgid "" msgid ""
@@ -401,19 +424,19 @@ msgid ""
"`Current Balance:` {coin_emoji}{balance}" "`Current Balance:` {coin_emoji}{balance}"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:744 #: src/modules/economy/cog.py:791
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:send|embed:gift|title" msgctxt "cmd:send|embed:gift|title"
msgid "{user} sent you a gift!" msgid "{user} sent you a gift!"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:748 #: src/modules/economy/cog.py:795
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:send|embed:gift|desc" msgctxt "cmd:send|embed:gift|desc"
msgid "{mention} sent you {coin_emoji}**{amount}**." msgid "{mention} sent you {coin_emoji}**{amount}**."
msgstr "" msgstr ""
#: src/modules/economy/cog.py:773 #: src/modules/economy/cog.py:820
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:send|embed:ack|desc" msgctxt "cmd:send|embed:ack|desc"
msgid "" msgid ""
@@ -421,19 +444,19 @@ msgid ""
"{mention}!" "{mention}!"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:783 #: src/modules/economy/cog.py:830
msgctxt "cmd:send|embed:ack|desc|error:unreachable" msgctxt "cmd:send|embed:ack|desc|error:unreachable"
msgid "" msgid ""
"Unfortunately, I was not able to message the recipient. Perhaps they have me " "Unfortunately, I was not able to message the recipient. Perhaps they have me "
"blocked?" "blocked?"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:795 #: src/modules/economy/cog.py:842
msgctxt "cmd:configure_economy" msgctxt "cmd:configure_economy"
msgid "economy" msgid "economy"
msgstr "" msgstr ""
#: src/modules/economy/cog.py:798 #: src/modules/economy/cog.py:845
msgctxt "cmd:configure_economy|desc" msgctxt "cmd:configure_economy|desc"
msgid "Configure LionCoin Economy" msgid "Configure LionCoin Economy"
msgstr "" msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -30,57 +30,61 @@ msgstr ""
msgid "Execute arbitrary code with Exec" msgid "Execute arbitrary code with Exec"
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:272 #: src/modules/sysadmin/exec_cog.py:325
msgctxt "command" msgctxt "command"
msgid "eval" msgid "eval"
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:273 #: src/modules/sysadmin/exec_cog.py:326
msgctxt "command:eval" msgctxt "command:eval"
msgid "Execute arbitrary code with Eval" msgid "Execute arbitrary code with Eval"
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:276 #: src/modules/sysadmin/exec_cog.py:329
msgctxt "command:eval|param:string" msgctxt "command:eval|param:string"
msgid "Code to evaluate." msgid "Code to evaluate."
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:283 #: src/modules/sysadmin/exec_cog.py:336
msgctxt "command" msgctxt "command"
msgid "asyncall" msgid "asyncall"
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:284 #: src/modules/sysadmin/exec_cog.py:337
msgctxt "command:asyncall|desc" msgctxt "command:asyncall|desc"
msgid "Execute arbitrary code on all shards." msgid "Execute arbitrary code on all shards."
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:287 #: src/modules/sysadmin/exec_cog.py:340
msgctxt "command:asyncall|param:string" msgctxt "command:asyncall|param:string"
msgid "Cross-shard code to execute. Cannot reference ctx!" msgid "Cross-shard code to execute. Cannot reference ctx!"
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:288 #: src/modules/sysadmin/exec_cog.py:341
msgctxt "command:asyncall|param:target" msgctxt "command:asyncall|param:target"
msgid "Target shard app name, see autocomplete for options." msgid "Target shard app name, see autocomplete for options."
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:343 #: src/modules/sysadmin/exec_cog.py:384
msgid "reload" msgid "reload"
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:344 #: src/modules/sysadmin/exec_cog.py:385
msgid "Reload a given LionBot extension. Launches an ExecUI." msgid "Reload a given LionBot extension. Launches an ExecUI."
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:347 #: src/modules/sysadmin/exec_cog.py:388
msgid "Name of the extesion to reload. See autocomplete for options." msgid "Name of the extension to reload. See autocomplete for options."
msgstr "" 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" msgid "shutdown"
msgstr "" msgstr ""
#: src/modules/sysadmin/exec_cog.py:380 #: src/modules/sysadmin/exec_cog.py:426
msgid "Shutdown (or restart) the client." msgid "Shutdown (or restart) the client."
msgstr "" msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,85 +17,85 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: src/gui/cards/goals.py:95 #: src/gui/cards/goals.py:97
msgctxt "skin:goals|goal:tasks|name" msgctxt "skin:goals|goal:tasks|name"
msgid "TASKS DONE" msgid "TASKS DONE"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:99 #: src/gui/cards/goals.py:101
msgctxt "skin:goals|goal:tasks|goal" msgctxt "skin:goals|goal:tasks|goal"
msgid "GOAL: " msgid "GOAL: "
msgstr "" msgstr ""
#: src/gui/cards/goals.py:125 #: src/gui/cards/goals.py:127
msgctxt "skin:goals|goal:attendance|name" msgctxt "skin:goals|goal:attendance|name"
msgid "" msgid ""
"ATTENDANCE\n" "ATTENDANCE\n"
"RATE" "RATE"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:139 #: src/gui/cards/goals.py:141
msgctxt "skin:goals|mode:study|goal:middle|above" msgctxt "skin:goals|mode:study|goal:middle|above"
msgid "STUDIED" msgid "STUDIED"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:143 #: src/gui/cards/goals.py:145
msgctxt "skin:goals|mode:study|goal:middle|below" msgctxt "skin:goals|mode:study|goal:middle|below"
msgid "HOURS" msgid "HOURS"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:147 #: src/gui/cards/goals.py:149
msgctxt "skin:goals|mode:voice|goal:middle|above" msgctxt "skin:goals|mode:voice|goal:middle|above"
msgid "CHATTED" msgid "CHATTED"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:151 #: src/gui/cards/goals.py:153
msgctxt "skin:goals|mode:voice|goal:middle|below" msgctxt "skin:goals|mode:voice|goal:middle|below"
msgid "HOURS" msgid "HOURS"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:155 #: src/gui/cards/goals.py:157
msgctxt "skin:goals|mode:text|goal:middle|above" msgctxt "skin:goals|mode:text|goal:middle|above"
msgid "SENT" msgid "SENT"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:159 #: src/gui/cards/goals.py:161
msgctxt "skin:goals|mode:text|goal:middle|below" msgctxt "skin:goals|mode:text|goal:middle|below"
msgid "MESSAGES" msgid "MESSAGES"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:163 #: src/gui/cards/goals.py:165
msgctxt "skin:goals|mode:anki|goal:middle|above" msgctxt "skin:goals|mode:anki|goal:middle|above"
msgid "REVIEWED" msgid "REVIEWED"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:167 #: src/gui/cards/goals.py:169
msgctxt "skin:goals|mode:anki|goal:middle|below" msgctxt "skin:goals|mode:anki|goal:middle|below"
msgid "CARDS" msgid "CARDS"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:228 #: src/gui/cards/goals.py:230
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "skin:goals|footer" msgctxt "skin:goals|footer"
msgid "As of {day} {month} • {name}" msgid "As of {day} {month} • {name}"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:240 #: src/gui/cards/goals.py:242
msgctxt "ui:goals|weekly|title" msgctxt "ui:goals|weekly|title"
msgid "WEEKLY STATISTICS" msgid "WEEKLY STATISTICS"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:244 #: src/gui/cards/goals.py:246
msgctxt "ui:goals|weekly|task_header" msgctxt "ui:goals|weekly|task_header"
msgid "GOALS OF THE WEEK" msgid "GOALS OF THE WEEK"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:254 #: src/gui/cards/goals.py:256
msgctxt "ui:goals|monthly|title" msgctxt "ui:goals|monthly|title"
msgid "MONTHLY STATISTICS" msgid "MONTHLY STATISTICS"
msgstr "" msgstr ""
#: src/gui/cards/goals.py:258 #: src/gui/cards/goals.py:260
msgctxt "ui:goals|monthly|task_header" msgctxt "ui:goals|monthly|task_header"
msgid "GOALS OF THE MONTH" msgid "GOALS OF THE MONTH"
msgstr "" msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -84,8 +84,8 @@ msgid ""
"\n" "\n"
" Other relevant commands for guild configuration below:\n" " Other relevant commands for guild configuration below:\n"
" `/editshop`: Add/Edit/Remove colour roles from the {coin} shop.\n" " `/editshop`: Add/Edit/Remove colour roles from the {coin} shop.\n"
" `/ranks`: Add/Edit/Remove activity ranks.\n" " `/ranks`: Add/Edit/Refresh/Remove activity ranks.\n"
" `/timer admin`: Add/Edit/Remove Pomodoro timers in voice channels.\n" " `/pomodoro`: Add/Edit/Remove Pomodoro timers in voice channels.\n"
" `/rolemenus`: Allow members to equip roles from customisable messages.\n" " `/rolemenus`: Allow members to equip roles from customisable messages.\n"
" `/economy balance`: Display and modify LionCoin balance for members and " " `/economy balance`: Display and modify LionCoin balance for members and "
"roles.\n" "roles.\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -230,7 +230,7 @@ msgstr ""
msgctxt "guildset:mod_role|long_desc" msgctxt "guildset:mod_role|long_desc"
msgid "" msgid ""
"Members with the set role will be able to access my configuration panels, " "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 " "Moderators cannot reconfigure most bot configuration, or perform operations "
"they do not already have permission for in Discord." "they do not already have permission for in Discord."
msgstr "" msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,32 +17,32 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\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" msgctxt "cmd:configure_ranks|param:rank_type|choice:voice"
msgid "Voice" msgid "Voice"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:74 #: src/modules/ranks/cog.py:77
msgctxt "cmd:configure_ranks|param:rank_type|choice:xp" msgctxt "cmd:configure_ranks|param:rank_type|choice:xp"
msgid "XP" msgid "XP"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:75 #: src/modules/ranks/cog.py:78
msgctxt "cmd:configure_ranks|param:rank_type|choice:message" msgctxt "cmd:configure_ranks|param:rank_type|choice:message"
msgid "Message" msgid "Message"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:383 #: src/modules/ranks/cog.py:406
msgctxt "event:rank_update|embed:notify" msgctxt "event:rank_update|embed:notify"
msgid "New Activity Rank Attained!" msgid "New Activity Rank Attained!"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:494 #: src/modules/ranks/cog.py:516
msgctxt "rank_refresh|error:roles_dne|desc" msgctxt "rank_refresh|error:roles_dne|desc"
msgid "Some ranks have invalid or deleted roles! Please remove them first." msgid "Some ranks have invalid or deleted roles! Please remove them first."
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:504 #: src/modules/ranks/cog.py:526
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "rank_refresh|error:unassignable_roles|desc" msgctxt "rank_refresh|error:unassignable_roles|desc"
msgid "" msgid ""
@@ -50,36 +50,36 @@ msgid ""
"{roles}" "{roles}"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:574 #: src/modules/ranks/cog.py:596
msgctxt "rank_refresh|remove_roles|audit" msgctxt "rank_refresh|remove_roles|audit"
msgid "Removing invalid rank role." msgid "Removing invalid rank role."
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:588 #: src/modules/ranks/cog.py:610
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "rank_refresh|remove_roles|small_error" msgctxt "rank_refresh|remove_roles|small_error"
msgid "*Could not remove ranks from {member}*" msgid "*Could not remove ranks from {member}*"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:595 #: src/modules/ranks/cog.py:617
msgctxt "rank_refresh|remove_roles|error:too_many_issues" msgctxt "rank_refresh|remove_roles|error:too_many_issues"
msgid "" msgid ""
"Too many issues occurred while removing ranks! Please check my permissions " "Too many issues occurred while removing ranks! Please check my permissions "
"and try again in a few minutes." "and try again in a few minutes."
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:609 #: src/modules/ranks/cog.py:631
msgctxt "rank_refresh|add_roles|audit" msgctxt "rank_refresh|add_roles|audit"
msgid "Adding rank role from refresh" msgid "Adding rank role from refresh"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:623 #: src/modules/ranks/cog.py:645
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "rank_refresh|add_roles|small_error" msgctxt "rank_refresh|add_roles|small_error"
msgid "*Could not add {role} to {member}*" msgid "*Could not add {role} to {member}*"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:630 #: src/modules/ranks/cog.py:652
msgctxt "rank_refresh|add_roles|error:too_many_issues" msgctxt "rank_refresh|add_roles|error:too_many_issues"
msgid "" msgid ""
"Too many issues occurred while adding ranks! Please check my permissions and " "Too many issues occurred while adding ranks! Please check my permissions and "
@@ -87,22 +87,22 @@ msgid ""
msgstr "" msgstr ""
#. ---------- Commands ---------- #. ---------- Commands ----------
#: src/modules/ranks/cog.py:655 #: src/modules/ranks/cog.py:677
msgctxt "cmd:ranks" msgctxt "cmd:ranks"
msgid "ranks" msgid "ranks"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:687 #: src/modules/ranks/cog.py:709
msgctxt "cmd:configure_ranks" msgctxt "cmd:configure_ranks"
msgid "ranks" msgid "ranks"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:688 #: src/modules/ranks/cog.py:710
msgctxt "cmd:configure_ranks|desc" msgctxt "cmd:configure_ranks|desc"
msgid "Configure Activity Ranks" msgid "Configure Activity Ranks"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:748 #: src/modules/ranks/cog.py:770
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "" msgctxt ""
"cmd:configure_ranks|response:updated|setting:notification|withdm_withchannel" "cmd:configure_ranks|response:updated|setting:notification|withdm_withchannel"
@@ -111,20 +111,20 @@ msgid ""
"otherwise to {channel}" "otherwise to {channel}"
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:754 #: src/modules/ranks/cog.py:776
msgctxt "" msgctxt ""
"cmd:configure_ranks|response:updated|setting:notification|withdm_nochannel" "cmd:configure_ranks|response:updated|setting:notification|withdm_nochannel"
msgid "Rank update notifications will be sent via **direct message**." msgid "Rank update notifications will be sent via **direct message**."
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:760 #: src/modules/ranks/cog.py:782
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "" msgctxt ""
"cmd:configure_ranks|response:updated|setting:notification|nodm_withchannel" "cmd:configure_ranks|response:updated|setting:notification|nodm_withchannel"
msgid "Rank update notifications will be sent to {channel}." msgid "Rank update notifications will be sent to {channel}."
msgstr "" msgstr ""
#: src/modules/ranks/cog.py:765 #: src/modules/ranks/cog.py:787
msgctxt "" msgctxt ""
"cmd:configure_ranks|response:updated|setting:notification|nodm_nochannel" "cmd:configure_ranks|response:updated|setting:notification|nodm_nochannel"
msgid "Members will not be notified when their activity rank updates." msgid "Members will not be notified when their activity rank updates."
@@ -545,27 +545,27 @@ msgstr ""
#: src/modules/ranks/ui/refresh.py:202 #: src/modules/ranks/ui/refresh.py:202
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:refresh_ranks|embed|field:remove|value" msgctxt "ui:refresh_ranks|embed|field:remove|value"
msgid "0 {progress} {total}" msgid "{progress} {done}/{total} removed"
msgstr "" msgstr ""
#: src/modules/ranks/ui/refresh.py:212 #: src/modules/ranks/ui/refresh.py:213
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:refresh_ranks|embed|line:remove" msgctxt "ui:refresh_ranks|embed|line:remove"
msgid "**Removed invalid ranks:** {done}/{target}" msgid "**Removed invalid ranks:** {done}/{target}"
msgstr "" msgstr ""
#: src/modules/ranks/ui/refresh.py:220 #: src/modules/ranks/ui/refresh.py:221
msgctxt "ui:refresh_ranks|embed|field:add|name" msgctxt "ui:refresh_ranks|embed|field:add|name"
msgid "Giving members their rank roles" msgid "Giving members their rank roles"
msgstr "" msgstr ""
#: src/modules/ranks/ui/refresh.py:224 #: src/modules/ranks/ui/refresh.py:225
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:refresh_ranks|embed|field:add|value" msgctxt "ui:refresh_ranks|embed|field:add|value"
msgid "0 {progress} {total}" msgid "{progress} {done}/{total} given"
msgstr "" msgstr ""
#: src/modules/ranks/ui/refresh.py:234 #: src/modules/ranks/ui/refresh.py:236
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:refresh_ranks|embed|line:add" msgctxt "ui:refresh_ranks|embed|line:add"
msgid "**Updated member ranks:** {done}/{target}" msgid "**Updated member ranks:** {done}/{target}"
@@ -621,27 +621,42 @@ msgctxt "dash:rank|dropdown|placeholder"
msgid "Activity Rank Panel" msgid "Activity Rank Panel"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:92 #: src/modules/ranks/ui/overview.py:94
msgctxt "ui:rank_overview|button:auto|label" msgctxt "ui:rank_overview|button:auto|label"
msgid "Auto Create" msgid "Auto Create"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:107 #: src/modules/ranks/ui/overview.py:109
msgctxt "ui:rank_overview|button:refresh|label" msgctxt "ui:rank_overview|button:refresh|label"
msgid "Refresh Member Ranks" msgid "Refresh Member Ranks"
msgstr "" 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" msgctxt "ui:rank_overview|button:clear|label"
msgid "Clear Ranks" msgid "Clear Ranks"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:153 #: src/modules/ranks/ui/overview.py:178
msgctxt "ui:rank_overview|button:create|label" msgctxt "ui:rank_overview|button:create|label"
msgid "Create Rank" msgid "Create Rank"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:169 #: src/modules/ranks/ui/overview.py:194
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:rank_overview|menu:roles|error:above_caller" msgctxt "ui:rank_overview|menu:roles|error:above_caller"
msgid "" msgid ""
@@ -649,24 +664,24 @@ msgid ""
"may only manage roles below your top role." "may only manage roles below your top role."
msgstr "" 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" msgctxt "ui:rank_overview|menu:roles|error:above_caller|title"
msgid "Insufficient permissions!" msgid "Insufficient permissions!"
msgstr "" 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" msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:is_default"
msgid "The @everyone role cannot be removed, and cannot be a rank!" msgid "The @everyone role cannot be removed, and cannot be a rank!"
msgstr "" 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" msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:is_managed"
msgid "" msgid ""
"The role is managed by another application or integration, and cannot be a " "The role is managed by another application or integration, and cannot be a "
"rank!" "rank!"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:218 #: src/modules/ranks/ui/overview.py:243
msgctxt "" msgctxt ""
"ui:rank_overview|menu:roles|error:not_assignable|suberror:no_permissions" "ui:rank_overview|menu:roles|error:not_assignable|suberror:no_permissions"
msgid "" msgid ""
@@ -674,34 +689,62 @@ msgid ""
"manage ranks!" "manage ranks!"
msgstr "" 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" msgctxt "ui:rank_overview|menu:roles|error:not_assignable|suberror:above_me"
msgid "" msgid ""
"This role is above my top role in the role hierarchy, so I cannot add or " "This role is above my top role in the role hierarchy, so I cannot add or "
"remove it!" "remove it!"
msgstr "" 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" 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!" msgid "I am not able to manage the selected role, so it cannot be a rank!"
msgstr "" 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" msgctxt "ui:rank_overview|menu:roles|error:not_assignable|title"
msgid "Could not create rank!" msgid "Could not create rank!"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:259 #: src/modules/ranks/ui/overview.py:284
msgctxt "ui:rank_overview|menu:roles|placeholder" msgctxt "ui:rank_overview|menu:roles|placeholder"
msgid "Create from role" msgid "Create from role"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:276 #: src/modules/ranks/ui/overview.py:301
msgctxt "ui:rank_overview|menu:ranks|placeholder" msgctxt "ui:rank_overview|menu:ranks|placeholder"
msgid "View or edit rank" msgid "View or edit rank"
msgstr "" 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" msgctxt "ui:rank_overview|embed:noranks|desc"
msgid "" msgid ""
"No activity ranks have been set up!\n" "No activity ranks have been set up!\n"
@@ -709,19 +752,19 @@ msgid ""
"xp ranks, or select a role or press Create below!" "xp ranks, or select a role or press Create below!"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:370 #: src/modules/ranks/ui/overview.py:423
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:rank_overview|embed|title|type:voice" msgctxt "ui:rank_overview|embed|title|type:voice"
msgid "Voice Ranks in {guild_name}" msgid "Voice Ranks in {guild_name}"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:375 #: src/modules/ranks/ui/overview.py:428
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:rank_overview|embed|title|type:xp" msgctxt "ui:rank_overview|embed|title|type:xp"
msgid "XP ranks in {guild_name}" msgid "XP ranks in {guild_name}"
msgstr "" msgstr ""
#: src/modules/ranks/ui/overview.py:380 #: src/modules/ranks/ui/overview.py:433
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:rank_overview|embed|title|type:message" msgctxt "ui:rank_overview|embed|title|type:message"
msgid "Message ranks in {guild_name}" msgid "Message ranks in {guild_name}"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,27 +18,356 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\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" msgctxt "reminder|embed"
msgid "You asked me to remind you!" msgid "You asked me to remind you!"
msgstr "" msgstr ""
#: src/modules/reminders/cog.py:101 #: src/modules/reminders/data.py:102
msgctxt "reminder|embed" msgctxt "reminder|embed"
msgid "Context?" msgid "Context?"
msgstr "" msgstr ""
#: src/modules/reminders/cog.py:103 #: src/modules/reminders/data.py:104
msgctxt "reminder|embed" msgctxt "reminder|embed"
msgid "Click Here" msgid "Click Here"
msgstr "" msgstr ""
#: src/modules/reminders/cog.py:110 #: src/modules/reminders/data.py:111
msgctxt "reminder|embed" msgctxt "reminder|embed"
msgid "Next reminder" msgid "Next reminder"
msgstr "" msgstr ""
#: src/modules/reminders/cog.py:134 #: src/modules/reminders/data.py:135
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "reminder|formatted|interval" msgctxt "reminder|formatted|interval"
msgid "Every day" msgid "Every day"
@@ -46,7 +375,7 @@ msgid_plural "Every `{days}` days"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/modules/reminders/cog.py:143 #: src/modules/reminders/data.py:144
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "reminder|formatted|interval" msgctxt "reminder|formatted|interval"
msgid "Every hour" msgid "Every hour"
@@ -54,305 +383,8 @@ msgid_plural "Every `{hours}` hours"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/modules/reminders/cog.py:152 #: src/modules/reminders/data.py:153
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "reminder|formatted|interval" msgctxt "reminder|formatted|interval"
msgid "Every `{duration}`" msgid "Every `{duration}`"
msgstr "" 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 ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -92,8 +92,9 @@ msgid "Create Room Timer"
msgstr "" msgstr ""
#: src/modules/rooms/roomui.py:236 #: src/modules/rooms/roomui.py:236
#, possible-python-brace-format
msgctxt "ui:room_status|button:timer|timer_created" 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 "" msgstr ""
#: src/modules/rooms/roomui.py:254 #: src/modules/rooms/roomui.py:254
@@ -177,83 +178,83 @@ msgctxt "ui:room_status|embed|field:members|name"
msgid "Members ({count}/{cap})" msgid "Members ({count}/{cap})"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:306 #: src/modules/rooms/cog.py:321
msgctxt "cmd:room" msgctxt "cmd:room"
msgid "room" msgid "room"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:307 #: src/modules/rooms/cog.py:322
msgctxt "cmd:room|desc" msgctxt "cmd:room|desc"
msgid "Base command group for private room configuration." msgid "Base command group for private room configuration."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:314 #: src/modules/rooms/cog.py:329
msgctxt "cmd:room_rent" msgctxt "cmd:room_rent"
msgid "rent" msgid "rent"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:317 #: src/modules/rooms/cog.py:332
msgctxt "cmd:room_rent|desc" msgctxt "cmd:room_rent|desc"
msgid "Rent a private voice channel with LionCoins." msgid "Rent a private voice channel with LionCoins."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:321 #: src/modules/rooms/cog.py:336
msgctxt "cmd:room_rent|param:days" msgctxt "cmd:room_rent|param:days"
msgid "days" msgid "days"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:322 #: src/modules/rooms/cog.py:337
msgctxt "cmd:room_rent|param:members" msgctxt "cmd:room_rent|param:members"
msgid "members" msgid "members"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:323 #: src/modules/rooms/cog.py:338
msgctxt "cmd:room_rent|param:name" msgctxt "cmd:room_rent|param:name"
msgid "name" msgid "name"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:328 #: src/modules/rooms/cog.py:343
msgctxt "cmd:room_rent|param:days|desc" msgctxt "cmd:room_rent|param:days|desc"
msgid "Number of days to pre-purchase. (Default: 1)" msgid "Number of days to pre-purchase. (Default: 1)"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:332 #: src/modules/rooms/cog.py:347
msgctxt "cmd:room_rent|param:members|desc" msgctxt "cmd:room_rent|param:members|desc"
msgid "Mention the members you want to add to your private room." msgid "Mention the members you want to add to your private room."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:336 #: src/modules/rooms/cog.py:351
msgctxt "cmd:room_rent|param:name|desc" msgctxt "cmd:room_rent|param:name|desc"
msgid "Name of your private voice channel." msgid "Name of your private voice channel."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:354 #: src/modules/rooms/cog.py:369
msgctxt "cmd:room_rent|error:not_setup" msgctxt "cmd:room_rent|error:not_setup"
msgid "" msgid ""
"The private room system has not been set up! A private room category needs " "The private room system has not been set up! A private room category needs "
"to be set first with `/configure rooms`." "to be set first with `/configure rooms`."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:365 #: src/modules/rooms/cog.py:380
msgctxt "cmd:room_rent|error:insufficient_perms" msgctxt "cmd:room_rent|error:insufficient_perms"
msgid "" msgid ""
"I do not have enough permissions to create a new channel under the " "I do not have enough permissions to create a new channel under the "
"configured private room category!" "configured private room category!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:379 #: src/modules/rooms/cog.py:394
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_rent|error:room_exists" msgctxt "cmd:room_rent|error:room_exists"
msgid "You already own a private room! Click to visit: {channel}" msgid "You already own a private room! Click to visit: {channel}"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:399 #: src/modules/rooms/cog.py:414
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_rent|error:member_not_found" msgctxt "cmd:room_rent|error:member_not_found"
msgid "Could not find the requested member {mention} in this server!" msgid "Could not find the requested member {mention} in this server!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:413 #: src/modules/rooms/cog.py:428
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_rent|error:too_many_members" msgctxt "cmd:room_rent|error:too_many_members"
msgid "" msgid ""
@@ -261,7 +262,7 @@ msgid ""
"but the maximum private room size is `{cap}`!" "but the maximum private room size is `{cap}`!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:427 #: src/modules/rooms/cog.py:442
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_rent|confirm:purchase" msgctxt "cmd:room_rent|confirm:purchase"
msgid "" msgid ""
@@ -273,18 +274,18 @@ msgid_plural ""
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/modules/rooms/cog.py:452 #: src/modules/rooms/cog.py:467
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_rent|success" msgctxt "cmd:room_rent|success"
msgid "Successfully created your private room {channel}!" msgid "Successfully created your private room {channel}!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:457 #: src/modules/rooms/cog.py:472
msgctxt "cmd:room_rent|success|title" msgctxt "cmd:room_rent|success|title"
msgid "Private Room Created!" msgid "Private Room Created!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:491 #: src/modules/rooms/cog.py:506
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_rent|error:insufficient_funds" msgctxt "cmd:room_rent|error:insufficient_funds"
msgid "" msgid ""
@@ -296,14 +297,14 @@ msgid_plural ""
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/modules/rooms/cog.py:525 #: src/modules/rooms/cog.py:540
msgctxt "cmd:room_rent|error:my_permissions" msgctxt "cmd:room_rent|error:my_permissions"
msgid "" msgid ""
"Could not create your private room! You were not charged.\n" "Could not create your private room! You were not charged.\n"
"I have insufficient permissions to create a private room channel." "I have insufficient permissions to create a private room channel."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:537 #: src/modules/rooms/cog.py:552
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_rent|error:unknown" msgctxt "cmd:room_rent|error:unknown"
msgid "" msgid ""
@@ -312,62 +313,62 @@ msgid ""
"`{error}`" "`{error}`"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:547 #: src/modules/rooms/cog.py:562
msgctxt "cmd:room_status" msgctxt "cmd:room_status"
msgid "status" msgid "status"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:550 #: src/modules/rooms/cog.py:565
msgctxt "cmd:room_status|desc" msgctxt "cmd:room_status|desc"
msgid "Display the status of your current room." msgid "Display the status of your current room."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:567 #: src/modules/rooms/cog.py:582
msgctxt "cmd:room_status|error:no_target" msgctxt "cmd:room_status|error:no_target"
msgid "" msgid ""
"Could not identify target private room! Please re-run the command in the " "Could not identify target private room! Please re-run the command in the "
"private room you wish to view the status of." "private room you wish to view the status of."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:582 #: src/modules/rooms/cog.py:597
msgctxt "cmd:room_invite" msgctxt "cmd:room_invite"
msgid "invite" msgid "invite"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:585 #: src/modules/rooms/cog.py:600
msgctxt "cmd:room_invite|desc" msgctxt "cmd:room_invite|desc"
msgid "Add members to your private room." msgid "Add members to your private room."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:589 #: src/modules/rooms/cog.py:604
msgctxt "cmd:room_invite|param:members" msgctxt "cmd:room_invite|param:members"
msgid "members" msgid "members"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:594 #: src/modules/rooms/cog.py:609
msgctxt "cmd:room_invite|param:members|desc" msgctxt "cmd:room_invite|param:members|desc"
msgid "Mention the members you want to add." msgid "Mention the members you want to add."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:608 #: src/modules/rooms/cog.py:623
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_invite|error:no_room" msgctxt "cmd:room_invite|error:no_room"
msgid "" msgid ""
"You do not own a private room! Use `/room rent` to rent one with {coin}!" "You do not own a private room! Use `/room rent` to rent one with {coin}!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:629 #: src/modules/rooms/cog.py:644
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_invite|error:member_not_found" msgctxt "cmd:room_invite|error:member_not_found"
msgid "Could not find the invited member {mention} in this server!" msgid "Could not find the invited member {mention} in this server!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:640 #: src/modules/rooms/cog.py:655
msgctxt "cmd:room_invite|error:no_new_members" msgctxt "cmd:room_invite|error:no_new_members"
msgid "All members mentioned are already in the room!" msgid "All members mentioned are already in the room!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:654 #: src/modules/rooms/cog.py:669
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_invite|error:too_many_members" msgctxt "cmd:room_invite|error:too_many_members"
msgid "" msgid ""
@@ -375,89 +376,89 @@ msgid ""
"you already have `{current}`, and the member cap is `{cap}`!" "you already have `{current}`, and the member cap is `{cap}`!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:678 #: src/modules/rooms/cog.py:693
msgctxt "cmd:room_invite|success|ack" msgctxt "cmd:room_invite|success|ack"
msgid "Members Invited successfully." msgid "Members Invited successfully."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:686 #: src/modules/rooms/cog.py:701
msgctxt "cmd:room_kick" msgctxt "cmd:room_kick"
msgid "kick" msgid "kick"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:689 #: src/modules/rooms/cog.py:704
msgctxt "cmd:room_kick|desc" msgctxt "cmd:room_kick|desc"
msgid "Remove a members from your private room." msgid "Remove a members from your private room."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:693 #: src/modules/rooms/cog.py:708
msgctxt "cmd:room_kick|param:members" msgctxt "cmd:room_kick|param:members"
msgid "members" msgid "members"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:698 #: src/modules/rooms/cog.py:713
msgctxt "cmd:room_kick|param:members|desc" msgctxt "cmd:room_kick|param:members|desc"
msgid "" msgid ""
"Mention the members you want to remove. Also accepts space-separated user " "Mention the members you want to remove. Also accepts space-separated user "
"ids." "ids."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:712 #: src/modules/rooms/cog.py:727
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_kick|error:no_room" msgctxt "cmd:room_kick|error:no_room"
msgid "" msgid ""
"You do not own a private room! Use `/room rent` to rent one with {coin}!" "You do not own a private room! Use `/room rent` to rent one with {coin}!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:729 #: src/modules/rooms/cog.py:744
msgctxt "cmd:room_kick|error:no_matching_members" msgctxt "cmd:room_kick|error:no_matching_members"
msgid "None of the mentioned members are in this room!" msgid "None of the mentioned members are in this room!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:746 #: src/modules/rooms/cog.py:761
msgctxt "cmd:room_kick|success|ack" msgctxt "cmd:room_kick|success|ack"
msgid "Members removed." msgid "Members removed."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:752 #: src/modules/rooms/cog.py:767
msgctxt "cmd:room_transfer" msgctxt "cmd:room_transfer"
msgid "transfer" msgid "transfer"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:755 #: src/modules/rooms/cog.py:770
msgctxt "cmd:room_transfer|desc" msgctxt "cmd:room_transfer|desc"
msgid "Transfer your private room to another room member. Not reversible!" msgid "Transfer your private room to another room member. Not reversible!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:759 #: src/modules/rooms/cog.py:774
msgctxt "cmd:room_transfer|param:new_owner" msgctxt "cmd:room_transfer|param:new_owner"
msgid "new_owner" msgid "new_owner"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:764 #: src/modules/rooms/cog.py:779
msgctxt "cmd:room_transfer|param:new_owner" msgctxt "cmd:room_transfer|param:new_owner"
msgid "The room member you would like to transfer your room to." msgid "The room member you would like to transfer your room to."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:778 #: src/modules/rooms/cog.py:793
msgctxt "cmd:room_transfer|error:no_room" msgctxt "cmd:room_transfer|error:no_room"
msgid "You do not own a private room to transfer!" msgid "You do not own a private room to transfer!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:790 #: src/modules/rooms/cog.py:805
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_transfer|error:target_not_member" msgctxt "cmd:room_transfer|error:target_not_member"
msgid "" msgid ""
"{mention} is not a member of your private room! You must invite them first." "{mention} is not a member of your private room! You must invite them first."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:802 #: src/modules/rooms/cog.py:817
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_transfer|error:target_has_room" msgctxt "cmd:room_transfer|error:target_has_room"
msgid "{mention} already owns a room! Members can only own one room at a time." msgid "{mention} already owns a room! Members can only own one room at a time."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:811 #: src/modules/rooms/cog.py:826
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_transfer|confirm|question" msgctxt "cmd:room_transfer|confirm|question"
msgid "" msgid ""
@@ -465,62 +466,62 @@ msgid ""
"{new_owner}? This action is not reversible!" "{new_owner}? This action is not reversible!"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:831 #: src/modules/rooms/cog.py:846
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_transfer|success|description" msgctxt "cmd:room_transfer|success|description"
msgid "" msgid ""
"You have successfully transferred ownership of {channel} to {new_owner}." "You have successfully transferred ownership of {channel} to {new_owner}."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:837 #: src/modules/rooms/cog.py:852
msgctxt "cmd:room_deposit" msgctxt "cmd:room_deposit"
msgid "deposit" msgid "deposit"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:840 #: src/modules/rooms/cog.py:855
msgctxt "cmd:room_deposit|desc" msgctxt "cmd:room_deposit|desc"
msgid "" msgid ""
"Deposit LionCoins in your private room bank to add more days. (Members may " "Deposit LionCoins in your private room bank to add more days. (Members may "
"also deposit!)" "also deposit!)"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:844 #: src/modules/rooms/cog.py:859
msgctxt "cmd:room_deposit|param:coins" msgctxt "cmd:room_deposit|param:coins"
msgid "coins" msgid "coins"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:849 #: src/modules/rooms/cog.py:864
msgctxt "cmd:room_deposit|param:coins|desc" msgctxt "cmd:room_deposit|param:coins|desc"
msgid "Number of coins to deposit." msgid "Number of coins to deposit."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:869 #: src/modules/rooms/cog.py:884
msgctxt "cmd:room_deposit|error:no_target" msgctxt "cmd:room_deposit|error:no_target"
msgid "" msgid ""
"Could not identify target private room! Please re-run the command in the " "Could not identify target private room! Please re-run the command in the "
"private room you wish to contribute to." "private room you wish to contribute to."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:885 #: src/modules/rooms/cog.py:900
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_deposit|error:insufficient_funds" msgctxt "cmd:room_deposit|error:insufficient_funds"
msgid "" msgid ""
"You cannot deposit {coin}**{amount}**! You only have {coin}**{balance}**." "You cannot deposit {coin}**{amount}**! You only have {coin}**{balance}**."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:906 #: src/modules/rooms/cog.py:921
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:room_depost|success" msgctxt "cmd:room_depost|success"
msgid "" msgid ""
"Success! You have contributed {coin}**{amount}** to the private room bank." "Success! You have contributed {coin}**{amount}** to the private room bank."
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:921 #: src/modules/rooms/cog.py:936
msgctxt "cmd:configure_rooms" msgctxt "cmd:configure_rooms"
msgid "rooms" msgid "rooms"
msgstr "" msgstr ""
#: src/modules/rooms/cog.py:922 #: src/modules/rooms/cog.py:937
msgctxt "cmd:configure_rooms|desc" msgctxt "cmd:configure_rooms|desc"
msgid "Configure Rented Private Rooms" msgid "Configure Rented Private Rooms"
msgstr "" msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -23,84 +23,89 @@ msgid "editshop"
msgstr "" msgstr ""
#: src/modules/shop/cog.py:117 #: src/modules/shop/cog.py:117
msgctxt "group:shop" msgctxt "cmd:shop"
msgid "shop" msgid "shop"
msgstr "" 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" msgctxt "cmd:shop_open"
msgid "open" msgid "open"
msgstr "" msgstr ""
#: src/modules/shop/cog.py:124 #: src/modules/shop/cog.py:125
msgctxt "cmd:shop_open|desc" msgctxt "cmd:shop_open|desc"
msgid "Open the server shop." msgid "Open the server shop."
msgstr "" msgstr ""
#: src/modules/shop/cog.py:150 #: src/modules/shop/cog.py:151
msgctxt "cmd:shop_open|error:no_shops" msgctxt "cmd:shop_open|error:no_shops"
msgid "There is nothing to buy!" msgid "There is nothing to buy!"
msgstr "" msgstr ""
#: src/modules/shop/cog.py:212 #: src/modules/shop/cog.py:213
msgctxt "ui:stores|button:close|label" msgctxt "ui:stores|button:close|label"
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: src/modules/shop/cog.py:219 #: src/modules/shop/cog.py:220
msgctxt "ui:stores|button:close|response|title" msgctxt "ui:stores|button:close|response|title"
msgid "Shop Closed" msgid "Shop Closed"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:104 #: src/modules/shop/shops/colours.py:105
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:colourstore|menu:buycolours|label" msgctxt "ui:colourstore|menu:buycolours|label"
msgid "{name} ({price} LC)" msgid "{name} ({price} LC)"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:109 #: src/modules/shop/shops/colours.py:110
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:colourstore|menu:buycolours|label" msgctxt "ui:colourstore|menu:buycolours|label"
msgid "{name} (This is your colour!)" msgid "{name} (This is your colour!)"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:114 #: src/modules/shop/shops/colours.py:115
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:colourstore|menu:buycolours|desc" msgctxt "ui:colourstore|menu:buycolours|desc"
msgid "Colour: {colour}" msgid "Colour: {colour}"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:119 #: src/modules/shop/shops/colours.py:120
msgctxt "ui:colourstore|menu:buycolours|desc" msgctxt "ui:colourstore|menu:buycolours|desc"
msgid "Colour: Unknown" msgid "Colour: Unknown"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:133 #: src/modules/shop/shops/colours.py:134
msgctxt "shop:colours|name" msgctxt "shop:colours|name"
msgid "Colour Shop" msgid "Colour Shop"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:172 #: src/modules/shop/shops/colours.py:173
msgctxt "shop:colour|purchase|error:not_purchasable" msgctxt "shop:colour|purchase|error:not_purchasable"
msgid "This item may not be purchased!" msgid "This item may not be purchased!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:185 #: src/modules/shop/shops/colours.py:186
msgctxt "shop:colour|purchase|error:no_guild" msgctxt "shop:colour|purchase|error:no_guild"
msgid "Could not retrieve the server from Discord!" msgid "Could not retrieve the server from Discord!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:195 #: src/modules/shop/shops/colours.py:196
msgctxt "shop:colour|purchase|error:no_member" msgctxt "shop:colour|purchase|error:no_member"
msgid "Could not retrieve the member from Discord." msgid "Could not retrieve the member from Discord."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:205 #: src/modules/shop/shops/colours.py:206
msgctxt "shop:colour|purchase|error:no_role" msgctxt "shop:colour|purchase|error:no_role"
msgid "This colour role could not be found in the server." msgid "This colour role could not be found in the server."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:214 #: src/modules/shop/shops/colours.py:215
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "shop:colour|purchase|error:low_balance" msgctxt "shop:colour|purchase|error:low_balance"
msgid "" msgid ""
@@ -108,72 +113,72 @@ msgid ""
"Your balance is {coin}{balance}" "Your balance is {coin}{balance}"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:229 #: src/modules/shop/shops/colours.py:230
msgctxt "shop:colour|purchase|error:owned" msgctxt "shop:colour|purchase|error:owned"
msgid "You already own this item!" msgid "You already own this item!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:263 #: src/modules/shop/shops/colours.py:264
msgctxt "shop:colour|purchase|error:failed_no_role" msgctxt "shop:colour|purchase|error:failed_no_role"
msgid "This colour role no longer exists!" msgid "This colour role no longer exists!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:270 #: src/modules/shop/shops/colours.py:271
msgctxt "shop:colour|purchase|error:failed_permissions" msgctxt "shop:colour|purchase|error:failed_permissions"
msgid "I do not have enough permissions to give you this colour role!" msgid "I do not have enough permissions to give you this colour role!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:277 #: src/modules/shop/shops/colours.py:278
msgctxt "shop:colour|purchase|error:failed_unknown" msgctxt "shop:colour|purchase|error:failed_unknown"
msgid "An unknown error occurred while giving you this colour role!" msgid "An unknown error occurred while giving you this colour role!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:346 #: src/modules/shop/shops/colours.py:348
msgctxt "grp:editshop_colours" msgctxt "grp:editshop_colours"
msgid "colours" msgid "colours"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:351 #: src/modules/shop/shops/colours.py:353
msgctxt "cmd:editshop_colours_create" msgctxt "cmd:editshop_colours_create"
msgid "create" msgid "create"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:354 #: src/modules/shop/shops/colours.py:356
msgctxt "cmd:editshop_colours_create|desc" msgctxt "cmd:editshop_colours_create|desc"
msgid "Create a new colour role with the given colour." msgid "Create a new colour role with the given colour."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:358 #: src/modules/shop/shops/colours.py:360
msgctxt "cmd:editshop_colours_create|param:colour" msgctxt "cmd:editshop_colours_create|param:colour"
msgid "colour" msgid "colour"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:359 #: src/modules/shop/shops/colours.py:361
msgctxt "cmd:editshop_colours_create|param:name" msgctxt "cmd:editshop_colours_create|param:name"
msgid "name" msgid "name"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:360 #: src/modules/shop/shops/colours.py:362
msgctxt "cmd:editshop_colours_create|param:price" msgctxt "cmd:editshop_colours_create|param:price"
msgid "price" msgid "price"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:365 #: src/modules/shop/shops/colours.py:367
msgctxt "cmd:editshop_colours_create|param:colour|desc" msgctxt "cmd:editshop_colours_create|param:colour|desc"
msgid "What colour should the role be? (As a hex code, e.g. #AB22AB)" msgid "What colour should the role be? (As a hex code, e.g. #AB22AB)"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:369 #: src/modules/shop/shops/colours.py:371
msgctxt "cmd:editshop_colours_create|param:name|desc" msgctxt "cmd:editshop_colours_create|param:name|desc"
msgid "What should the colour role be called?" msgid "What should the colour role be called?"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:373 #: src/modules/shop/shops/colours.py:375
msgctxt "cmd:editshop_colours_create|param:price|desc" msgctxt "cmd:editshop_colours_create|param:price|desc"
msgid "How much should the colour role cost?" msgid "How much should the colour role cost?"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:395 #: src/modules/shop/shops/colours.py:397
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_create|error:parse_colour" msgctxt "cmd:editshop_colours_create|error:parse_colour"
msgid "" msgid ""
@@ -181,7 +186,7 @@ msgid ""
"Please enter the colour as a hex string, e.g. `#FA0BC1`" "Please enter the colour as a hex string, e.g. `#FA0BC1`"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:405 #: src/modules/shop/shops/colours.py:407
msgctxt "cmd:editshop_colours_create|error:perms" msgctxt "cmd:editshop_colours_create|error:perms"
msgid "" msgid ""
"I do not have permission to create server roles!\n" "I do not have permission to create server roles!\n"
@@ -189,26 +194,26 @@ msgid ""
"editshop colours add` instead." "editshop colours add` instead."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:421 #: src/modules/shop/shops/colours.py:424
msgctxt "cmd:editshop_colours_create|error:max_colours" msgctxt "cmd:editshop_colours_create|error:max_colours"
msgid "" msgid ""
"This server already has the maximum of `25` colour roles!\n" "This server already has the maximum of `25` colour roles!\n"
"Please remove some before adding or creating more." "Please remove some before adding or creating more."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:440 #: src/modules/shop/shops/colours.py:443
msgctxt "cmd:editshop_colours_create|error:failed_unknown" msgctxt "cmd:editshop_colours_create|error:failed_unknown"
msgid "" msgid ""
"An unknown Discord error occurred while creating your colour role!\n" "An unknown Discord error occurred while creating your colour role!\n"
"Please try again in a few minutes." "Please try again in a few minutes."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:490 #: src/modules/shop/shops/colours.py:493
msgctxt "cmd:editshop_colours_create|resp:done|title" msgctxt "cmd:editshop_colours_create|resp:done|title"
msgid "Colour Role Created" msgid "Colour Role Created"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:494 #: src/modules/shop/shops/colours.py:497
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_create|resp:done|desc" msgctxt "cmd:editshop_colours_create|resp:done|desc"
msgid "" msgid ""
@@ -216,80 +221,80 @@ msgid ""
"{coin}**{price}**!" "{coin}**{price}**!"
msgstr "" 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" msgctxt "cmd:editshop_colours_create|resp:done|field:position_note|value"
msgid "" msgid ""
"The new colour role was added below all other roles. Remember a member's " "The new colour role was added below all other roles. Remember a member's "
"active colour is determined by their highest coloured role!" "active colour is determined by their highest coloured role!"
msgstr "" 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" msgctxt "cmd:editshop_colours_create|resp:done|field:position_note|name"
msgid "Note" msgid "Note"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:514 #: src/modules/shop/shops/colours.py:517
msgctxt "cmd:editshop_colours_edit" msgctxt "cmd:editshop_colours_edit"
msgid "edit" msgid "edit"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:517 #: src/modules/shop/shops/colours.py:520
msgctxt "cmd:editshop_colours_edit|desc" msgctxt "cmd:editshop_colours_edit|desc"
msgid "Edit the name, colour, or price of a colour role." msgid "Edit the name, colour, or price of a colour role."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:521 #: src/modules/shop/shops/colours.py:524
msgctxt "cmd:editshop_colours_edit|param:role" msgctxt "cmd:editshop_colours_edit|param:role"
msgid "role" msgid "role"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:522 #: src/modules/shop/shops/colours.py:525
msgctxt "cmd:editshop_colours_edit|param:name" msgctxt "cmd:editshop_colours_edit|param:name"
msgid "name" msgid "name"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:523 #: src/modules/shop/shops/colours.py:526
msgctxt "cmd:editshop_colours_edit|param:colour" msgctxt "cmd:editshop_colours_edit|param:colour"
msgid "colour" msgid "colour"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:524 #: src/modules/shop/shops/colours.py:527
msgctxt "cmd:editshop_colours_edit|param:price" msgctxt "cmd:editshop_colours_edit|param:price"
msgid "price" msgid "price"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:529 #: src/modules/shop/shops/colours.py:532
msgctxt "cmd:editshop_colours_edit|param:role|desc" msgctxt "cmd:editshop_colours_edit|param:role|desc"
msgid "Select a colour role to edit." msgid "Select a colour role to edit."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:533 #: src/modules/shop/shops/colours.py:536
msgctxt "cmd:editshop_colours_edit|param:name|desc" msgctxt "cmd:editshop_colours_edit|param:name|desc"
msgid "New name to give the colour role." msgid "New name to give the colour role."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:537 #: src/modules/shop/shops/colours.py:540
msgctxt "cmd:editshop_colours_edit|param:colour|desc" msgctxt "cmd:editshop_colours_edit|param:colour|desc"
msgid "New colour for the colour role (as hex, e.g. #AB12AB)." msgid "New colour for the colour role (as hex, e.g. #AB12AB)."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:541 #: src/modules/shop/shops/colours.py:544
msgctxt "cmd:editshop_colours_edit|param:price|desc" msgctxt "cmd:editshop_colours_edit|param:price|desc"
msgid "New price for the colour role." msgid "New price for the colour role."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:570 #: src/modules/shop/shops/colours.py:573
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_edit|error:invalid_role" msgctxt "cmd:editshop_colours_edit|error:invalid_role"
msgid "{mention} is not in the colour role shop!" msgid "{mention} is not in the colour role shop!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:584 #: src/modules/shop/shops/colours.py:587
msgctxt "cmd:editshop_colours_edit|error:no_args" msgctxt "cmd:editshop_colours_edit|error:no_args"
msgid "You must give me one of `name`, `colour`, or `price` to update!" msgid "You must give me one of `name`, `colour`, or `price` to update!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:600 #: src/modules/shop/shops/colours.py:603
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_edit|error:parse_colour" msgctxt "cmd:editshop_colours_edit|error:parse_colour"
msgid "" msgid ""
@@ -297,82 +302,82 @@ msgid ""
"Please enter the colour as a hex string, e.g. `#FA0BC1`" "Please enter the colour as a hex string, e.g. `#FA0BC1`"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:615 #: src/modules/shop/shops/colours.py:618
msgctxt "cmd:editshop_colours_edit|error:perms" msgctxt "cmd:editshop_colours_edit|error:perms"
msgid "I do not have sufficient server permissions to edit this role!" msgid "I do not have sufficient server permissions to edit this role!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:631 #: src/modules/shop/shops/colours.py:634
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_edit|resp:done|line:price" msgctxt "cmd:editshop_colours_edit|resp:done|line:price"
msgid "{tick} Set price to {coin}**{price}**" msgid "{tick} Set price to {coin}**{price}**"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:648 #: src/modules/shop/shops/colours.py:651
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_edit|resp:done|line:role" msgctxt "cmd:editshop_colours_edit|resp:done|line:role"
msgid "{tick} Updated role to {mention}" msgid "{tick} Updated role to {mention}"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:658 #: src/modules/shop/shops/colours.py:661
msgctxt "cmd:editshop_colours_edit|resp:done|embed:title" msgctxt "cmd:editshop_colours_edit|resp:done|embed:title"
msgid "Colour Role Updated" msgid "Colour Role Updated"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:664 #: src/modules/shop/shops/colours.py:667
msgctxt "cmd:editshop_colours_auto" msgctxt "cmd:editshop_colours_auto"
msgid "auto" msgid "auto"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:665 #: src/modules/shop/shops/colours.py:668
msgctxt "cmd:editshop_colours_auto|desc" msgctxt "cmd:editshop_colours_auto|desc"
msgid "Automatically create a set of colour roles." msgid "Automatically create a set of colour roles."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:674 #: src/modules/shop/shops/colours.py:677
msgctxt "cmd:editshop_colours_add" msgctxt "cmd:editshop_colours_add"
msgid "add" msgid "add"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:677 #: src/modules/shop/shops/colours.py:680
msgctxt "cmd:editshop_colours_add|desc" msgctxt "cmd:editshop_colours_add|desc"
msgid "Add an existing role to the colour shop." msgid "Add an existing role to the colour shop."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:681 #: src/modules/shop/shops/colours.py:684
msgctxt "cmd:editshop_colours_add|param:role" msgctxt "cmd:editshop_colours_add|param:role"
msgid "role" msgid "role"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:682 #: src/modules/shop/shops/colours.py:685
msgctxt "cmd:editshop_colours_add|param:price" msgctxt "cmd:editshop_colours_add|param:price"
msgid "price" msgid "price"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:687 #: src/modules/shop/shops/colours.py:690
msgctxt "cmd:editshop_colours_add|param:role|desc" msgctxt "cmd:editshop_colours_add|param:role|desc"
msgid "Select a role to add to the colour shop." msgid "Select a role to add to the colour shop."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:691 #: src/modules/shop/shops/colours.py:694
msgctxt "cmd:editshop_colours_add|param:price|desc" msgctxt "cmd:editshop_colours_add|param:price|desc"
msgid "How much should this role cost?" msgid "How much should this role cost?"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:716 #: src/modules/shop/shops/colours.py:719
msgctxt "cmd:editshop_colours_add|error:max_colours" msgctxt "cmd:editshop_colours_add|error:max_colours"
msgid "" msgid ""
"This server already has the maximum of `25` colour roles!\n" "This server already has the maximum of `25` colour roles!\n"
"Please remove some before adding or creating more." "Please remove some before adding or creating more."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:725 #: src/modules/shop/shops/colours.py:728
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_add|error:role_exists" msgctxt "cmd:editshop_colours_add|error:role_exists"
msgid "The role {mention} is already registered as a colour role!" msgid "The role {mention} is already registered as a colour role!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:734 #: src/modules/shop/shops/colours.py:737
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_add|error:role_perms" msgctxt "cmd:editshop_colours_add|error:role_perms"
msgid "" msgid ""
@@ -381,7 +386,7 @@ msgid ""
"role." "role."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:745 #: src/modules/shop/shops/colours.py:748
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_add|error:caller_perms" msgctxt "cmd:editshop_colours_add|error:caller_perms"
msgid "" msgid ""
@@ -390,138 +395,138 @@ msgid ""
"role." "role."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:754 #: src/modules/shop/shops/colours.py:760
msgctxt "cmd:editshop_colours_add|error:role_has_admin" msgctxt "cmd:editshop_colours_add|error:role_has_admin"
msgid "" msgid ""
"I refuse to add an administrator role to the LionCoin shop. That is a really " "I refuse to add an administrator role to the LionCoin shop. That is a really "
"bad idea." "bad idea."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:775 #: src/modules/shop/shops/colours.py:781
msgctxt "cmd:editshop_colours_add|resp:done|embed:title" msgctxt "cmd:editshop_colours_add|resp:done|embed:title"
msgid "Colour Role Created" msgid "Colour Role Created"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:778 #: src/modules/shop/shops/colours.py:784
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_add|resp:done|embed:desc" msgctxt "cmd:editshop_colours_add|resp:done|embed:desc"
msgid "You have added {mention} to the colour shop for {coin}**{price}**!" msgid "You have added {mention} to the colour shop for {coin}**{price}**!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:786 #: src/modules/shop/shops/colours.py:792
msgctxt "cmd:editshop_colours_clear" msgctxt "cmd:editshop_colours_clear"
msgid "clear" msgid "clear"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:789 #: src/modules/shop/shops/colours.py:795
msgctxt "cmd:editshop_colours_clear|desc" msgctxt "cmd:editshop_colours_clear|desc"
msgid "" msgid ""
"Remove all the colour roles from the shop, and optionally delete the roles." "Remove all the colour roles from the shop, and optionally delete the roles."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:793 #: src/modules/shop/shops/colours.py:799
msgctxt "cmd:editshop_colours_clear|param:delete" msgctxt "cmd:editshop_colours_clear|param:delete"
msgid "delete_roles" msgid "delete_roles"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:798 #: src/modules/shop/shops/colours.py:804
msgctxt "cmd:editshop_colours_clear|param:delete|desc" msgctxt "cmd:editshop_colours_clear|param:delete|desc"
msgid "Also delete the associated roles." msgid "Also delete the associated roles."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:840 #: src/modules/shop/shops/colours.py:846
msgctxt "cmd:editshop_colours_clear|error:no_colours" msgctxt "cmd:editshop_colours_clear|error:no_colours"
msgid "There are no coloured roles to remove!" msgid "There are no coloured roles to remove!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:884 #: src/modules/shop/shops/colours.py:890
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_clear|resp:done|line:clear" msgctxt "cmd:editshop_colours_clear|resp:done|line:clear"
msgid "{tick} Colour shop cleared." msgid "{tick} Colour shop cleared."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:895 #: src/modules/shop/shops/colours.py:901
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_clear|resp:done|line:refunding" msgctxt "cmd:editshop_colours_clear|resp:done|line:refunding"
msgid "{loading} Refunded **{count}/{total}** members." msgid "{loading} Refunded **{count}/{total}** members."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:901 #: src/modules/shop/shops/colours.py:907
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_clear|resp:done|line:refunded" msgctxt "cmd:editshop_colours_clear|resp:done|line:refunded"
msgid "{tick} Refunded **{total}/{total}** members." msgid "{tick} Refunded **{total}/{total}** members."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:914 #: src/modules/shop/shops/colours.py:920
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted_failed" msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted_failed"
msgid "" msgid ""
"{emoji} Deleted **{count}/{total}** colour roles. (**{failed}** failed!)" "{emoji} Deleted **{count}/{total}** colour roles. (**{failed}** failed!)"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:919 #: src/modules/shop/shops/colours.py:925
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted" msgctxt "cmd:editshop_colours_clear|resp:done|line:deleted"
msgid "{emoji} Deleted **{count}/{total}** colour roles." msgid "{emoji} Deleted **{count}/{total}** colour roles."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:968 #: src/modules/shop/shops/colours.py:974
msgctxt "cmd:editshop_colours_remove" msgctxt "cmd:editshop_colours_remove"
msgid "remove" msgid "remove"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:971 #: src/modules/shop/shops/colours.py:977
msgctxt "cmd:editshop_colours_remove|desc" msgctxt "cmd:editshop_colours_remove|desc"
msgid "Remove a specific colour role from the shop." msgid "Remove a specific colour role from the shop."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:975 #: src/modules/shop/shops/colours.py:981
msgctxt "cmd:editshop_colours_remove|param:role" msgctxt "cmd:editshop_colours_remove|param:role"
msgid "role" msgid "role"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:976 #: src/modules/shop/shops/colours.py:982
msgctxt "cmd:editshop_colours_remove" msgctxt "cmd:editshop_colours_remove"
msgid "delete_role" msgid "delete_role"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:981 #: src/modules/shop/shops/colours.py:987
msgctxt "cmd:editshop_colours_remove|param:role|desc" msgctxt "cmd:editshop_colours_remove|param:role|desc"
msgid "Select the colour role to remove." msgid "Select the colour role to remove."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:985 #: src/modules/shop/shops/colours.py:991
msgctxt "cmd:editshop_colours_remove|param:delete_role|desc" msgctxt "cmd:editshop_colours_remove|param:delete_role|desc"
msgid "Whether to delete the associated role." msgid "Whether to delete the associated role."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1010 #: src/modules/shop/shops/colours.py:1016
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_remove|error:not_colour" msgctxt "cmd:editshop_colours_remove|error:not_colour"
msgid "{mention} is not in the colour role shop!" msgid "{mention} is not in the colour role shop!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1028 #: src/modules/shop/shops/colours.py:1034
msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" msgctxt "cmd:editshop_colours_remove|resp:done|line:delete"
msgid "Successfully deleted the role." msgid "Successfully deleted the role."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1033 #: src/modules/shop/shops/colours.py:1039
msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" msgctxt "cmd:editshop_colours_remove|resp:done|line:delete"
msgid "I do not have sufficient permissions to delete the role." msgid "I do not have sufficient permissions to delete the role."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1038 #: src/modules/shop/shops/colours.py:1044
msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" msgctxt "cmd:editshop_colours_remove|resp:done|line:delete"
msgid "Failed to delete the role for an unknown reason." msgid "Failed to delete the role for an unknown reason."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1043 #: src/modules/shop/shops/colours.py:1049
msgctxt "cmd:editshop_colours_remove|resp:done|line:delete" msgctxt "cmd:editshop_colours_remove|resp:done|line:delete"
msgid "Could not find the role in order to delete it." msgid "Could not find the role in order to delete it."
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1054 #: src/modules/shop/shops/colours.py:1060
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:editshop_colours_remove|resp:done|embed:desc" msgctxt "cmd:editshop_colours_remove|resp:done|embed:desc"
msgid "" msgid ""
@@ -529,45 +534,64 @@ msgid ""
"{delete_line}" "{delete_line}"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1114 #: src/modules/shop/shops/colours.py:1138
msgctxt "ui:colourstore|menu:buycolours|embed:error|title" msgctxt "ui:colourstore|menu:buycolours|embed:error|title"
msgid "Purchase Failed!" msgid "Purchase Failed!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1125 #: src/modules/shop/shops/colours.py:1149
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:colourstore|menu:buycolours|resp:done|desc" msgctxt "ui:colourstore|menu:buycolours|resp:done|desc"
msgid "{tick} You have purchased {mention}" msgid "{tick} You have purchased {mention}"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1160 #: src/modules/shop/shops/colours.py:1184
msgctxt "ui:colourstore|menu:buycolours|placeholder" msgctxt "ui:colourstore|menu:buycolours|placeholder"
msgid "There are no colour roles available to purchase!" msgid "There are no colour roles available to purchase!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1166 #: src/modules/shop/shops/colours.py:1190
msgctxt "ui:colourstore|menu:buycolours|placeholder" msgctxt "ui:colourstore|menu:buycolours|placeholder"
msgid "Select a colour role to purchase!" msgid "Select a colour role to purchase!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1195 #: src/modules/shop/shops/colours.py:1236
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:colourstore|embed|line:owned_item" msgctxt "ui:colourstore|embed|line:owned_item"
msgid "`[{j:02}]` | `{price} LC` | {mention} (You own this!)" msgid "`[{j:02}]` | `{price} LC` | {mention} (You own this!)"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1200 #: src/modules/shop/shops/colours.py:1241
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:colourstore|embed|line:item" msgctxt "ui:colourstore|embed|line:item"
msgid "`[{j:02}]` | `{price} LC` | {mention}" msgid "`[{j:02}]` | `{price} LC` | {mention}"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1207 #: src/modules/shop/shops/colours.py:1248
msgctxt "ui:colourstore|embed|desc" msgctxt "ui:colourstore|embed|desc"
msgid "No colour roles available for purchase!" msgid "No colour roles available for purchase!"
msgstr "" msgstr ""
#: src/modules/shop/shops/colours.py:1210 #: src/modules/shop/shops/colours.py:1251
msgctxt "ui:colourstore|embed|title" msgctxt "ui:colourstore|embed|title"
msgid "Colour Role Shop" msgid "Colour Role Shop"
msgstr "" 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 ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -47,36 +47,34 @@ msgctxt "cmd:leaderboard|desc"
msgid "Server leaderboard." msgid "Server leaderboard."
msgstr "" 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" msgctxt "cmd:configure_statistics"
msgid "statistics" msgid "statistics"
msgstr "" msgstr ""
#: src/modules/statistics/cog.py:92 #: src/modules/statistics/cog.py:109
msgctxt "cmd:configure_statistics|desc" msgctxt "cmd:configure_statistics|desc"
msgid "Statistics configuration panel" msgid "Statistics configuration panel"
msgstr "" msgstr ""
#: src/modules/statistics/cog.py:95 #: src/modules/statistics/cog.py:112
msgctxt "cmd:configure_statistics|param:season_start" msgctxt "cmd:configure_statistics|param:season_start"
msgid "season_start" msgid "season_start"
msgstr "" msgstr ""
#: src/modules/statistics/cog.py:100 #: src/modules/statistics/cog.py:117
msgctxt "cmd:configure_statistics|param:season_start|desc" msgctxt "cmd:configure_statistics|param:season_start|desc"
msgid "" msgid ""
"Time from which to start counting activity for rank badges and season " "Time from which to start counting activity for rank badges and season "
"leaderboards. (YYYY-MM-DD)" "leaderboards. (YYYY-MM-DD)"
msgstr "" 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 #: src/modules/statistics/settings.py:37
msgctxt "settype:stat|output:voice" msgctxt "settype:stat|output:voice"
msgid "`Voice`" msgid "`Voice`"
@@ -159,171 +157,175 @@ msgctxt "guildset:season_start|long_desc"
msgid "" msgid ""
"Activity ranks will be determined based on tracked activity since this time, " "Activity ranks will be determined based on tracked activity since this time, "
"and the leaderboard will display activity since this time by default. Unset " "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 "" msgstr ""
#: src/modules/statistics/settings.py:101 #: src/modules/statistics/settings.py:102
msgctxt "guildset:season_start|accepts" msgctxt "guildset:season_start|accepts"
msgid "The season start time in the form YYYY-MM-DD HH:MM" msgid "The season start time in the form YYYY-MM-DD HH:MM"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:105 #: src/modules/statistics/settings.py:106
msgctxt "guildset:season_start|notset" msgctxt "guildset:season_start|notset"
msgid "Not Set (Using all-time statistics)" msgid "Not Set (Using all-time statistics)"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:124 #: src/modules/statistics/settings.py:125
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "guildset:season_start|parse|error:future_time" msgctxt "guildset:season_start|parse|error:future_time"
msgid "Provided season start time {timestamp} is in the future!" msgid "Provided season start time {timestamp} is in the future!"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:136 #: src/modules/statistics/settings.py:137
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "guildset:season_start|set_response|set" msgctxt "guildset:season_start|set_response|set"
msgid "" msgid ""
"The leaderboard season and activity ranks will now count from {timestamp}. " "The leaderboard season and activity ranks will now count from {timestamp}. "
"Member ranks will update when they are next active. Use {rank_cmd} to " "Member ranks will update when they are next active.\n"
"refresh immediately." "Use {rank_cmd} and press **Refresh Member Ranks** to refresh all ranks "
"immediately."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:145 #: src/modules/statistics/settings.py:147
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "guildset:season_start|set_response|unset" msgctxt "guildset:season_start|set_response|unset"
msgid "" msgid ""
"The leaderboard and activity ranks will now count all-time statistics. " "The leaderboard and activity ranks will now count all-time statistics. "
"Member ranks will update when they are next active. Use {rank_cmd} to " "Member ranks will update when they are next active.\n"
"refresh immediately." "Use {rank_cmd} and press **Refresh Member Ranks** to refresh all ranks "
"immediately."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:156 #: src/modules/statistics/settings.py:159
msgctxt "guildset:unranked_roles" msgctxt "guildset:unranked_roles"
msgid "unranked_roles" msgid "unranked_roles"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:159 #: src/modules/statistics/settings.py:162
msgctxt "guildset:unranked_roles|desc" msgctxt "guildset:unranked_roles|desc"
msgid "Roles to exclude from the leaderboards." msgid "Roles to exclude from the leaderboards."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:163 #: src/modules/statistics/settings.py:166
msgctxt "guildset:unranked_roles|long_desc" msgctxt "guildset:unranked_roles|long_desc"
msgid "" msgid ""
"When set, members with *any* of these roles will not appear on the /" "When set, members with *any* of these roles will not appear on the /"
"leaderboard ranking list." "leaderboard ranking list."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:167 #: src/modules/statistics/settings.py:170
msgctxt "guildset:unranked_roles|accepts" msgctxt "guildset:unranked_roles|accepts"
msgid "Comma separated list of unranked role names or ids." msgid "Comma separated list of unranked role names or ids."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:183 #: src/modules/statistics/settings.py:186
msgctxt "guildset:unranked_roles|set_using" msgctxt "guildset:unranked_roles|set_using"
msgid "Role selector below." msgid "Role selector below."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:193 #: src/modules/statistics/settings.py:196
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "guildset:unranked_roles|set_response|set" msgctxt "guildset:unranked_roles|set_response|set"
msgid "" msgid ""
"Members of the following roles will not appear on the leaderboard: {roles}" "Members of the following roles will not appear on the leaderboard: {roles}"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:200 #: src/modules/statistics/settings.py:203
msgctxt "guildset:unranked_roles|set_response|unset" msgctxt "guildset:unranked_roles|set_response|unset"
msgid "You have cleared the unranked role list." msgid "You have cleared the unranked role list."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:214 #: src/modules/statistics/settings.py:217
msgctxt "guildset:visible_stats" msgctxt "guildset:visible_stats"
msgid "visible_stats" msgid "visible_stats"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:217 #: src/modules/statistics/settings.py:220
msgctxt "guildset:visible_stats|desc" msgctxt "guildset:visible_stats|desc"
msgid "Which statistics will be visible in the statistics commands." msgid "Which statistics will be visible in the statistics commands."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:221 #: src/modules/statistics/settings.py:224
msgctxt "guildset:visible_stats|desc" msgctxt "guildset:visible_stats|desc"
msgid "" msgid ""
"Choose which statistics types to display in the leaderboard and statistics " "Choose which statistics types to display in the leaderboard and statistics "
"commands." "commands."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:225 #: src/modules/statistics/settings.py:228
msgctxt "guildset:visible_stats|accepts" msgctxt "guildset:visible_stats|accepts"
msgid "Voice, Text, Anki" msgid "Voice, Text, Anki"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:246 #: src/modules/statistics/settings.py:249
msgctxt "guildset:visible_stats|set_using" msgctxt "guildset:visible_stats|set_using"
msgid "Option menu below." msgid "Option menu below."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:254 #: src/modules/statistics/settings.py:257
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "guildset:visible_stats|set_response" msgctxt "guildset:visible_stats|set_response"
msgid "Members will be able to view the following statistics types: {types}" msgid "Members will be able to view the following statistics types: {types}"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:264 #: src/modules/statistics/settings.py:267
msgctxt "guildset:default_stat" msgctxt "guildset:default_stat"
msgid "default_stat" msgid "default_stat"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:267 #: src/modules/statistics/settings.py:270
msgctxt "guildset:default_stat|desc" msgctxt "guildset:default_stat|desc"
msgid "Statistic type to display by default in setting dialogues." msgid "Statistic type to display by default in setting dialogues."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:271 #: src/modules/statistics/settings.py:274
msgctxt "guildset:default_stat|long_desc" msgctxt "guildset:default_stat|long_desc"
msgid "Which statistic type to display by default in setting dialogues." msgid "Which statistic type to display by default in setting dialogues."
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:304 #: src/modules/statistics/settings.py:307
msgctxt "ui:statistics_config|menu:unranked_roles|placeholder" msgctxt "ui:statistics_config|menu:unranked_roles|placeholder"
msgid "Select Unranked Roles" msgid "Select Unranked Roles"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:328 #: src/modules/statistics/settings.py:331
msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:voice" msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:voice"
msgid "Voice Activity" msgid "Voice Activity"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:333 #: src/modules/statistics/settings.py:336
msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:study" msgctxt "ui:statistics_config|menu:visible_stats|item:voice|mode:study"
msgid "Study Statistics" msgid "Study Statistics"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:343 #: src/modules/statistics/settings.py:346
msgctxt "ui:statistics_config|menu:visible_stats|item:text" msgctxt "ui:statistics_config|menu:visible_stats|item:text"
msgid "Message Activity" msgid "Message Activity"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:351 #: src/modules/statistics/settings.py:354
msgctxt "ui:statistics_config|menu:visible_stats|item:anki" msgctxt "ui:statistics_config|menu:visible_stats|item:anki"
msgid "Anki Reviews" msgid "Anki Reviews"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:362 #: src/modules/statistics/settings.py:365
msgctxt "ui:statistics_config|menu:visible_stats|placeholder" msgctxt "ui:statistics_config|menu:visible_stats|placeholder"
msgid "Select Visible Statistics" msgid "Select Visible Statistics"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:383 #: src/modules/statistics/settings.py:386
msgctxt "ui:statistics_config|embed|title" msgctxt "ui:statistics_config|embed|title"
msgid "Statistics Configuration Panel" msgid "Statistics Configuration Panel"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:405 #: src/modules/statistics/settings.py:408
msgctxt "dash:stats|title" msgctxt "dash:stats|title"
msgid "Activity Statistics Configuration ({commands[configure statistics]})" msgid "Activity Statistics Configuration ({commands[configure statistics]})"
msgstr "" msgstr ""
#: src/modules/statistics/settings.py:409 #: src/modules/statistics/settings.py:412
msgctxt "dash:stats|dropdown|placeholder" msgctxt "dash:stats|dropdown|placeholder"
msgid "Activity Statistics Panel" msgid "Activity Statistics Panel"
msgstr "" msgstr ""
@@ -480,68 +482,68 @@ msgctxt "modal:goal_editor|monthly|title"
msgid "Monthly goal editor" msgid "Monthly goal editor"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:499 #: src/modules/statistics/ui/weeklymonthly.py:503
msgctxt "ui:weeklymonthly|button:edit_goals|label" msgctxt "ui:weeklymonthly|button:edit_goals|label"
msgid "Edit Goals" msgid "Edit Goals"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:515 #: src/modules/statistics/ui/weeklymonthly.py:519
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:weeklymonthly|menu:period|monthly|label" msgctxt "ui:weeklymonthly|menu:period|monthly|label"
msgid "{month} {year}" msgid "{month} {year}"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:530 #: src/modules/statistics/ui/weeklymonthly.py:534
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:weeklymonthly|menu:period|weekly|label" msgctxt "ui:weeklymonthly|menu:period|weekly|label"
msgid "{year} W{week}" msgid "{year} W{week}"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:534 #: src/modules/statistics/ui/weeklymonthly.py:538
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:weeklymonthly|menu:period|weekly|desc" msgctxt "ui:weeklymonthly|menu:period|weekly|desc"
msgid "" msgid ""
"{start_day} {start_month} {start_year} to {end_day} {end_month} {end_year}" "{start_day} {start_month} {start_year} to {end_day} {end_month} {end_year}"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:612 #: src/modules/statistics/ui/weeklymonthly.py:616
msgctxt "ui:weeklymonthly|button:period|close|label" msgctxt "ui:weeklymonthly|button:period|close|label"
msgid "Close Selector" msgid "Close Selector"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:617 #: src/modules/statistics/ui/weeklymonthly.py:621
msgctxt "ui:weeklymonthly|button:period|weekly|label" msgctxt "ui:weeklymonthly|button:period|weekly|label"
msgid "Select Week" msgid "Select Week"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:622 #: src/modules/statistics/ui/weeklymonthly.py:626
msgctxt "ui:weeklymonthly|button:period|monthly|label" msgctxt "ui:weeklymonthly|button:period|monthly|label"
msgid "Select Month" msgid "Select Month"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:687 #: src/modules/statistics/ui/weeklymonthly.py:691
msgctxt "ui:weeklymonthly|menu:period|weekly|placeholder" msgctxt "ui:weeklymonthly|menu:period|weekly|placeholder"
msgid "Select a week to display" msgid "Select a week to display"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:692 #: src/modules/statistics/ui/weeklymonthly.py:696
msgctxt "ui:weeklymonthly|menu:period|monthly|placeholder" msgctxt "ui:weeklymonthly|menu:period|monthly|placeholder"
msgid "Select a month to display" msgid "Select a month to display"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:714 #: src/modules/statistics/ui/weeklymonthly.py:718
msgctxt "ui:WeeklyMonthly|button:global|resp:success" msgctxt "ui:WeeklyMonthly|button:global|resp:success"
msgid "" msgid ""
"You will now see combined statistics from all your servers (where " "You will now see combined statistics from all your servers (where "
"applicable)! Press again to revert." "applicable)! Press again to revert."
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:727 #: src/modules/statistics/ui/weeklymonthly.py:731
msgctxt "ui:WeeklyMonthly|button:global|mode:local" msgctxt "ui:WeeklyMonthly|button:global|mode:local"
msgid "Server Statistics" msgid "Server Statistics"
msgstr "" msgstr ""
#: src/modules/statistics/ui/weeklymonthly.py:732 #: src/modules/statistics/ui/weeklymonthly.py:736
msgctxt "ui:WeeklyMonthly|button:global|mode:global" msgctxt "ui:WeeklyMonthly|button:global|mode:global"
msgid "Global Statistics" msgid "Global Statistics"
msgstr "" msgstr ""
@@ -611,92 +613,101 @@ msgid ""
"again to revert." "again to revert."
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:231 #: src/modules/statistics/ui/leaderboard.py:250
msgctxt "ui:leaderboard|menu:stats|placeholder" msgctxt "ui:leaderboard|menu:stats|placeholder"
msgid "Select Activity Type" msgid "Select Activity Type"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:240 #: src/modules/statistics/ui/leaderboard.py:259
msgctxt "ui:leaderboard|menu:stats|item:voice" msgctxt "ui:leaderboard|menu:stats|item:voice"
msgid "Voice Activity" msgid "Voice Activity"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:251 #: src/modules/statistics/ui/leaderboard.py:270
msgctxt "ui:leaderboard|menu:stats|item:study" msgctxt "ui:leaderboard|menu:stats|item:study"
msgid "Study Statistics" msgid "Study Statistics"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:262 #: src/modules/statistics/ui/leaderboard.py:281
msgctxt "ui:leaderboard|menu:stats|item:message" msgctxt "ui:leaderboard|menu:stats|item:message"
msgid "Message Activity" msgid "Message Activity"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:273 #: src/modules/statistics/ui/leaderboard.py:292
msgctxt "ui:leaderboard|menu;stats|item:anki" msgctxt "ui:leaderboard|menu;stats|item:anki"
msgid "Anki Cards Reviewed" msgid "Anki Cards Reviewed"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:327 #: src/modules/statistics/ui/leaderboard.py:346
msgctxt "ui:leaderboard|button:season|label" msgctxt "ui:leaderboard|button:season|label"
msgid "This Season" msgid "This Season"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:331 #: src/modules/statistics/ui/leaderboard.py:350
msgctxt "ui:leaderboard|button:day|label" msgctxt "ui:leaderboard|button:day|label"
msgid "Today" msgid "Today"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:335 #: src/modules/statistics/ui/leaderboard.py:354
msgctxt "ui:leaderboard|button:week|label" msgctxt "ui:leaderboard|button:week|label"
msgid "This Week" msgid "This Week"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:339 #: src/modules/statistics/ui/leaderboard.py:358
msgctxt "ui:leaderboard|button:month|label" msgctxt "ui:leaderboard|button:month|label"
msgid "This Month" msgid "This Month"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:343 #: src/modules/statistics/ui/leaderboard.py:362
msgctxt "ui:leaderboard|button:alltime|label" msgctxt "ui:leaderboard|button:alltime|label"
msgid "All Time" msgid "All Time"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:347 #: src/modules/statistics/ui/leaderboard.py:366
msgctxt "ui:leaderboard|button:jump|label" msgctxt "ui:leaderboard|button:jump|label"
msgid "Jump" msgid "Jump"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:362 #: src/modules/statistics/ui/leaderboard.py:381
msgctxt "ui:leaderboard|button:jump|input:title" msgctxt "ui:leaderboard|button:jump|input:title"
msgid "Jump to page" msgid "Jump to page"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:366 #: src/modules/statistics/ui/leaderboard.py:385
msgctxt "ui:leaderboard|button:jump|input:question" msgctxt "ui:leaderboard|button:jump|input:question"
msgid "Page number to jump to" msgid "Page number to jump to"
msgstr "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:377 #: src/modules/statistics/ui/leaderboard.py:396
msgctxt "ui:leaderboard|button:jump|error:invalid_page" msgctxt "ui:leaderboard|button:jump|error:invalid_page"
msgid "Invalid page number, please try again!" msgid "Invalid page number, please try again!"
msgstr "" 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" 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 "" 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" 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 "" 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" 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 "" msgstr ""
#: src/modules/statistics/ui/leaderboard.py:444 #: src/modules/statistics/ui/leaderboard.py:472
msgctxt "ui:leaderboard|message:empty|title" msgctxt "ui:leaderboard|message:empty|title"
msgid "Leaderboard Empty!" msgid "Leaderboard Empty!"
msgstr "" msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -53,291 +53,323 @@ msgctxt "argtype:Before|opt:THISMONTH"
msgid "This Month" msgid "This Month"
msgstr "" 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" msgctxt "cmd:tasklist"
msgid "tasklist" msgid "tasklist"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:228 #: src/modules/tasklist/cog.py:261
msgctxt "cmd:tasklist|desc" msgctxt "cmd:tasklist|desc"
msgid "Open your tasklist." msgid "Open your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:237 #: src/modules/tasklist/cog.py:270
msgctxt "group:tasks" msgctxt "group:tasks"
msgid "tasks" msgid "tasks"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:238 #: src/modules/tasklist/cog.py:271
msgctxt "group:tasks|desc" msgctxt "group:tasks|desc"
msgid "Base command group for tasklist commands." msgid "Base command group for tasklist commands."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:260 #: src/modules/tasklist/cog.py:293
msgctxt "argtype:taskid|error:no_tasks" msgctxt "argtype:taskid|error:no_tasks"
msgid "Tasklist empty! No matching tasks." msgid "Tasklist empty! No matching tasks."
msgstr "" 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 #, possible-python-brace-format
msgctxt "argtype:taskid|error:parse_multi" msgctxt "argtype:taskid|error:parse_multi"
msgid "(Warning: {error})" msgid "(Warning: {error})"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:339 #: src/modules/tasklist/cog.py:382
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "argtype:taskid|error:no_matching" msgctxt "argtype:taskid|error:no_matching"
msgid "No tasks matching '{partial}'!" msgid "No tasks matching '{partial}'!"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:359 #: src/modules/tasklist/cog.py:402
msgctxt "cmd:tasks_new" msgctxt "cmd:tasks_new"
msgid "new" msgid "new"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:362 #: src/modules/tasklist/cog.py:405
msgctxt "cmd:tasks_new|desc" msgctxt "cmd:tasks_new|desc"
msgid "Add a new task to your tasklist." msgid "Add a new task to your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:366 #: src/modules/tasklist/cog.py:409
msgctxt "cmd:tasks_new|param:content" msgctxt "cmd:tasks_new|param:content"
msgid "task" msgid "task"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:367 #: src/modules/tasklist/cog.py:410
msgctxt "cmd:tasks_new|param:parent" msgctxt "cmd:tasks_new|param:parent"
msgid "parent" msgid "parent"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:370 #: src/modules/tasklist/cog.py:413
msgctxt "cmd:tasks_new|param:content|desc" msgctxt "cmd:tasks_new|param:content|desc"
msgid "Content of your new task." msgid "Content of your new task."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:371 #: src/modules/tasklist/cog.py:414
msgctxt "cmd:tasks_new|param:parent" msgctxt "cmd:tasks_new|param:parent"
msgid "Parent of this task." msgid "Parent of this task."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:391 #: src/modules/tasklist/cog.py:434
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:tasks_new|error:parse_parent" msgctxt "cmd:tasks_new|error:parse_parent"
msgid "Could not find parent task number `{input}` in your tasklist." msgid "Could not find parent task number `{input}` in your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:406 #: src/modules/tasklist/cog.py:449
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:tasks_new|resp:success" msgctxt "cmd:tasks_new|resp:success"
msgid "{tick} Created task `{label}`." msgid "{tick} Created task `{label}`."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:418 #: src/modules/tasklist/cog.py:461
msgctxt "cmd:tasks_upload" msgctxt "cmd:tasks_upload"
msgid "upload" msgid "upload"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:421 #: src/modules/tasklist/cog.py:464
msgctxt "cmd:tasks_upload|desc" msgctxt "cmd:tasks_upload|desc"
msgid "Upload a list of tasks to append to or replace your tasklist." msgid "Upload a list of tasks to append to or replace your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:425 #: src/modules/tasklist/cog.py:468
msgctxt "cmd:tasks_upload|param:tasklist" msgctxt "cmd:tasks_upload|param:tasklist"
msgid "tasklist" msgid "tasklist"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:426 #: src/modules/tasklist/cog.py:469
msgctxt "cmd:tasks_upload|param:append" msgctxt "cmd:tasks_upload|param:append"
msgid "append" msgid "append"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:431 #: src/modules/tasklist/cog.py:474
msgctxt "cmd:tasks_upload|param:tasklist|desc" msgctxt "cmd:tasks_upload|param:tasklist|desc"
msgid "" msgid ""
"Text file containing a (standard markdown formatted) checklist of tasks to " "Text file containing a (standard markdown formatted) checklist of tasks to "
"add or append." "add or append."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:435 #: src/modules/tasklist/cog.py:478
msgctxt "cmd:tasks_upload|param:append|desc" msgctxt "cmd:tasks_upload|param:append|desc"
msgid "" msgid ""
"Whether to append the given tasks or replace your entire tasklist. Defaults " "Whether to append the given tasks or replace your entire tasklist. Defaults "
"to True." "to True."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:451 #: src/modules/tasklist/cog.py:494
msgctxt "cmd:tasks_upload|error:not_text" msgctxt "cmd:tasks_upload|error:not_text"
msgid "The attached tasklist must be a text file!" msgid "The attached tasklist must be a text file!"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:459 #: src/modules/tasklist/cog.py:502
msgctxt "cmd:tasks_upload|error:too_large" msgctxt "cmd:tasks_upload|error:too_large"
msgid "The attached tasklist was too large!" msgid "The attached tasklist was too large!"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:470 #: src/modules/tasklist/cog.py:513
msgctxt "cmd:tasks_upload|error:too_many_lines" msgctxt "cmd:tasks_upload|error:too_many_lines"
msgid "" msgid ""
"Too many tasks! Refusing to process a tasklist with more than `1000` lines." "Too many tasks! Refusing to process a tasklist with more than `1000` lines."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:476 #: src/modules/tasklist/cog.py:519
msgctxt "cmd:tasks_upload|error:decoding" msgctxt "cmd:tasks_upload|error:decoding"
msgid "" msgid ""
"Could not decode attached tasklist. Please make sure it is saved with the " "Could not decode attached tasklist. Please make sure it is saved with the "
"`UTF-8` encoding." "`UTF-8` encoding."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:523 #: src/modules/tasklist/cog.py:566
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:tasks_upload|resp:success" msgctxt "cmd:tasks_upload|resp:success"
msgid "{tick} Updated your tasklist." msgid "{tick} Updated your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:535 #: src/modules/tasklist/cog.py:578
msgctxt "cmd:tasks_edit" msgctxt "cmd:tasks_edit"
msgid "edit" msgid "edit"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:538 #: src/modules/tasklist/cog.py:581
msgctxt "cmd:tasks_edit|desc" msgctxt "cmd:tasks_edit|desc"
msgid "Edit a task in your tasklist." msgid "Edit a task in your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:542 #: src/modules/tasklist/cog.py:585
msgctxt "cmd:tasks_edit|param:taskstr" msgctxt "cmd:tasks_edit|param:taskstr"
msgid "task" msgid "task"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:543 #: src/modules/tasklist/cog.py:586
msgctxt "cmd:tasks_edit|param:new_content" msgctxt "cmd:tasks_edit|param:new_content"
msgid "new_task" msgid "new_task"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:544 #: src/modules/tasklist/cog.py:587
msgctxt "cmd:tasks_edit|param:new_parent" msgctxt "cmd:tasks_edit|param:new_parent"
msgid "new_parent" msgid "new_parent"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:547 #: src/modules/tasklist/cog.py:590
msgctxt "cmd:tasks_edit|param:taskstr|desc" msgctxt "cmd:tasks_edit|param:taskstr|desc"
msgid "Which task do you want to update?" msgid "Which task do you want to update?"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:548 #: src/modules/tasklist/cog.py:591
msgctxt "cmd:tasks_edit|param:new_content|desc" msgctxt "cmd:tasks_edit|param:new_content|desc"
msgid "What do you want to change the task to?" msgid "What do you want to change the task to?"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:549 #: src/modules/tasklist/cog.py:592
msgctxt "cmd:tasks_edit|param:new_parent|desc" msgctxt "cmd:tasks_edit|param:new_parent|desc"
msgid "Which task do you want to be the new parent?" msgid "Which task do you want to be the new parent?"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:568 #: src/modules/tasklist/cog.py:611
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:tasks_edit|error:parse_taskstr" msgctxt "cmd:tasks_edit|error:parse_taskstr"
msgid "Could not find target task number `{input}` in your tasklist." msgid "Could not find target task number `{input}` in your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:584 #: src/modules/tasklist/cog.py:627
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:tasks_edit|error:parse_parent" msgctxt "cmd:tasks_edit|error:parse_parent"
msgid "Could not find new parent task number `{input}` in your tasklist." msgid "Could not find new parent task number `{input}` in your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:603 #: src/modules/tasklist/cog.py:646
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:tasks_edit|resp:success|desc" msgctxt "cmd:tasks_edit|resp:success|desc"
msgid "{tick} Task `{label}` updated." msgid "{tick} Task `{label}` updated."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:625 #: src/modules/tasklist/cog.py:668
msgctxt "ui:tasklist_single_editor|title" msgctxt "ui:tasklist_single_editor|title"
msgid "Edit Task" msgid "Edit Task"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:640 #: src/modules/tasklist/cog.py:683
msgctxt "cmd:tasks_clear" msgctxt "cmd:tasks_clear"
msgid "clear" msgid "clear"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:641 #: src/modules/tasklist/cog.py:684
msgctxt "cmd:tasks_clear|desc" msgctxt "cmd:tasks_clear|desc"
msgid "Clear your tasklist." msgid "Clear your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:651 #: src/modules/tasklist/cog.py:694
msgctxt "cmd:tasks_clear|resp:success" msgctxt "cmd:tasks_clear|resp:success"
msgid "Your tasklist has been cleared." msgid "Your tasklist has been cleared."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:659 #: src/modules/tasklist/cog.py:702
msgctxt "cmd:tasks_remove" msgctxt "cmd:tasks_remove"
msgid "remove" msgid "remove"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:662 #: src/modules/tasklist/cog.py:705
msgctxt "cmd:tasks_remove|desc" msgctxt "cmd:tasks_remove|desc"
msgid "" msgid ""
"Remove tasks matching all the provided conditions. (E.g. remove tasks " "Remove tasks matching all the provided conditions. (E.g. remove tasks "
"completed before today)." "completed before today)."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:666 #: src/modules/tasklist/cog.py:709
msgctxt "cmd:tasks_remove|param:taskidstr" msgctxt "cmd:tasks_remove|param:taskidstr"
msgid "tasks" msgid "tasks"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:667 #: src/modules/tasklist/cog.py:710
msgctxt "cmd:tasks_remove|param:created_before" msgctxt "cmd:tasks_remove|param:created_before"
msgid "created_before" msgid "created_before"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:668 #: src/modules/tasklist/cog.py:711
msgctxt "cmd:tasks_remove|param:updated_before" msgctxt "cmd:tasks_remove|param:updated_before"
msgid "updated_before" msgid "updated_before"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:669 #: src/modules/tasklist/cog.py:712
msgctxt "cmd:tasks_remove|param:completed" msgctxt "cmd:tasks_remove|param:completed"
msgid "completed" msgid "completed"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:670 #: src/modules/tasklist/cog.py:713
msgctxt "cmd:tasks_remove|param:cascade" msgctxt "cmd:tasks_remove|param:cascade"
msgid "cascade" msgid "cascade"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:675 #: src/modules/tasklist/cog.py:718
msgctxt "cmd:tasks_remove|param:taskidstr|desc" 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 "" msgstr ""
#: src/modules/tasklist/cog.py:679 #: src/modules/tasklist/cog.py:722
msgctxt "cmd:tasks_remove|param:created_before|desc" msgctxt "cmd:tasks_remove|param:created_before|desc"
msgid "Only delete tasks created before the selected time." msgid "Only delete tasks created before the selected time."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:683 #: src/modules/tasklist/cog.py:726
msgctxt "cmd:tasks_remove|param:updated_before|desc" msgctxt "cmd:tasks_remove|param:updated_before|desc"
msgid "" msgid ""
"Only deleted tasks update (i.e. completed or edited) before the selected " "Only deleted tasks update (i.e. completed or edited) before the selected "
"time." "time."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:687 #: src/modules/tasklist/cog.py:730
msgctxt "cmd:tasks_remove|param:completed" msgctxt "cmd:tasks_remove|param:completed"
msgid "Only delete tasks which are (not) complete." msgid "Only delete tasks which are (not) complete."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:691 #: src/modules/tasklist/cog.py:734
msgctxt "cmd:tasks_remove|param:cascade" msgctxt "cmd:tasks_remove|param:cascade"
msgid "Whether to recursively remove subtasks of removed tasks." msgid "Whether to recursively remove subtasks of removed tasks."
msgstr "" 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 #, possible-python-brace-format
msgctxt "cmd:tasks_remove|resp:success" msgctxt "cmd:tasks_remove|resp:success"
msgid "{tick} Deleted task `{label}`" msgid "{tick} Deleted task `{label}`"
@@ -345,37 +377,39 @@ msgid_plural "{tick} Deleted `{count}` tasks from your tasklist."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/modules/tasklist/cog.py:778 #: src/modules/tasklist/cog.py:821
msgctxt "cmd:tasks_tick" msgctxt "cmd:tasks_tick"
msgid "tick" msgid "tick"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:779 #: src/modules/tasklist/cog.py:822
msgctxt "cmd:tasks_tick|desc" msgctxt "cmd:tasks_tick|desc"
msgid "Mark the given tasks as completed." msgid "Mark the given tasks as completed."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:782 #: src/modules/tasklist/cog.py:825
msgctxt "cmd:tasks_tick|param:taskidstr" msgctxt "cmd:tasks_tick|param:taskidstr"
msgid "tasks" msgid "tasks"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:783 #: src/modules/tasklist/cog.py:826
msgctxt "cmd:tasks_tick|param:cascade" msgctxt "cmd:tasks_tick|param:cascade"
msgid "cascade" msgid "cascade"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:788 #: src/modules/tasklist/cog.py:831
msgctxt "cmd:tasks_tick|param:taskidstr|desc" 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 "" msgstr ""
#: src/modules/tasklist/cog.py:792 #: src/modules/tasklist/cog.py:835
msgctxt "cmd:tasks_tick|param:cascade|desc" msgctxt "cmd:tasks_tick|param:cascade|desc"
msgid "Whether to also mark all subtasks as complete." msgid "Whether to also mark all subtasks as complete."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:836 #: src/modules/tasklist/cog.py:879
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:tasks_tick|resp:success" msgctxt "cmd:tasks_tick|resp:success"
msgid "{tick} Marked `{label}` as complete." msgid "{tick} Marked `{label}` as complete."
@@ -383,37 +417,39 @@ msgid_plural "{tick} Marked `{count}` tasks as complete."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/modules/tasklist/cog.py:854 #: src/modules/tasklist/cog.py:897
msgctxt "cmd:tasks_untick" msgctxt "cmd:tasks_untick"
msgid "untick" msgid "untick"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:855 #: src/modules/tasklist/cog.py:898
msgctxt "cmd:tasks_untick|desc" msgctxt "cmd:tasks_untick|desc"
msgid "Mark the given tasks as incomplete." msgid "Mark the given tasks as incomplete."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:858 #: src/modules/tasklist/cog.py:901
msgctxt "cmd:tasks_untick|param:taskidstr" msgctxt "cmd:tasks_untick|param:taskidstr"
msgid "taskids" msgid "taskids"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:859 #: src/modules/tasklist/cog.py:902
msgctxt "cmd:tasks_untick|param:cascade" msgctxt "cmd:tasks_untick|param:cascade"
msgid "cascade" msgid "cascade"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:864 #: src/modules/tasklist/cog.py:907
msgctxt "cmd:tasks_untick|param:taskidstr|desc" 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 "" msgstr ""
#: src/modules/tasklist/cog.py:868 #: src/modules/tasklist/cog.py:911
msgctxt "cmd:tasks_untick|param:cascade|desc" msgctxt "cmd:tasks_untick|param:cascade|desc"
msgid "Whether to also mark all subtasks as incomplete." msgid "Whether to also mark all subtasks as incomplete."
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:909 #: src/modules/tasklist/cog.py:952
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:tasks_untick|resp:success" msgctxt "cmd:tasks_untick|resp:success"
msgid "{tick} Marked `{label}` as incomplete." msgid "{tick} Marked `{label}` as incomplete."
@@ -421,27 +457,27 @@ msgid_plural "{tick} Marked `{count}` tasks as incomplete."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/modules/tasklist/cog.py:933 #: src/modules/tasklist/cog.py:976
msgctxt "cmd:configure_tasklist" msgctxt "cmd:configure_tasklist"
msgid "tasklist" msgid "tasklist"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:934 #: src/modules/tasklist/cog.py:977
msgctxt "cmd:configure_tasklist|desc" msgctxt "cmd:configure_tasklist|desc"
msgid "Tasklist configuration panel" msgid "Tasklist configuration panel"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:937 #: src/modules/tasklist/cog.py:980
msgctxt "cmd:configure_tasklist|param:reward" msgctxt "cmd:configure_tasklist|param:reward"
msgid "reward" msgid "reward"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:938 #: src/modules/tasklist/cog.py:981
msgctxt "cmd:configure_tasklist|param:reward_limit" msgctxt "cmd:configure_tasklist|param:reward_limit"
msgid "reward_limit" msgid "reward_limit"
msgstr "" msgstr ""
#: src/modules/tasklist/cog.py:974 #: src/modules/tasklist/cog.py:1017
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:configure_tasklist|resp:success|desc" msgctxt "cmd:configure_tasklist|resp:success|desc"
msgid "" msgid ""
@@ -449,19 +485,19 @@ msgid ""
"up to a maximum of `{limit}` tasks per 24h." "up to a maximum of `{limit}` tasks per 24h."
msgstr "" msgstr ""
#: src/modules/tasklist/tasklist.py:264 #: src/modules/tasklist/tasklist.py:267
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "tasklist|parse:multi-range|error:parents_match" msgctxt "tasklist|parse:multi-range|error:parents_match"
msgid "Parents don't match in range `{range}`" msgid "Parents don't match in range `{range}`"
msgstr "" msgstr ""
#: src/modules/tasklist/tasklist.py:286 #: src/modules/tasklist/tasklist.py:289
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "tasklist|parse:multi-range|error:parse" msgctxt "tasklist|parse:multi-range|error:parse"
msgid "Could not parse `{range}` as a task number or range." msgid "Could not parse `{range}` as a task number or range."
msgstr "" msgstr ""
#: src/modules/tasklist/tasklist.py:317 #: src/modules/tasklist/tasklist.py:320
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "modal:tasklist_bulk_editor|error:parse_task" msgctxt "modal:tasklist_bulk_editor|error:parse_task"
msgid "" msgid ""
@@ -469,7 +505,7 @@ msgid ""
"`{input}`" "`{input}`"
msgstr "" msgstr ""
#: src/modules/tasklist/tasklist.py:329 #: src/modules/tasklist/tasklist.py:332
msgctxt "modal:tasklist_bulk_editor|error:task_too_long" msgctxt "modal:tasklist_bulk_editor|error:task_too_long"
msgid "Please keep your tasks under 100 characters!" msgid "Please keep your tasks under 100 characters!"
msgstr "" msgstr ""
@@ -545,13 +581,13 @@ msgctxt "ui:tasklist|menu:sub|mode:delete|placeholder"
msgid "Delete from {label}.*" msgid "Delete from {label}.*"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:408 #: src/modules/tasklist/ui.py:409
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:tasklist_single_editor|field:parent|error:parse_id" msgctxt "ui:tasklist_single_editor|field:parent|error:parse_id"
msgid "Could not find the given parent task number `{input}` in your tasklist." msgid "Could not find the given parent task number `{input}` in your tasklist."
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:422 #: src/modules/tasklist/ui.py:423
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:tasklist_single_editor|field:parent|error:multiple_matching" msgctxt "ui:tasklist_single_editor|field:parent|error:multiple_matching"
msgid "" msgid ""
@@ -559,77 +595,77 @@ msgid ""
"number instead!" "number instead!"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:429 #: src/modules/tasklist/ui.py:430
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:tasklist_single_editor|field:parent|error:no_matching" msgctxt "ui:tasklist_single_editor|field:parent|error:no_matching"
msgid "No tasks matching given parent task `{input}`." msgid "No tasks matching given parent task `{input}`."
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:500 #: src/modules/tasklist/ui.py:501
msgctxt "ui:tasklist|menu:edit|modal:title" msgctxt "ui:tasklist|menu:edit|modal:title"
msgid "Edit task" msgid "Edit task"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:593 #: src/modules/tasklist/ui.py:596
msgctxt "ui:tasklist_single_editor|title" msgctxt "ui:tasklist_single_editor|title"
msgid "Add task" msgid "Add task"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:626 #: src/modules/tasklist/ui.py:629
msgctxt "ui:tasklist|button:edit_mode|label" msgctxt "ui:tasklist|button:edit_mode|label"
msgid "Edit" msgid "Edit"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:642 #: src/modules/tasklist/ui.py:645
msgctxt "ui:tasklist|button:delete_mode|label" msgctxt "ui:tasklist|button:delete_mode|label"
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:658 #: src/modules/tasklist/ui.py:661
msgctxt "ui:tasklist|button:toggle_mode|label" msgctxt "ui:tasklist|button:toggle_mode|label"
msgid "Toggle" msgid "Toggle"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:675 #: src/modules/tasklist/ui.py:678
msgctxt "ui:tasklist|button:edit_bulk|error:too_long" msgctxt "ui:tasklist|button:edit_bulk|error:too_long"
msgid "" msgid ""
"Your tasklist is too long to be edited in a Discord text input! Use the save " "Your tasklist is too long to be edited in a Discord text input! Use the save "
"button and {cmds[tasks upload]} instead." "button and {cmds[tasks upload]} instead."
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:689 #: src/modules/tasklist/ui.py:692
msgctxt "ui:tasklist|button:edit_bulk|label" msgctxt "ui:tasklist|button:edit_bulk|label"
msgid "Bulk Edit" msgid "Bulk Edit"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:702 #: src/modules/tasklist/ui.py:705
msgctxt "ui:tasklist|button:clear|label" msgctxt "ui:tasklist|button:clear|label"
msgid "Clear Tasklist" msgid "Clear Tasklist"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:721 #: src/modules/tasklist/ui.py:724
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:tasklist|button:save|dm:contents" msgctxt "ui:tasklist|button:save|dm:contents"
msgid "Your tasklist as of {now} is attached. Click here to jump back: {jump}" msgid "Your tasklist as of {now} is attached. Click here to jump back: {jump}"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:734 #: src/modules/tasklist/ui.py:737
msgctxt "ui:tasklist|button:save|error:dms" msgctxt "ui:tasklist|button:save|error:dms"
msgid "Could not DM you! Do you have me blocked? Tasklist attached below." msgid "Could not DM you! Do you have me blocked? Tasklist attached below."
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:779 #: src/modules/tasklist/ui.py:782
msgctxt "ui:tasklist|error:wrong_user" msgctxt "ui:tasklist|error:wrong_user"
msgid "This is not your tasklist!" msgid "This is not your tasklist!"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:821 #: src/modules/tasklist/ui.py:824
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "ui:tasklist|embed|author" msgctxt "ui:tasklist|embed|author"
msgid "{name}'s tasklist ({completed}/{total} complete)" msgid "{name}'s tasklist ({completed}/{total} complete)"
msgstr "" msgstr ""
#: src/modules/tasklist/ui.py:843 #: src/modules/tasklist/ui.py:846
msgctxt "ui:tasklist|embed|description" msgctxt "ui:tasklist|embed|description"
msgid "" msgid ""
"**You have no tasks on your tasklist!**\n" "**You have no tasks on your tasklist!**\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,62 +17,66 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\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" msgid "test"
msgstr "" msgstr ""
#: src/modules/test/test.py:55 #: src/modules/test/test.py:67
msgid "Test" msgid "Test"
msgstr "" msgstr ""
#: src/modules/test/test.py:62 #: src/modules/test/test.py:74
msgid "editor" msgid "editor"
msgstr "" msgstr ""
#: src/modules/test/test.py:63 #: src/modules/test/test.py:75
msgid "Test message editor" msgid "Test message editor"
msgstr "" msgstr ""
#: src/modules/test/test.py:89 #: src/modules/test/test.py:101
msgid "test_ephemeral" msgid "test_ephemeral"
msgstr "" msgstr ""
#: src/modules/test/test.py:90 #: src/modules/test/test.py:102
msgid "Test ephemeral delete and edit" msgid "Test ephemeral delete and edit"
msgstr "" msgstr ""
#: src/modules/test/test.py:102 #: src/modules/test/test.py:114
msgid "colours" msgid "colours"
msgstr "" msgstr ""
#: src/modules/test/test.py:103 #: src/modules/test/test.py:115
msgid "Test Ansi colours" msgid "Test Ansi colours"
msgstr "" msgstr ""
#: src/modules/test/test.py:123 #: src/modules/test/test.py:135
msgid "fail" msgid "fail"
msgstr "" msgstr ""
#: src/modules/test/test.py:130 #: src/modules/test/test.py:143
msgid "failui"
msgstr ""
#: src/modules/test/test.py:150
msgid "pager" msgid "pager"
msgstr "" msgstr ""
#: src/modules/test/test.py:158 #: src/modules/test/test.py:178
msgid "pager2" msgid "pager2"
msgstr "" msgstr ""
#: src/modules/test/test.py:189 #: src/modules/test/test.py:209
msgid "prettyusers" msgid "prettyusers"
msgstr "" msgstr ""
#: src/modules/test/test.py:239 #: src/modules/test/test.py:259
msgid "dmview" msgid "dmview"
msgstr "" msgstr ""
#: src/modules/test/test.py:250 #: src/modules/test/test.py:270
msgid "multiview" msgid "multiview"
msgstr "" msgstr ""
#: src/modules/test/test.py:267 #: src/modules/test/test.py:287
msgid "stats-card" msgid "stats-card"
msgstr "" msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,22 +17,22 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: src/tracking/text/cog.py:249 #: src/tracking/text/cog.py:254
msgctxt "cmd:configure_message_exp" msgctxt "cmd:configure_message_exp"
msgid "message_exp" msgid "message_exp"
msgstr "" msgstr ""
#: src/tracking/text/cog.py:252 #: src/tracking/text/cog.py:257
msgctxt "cmd:configure_message_exp|desc" msgctxt "cmd:configure_message_exp|desc"
msgid "Configure Message Tracking & Experience" msgid "Configure Message Tracking & Experience"
msgstr "" msgstr ""
#: src/tracking/text/cog.py:315 #: src/tracking/text/cog.py:320
msgctxt "cmd:leo_configure_exp_rates" msgctxt "cmd:leo_configure_exp_rates"
msgid "experience_rates" msgid "experience_rates"
msgstr "" msgstr ""
#: src/tracking/text/cog.py:318 #: src/tracking/text/cog.py:323
msgctxt "cmd:leo_configure_exp_rates|desc" msgctxt "cmd:leo_configure_exp_rates|desc"
msgid "Global experience rate configuration" msgid "Global experience rate configuration"
msgstr "" msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -103,34 +103,34 @@ msgctxt "cmd:page_select|acmpl|error:no_pager"
msgid "No active pagers in this channel!" msgid "No active pagers in this channel!"
msgstr "" msgstr ""
#: src/utils/transformers.py:43 #: src/utils/transformers.py:45
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "utils:parse_dur|error" msgctxt "utils:parse_dur|error"
msgid "Cannot parse `{value}` as a duration." msgid "Cannot parse `{value}` as a duration."
msgstr "" msgstr ""
#: src/utils/transformers.py:68 #: src/utils/transformers.py:71
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "util:Duration|acmpl|error" msgctxt "util:Duration|acmpl|error"
msgid "Cannot extract duration from \"{partial}\"" msgid "Cannot extract duration from \"{partial}\""
msgstr "" msgstr ""
#: src/utils/lib.py:670 #: src/utils/lib.py:678
msgctxt "util:parse_dur|regex:day" msgctxt "util:parse_dur|regex:day"
msgid "(?P<value>\\d+)\\s*(?:(d)|(day))" msgid "(?P<value>\\d+)\\s*(?:(d)|(day))"
msgstr "" msgstr ""
#: src/utils/lib.py:677 #: src/utils/lib.py:685
msgctxt "util:parse_dur|regex:hour" msgctxt "util:parse_dur|regex:hour"
msgid "(?P<value>\\d+)\\s*(?:(h)|(hour))" msgid "(?P<value>\\d+)\\s*(?:(h)|(hour))"
msgstr "" msgstr ""
#: src/utils/lib.py:684 #: src/utils/lib.py:692
msgctxt "util:parse_dur|regex:minute" msgctxt "util:parse_dur|regex:minute"
msgid "(?P<value>\\d+)\\s*(?:(m)|(min))" msgid "(?P<value>\\d+)\\s*(?:(m)|(min))"
msgstr "" msgstr ""
#: src/utils/lib.py:691 #: src/utils/lib.py:699
msgctxt "util:parse_dur|regex:second" msgctxt "util:parse_dur|regex:second"
msgid "(?P<value>\\d+)\\s*(?:(s)|(sec))" msgid "(?P<value>\\d+)\\s*(?:(s)|(sec))"
msgstr "" msgstr ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,129 +17,129 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: src/tracking/voice/cog.py:640 #: src/tracking/voice/cog.py:649
msgctxt "cmd:now" msgctxt "cmd:now"
msgid "now" msgid "now"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:643 #: src/tracking/voice/cog.py:652
msgctxt "cmd:now|desc" msgctxt "cmd:now|desc"
msgid "" msgid ""
"Describe what you are working on, or see what your friends are working on!" "Describe what you are working on, or see what your friends are working on!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:647 #: src/tracking/voice/cog.py:656
msgctxt "cmd:now|param:tag" msgctxt "cmd:now|param:tag"
msgid "tag" msgid "tag"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:648 #: src/tracking/voice/cog.py:657
msgctxt "cmd:now|param:user" msgctxt "cmd:now|param:user"
msgid "user" msgid "user"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:649 #: src/tracking/voice/cog.py:658
msgctxt "cmd:now|param:clear" msgctxt "cmd:now|param:clear"
msgid "clear" msgid "clear"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:654 #: src/tracking/voice/cog.py:663
msgctxt "cmd:now|param:tag|desc" msgctxt "cmd:now|param:tag|desc"
msgid "Describe what you are working on in 10 characters or less!" msgid "Describe what you are working on in 10 characters or less!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:658 #: src/tracking/voice/cog.py:667
msgctxt "cmd:now|param:user|desc" msgctxt "cmd:now|param:user|desc"
msgid "Check what a friend is working on." msgid "Check what a friend is working on."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:662 #: src/tracking/voice/cog.py:671
msgctxt "cmd:now|param:clear|desc" msgctxt "cmd:now|param:clear|desc"
msgid "Unset your activity tag (or the target user's tag, for moderators)." msgid "Unset your activity tag (or the target user's tag, for moderators)."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:689 #: src/tracking/voice/cog.py:698
msgctxt "cmd:now|target:self|error:target_inactive" msgctxt "cmd:now|target:self|error:target_inactive"
msgid "" msgid ""
"You have no running session! Join a tracked voice channel to start a session." "You have no running session! Join a tracked voice channel to start a session."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:698 #: src/tracking/voice/cog.py:707
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:now|target:other|error:target_inactive" msgctxt "cmd:now|target:other|error:target_inactive"
msgid "{mention} has no running session!" msgid "{mention} has no running session!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:713 #: src/tracking/voice/cog.py:722
msgctxt "cmd:now|target:self|mode:clear|success|title" msgctxt "cmd:now|target:self|mode:clear|success|title"
msgid "Session Tag Cleared" msgid "Session Tag Cleared"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:717 #: src/tracking/voice/cog.py:726
msgctxt "cmd:now|target:self|mode:clear|success|desc" msgctxt "cmd:now|target:self|mode:clear|success|desc"
msgid "Successfully unset your session tag." msgid "Successfully unset your session tag."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:726 #: src/tracking/voice/cog.py:735
msgctxt "cmd:now|target:other|mode:clear|error:perms|title" msgctxt "cmd:now|target:other|mode:clear|error:perms|title"
msgid "You can't do that!" msgid "You can't do that!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:730 #: src/tracking/voice/cog.py:739
msgctxt "cmd:now|target:other|mode:clear|error:perms|desc" 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." msgid "You need to be a moderator to set or clear someone else's session tag."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:740 #: src/tracking/voice/cog.py:749
msgctxt "cmd:now|target:other|mode:clear|success|title" msgctxt "cmd:now|target:other|mode:clear|success|title"
msgid "Session Tag Cleared!" msgid "Session Tag Cleared!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:744 #: src/tracking/voice/cog.py:753
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:now|target:other|mode:clear|success|desc" msgctxt "cmd:now|target:other|mode:clear|success|desc"
msgid "Cleared {target}'s session tag." msgid "Cleared {target}'s session tag."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:756 #: src/tracking/voice/cog.py:765
msgctxt "cmd:now|target:self|mode:set|success|title" msgctxt "cmd:now|target:self|mode:set|success|title"
msgid "Session Tag Set!" msgid "Session Tag Set!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:760 #: src/tracking/voice/cog.py:769
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:now|target:self|mode:set|success|desc" msgctxt "cmd:now|target:self|mode:set|success|desc"
msgid "You are now working on `{new_tag}`. Good luck!" msgid "You are now working on `{new_tag}`. Good luck!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:769 #: src/tracking/voice/cog.py:778
msgctxt "cmd:now|target:other|mode:set|error:perms|title" msgctxt "cmd:now|target:other|mode:set|error:perms|title"
msgid "You can't do that!" msgid "You can't do that!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:773 #: src/tracking/voice/cog.py:782
msgctxt "cmd:now|target:other|mode:set|error:perms|desc" 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!" msgid "You need to be a moderator to set or clear someone else's session tag!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:783 #: src/tracking/voice/cog.py:792
msgctxt "cmd:now|target:other|mode:set|success|title" msgctxt "cmd:now|target:other|mode:set|success|title"
msgid "Session Tag Set!" msgid "Session Tag Set!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:787 #: src/tracking/voice/cog.py:796
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:now|target:other|mode:set|success|desc" msgctxt "cmd:now|target:other|mode:set|success|desc"
msgid "Set {target}'s session tag to `{new_tag}`." msgid "Set {target}'s session tag to `{new_tag}`."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:796 #: src/tracking/voice/cog.py:805
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:now|target:self|mode:show_with_tag|desc" msgctxt "cmd:now|target:self|mode:show_with_tag|desc"
msgid "You have been working on **`{tag}`** in {channel} since {time}!" msgid "You have been working on **`{tag}`** in {channel} since {time}!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:801 #: src/tracking/voice/cog.py:810
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:now|target:self|mode:show_without_tag|desc" msgctxt "cmd:now|target:self|mode:show_without_tag|desc"
msgid "" msgid ""
@@ -148,7 +148,7 @@ msgid ""
"Use `/now <tag>` to set what you are working on." "Use `/now <tag>` to set what you are working on."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:808 #: src/tracking/voice/cog.py:817
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:now|target:other|mode:show_with_tag|desc" msgctxt "cmd:now|target:other|mode:show_with_tag|desc"
msgid "" msgid ""
@@ -156,23 +156,23 @@ msgid ""
"They have been working on **{tag}** since {time}." "They have been working on **{tag}** since {time}."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:814 #: src/tracking/voice/cog.py:823
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:now|target:other|mode:show_without_tag|desc" msgctxt "cmd:now|target:other|mode:show_without_tag|desc"
msgid "{target} has been working in {channel} since {time}!" msgid "{target} has been working in {channel} since {time}!"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:837 #: src/tracking/voice/cog.py:846
msgctxt "cmd:configure_voice_rates" msgctxt "cmd:configure_voice_rates"
msgid "voice_rewards" msgid "voice_rewards"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:840 #: src/tracking/voice/cog.py:849
msgctxt "cmd:configure_voice_rates|desc" msgctxt "cmd:configure_voice_rates|desc"
msgid "Configure Voice tracking rewards and experience" msgid "Configure Voice tracking rewards and experience"
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:897 #: src/tracking/voice/cog.py:906
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:configure_voice_tracking|mode:voice|resp:success|desc" msgctxt "cmd:configure_voice_tracking|mode:voice|resp:success|desc"
msgid "" msgid ""
@@ -181,7 +181,7 @@ msgid ""
"day." "day."
msgstr "" msgstr ""
#: src/tracking/voice/cog.py:908 #: src/tracking/voice/cog.py:917
#, possible-python-brace-format #, possible-python-brace-format
msgctxt "cmd:configure_voice_tracking|mode:study|resp:success|desc" msgctxt "cmd:configure_voice_tracking|mode:study|resp:success|desc"
msgid "" msgid ""

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"

View File

@@ -26,6 +26,7 @@ class ConfigCog(LionCog):
@cmds.hybrid_group( @cmds.hybrid_group(
name=_p('group:configure', "configure"), name=_p('group:configure', "configure"),
description=_p('group:configure|desc', "View and adjust my configuration options."),
) )
@appcmds.guild_only @appcmds.guild_only
@appcmds.default_permissions(manage_guild=True) @appcmds.default_permissions(manage_guild=True)

View File

@@ -179,9 +179,6 @@ class CoreData(Registry, name="core"):
mod_log_channel = Integer() mod_log_channel = Integer()
alert_channel = Integer() alert_channel = Integer()
studyban_role = Integer()
max_study_bans = Integer()
min_workout_length = Integer() min_workout_length = Integer()
workout_reward = Integer() workout_reward = Integer()
@@ -209,6 +206,8 @@ class CoreData(Registry, name="core"):
video_studyban = Bool() video_studyban = Bool()
video_grace_period = Integer() video_grace_period = Integer()
studyban_role = Integer()
greeting_channel = Integer() greeting_channel = Integer()
greeting_message = String() greeting_message = String()
returning_message = String() returning_message = String()

View File

@@ -85,6 +85,8 @@ class LionMember(Timezoned):
""" """
if member.display_name != self.data.display_name: if member.display_name != self.data.display_name:
await self.data.update(display_name=member.display_name) await self.data.update(display_name=member.display_name)
else:
await self.data.refresh()
async def fetch_member(self) -> Optional[discord.Member]: async def fetch_member(self) -> Optional[discord.Member]:
""" """

Submodule src/gui updated: 3952086fb0...b781f7f9f2

View File

@@ -7,10 +7,11 @@ import discord
from discord.utils import MISSING from discord.utils import MISSING
from discord.ext.commands import Bot, Cog, HybridCommand, HybridCommandError from discord.ext.commands import Bot, Cog, HybridCommand, HybridCommandError
from discord.ext.commands.errors import CommandInvokeError, CheckFailure 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 aiohttp import ClientSession
from data import Database from data import Database
from utils.lib import tabulate
from .config import Conf from .config import Conf
from .logger import logging_context, log_context, log_action_stack, log_wrap, set_logging_context from .logger import logging_context, log_context, log_action_stack, log_wrap, set_logging_context
@@ -160,6 +161,17 @@ class LionBot(Bot):
raise original raise original
except HandledException: except HandledException:
pass 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: except SafeCancellation:
if original.msg: if original.msg:
try: try:
@@ -183,7 +195,7 @@ class LionBot(Bot):
extra={'action': 'BotError', 'with_ctx': True} extra={'action': 'BotError', 'with_ctx': True}
) )
except discord.HTTPException: except discord.HTTPException:
logger.warning( logger.error(
f"Caught an unhandled 'HTTPException' while executing: {cmd_str}", f"Caught an unhandled 'HTTPException' while executing: {cmd_str}",
exc_info=True, exc_info=True,
extra={'action': 'BotError', 'with_ctx': True} extra={'action': 'BotError', 'with_ctx': True}
@@ -192,7 +204,7 @@ class LionBot(Bot):
pass pass
except asyncio.TimeoutError: except asyncio.TimeoutError:
pass pass
except Exception: except Exception as e:
logger.exception( logger.exception(
f"Caught an unknown CommandInvokeError while executing: {cmd_str}", f"Caught an unknown CommandInvokeError while executing: {cmd_str}",
extra={'action': 'BotError', 'with_ctx': True} extra={'action': 'BotError', 'with_ctx': True}
@@ -201,10 +213,36 @@ class LionBot(Bot):
error_embed = discord.Embed(title="Something went wrong!") error_embed = discord.Embed(title="Something went wrong!")
error_embed.description = ( error_embed.description = (
"An unexpected error occurred while processing your command!\n" "An unexpected error occurred while processing your command!\n"
"Our development team has been notified, and the issue should be fixed soon.\n" "Our development team has been notified, and the issue will be addressed soon.\n"
"If the error persists, please contact our support team and give them the following number: " "If the error persists, or you have any questions, please contact our [support team]({link}) "
f"`{ctx.interaction.id if ctx.interaction else ctx.message.id}`" "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}`"
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 == ctx.guild.owner 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: try:
await ctx.error_reply(embed=error_embed) await ctx.error_reply(embed=error_embed)

View File

@@ -1,12 +1,15 @@
import logging import logging
import discord
from discord import Interaction from discord import Interaction
from discord.app_commands import CommandTree from discord.app_commands import CommandTree
from discord.app_commands.errors import AppCommandError, CommandInvokeError from discord.app_commands.errors import AppCommandError, CommandInvokeError
from discord.enums import InteractionType from discord.enums import InteractionType
from discord.app_commands.namespace import Namespace from discord.app_commands.namespace import Namespace
from .logger import logging_context, set_logging_context, log_wrap from utils.lib import tabulate
from .logger import logging_context, set_logging_context, log_wrap, log_action_stack
from .errors import SafeCancellation from .errors import SafeCancellation
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -17,7 +20,7 @@ class LionTree(CommandTree):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self._call_tasks = set() self._call_tasks = set()
async def on_error(self, interaction, error) -> None: async def on_error(self, interaction: discord.Interaction, error) -> None:
try: try:
if isinstance(error, CommandInvokeError): if isinstance(error, CommandInvokeError):
raise error.original raise error.original
@@ -28,6 +31,51 @@ class LionTree(CommandTree):
pass pass
except Exception: except Exception:
logger.exception(f"Unhandled exception in interaction: {interaction}", extra={'action': 'TreeError'}) logger.exception(f"Unhandled exception in interaction: {interaction}", extra={'action': 'TreeError'})
if not interaction.is_expired():
splat = self.bugsplat(interaction, error)
try:
if interaction.response.is_done():
await interaction.followup.send(embed=splat, ephemeral=True)
else:
await interaction.response.send_message(embed=splat, ephemeral=True)
except discord.HTTPException:
pass
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}`"
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 == interaction.guild.owner 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: def _from_interaction(self, interaction: Interaction) -> None:
@log_wrap(context=f"iid: {interaction.id}", isolate=False) @log_wrap(context=f"iid: {interaction.id}", isolate=False)

View File

@@ -17,6 +17,7 @@ from .config import conf
from . import sharding from . import sharding
from .context import context from .context import context
from utils.lib import utc_now from utils.lib import utc_now
from utils.ratelimits import Bucket, BucketOverFull, BucketFull
log_logger = logging.getLogger(__name__) log_logger = logging.getLogger(__name__)
@@ -258,7 +259,7 @@ class LocalQueueHandler(QueueHandler):
class WebHookHandler(logging.StreamHandler): 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__() super().__init__()
self.webhook_url = webhook_url self.webhook_url = webhook_url
self.prefix = prefix self.prefix = prefix
@@ -270,6 +271,12 @@ class WebHookHandler(logging.StreamHandler):
self.last_batched = None self.last_batched = None
self.waiting = [] self.waiting = []
self.bucket = Bucket(20, 40)
self.ignored = 0
self.session = None
self.webhook = None
def get_loop(self): def get_loop(self):
if self.loop is None: if self.loop is None:
self.loop = asyncio.new_event_loop() self.loop = asyncio.new_event_loop()
@@ -281,8 +288,14 @@ class WebHookHandler(logging.StreamHandler):
self.get_loop().call_soon_threadsafe(self._post, record) self.get_loop().call_soon_threadsafe(self._post, record)
def _post(self, record): def _post(self, record):
if self.session is None:
self.setup()
asyncio.create_task(self.post(record)) 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): async def post(self, record):
log_context.set("Webhook Logger") log_context.set("Webhook Logger")
log_action_stack.set(("Logging",)) log_action_stack.set(("Logging",))
@@ -314,7 +327,7 @@ class WebHookHandler(logging.StreamHandler):
else: else:
await self._send(message, as_file=as_file) await self._send(message, as_file=as_file)
except Exception as ex: 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): async def _schedule_batched(self):
if self.batch_task is not None and not (self.batch_task.done() or self.batch_task.cancelled()): if self.batch_task is not None and not (self.batch_task.done() or self.batch_task.cancelled()):
@@ -327,7 +340,7 @@ class WebHookHandler(logging.StreamHandler):
except asyncio.CancelledError: except asyncio.CancelledError:
return return
except Exception as ex: 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): async def _send_batched_now(self):
if self.batch_task is not None and not self.batch_task.done(): if self.batch_task is not None and not self.batch_task.done():
@@ -342,18 +355,36 @@ class WebHookHandler(logging.StreamHandler):
await self._send(batched) await self._send(batched)
async def _send(self, message, as_file=False): async def _send(self, message, as_file=False):
async with aiohttp.ClientSession() as session: try:
webhook = Webhook.from_url(self.webhook_url, session=session) self.bucket.request()
if as_file or len(message) > 1900: except BucketOverFull:
with StringIO(message) as fp: # Silently ignore
fp.seek(0) self.ignored += 1
await webhook.send( return
f"{self.prefix}\n`{message.splitlines()[0]}`", except BucketFull:
file=File(fp, filename="logs.md"), logger.warning(
username=log_app.get() f"Live logging webhook {self.webhook.id} going too fast! "
) "Ignoring records until rate slows down."
else: )
await webhook.send(self.prefix + '\n' + message, username=log_app.get()) self.ignored += 1
return
else:
if self.ignored > 0:
logger.warning(
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 = [] handlers = []
@@ -362,8 +393,8 @@ if webhook := conf.logging['general_log']:
handlers.append(handler) handlers.append(handler)
if webhook := conf.logging['error_log']: 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) handler.setLevel(logging.WARNING)
handlers.append(handler) handlers.append(handler)
if webhook := conf.logging['critical_log']: if webhook := conf.logging['critical_log']:

View File

@@ -9,10 +9,10 @@ active = [
'.ranks', '.ranks',
'.reminders', '.reminders',
'.shop', '.shop',
'.tasklist',
'.statistics', '.statistics',
'.pomodoro', '.pomodoro',
'.rooms', '.rooms',
'.tasklist',
'.rolemenus', '.rolemenus',
'.member_admin', '.member_admin',
'.moderation', '.moderation',

View File

@@ -381,13 +381,28 @@ class Economy(LionCog):
if role: if role:
query = MemModel.table.select_where( query = MemModel.table.select_where(
(MemModel.guildid == role.guild.id) & (MemModel.coins != 0) (MemModel.guildid == role.guild.id) & (MemModel.coins != 0)
) ).with_no_adapter()
query.order_by('coins', ORDER.DESC)
if not role.is_default(): if not role.is_default():
# Everyone role is handled differently for data efficiency # Everyone role is handled differently for data efficiency
ids = [target.id for target in targets] ids = [target.id for target in targets]
query = query.where(userid=ids) 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( name = t(_p(
'cmd:economy_balance|embed:role_lb|author', 'cmd:economy_balance|embed:role_lb|author',
@@ -400,7 +415,7 @@ class Economy(LionCog):
"This server has a total balance of {coin_emoji}**{total}**." "This server has a total balance of {coin_emoji}**{total}**."
)).format( )).format(
coin_emoji=cemoji, coin_emoji=cemoji,
total=sum(row['coins'] for row in rows) total=total
) )
else: else:
header = t(_p( header = t(_p(
@@ -408,9 +423,9 @@ class Economy(LionCog):
"{role_mention} has `{count}` members with non-zero balance, " "{role_mention} has `{count}` members with non-zero balance, "
"with a total balance of {coin_emoji}**{total}**." "with a total balance of {coin_emoji}**{total}**."
)).format( )).format(
count=len(targets), count=count,
role_mention=role.mention, role_mention=role.mention,
total=sum(row['coins'] for row in rows), total=total,
coin_emoji=cemoji coin_emoji=cemoji
) )
@@ -476,7 +491,7 @@ class Economy(LionCog):
else: else:
# If we have a single target, show their current balance, with a short transaction history. # If we have a single target, show their current balance, with a short transaction history.
user = targets[0] 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( embed = discord.Embed(
colour=discord.Colour.orange(), colour=discord.Colour.orange(),
@@ -675,7 +690,7 @@ class Economy(LionCog):
) )
@appcmds.guild_only() @appcmds.guild_only()
async def send_cmd(self, ctx: LionContext, async def send_cmd(self, ctx: LionContext,
target: discord.User | discord.Member, target: discord.Member,
amount: appcmds.Range[int, 1, MAX_COINS], amount: appcmds.Range[int, 1, MAX_COINS],
note: Optional[str] = None): note: Optional[str] = None):
""" """
@@ -690,17 +705,49 @@ class Economy(LionCog):
t = self.bot.translator.t t = self.bot.translator.t
error = None
if not ctx.lguild.config.get('allow_transfers').value: if not ctx.lguild.config.get('allow_transfers').value:
await ctx.interaction.response.send_message( error = error_embed(
embed=error_embed( t(_p(
t(_p( 'cmd:send|error:not_allowed',
'cmd:send|error:not_allowed', "Sorry, this server has disabled LionCoin transfers!"
"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 return
# Ensure the target member exists
Member = self.bot.core.data.Member Member = self.bot.core.data.Member
target_lion = await self.bot.core.lions.fetch_member(ctx.guild.id, target.id) target_lion = await self.bot.core.lions.fetch_member(ctx.guild.id, target.id)
@@ -778,7 +825,7 @@ class Economy(LionCog):
) )
) )
if failed: if failed:
embed.description = t(_p( embed.description += '\n' + t(_p(
'cmd:send|embed:ack|desc|error:unreachable', 'cmd:send|embed:ack|desc|error:unreachable',
"Unfortunately, I was not able to message the recipient. Perhaps they have me blocked?" "Unfortunately, I was not able to message the recipient. Perhaps they have me blocked?"
)) ))

View File

@@ -8,6 +8,7 @@ from core.data import CoreData
from utils.data import TemporaryTable, SAFECOINS from utils.data import TemporaryTable, SAFECOINS
# TODO: Add Rank transaction type and tables.
class TransactionType(Enum): class TransactionType(Enum):
""" """
Schema Schema

View File

@@ -20,9 +20,9 @@ cmd_map = {
"cmd_send": "send", "cmd_send": "send",
"cmd_shop": "shop open", "cmd_shop": "shop open",
"cmd_room": "room rent", "cmd_room": "room rent",
"cmd_reminders": "remindme in", "cmd_reminders": "reminders",
"cmd_tasklist": "tasklist", "cmd_tasklist": "tasklist",
"cmd_timers": "timers list", "cmd_timers": "timers",
"cmd_schedule": "schedule", "cmd_schedule": "schedule",
"cmd_dashboard": "dashboard" "cmd_dashboard": "dashboard"
} }
@@ -79,8 +79,8 @@ admin_extra = _p(
Other relevant commands for guild configuration below: Other relevant commands for guild configuration below:
`/editshop`: Add/Edit/Remove colour roles from the {coin} shop. `/editshop`: Add/Edit/Remove colour roles from the {coin} shop.
`/ranks`: Add/Edit/Remove activity ranks. `/ranks`: Add/Edit/Refresh/Remove activity ranks.
`/timer admin`: Add/Edit/Remove Pomodoro timers in voice channels. `/pomodoro`: Add/Edit/Remove Pomodoro timers in voice channels.
`/rolemenus`: Allow members to equip roles from customisable messages. `/rolemenus`: Allow members to equip roles from customisable messages.
`/economy balance`: Display and modify LionCoin balance for members and roles. `/economy balance`: Display and modify LionCoin balance for members and roles.
""" """

View File

@@ -128,7 +128,7 @@ class ModerationSettings(SettingGroup):
_long_desc = _p( _long_desc = _p(
'guildset:mod_role|long_desc', 'guildset:mod_role|long_desc',
"Members with the set role will be able to access my configuration panels, " "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, " "Moderators cannot reconfigure most bot configuration, "
"or perform operations they do not already have permission for in Discord." "or perform operations they do not already have permission for in Discord."
) )

View File

@@ -21,7 +21,6 @@ from .settings import TimerSettings
from .settingui import TimerConfigUI from .settingui import TimerConfigUI
from .timer import Timer from .timer import Timer
from .options import TimerOptions from .options import TimerOptions
from .ui import TimerStatusUI
from .ui.config import TimerOptionsUI from .ui.config import TimerOptionsUI
_p = babel._p _p = babel._p
@@ -317,29 +316,24 @@ class TimerCog(LionCog):
await timer.destroy(**kwargs) await timer.destroy(**kwargs)
# ----- Timer Commands ----- # ----- 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 -- # -- User Display Commands --
@pomodoro_group.command( @cmds.hybrid_command(
name=_p('cmd:pomodoro_status', "show"), name=_p('cmd:timer', "timer"),
description=_p('cmd:pomodoro_status|desc', "Display the status of a single pomodoro timer.") description=_p('cmd:timer|desc', "Show your current (or selected) pomodoro timer.")
) )
@appcmds.rename( @appcmds.rename(
channel=_p('cmd:pomodoro_status|param:channel', "timer_channel") channel=_p('cmd:timer|param:channel', "timer_channel")
) )
@appcmds.describe( @appcmds.describe(
channel=_p( channel=_p(
'cmd:pomodoro_status|param:channel|desc', 'cmd:timer|param:channel|desc',
"The channel for which you want to view the timer." "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 t = self.bot.translator.t
if not ctx.guild: if not ctx.guild:
@@ -347,27 +341,63 @@ class TimerCog(LionCog):
if not ctx.interaction: if not ctx.interaction:
return return
# Check if a timer exists in the given channel timers: list[Timer] = list(self.get_guild_timers(ctx.guild.id).values())
timer = self.get_channel_timer(channel.id) error: Optional[discord.Embed] = None
if timer is None:
embed = discord.Embed( if not timers:
# Guild has no timers
error = discord.Embed(
colour=discord.Colour.brand_red(), colour=discord.Colour.brand_red(),
description=t(_p( description=t(_p(
'cmd:pomodoro_status|error:no_timer', 'cmd:timer|error:no_timers|desc',
"The channel {channel} does not have a timer set up!" "**This server has no timers set up!**\n"
)).format(channel=channel.mention) "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) elif channel is None:
else: if ctx.author.voice and ctx.author.voice.channel:
# Display the timer status ephemerally channel = ctx.author.voice.channel
status = await timer.current_status(with_notify=False, with_warnings=False) else:
await ctx.reply(**status.send_args, ephemeral=True) 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( if channel is not None:
name=_p('cmd:pomodoro_list', "list"), timer = self.get_channel_timer(channel.id)
description=_p('cmd:pomodoro_list|desc', "List the available pomodoro timers.") 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
status = await timer.current_status(with_notify=False, with_warnings=False)
await ctx.reply(**status.send_args, ephemeral=True)
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 t = self.bot.translator.t
if not ctx.guild: if not ctx.guild:
@@ -376,6 +406,8 @@ class TimerCog(LionCog):
return return
timers = list(self.get_guild_timers(ctx.guild.id).values()) 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 = [ visible_timers = [
timer for timer in timers timer for timer in timers
if timer.channel and timer.channel.permissions_for(ctx.author).connect if timer.channel and timer.channel.permissions_for(ctx.author).connect
@@ -383,26 +415,29 @@ class TimerCog(LionCog):
] ]
if not timers: if not timers:
# No timers in this guild! # No timers in the guild
embed = discord.Embed( embed = discord.Embed(
colour=discord.Colour.brand_red(), colour=discord.Colour.brand_red(),
description=t(_p( description=t(_p(
'cmd:pomodoro_list|error:no_timers', 'cmd:timer|error:no_timers|desc',
"No timers have been setup in this server!\n" "**This server has no timers set up!**\n"
"You can ask an admin to create one with {command}, " "Ask an admin to set up and configure a timer with {create_cmd} first, "
"or rent a private room and create one yourself!" "or rent a private room with {room_cmd} and create one yourself!"
)).format(command='`/pomodoro admin create`') )).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) await ctx.reply(embed=embed, ephemeral=True)
elif not visible_timers: elif not visible_timers:
# Timers exist, but the member can't see any # Timers exist, but the member can't see any
embed = discord.Embed( embed = discord.Embed(
colour=discord.Colour.brand_red(), colour=discord.Colour.brand_red(),
description=t(_p( description=t(_p(
'cmd:pomodoro_list|error:no_visible_timers', 'cmd:timer|error:no_visible_timers|desc',
"There are no timers you can join in this server!" "**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) await ctx.reply(embed=embed, ephemeral=True)
else: else:
@@ -410,8 +445,8 @@ class TimerCog(LionCog):
embed = discord.Embed( embed = discord.Embed(
colour=discord.Colour.orange(), colour=discord.Colour.orange(),
title=t(_p( title=t(_p(
'cmd:pomodoro_list|embed:timer_list|title', 'cmd:timers|embed:timer_list|title',
"Pomodoro Timers in **{guild}**" "Pomodoro Timer Rooms in **{guild}**"
)).format(guild=ctx.guild.name), )).format(guild=ctx.guild.name),
) )
for timer in visible_timers: for timer in visible_timers:
@@ -419,25 +454,26 @@ class TimerCog(LionCog):
if stage is None: if stage is None:
if timer.auto_restart: if timer.auto_restart:
lazy_status = _p( lazy_status = _p(
'cmd:pomodoro_list|status:stopped_auto', 'cmd:timers|status:stopped_auto',
"`{pattern}` timer is stopped with no members!\nJoin {channel} to restart it." "`{pattern}` timer is stopped with no members!\n"
"Join {channel} to restart it."
) )
else: else:
lazy_status = _p( lazy_status = _p(
'cmd:pomodoro_list|status:stopped_manual', 'cmd:timers|status:stopped_manual',
"`{pattern}` timer is stopped with `{members}` members!\n" "`{pattern}` timer is stopped with `{members}` members!\n"
"Join {channel} and press `Start` to start it!" "Join {channel} and press `Start` to start it!"
) )
else: else:
if stage.focused: if stage.focused:
lazy_status = _p( lazy_status = _p(
'cmd:pomodoro_list|status:running_focus', 'cmd:timers|status:running_focus',
"`{pattern}` timer is running with `{members}` members!\n" "`{pattern}` timer is running with `{members}` members!\n"
"Currently **focusing**, with break starting {timestamp}" "Currently **focusing**, with break starting {timestamp}"
) )
else: else:
lazy_status = _p( lazy_status = _p(
'cmd:pomodoro_list|status:running_break', 'cmd:timers|status:running_break',
"`{pattern}` timer is running with `{members}` members!\n" "`{pattern}` timer is running with `{members}` members!\n"
"Currently **resting**, with focus starting {timestamp}" "Currently **resting**, with focus starting {timestamp}"
) )
@@ -451,18 +487,19 @@ class TimerCog(LionCog):
await ctx.reply(embed=embed, ephemeral=False) await ctx.reply(embed=embed, ephemeral=False)
# -- Admin Commands -- # -- Admin Commands --
@pomodoro_group.group( @cmds.hybrid_group(
name=_p('cmd:pomodoro_admin', "admin"), name=_p('cmd:pomodoro', "pomodoro"),
desc=_p('cmd:pomodoro_admin|desc', "Command group for pomodoro admin controls.") 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"), name=_p('cmd:pomodoro_create', "create"),
description=_p( description=_p(
'cmd:pomodoro_create|desc', 'cmd:pomodoro_create|desc',
"Create a new Pomodoro timer. Requires admin permissions." "Create a new Pomodoro timer. Requires manage channel permissions."
) )
) )
@appcmds.rename( @appcmds.rename(
@@ -495,17 +532,15 @@ class TimerCog(LionCog):
if not ctx.interaction: if not ctx.interaction:
return return
# Check permissions # Get private room if applicable
if not ctx.author.guild_permissions.administrator: room_cog = self.bot.get_cog('RoomCog')
embed = discord.Embed( if room_cog is None:
colour=discord.Colour.brand_red(), logger.warning("Running pomodoro create without private room cog loaded!")
description=t(_p( private_room = None
'cmd:pomodoro_create|error:insufficient_perms', else:
"Only server administrators can create timers!" 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
await ctx.reply(embed=embed, ephemeral=True)
return
# If a voice channel was not given, attempt to resolve it or make one # If a voice channel was not given, attempt to resolve it or make one
if channel is None: if channel is None:
@@ -514,112 +549,155 @@ class TimerCog(LionCog):
channel = ctx.channel channel = ctx.channel
elif ctx.author.voice and ctx.author.voice.channel: elif ctx.author.voice and ctx.author.voice.channel:
channel = 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: else:
# Attempt to create new channel in current category # Attempt to create new channel in current category
if ctx.guild.me.guild_permissions.manage_channels: try:
try: channel = await ctx.guild.create_voice_channel(
channel = await ctx.guild.create_voice_channel( name=name or t(_p(
name=name or "Timer", 'cmd:pomodoro_create|new_channel|default_name',
reason="Creating Pomodoro Voice Channel", "Timer"
category=ctx.channel.category )),
) reason=t(_p(
except discord.HTTPException: 'cmd:pomodoro_create|new_channel|audit_reason',
embed = discord.Embed( "Creating Pomodoro Voice Channel"
colour=discord.Colour.brand_red(), )),
title=t(_p( category=ctx.channel.category
'cmd:pomodoro_create|error:channel_create_failed|title', )
"Could not create pomodoro voice channel!" except discord.HTTPException:
)),
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
embed = discord.Embed( embed = discord.Embed(
colour=discord.Colour.brand_red(), colour=discord.Colour.brand_red(),
title=t(_p( 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!" "Could not create pomodoro voice channel!"
)), )),
description=t(_p( description=t(_p(
'cmd:pomodoro_create|error:channel_create_permissions|desc', 'cmd:pomodoro_create|new_channel|error:channel_create_failed|desc',
"No `timer_channel` was provided, and I lack the `MANAGE_CHANNELS` permission " "Failed to create a new pomodoro voice channel due to an unknown "
"needed to create a new voice channel." "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) await ctx.reply(embed=embed, ephemeral=True)
return
# At this point, we have a voice channel if not channel:
# Make sure a timer does not already exist in the channel # Already handled the creation error
if (self.get_channel_timer(channel.id)) is not None: pass
elif (self.get_channel_timer(channel.id)) is not None:
# A timer already exists in the resolved channel
embed = discord.Embed( embed = discord.Embed(
colour=discord.Colour.brand_red(), colour=discord.Colour.brand_red(),
description=t(_p( description=t(_p(
'cmd:pomodoro_create|error:timer_exists', 'cmd:pomodoro_create|add_timer|error:timer_exists',
"A timer already exists in {channel}! Use `/pomodoro admin edit` to modify it." "A timer already exists in {channel}! "
)).format(channel=channel.mention) "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) 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 owned = (private_room and (channel == private_room))
provided = { if owned:
'focus_length': focus_length * 60, provided['manager_role'] = manager_role or ctx.guild.default_role
'break_length': break_length * 60, create_args['notification_channelid'] = channel.id
'notification_channel': notification_channel, create_args['ownerid'] = ctx.author.id
'inactivity_threshold': inactivity_threshold, else:
'manager_role': manager_role, provided['notification_channel'] = notification_channel
'voice_alerts': voice_alerts, provided['manager_role'] = manager_role
'name': name or channel.name,
'channel_name': channel_name or None,
}
create_args = {'channelid': channel.id, 'guildid': channel.guild.id} for param, value in provided.items():
for param, value in provided.items(): if value is not None:
if value is not None: setting, _ = _param_options[param]
setting, _ = _param_options[param] create_args[setting._column] = setting._data_from_value(channel.id, value)
create_args[setting._column] = setting._data_from_value(channel.id, value)
# Permission checks and input checking done # Permission checks and input checking done
await ctx.interaction.response.defer(thinking=True) await ctx.interaction.response.defer(thinking=True)
# Create timer # Create timer
timer = await self.create_timer(**create_args) timer = await self.create_timer(**create_args)
# Start timer # Start timer
await timer.start() await timer.start()
# Ack with a config UI # Ack with a config UI
ui = TimerOptionsUI(self.bot, timer, TimerRole.ADMIN, callerid=ctx.author.id) ui = TimerOptionsUI(
await ui.run( self.bot, timer, TimerRole.ADMIN if not owned else TimerRole.OWNER, callerid=ctx.author.id
ctx.interaction, )
content=t(_p( await ui.run(
'cmd:pomodoro_create|response:success|content', ctx.interaction,
"Timer created successfully! Use the panel below to reconfigure." content=t(_p(
)) 'cmd:pomodoro_create|response:success|content',
) "Timer created successfully! Use the panel below to reconfigure."
await ui.wait() ))
)
await ui.wait()
@pomodoro_admin_group.command( @pomodoro_group.command(
name=_p('cmd:pomodoro_destroy', "destroy"), name=_p('cmd:pomodoro_destroy', "destroy"),
description=_p( description=_p(
'cmd:pomodoro_destroy|desc', '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( @appcmds.rename(
channel=_p('cmd:pomodoro_destroy|param:channel', "timer_channel"), channel=_p('cmd:pomodoro_destroy|param:channel', "timer_channel"),
) )
@appcmds.describe( @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): async def cmd_pomodoro_delete(self, ctx: LionContext, channel: discord.VoiceChannel):
t = self.bot.translator.t t = self.bot.translator.t
@@ -644,46 +722,42 @@ class TimerCog(LionCog):
return return
# Check the user has sufficient permissions to delete the timer # 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) timer_role = timer.get_member_role(ctx.author)
if timer.owned: if timer.owned and timer_role < TimerRole.OWNER:
if timer_role < TimerRole.OWNER: embed = discord.Embed(
embed = discord.Embed( colour=discord.Colour.brand_red(),
colour=discord.Colour.brand_red(), description=t(_p(
description=t(_p( 'cmd:pomodoro_destroy|error:insufficient_perms|owned',
'cmd:pomodoro_destroy|error:insufficient_perms|owned', "You need to be an administrator or own this channel to remove this timer!"
"You need to be an administrator or own this channel to remove this timer!" ))
)) )
) await ctx.interaction.response.send_message(embed=embed, ephemeral=True)
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:
return
elif timer_role is not TimerRole.ADMIN:
embed = discord.Embed( embed = discord.Embed(
colour=discord.Colour.brand_red(), colour=discord.Colour.brand_red(),
description=t(_p( description=t(_p(
'cmd:pomodoro_destroy|error:insufficient_perms|notowned', '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) 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) @pomodoro_group.command(
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(
name=_p('cmd:pomodoro_edit', "edit"), name=_p('cmd:pomodoro_edit', "edit"),
description=_p( description=_p(
'cmd:pomodoro_edit|desc', 'cmd:pomodoro_edit|desc',
"Edit a Timer" "Reconfigure a pomodoro timer."
) )
) )
@appcmds.rename( @appcmds.rename(
@@ -693,7 +767,7 @@ class TimerCog(LionCog):
@appcmds.describe( @appcmds.describe(
channel=_p( channel=_p(
'cmd:pomodoro_edit|param:channel|desc', '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()} **{param: option._desc for param, (option, _) in _param_options.items()}
) )
@@ -827,8 +901,6 @@ class TimerCog(LionCog):
@low_management_ward @low_management_ward
async def configure_pomodoro_command(self, ctx: LionContext, async def configure_pomodoro_command(self, ctx: LionContext,
pomodoro_channel: Optional[discord.VoiceChannel | discord.TextChannel] = None): pomodoro_channel: Optional[discord.VoiceChannel | discord.TextChannel] = None):
t = self.bot.translator.t
# Type checking guards # Type checking guards
if not ctx.guild: if not ctx.guild:
return return

View File

@@ -4,6 +4,7 @@ import discord
from meta import LionBot from meta import LionBot
from meta.errors import UserInputError from meta.errors import UserInputError
from utils.lib import replace_multiple
from babel.translator import ctx_translator from babel.translator import ctx_translator
from settings import ModelData from settings import ModelData
from settings.groups import SettingGroup, ModelConfig, SettingDotDict from settings.groups import SettingGroup, ModelConfig, SettingDotDict
@@ -37,6 +38,8 @@ class TimerOptions(SettingGroup):
_model = TimerData.Timer _model = TimerData.Timer
_column = TimerData.Timer.channelid.name _column = TimerData.Timer.channelid.name
_create_row = False
_allow_object = False
@TimerConfig.register_model_setting @TimerConfig.register_model_setting
class NotificationChannel(ModelData, ChannelSetting): class NotificationChannel(ModelData, ChannelSetting):
@@ -50,6 +53,8 @@ class TimerOptions(SettingGroup):
_model = TimerData.Timer _model = TimerData.Timer
_column = TimerData.Timer.notification_channelid.name _column = TimerData.Timer.notification_channelid.name
_create_row = False
_allow_object = False
@classmethod @classmethod
async def _check_value(cls, parent_id: int, value: Optional[discord.abc.GuildChannel], **kwargs): async def _check_value(cls, parent_id: int, value: Optional[discord.abc.GuildChannel], **kwargs):
@@ -86,6 +91,7 @@ class TimerOptions(SettingGroup):
) )
_model = TimerData.Timer _model = TimerData.Timer
_column = TimerData.Timer.inactivity_threshold.name _column = TimerData.Timer.inactivity_threshold.name
_create_row = False
_min = 0 _min = 0
_max = 64 _max = 64
@@ -94,6 +100,19 @@ class TimerOptions(SettingGroup):
def input_formatted(self): def input_formatted(self):
return str(self._data) if self._data is not None else '' 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 @TimerConfig.register_model_setting
class ManagerRole(ModelData, RoleSetting): class ManagerRole(ModelData, RoleSetting):
setting_id = 'manager_role' setting_id = 'manager_role'
@@ -106,6 +125,8 @@ class TimerOptions(SettingGroup):
_model = TimerData.Timer _model = TimerData.Timer
_column = TimerData.Timer.manager_roleid.name _column = TimerData.Timer.manager_roleid.name
_create_row = False
_allow_object = False
@classmethod @classmethod
def _format_data(cls, parent_id, data, timer=None, **kwargs): def _format_data(cls, parent_id, data, timer=None, **kwargs):
@@ -132,6 +153,7 @@ class TimerOptions(SettingGroup):
_model = TimerData.Timer _model = TimerData.Timer
_column = TimerData.Timer.voice_alerts.name _column = TimerData.Timer.voice_alerts.name
_create_row = False
@TimerConfig.register_model_setting @TimerConfig.register_model_setting
class BaseName(ModelData, StringSetting): class BaseName(ModelData, StringSetting):
@@ -153,6 +175,7 @@ class TimerOptions(SettingGroup):
_model = TimerData.Timer _model = TimerData.Timer
_column = TimerData.Timer.pretty_name.name _column = TimerData.Timer.pretty_name.name
_create_row = False
@TimerConfig.register_model_setting @TimerConfig.register_model_setting
class ChannelFormat(ModelData, StringSetting): class ChannelFormat(ModelData, StringSetting):
@@ -172,6 +195,43 @@ class TimerOptions(SettingGroup):
_model = TimerData.Timer _model = TimerData.Timer
_column = TimerData.Timer.channel_name.name _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 @TimerConfig.register_model_setting
class FocusLength(ModelData, DurationSetting): class FocusLength(ModelData, DurationSetting):
@@ -191,6 +251,7 @@ class TimerOptions(SettingGroup):
_model = TimerData.Timer _model = TimerData.Timer
_column = TimerData.Timer.focus_length.name _column = TimerData.Timer.focus_length.name
_create_row = False
_default_multiplier = 60 _default_multiplier = 60
allow_zero = False allow_zero = False
@@ -231,6 +292,7 @@ class TimerOptions(SettingGroup):
_model = TimerData.Timer _model = TimerData.Timer
_column = TimerData.Timer.break_length.name _column = TimerData.Timer.break_length.name
_create_row = False
_default_multiplier = 60 _default_multiplier = 60
allow_zero = False allow_zero = False

View File

@@ -45,6 +45,7 @@ class Timer:
'_voice_update_lock', '_voice_update_lock',
'_run_task', '_run_task',
'_loop_task', '_loop_task',
'destroyed',
) )
break_name = _p('timer|stage:break|name', "BREAK") break_name = _p('timer|stage:break|name', "BREAK")
@@ -79,6 +80,8 @@ class Timer:
# Main loop task. Should not be cancelled. # Main loop task. Should not be cancelled.
self._loop_task = None self._loop_task = None
self.destroyed = False
def __repr__(self): def __repr__(self):
return ( return (
"<Timer " "<Timer "
@@ -406,7 +409,7 @@ class Timer:
"Remember to press {tick} to register your presence every stage.", "Remember to press {tick} to register your presence every stage.",
len(needs_kick) len(needs_kick)
), locale=self.locale.value).format( ), locale=self.locale.value).format(
channel=self.channel.mention, channel=f"<#{self.data.channelid}>",
mentions=', '.join(member.mention for member in needs_kick), mentions=', '.join(member.mention for member in needs_kick),
tick=self.bot.config.emojis.tick tick=self.bot.config.emojis.tick
) )
@@ -439,7 +442,7 @@ class Timer:
if not stage: if not stage:
return 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 return
async with self.lguild.voice_lock: async with self.lguild.voice_lock:
@@ -501,7 +504,7 @@ class Timer:
"{channel} is now on **BREAK**! Take a rest, **FOCUS** starts {timestamp}" "{channel} is now on **BREAK**! Take a rest, **FOCUS** starts {timestamp}"
) )
stageline = t(lazy_stageline).format( stageline = t(lazy_stageline).format(
channel=self.channel.mention, channel=f"<#{self.data.channelid}>",
timestamp=f"<t:{int(stage.end.timestamp())}:R>" timestamp=f"<t:{int(stage.end.timestamp())}:R>"
) )
return stageline return stageline
@@ -550,12 +553,12 @@ class Timer:
content = t(_p( content = t(_p(
'timer|status|stopped:auto', 'timer|status|stopped:auto',
"Timer stopped! Join {channel} to start the timer." "Timer stopped! Join {channel} to start the timer."
)).format(channel=self.channel.mention) )).format(channel=f"<#{self.data.channelid}>")
else: else:
content = t(_p( content = t(_p(
'timer|status|stopped:manual', 'timer|status|stopped:manual',
"Timer stopped! Press `Start` to restart the timer." "Timer stopped! Press `Start` to restart the timer."
)).format(channel=self.channel.mention) )).format(channel=f"<#{self.data.channelid}>")
card = await get_timer_card(self.bot, self, stage) card = await get_timer_card(self.bot, self, stage)
await card.render() await card.render()
@@ -668,6 +671,7 @@ class Timer:
if repost: if repost:
await self.send_status(delete_last=False, with_notify=False) await self.send_status(delete_last=False, with_notify=False)
@log_wrap(action='Update Channel Name')
async def _update_channel_name(self): async def _update_channel_name(self):
""" """
Submit a task to update the voice channel name. Submit a task to update the voice channel name.
@@ -675,15 +679,19 @@ class Timer:
Attempts to ensure that only one task is running at a time. Attempts to ensure that only one task is running at a time.
Attempts to wait until the next viable channel update slot (via ratelimit). Attempts to wait until the next viable channel update slot (via ratelimit).
""" """
if self._voice_update_task and not self._voice_update_task.done(): if self._voice_update_lock.locked():
# Voice update request already submitted # 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 return
async with self._voice_update_lock: async with self._voice_update_lock:
if self._last_voice_update: if self._last_voice_update:
to_wait = ((self._last_voice_update + timedelta(minutes=5)) - utc_now()).total_seconds() to_wait = ((self._last_voice_update + timedelta(minutes=5)) - utc_now()).total_seconds()
if to_wait > 0: 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: try:
await self._voice_update_task await self._voice_update_task
except asyncio.CancelledError: except asyncio.CancelledError:
@@ -698,8 +706,18 @@ class Timer:
if new_name == self.channel.name: if new_name == self.channel.name:
return return
self._last_voice_update = utc_now() try:
await self.channel.edit(name=self.channel_name) 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") @log_wrap(action="Stop Timer")
async def stop(self, auto_restart=False): async def stop(self, auto_restart=False):
@@ -728,7 +746,12 @@ class Timer:
if self._run_task and not self._run_task.done(): if self._run_task and not self._run_task.done():
self._run_task.cancel() self._run_task.cancel()
channelid = self.data.channelid 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() await self.data.delete()
self.destroyed = True
if self.last_status_message: if self.last_status_message:
try: try:
await self.last_status_message.delete() await self.last_status_message.delete()
@@ -787,6 +810,7 @@ class Timer:
if current.end < utc_now(): if current.end < utc_now():
self._state = self.current_stage self._state = self.current_stage
task = asyncio.create_task(self.notify_change_stage(current, self._state)) task = asyncio.create_task(self.notify_change_stage(current, self._state))
background_tasks.add(task)
task.add_done_callback(background_tasks.discard) task.add_done_callback(background_tasks.discard)
current = self._state current = self._state
elif self.members: elif self.members:

View File

@@ -37,6 +37,23 @@ class TimerOptionsUI(MessageUI):
self.timer = timer self.timer = timer
self.role = role 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) @button(label="EDIT_PLACEHOLDER", style=ButtonStyle.blurple)
async def edit_button(self, press: discord.Interaction, pressed: Button): async def edit_button(self, press: discord.Interaction, pressed: Button):
""" """

View File

@@ -1,6 +1,7 @@
from typing import Optional from typing import Optional
import asyncio import asyncio
import datetime import datetime
from weakref import WeakValueDictionary
import discord import discord
from discord.ext import commands as cmds 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.lib import utc_now, replace_multiple
from utils.ratelimits import Bucket, limit_concurrency from utils.ratelimits import Bucket, limit_concurrency
from utils.data import TemporaryTable from utils.data import TemporaryTable
from modules.economy.cog import Economy
from modules.economy.data import TransactionType
from . import babel, logger from . import babel, logger
@@ -126,6 +129,9 @@ class RankCog(LionCog):
# pop the guild whenever the season is updated or the rank type changes. # pop the guild whenever the season is updated or the rank type changes.
self._member_ranks = {} 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): async def cog_load(self):
await self.data.init() await self.data.init()
@@ -136,6 +142,13 @@ class RankCog(LionCog):
configcog = self.bot.get_cog('ConfigCog') configcog = self.bot.get_cog('ConfigCog')
self.crossload_group(self.configure_group, configcog.configure_group) 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 <guildid: {guildid}> (locked: {lock.locked()})")
return lock
# ---------- Event handlers ---------- # ---------- Event handlers ----------
# season_start setting event handler.. clears the guild season rank cache # season_start setting event handler.. clears the guild season rank cache
@LionCog.listener('on_guildset_season_start') @LionCog.listener('on_guildset_season_start')
@@ -255,26 +268,22 @@ class RankCog(LionCog):
""" """
Handle batch of completed message sessions. 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: for guildid, userid, messages, guild_xp in session_data:
lguild = await self.bot.core.lions.fetch_guild(guildid) lguild = await self.bot.core.lions.fetch_guild(guildid)
rank_type = lguild.config.get('rank_type').value rank_type = lguild.config.get('rank_type').value
if rank_type in (RankType.MESSAGE, RankType.XP): if rank_type in (RankType.MESSAGE, RankType.XP):
if (_members := self._member_ranks.get(guildid, None)) is not None and userid in _members: async with self.ranklock(guildid):
session_rank = _members[userid] if (_members := self._member_ranks.get(guildid, None)) is not None and userid in _members:
session_rank.stat += messages if (rank_type is RankType.MESSAGE) else guild_xp session_rank = _members[userid]
else: session_rank.stat += messages if (rank_type is RankType.MESSAGE) else guild_xp
session_rank = await self.get_member_rank(guildid, userid) 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: 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))) task = asyncio.create_task(self.update_rank(session_rank), name='update-message-rank')
else: else:
tasks.append(asyncio.create_task(self._role_check(session_rank))) task = asyncio.create_task(self._role_check(session_rank), name='rank-role-check')
await task
if tasks:
await asyncio.gather(*tasks)
async def _role_check(self, session_rank: SeasonRank): async def _role_check(self, session_rank: SeasonRank):
guild = self.bot.get_guild(session_rank.guildid) guild = self.bot.get_guild(session_rank.guildid)
@@ -299,6 +308,7 @@ class RankCog(LionCog):
if new_last_roleid != last_roleid: if new_last_roleid != last_roleid:
await session_rank.rankrow.update(last_roleid=new_last_roleid) await session_rank.rankrow.update(last_roleid=new_last_roleid)
@log_wrap(action="Update Rank")
async def update_rank(self, session_rank): async def update_rank(self, session_rank):
# Identify target rank # Identify target rank
guildid = session_rank.guildid guildid = session_rank.guildid
@@ -341,6 +351,7 @@ class RankCog(LionCog):
await member.add_roles(new_role) await member.add_roles(new_role)
last_roleid = new_role.id last_roleid = new_role.id
except discord.HTTPException: except discord.HTTPException:
# TODO: Event log either way
pass pass
# Update MemberRank row # Update MemberRank row
@@ -357,6 +368,18 @@ class RankCog(LionCog):
session_rank.current_rank = new_rank session_rank.current_rank = new_rank
session_rank.next_rank = next((rank for rank in ranks if rank.required > new_rank.required), None) 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 # Send notification
await self._notify_rank_update(guildid, userid, new_rank) await self._notify_rank_update(guildid, userid, new_rank)
@@ -427,10 +450,8 @@ class RankCog(LionCog):
} }
return key_map return key_map
@log_wrap(action="Voice Rank Hook")
async def on_voice_session_complete(self, *session_data): 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: for guildid, userid, duration, guild_xp in session_data:
lguild = await self.bot.core.lions.fetch_guild(guildid) lguild = await self.bot.core.lions.fetch_guild(guildid)
unranked_role_setting = await self.bot.get_cog('StatsCog').settings.UnrankedRoles.get(guildid) unranked_role_setting = await self.bot.get_cog('StatsCog').settings.UnrankedRoles.get(guildid)
@@ -441,27 +462,28 @@ class RankCog(LionCog):
continue continue
rank_type = lguild.config.get('rank_type').value rank_type = lguild.config.get('rank_type').value
if rank_type in (RankType.VOICE,): if rank_type in (RankType.VOICE,):
if (_members := self._member_ranks.get(guildid, None)) is not None and userid in _members: async with self.ranklock(guildid):
session_rank = _members[userid] if (_members := self._member_ranks.get(guildid, None)) is not None and userid in _members:
# TODO: Temporary measure session_rank = _members[userid]
season_start = lguild.config.get('season_start').value or datetime.datetime(1970, 1, 1) # TODO: Temporary measure
stat_data = self.bot.get_cog('StatsCog').data season_start = lguild.config.get('season_start').value or datetime.datetime(1970, 1, 1)
session_rank.stat = (await stat_data.VoiceSessionStats.study_times_since( stat_data = self.bot.get_cog('StatsCog').data
guildid, userid, season_start) session_rank.stat = (await stat_data.VoiceSessionStats.study_times_since(
)[0] guildid, userid, season_start)
# session_rank.stat += duration if (rank_type is RankType.VOICE) else guild_xp )[0]
else: # session_rank.stat += duration if (rank_type is RankType.VOICE) else guild_xp
session_rank = await self.get_member_rank(guildid, userid) 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: 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))) task = asyncio.create_task(self.update_rank(session_rank), name='voice-rank-update')
else: else:
tasks.append(asyncio.create_task(self._role_check(session_rank))) task = asyncio.create_task(self._role_check(session_rank), name='voice-role-check')
if tasks:
await asyncio.gather(*tasks)
async def on_xp_update(self, *xp_data): 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') @log_wrap(action='interactive rank refresh')
async def interactive_rank_refresh(self, interaction: discord.Interaction, guild: discord.Guild): async def interactive_rank_refresh(self, interaction: discord.Interaction, guild: discord.Guild):
@@ -470,9 +492,9 @@ class RankCog(LionCog):
""" """
t = self.bot.translator.t t = self.bot.translator.t
if not interaction.response.is_done(): 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) ui = RankRefreshUI(self.bot, guild, callerid=interaction.user.id, timeout=None)
await ui.run(interaction) await ui.send(interaction.channel)
# Retrieve fresh rank roles # Retrieve fresh rank roles
ranks = await self.get_guild_ranks(guild.id, refresh=True) ranks = await self.get_guild_ranks(guild.id, refresh=True)
@@ -638,18 +660,18 @@ class RankCog(LionCog):
# Save correct member ranks and given roles to data # Save correct member ranks and given roles to data
# First clear the member rank data entirely # First clear the member rank data entirely
await self.data.MemberRank.table.delete_where(guildid=guild.id) await self.data.MemberRank.table.delete_where(guildid=guild.id)
column = self._get_rankid_column(rank_type) if true_member_ranks:
values = [ column = self._get_rankid_column(rank_type)
(guild.id, memberid, rank.rankid, rank.roleid) values = [
for memberid, rank in true_member_ranks.items() (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'), await self.data.MemberRank.table.insert_many(
*values ('guildid', 'userid', column, 'last_roleid'),
) *values
)
self.flush_guild_ranks(guild.id) self.flush_guild_ranks(guild.id)
await ui.set_done() await ui.set_done()
await ui.wait()
# ---------- Commands ---------- # ---------- Commands ----------
@cmds.hybrid_command(name=_p('cmd:ranks', "ranks")) @cmds.hybrid_command(name=_p('cmd:ranks', "ranks"))
@@ -671,7 +693,7 @@ class RankCog(LionCog):
await ui.wait() await ui.wait()
else: else:
await ui.reload() await ui.reload()
msg = await ui.make_message() msg = await ui.make_message(show_note=False)
await ctx.reply( await ctx.reply(
**msg.send_args, **msg.send_args,
ephemeral=True ephemeral=True
@@ -740,7 +762,7 @@ class RankCog(LionCog):
lines = [] lines = []
if rank_type_setting in modified: if rank_type_setting in modified:
lines.append(rank_type_setting.update_message) 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 dm_ranks_setting.value:
if rank_channel_setting.value: if rank_channel_setting.value:
notif_string = t(_p( notif_string = t(_p(

View File

@@ -6,10 +6,11 @@ from discord.ui.select import select, Select, SelectOption, RoleSelect
from discord.ui.button import button, Button, ButtonStyle from discord.ui.button import button, Button, ButtonStyle
from meta import conf, LionBot from meta import conf, LionBot
from meta.errors import ResponseTimedOut
from core.data import RankType from core.data import RankType
from data import ORDER from data import ORDER
from utils.ui import MessageUI from utils.ui import MessageUI, Confirm
from utils.lib import MessageArgs from utils.lib import MessageArgs
from babel.translator import ctx_translator from babel.translator import ctx_translator
@@ -30,6 +31,7 @@ class RankOverviewUI(MessageUI):
self.bot = bot self.bot = bot
self.guild = guild self.guild = guild
self.guildid = guild.id self.guildid = guild.id
self.cog = bot.get_cog('RankCog')
self.lguild = None self.lguild = None
@@ -98,8 +100,8 @@ class RankOverviewUI(MessageUI):
Refresh the current ranks, Refresh the current ranks,
ensuring that all members have the correct rank. ensuring that all members have the correct rank.
""" """
cog = self.bot.get_cog('RankCog') async with self.cog.ranklock(self.guild.id):
await cog.interactive_rank_refresh(press, self.guild) await self.cog.interactive_rank_refresh(press, self.guild)
async def refresh_button_refresh(self): async def refresh_button_refresh(self):
self.refresh_button.label = self.bot.translator.t(_p( self.refresh_button.label = self.bot.translator.t(_p(
@@ -107,15 +109,38 @@ class RankOverviewUI(MessageUI):
"Refresh Member Ranks" "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): async def clear_button(self, press: discord.Interaction, pressed: Button):
""" """
Clear the rank list. Clear the rank list.
""" """
await self.rank_model.table.delete_where(guildid=self.guildid) # Confirm deletion
self.bot.get_cog('RankCog').flush_guild_ranks(self.guild.id) t = self.bot.translator.t
self.ranks = [] confirm_msg = t(_p(
await self.redraw() '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): async def clear_button_refresh(self):
self.clear_button.label = self.bot.translator.t(_p( self.clear_button.label = self.bot.translator.t(_p(
@@ -324,7 +349,7 @@ class RankOverviewUI(MessageUI):
string = f"{start} msgs" string = f"{start} msgs"
return string return string
async def make_message(self) -> MessageArgs: async def make_message(self, show_note=True) -> MessageArgs:
t = self.bot.translator.t t = self.bot.translator.t
if self.ranks: if self.ranks:
@@ -355,6 +380,34 @@ class RankOverviewUI(MessageUI):
] or [[]] ] or [[]]
lines = line_blocks[self.pagen] lines = line_blocks[self.pagen]
desc = '\n'.join(reversed(lines)) desc = '\n'.join(reversed(lines))
# 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))
else: else:
# No ranks, give hints about adding ranks # No ranks, give hints about adding ranks
desc = t(_p( desc = t(_p(
@@ -385,6 +438,13 @@ class RankOverviewUI(MessageUI):
title=title, title=title,
description=desc description=desc
) )
if show_note:
embed.add_field(
name=note_name,
value=season_str,
inline=False
)
return MessageArgs(embed=embed) return MessageArgs(embed=embed)
async def refresh_layout(self): async def refresh_layout(self):

View File

@@ -199,10 +199,11 @@ class RankRefreshUI(MessageUI):
)) ))
value = t(_p( value = t(_p(
'ui:refresh_ranks|embed|field:remove|value', 'ui:refresh_ranks|embed|field:remove|value',
"0 {progress} {total}" "{progress} {done}/{total} removed"
)).format( )).format(
progress=self.progress_bar(self.removed, 0, self.to_remove), progress=self.progress_bar(self.removed, 0, self.to_remove),
total=self.to_remove, total=self.to_remove,
done=self.removed,
) )
embed.add_field(name=name, value=value, inline=False) embed.add_field(name=name, value=value, inline=False)
else: else:
@@ -221,10 +222,11 @@ class RankRefreshUI(MessageUI):
)) ))
value = t(_p( value = t(_p(
'ui:refresh_ranks|embed|field:add|value', 'ui:refresh_ranks|embed|field:add|value',
"0 {progress} {total}" "{progress} {done}/{total} given"
)).format( )).format(
progress=self.progress_bar(self.added, 0, self.to_add), progress=self.progress_bar(self.added, 0, self.to_add),
total=self.to_add, total=self.to_add,
done=self.added,
) )
embed.add_field(name=name, value=value, inline=False) embed.add_field(name=name, value=value, inline=False)
else: else:

View File

@@ -12,158 +12,36 @@ Max 25 reminders (propagating Discord restriction)
""" """
from typing import Optional from typing import Optional
import datetime as dt import datetime as dt
from cachetools import TTLCache, LRUCache from cachetools import TTLCache
import discord import discord
from discord.ext import commands as cmds from discord.ext import commands as cmds
from discord import app_commands as appcmds from discord import app_commands as appcmds
from discord.app_commands import Transform from discord.app_commands import Transform
from discord.ui.select import select, SelectOption
from dateutil.parser import parse, ParserError from dateutil.parser import parse, ParserError
from data import RowModel, Registry, WeakCache
from data.queries import ORDER from data.queries import ORDER
from data.columns import Integer, String, Timestamp, Bool
from meta import LionBot, LionCog, LionContext from meta import LionBot, LionCog, LionContext
from meta.errors import UserInputError
from meta.app import shard_talk, appname_from_shard 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 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.monitor import TaskMonitor
from utils.transformers import DurationTransformer from utils.transformers import DurationTransformer
from utils.ui import LeoUI, AButton, AsComponents from utils.ui import AButton, AsComponents
from utils.ratelimits import Bucket from utils.ratelimits import Bucket
from . import babel, logger from . import babel, logger
from .data import ReminderData
from .ui import ReminderList
_, _p, _np = babel._, babel._p, babel._np _, _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"<t:{self.timestamp + self.interval}:R>"
)
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 "<t:{timestamp}:R>, [{content}]({jump_link}) {repeat}".format(
jump_link=self.message_link,
content=trunc_content,
timestamp=self.timestamp,
repeat=repeat
)
class ReminderMonitor(TaskMonitor[int]): class ReminderMonitor(TaskMonitor[int]):
... ...
@@ -191,7 +69,7 @@ class Reminders(LionCog):
# Short term userid -> list[Reminder] cache, mainly for autocomplete # Short term userid -> list[Reminder] cache, mainly for autocomplete
self._user_reminder_cache: TTLCache[int, list[ReminderData.Reminder]] = TTLCache(1000, ttl=60) 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): async def cog_load(self):
await self.data.init() await self.data.init()
@@ -212,6 +90,105 @@ class Reminders(LionCog):
# Start firing reminders # Start firing reminders
self.monitor.start() 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): async def get_reminders_for(self, userid: int):
""" """
Retrieve a list of reminders for the given userid, using the cache. Retrieve a list of reminders for the given userid, using the cache.
@@ -348,116 +325,43 @@ class Reminders(LionCog):
# Dispatch for analytics # Dispatch for analytics
self.bot.dispatch('reminder_sent', reminder) self.bot.dispatch('reminder_sent', reminder)
@cmds.hybrid_group( @cmds.hybrid_command(
name=_p('cmd:reminders', "reminders") 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"),
description=_p( description=_p(
'cmd:reminders_show|desc', 'cmd:reminders|desc',
"Display your current reminders." "View and set your reminders."
) )
) )
async def cmd_reminders_show(self, ctx: LionContext): async def cmd_reminders(self, ctx: LionContext):
# No help string
""" """
Display the reminder widget for this user. Display the reminder widget for this user.
""" """
t = self.bot.translator.t
if not ctx.interaction: if not ctx.interaction:
return return
if ctx.author.id in self._active_reminderlists: if ctx.author.id in self._active_reminderlists:
await self._active_reminderlists[ctx.author.id].close( await self._active_reminderlists[ctx.author.id].quit()
msg=t(_p( ui = ReminderList(self.bot, ctx.author)
'cmd:reminders_show|close_elsewhere',
"Closing since the list was opened elsewhere."
))
)
ui = ReminderListUI(self.bot, ctx.author)
try: try:
self._active_reminderlists[ctx.author.id] = ui self._active_reminderlists[ctx.author.id] = ui
await ui.run(ctx.interaction) await ui.run(ctx.interaction, ephemeral=True)
await ui.wait() await ui.wait()
finally: finally:
self._active_reminderlists.pop(ctx.author.id, None) self._active_reminderlists.pop(ctx.author.id, None)
@reminders_group.command( @cmds.hybrid_group(
name=_p('cmd:reminders_clear', "clear"), name=_p('cmd:remindme', "remindme"),
description=_p( description=_p('cmd:remindme|desc', "View and set task reminders."),
'cmd:reminders_clear|desc',
"Clear your reminder list."
)
) )
async def cmd_reminders_clear(self, ctx: LionContext): async def remindme_group(self, ctx: LionContext):
# No help string # Base command group for scheduling reminders.
""" pass
Confirm and then clear all the reminders for this user.
"""
if not ctx.interaction:
return
t = self.bot.translator.t @remindme_group.command(
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(
name=_p('cmd:reminders_cancel', "cancel"), name=_p('cmd:reminders_cancel', "cancel"),
description=_p( description=_p(
'cmd:reminders_cancel|desc', '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( @appcmds.rename(
@@ -576,13 +480,6 @@ class Reminders(LionCog):
] ]
return choices 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( @remindme_group.command(
name=_p('cmd:remindme_at', "at"), name=_p('cmd:remindme_at', "at"),
description=_p( description=_p(
@@ -596,118 +493,79 @@ class Reminders(LionCog):
every=_p('cmd:remindme_at|param:every', "repeat_every"), every=_p('cmd:remindme_at|param:every', "repeat_every"),
) )
@appcmds.describe( @appcmds.describe(
time=_p('cmd:remindme_at|param:time|desc', "When you want to be reminded. (E.g. `4pm` or `16:00`)."), time=_p(
reminder=_p('cmd:remindme_at|param:reminder|desc', "What should the reminder be?"), 'cmd:remindme_at|param:time|desc',
every=_p('cmd:remindme_at|param:every|desc', "How often to repeat this reminder.") "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( async def cmd_remindme_at(
self, self,
ctx: LionContext, ctx: LionContext,
time: str, time: appcmds.Range[str, 1, 100],
reminder: str, reminder: appcmds.Range[str, 1, 2000],
every: Optional[Transform[int, DurationTransformer(60)]] = None every: Optional[Transform[int, DurationTransformer(60)]] = None
): ):
t = self.bot.translator.t 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: try:
ts = parse(time, fuzzy=True, default=default) timezone = ctx.lmember.timezone
except ParserError: remind_at = await self.parse_time_static(time, timezone)
await ctx.reply( reminder = await self.create_reminder(
embed=error_embed( userid=ctx.author.id,
t(_p( remind_at=remind_at,
'cmd:remindme_at|error:parse_time|desc', content=reminder,
"Could not parse provided time `{given}`. Try entering e.g. `4 pm` or `16:00`." message_link=ctx.message.jump_url,
)).format(given=time), interval=every,
title=t(_p(
'cmd:remindme_at|error:parse_time|title',
"Could not create reminder!"
))
),
ephemeral=True
) )
return embed = reminder.set_response
if ts < utc_now(): except UserInputError as e:
await ctx.reply( embed = discord.Embed(
embed=error_embed( title=t(_p(
t(_p( 'cmd:remindme_at|error|title',
'cmd:remindme_at|error:past_time|desc', "Could not create reminder!"
"Provided time is in the past!" )),
)), description=e.msg,
title=t(_p( colour=discord.Colour.brand_red()
'cmd:remindme_at|error:past_time|title',
"Could not create reminder!"
))
),
ephemeral=True
) )
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"<t:{rem.timestamp}>"),
description=f"> {rem.content}"
)
await ctx.reply( await ctx.reply(
embed=embed, embed=embed,
ephemeral=True 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( @remindme_group.command(
name=_p('cmd:remindme_in', "in"), name=_p('cmd:remindme_in', "in"),
@@ -722,228 +580,49 @@ class Reminders(LionCog):
every=_p('cmd:remindme_in|param:every', "repeat_every"), every=_p('cmd:remindme_in|param:every', "repeat_every"),
) )
@appcmds.describe( @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)."), time=_p(
reminder=_p('cmd:remindme_in|param:reminder|desc', "What should the reminder be?"), 'cmd:remindme_in|param:time|desc',
every=_p('cmd:remindme_in|param:every|desc', "How often to repeat this reminder. (e.g. 1 day, or 2h)") "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( async def cmd_remindme_in(
self, self,
ctx: LionContext, ctx: LionContext,
time: Transform[int, DurationTransformer(60)], 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 every: Optional[Transform[int, DurationTransformer(60)]] = None
): ):
t = self.bot.translator.t t = self.bot.translator.t
reminders = await self.data.Reminder.fetch_where(userid=ctx.author.id)
# Guard against too many reminders try:
if len(reminders) > 25: remind_at = utc_now() + dt.timedelta(seconds=time)
await ctx.error_reply( reminder = await self.create_reminder(
embed=error_embed( userid=ctx.author.id,
t(_p( remind_at=remind_at,
'cmd_remindme_in|error:too_many|desc', content=reminder,
"Sorry, you have reached the maximum of `25` reminders!" message_link=ctx.message.jump_url,
)), interval=every,
title=t(_p(
'cmd_remindme_in|error:too_many|title',
"Could not create reminder!"
))
),
ephemeral=True
) )
return embed = reminder.set_response
except UserInputError as e:
# Guard against too frequent reminders embed = discord.Embed(
if every is not None and every < 600: title=t(_p(
await ctx.reply( 'cmd:remindme_in|error|title',
embed=error_embed( "Could not create reminder!"
t(_p( )),
'cmd_remindme_in|error:too_fast|desc', description=e.msg,
"You cannot set a repeating reminder with a period less than 10 minutes." colour=discord.Colour.brand_red()
)),
title=t(_p(
'cmd_remindme_in|error:too_fast|title',
"Could not create reminder!"
))
),
ephemeral=True
) )
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"<t:{rem.timestamp}:R>"),
description=f"> {rem.content}"
)
await ctx.reply( await ctx.reply(
embed=embed, embed=embed,
ephemeral=True 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

View File

@@ -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"<t:{self.timestamp + self.interval}:R>"
)
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 "<t:{timestamp}:R>, [{content}]({jump_link}) {repeat}".format(
jump_link=self.message_link,
content=trunc_content,
timestamp=self.timestamp,
repeat=repeat
)

304
src/modules/reminders/ui.py Normal file
View File

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

View File

@@ -287,7 +287,7 @@ class RoleMenuCog(LionCog):
error = None error = None
message = 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(): if len(splits) == 2 and splits[0].isdigit() and splits[1].isdigit():
chid, mid = map(int, splits) chid, mid = map(int, splits)
channel = guild.get_channel(chid) channel = guild.get_channel(chid)
@@ -678,7 +678,7 @@ class RoleMenuCog(LionCog):
target_mine = True target_mine = True
else: else:
# Parse provided message link into a Message # 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) target_mine = (target_message.author == ctx.guild.me)
# Check that this message is not already attached to a role menu # 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 message_data['content'] = target_message.content
if target_message.embeds: if target_message.embeds:
message_data['embed'] = target_message.embeds[0].to_dict() message_data['embed'] = target_message.embeds[0].to_dict()
rawmessage = json.dumps(message_data) rawmessagedata = json.dumps(message_data)
else: else:
if rawmessage is not None: if rawmessage is not None:
# Attempt to parse rawmessage # Attempt to parse rawmessage

View File

@@ -174,7 +174,7 @@ async def threecolumn_template(menu) -> MessageArgs:
) )
async def shop_template(menu) -> MessageArgs: async def shop_template(menu) -> MessageArgs:
menuroles = menu.roles 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 = [] lines = []
for menurole in menuroles: for menurole in menuroles:

View File

@@ -57,6 +57,21 @@ class RoomCog(LionCog):
for task in self._ticker_tasks.values(): for task in self._ticker_tasks.values():
task.cancel() 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]): async def _prepare_rooms(self, room_data: list[RoomData.Room]):
""" """
Launch or destroy rooms from the provided room data. Launch or destroy rooms from the provided room data.

View File

@@ -29,12 +29,9 @@ member_overwrite = discord.PermissionOverwrite(
) )
owner_overwrite = discord.PermissionOverwrite.from_pair(*member_overwrite.pair()) owner_overwrite = discord.PermissionOverwrite.from_pair(*member_overwrite.pair())
owner_overwrite.update( owner_overwrite.update(
manage_channels=True,
manage_webhooks=True, manage_webhooks=True,
manage_channels=True,
manage_messages=True, manage_messages=True,
create_public_threads=True,
create_private_threads=True,
manage_threads=True,
move_members=True, move_members=True,
) )
bot_overwrite = discord.PermissionOverwrite.from_pair(*owner_overwrite.pair()) bot_overwrite = discord.PermissionOverwrite.from_pair(*owner_overwrite.pair())

View File

@@ -233,8 +233,8 @@ class RoomUI(MessageUI):
await submit.edit_original_response( await submit.edit_original_response(
content=t(_p( content=t(_p(
'ui:room_status|button:timer|timer_created', '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() await self.refresh()
except UserInputError: except UserInputError:

View File

@@ -114,7 +114,8 @@ class Shopping(LionCog):
return return
@cmds.hybrid_group( @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.")
) )
async def shop_group(self, ctx: LionContext): async def shop_group(self, ctx: LionContext):
return return
@@ -188,8 +189,8 @@ class StoreManager(ui.LeoUI):
Ask the current shop widget to redraw. Ask the current shop widget to redraw.
""" """
self.page_num %= len(self.stores) self.page_num %= len(self.stores)
await self.stores[self.page_num].refresh() store = self.stores[self.page_num]
await self.stores[self.page_num].redraw() await store.refresh()
def make_buttons(self): def make_buttons(self):
""" """

View File

@@ -5,7 +5,7 @@ import discord
from discord.ui.button import Button from discord.ui.button import Button
from meta import LionBot, LionCog from meta import LionBot, LionCog
from utils import ui from utils.ui import MessageUI
from babel.translator import LazyStr from babel.translator import LazyStr
from ..data import ShopData from ..data import ShopData
@@ -165,7 +165,7 @@ class Shop:
return self._store_cls_(self) return self._store_cls_(self)
class Store(ui.LeoUI): class Store(MessageUI):
""" """
ABC for the UI used to interact with a given shop. 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.) (Note that each Shop instance is specific to a single customer.)
""" """
def __init__(self, shop: Shop, interaction: discord.Interaction, **kwargs): 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 # The shop this Store is an interface for
# Client, shop, and customer data is taken from here # Client, shop, and customer data is taken from here
@@ -189,36 +189,10 @@ class Store(ui.LeoUI):
self.embed: Optional[discord.Embed] = None self.embed: Optional[discord.Embed] = None
# Current interaction to use # Current interaction to use
self.interaction: discord.Interaction = interaction self._original = interaction
# ----- UI API -----
def set_store_row(self, row): def set_store_row(self, row):
self.store_row = row self.store_row = row
for item in row: for item in row:
self.add_item(item) 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

View File

@@ -8,12 +8,13 @@ from discord import app_commands as appcmds
from discord.ui.select import select, Select, SelectOption from discord.ui.select import select, Select, SelectOption
from discord.ui.button import button, Button from discord.ui.button import button, Button
from meta import conf
from meta import LionCog, LionContext, LionBot from meta import LionCog, LionContext, LionBot
from meta.errors import SafeCancellation from meta.errors import SafeCancellation
from meta.logger import log_wrap from meta.logger import log_wrap
from utils import ui from utils.lib import error_embed, MessageArgs
from utils.lib import error_embed
from constants import MAX_COINS from constants import MAX_COINS
from wards import equippable_role
from .. import babel from .. import babel
@@ -292,6 +293,7 @@ class ColourShop(Shop):
) )
except discord.HTTPException: except discord.HTTPException:
# Possibly Forbidden, or the role doesn't actually exist anymore (cache failure) # Possibly Forbidden, or the role doesn't actually exist anymore (cache failure)
# TODO: Event log
pass pass
await self.data.MemberInventory.table.delete_where(inventoryid=owned.data.inventoryid) 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_, item_type=self._shop_cls_._item_type_,
deleted=False deleted=False
) )
if len(current) >= 25: # Disabled because we can support more than 25 colours
if False and len(current) >= 25:
raise SafeCancellation( raise SafeCancellation(
t(_p( t(_p(
'cmd:editshop_colours_create|error:max_colours', 'cmd:editshop_colours_create|error:max_colours',
@@ -709,7 +712,7 @@ class ColourShopping(ShopCog):
item_type=self._shop_cls_._item_type_, item_type=self._shop_cls_._item_type_,
deleted=False deleted=False
) )
if len(current) >= 25: if False and len(current) >= 25:
raise SafeCancellation( raise SafeCancellation(
t(_p( t(_p(
'cmd:editshop_colours_add|error:max_colours', 'cmd:editshop_colours_add|error:max_colours',
@@ -738,7 +741,7 @@ class ColourShopping(ShopCog):
) )
# Check that the author has permission to manage this role # 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( raise SafeCancellation(
t(_p( t(_p(
'cmd:editshop_colours_add|error:caller_perms', 'cmd:editshop_colours_add|error:caller_perms',
@@ -747,6 +750,9 @@ class ColourShopping(ShopCog):
)).format(mention=role.mention) )).format(mention=role.mention)
) )
# Final catch-all with more general error messages
await equippable_role(self.bot, role, ctx.author)
if role.permissions.administrator: if role.permissions.administrator:
raise SafeCancellation( raise SafeCancellation(
t(_p( t(_p(
@@ -1016,7 +1022,7 @@ class ColourShopping(ShopCog):
item = items[0] item = items[0]
# Delete the item, respecting the delete setting. # 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: if delete_role:
role = ctx.guild.get_role(item.roleid) role = ctx.guild.get_role(item.roleid)
@@ -1093,6 +1099,24 @@ class ColourStore(Store):
""" """
shop: ColourShop 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") @select(placeholder="SELECT_PLACEHOLDER")
async def select_colour(self, interaction: discord.Interaction, selection: Select): async def select_colour(self, interaction: discord.Interaction, selection: Select):
t = self.shop.bot.translator.t t = self.shop.bot.translator.t
@@ -1143,7 +1167,7 @@ class ColourStore(Store):
selector = self.select_colour selector = self.select_colour
# Get the list of ColourRoleItems that may be purchased # 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() owned = self.shop.owned()
option_map: dict[int, SelectOption] = {} option_map: dict[int, SelectOption] = {}
@@ -1168,37 +1192,54 @@ class ColourStore(Store):
selector.disabled = False selector.disabled = False
selector.options = list(option_map.values()) selector.options = list(option_map.values())
async def refresh(self): @button(emoji=conf.emojis.forward)
""" async def next_page_button(self, press: discord.Interaction, pressed: Button):
Refresh the UI elements 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() await self.select_colour_refresh()
if not self.select_colour.options: if self.page_count > 1:
self._layout = [self.store_row] buttons = (self.prev_page_button, *self.store_row, self.next_page_button)
else: 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() async def make_message(self) -> MessageArgs:
def make_embed(self):
"""
Embed for this shop.
"""
t = self.shop.bot.translator.t t = self.shop.bot.translator.t
owned = self.shop.owned()
if self.shop.items: if self.shop.items:
owned = self.shop.owned() page_items = self.this_page
page_start = self.pagen * self.page_len + 1
lines = [] 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: if owned is not None and item.itemid == owned.itemid:
line = t(_p( line = t(_p(
'ui:colourstore|embed|line:owned_item', 'ui:colourstore|embed|line:owned_item',
"`[{j:02}]` | `{price} LC` | {mention} (You own this!)" "`[{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: else:
line = t(_p( line = t(_p(
'ui:colourstore|embed|line:item', 'ui:colourstore|embed|line:item',
"`[{j:02}]` | `{price} LC` | {mention}" "`[{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) lines.append(line)
description = '\n'.join(lines) description = '\n'.join(lines)
else: else:
@@ -1210,4 +1251,23 @@ class ColourStore(Store):
title=t(_p('ui:colourstore|embed|title', "Colour Role Shop")), title=t(_p('ui:colourstore|embed|title', "Colour Role Shop")),
description=description 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)

Some files were not shown because too many files have changed in this diff Show More