From 3a1396bfcb308848d8b38caec53cf8af8f0ce31a Mon Sep 17 00:00:00 2001 From: Maxi Vila Date: Fri, 3 Jul 2026 16:03:04 -0300 Subject: [PATCH] fix: address counterparty requirements review (tests, order precedence, denial message, strict parsing, dedup) --- bot/messages.ts | 3 +- bot/modules/orders/takeOrder.ts | 25 ++-- bot/modules/user/scenes/settings.ts | 133 ++++++++++----------- locales/de.yaml | 63 +++++----- locales/en.yaml | 71 ++++++----- locales/es.yaml | 55 +++++---- locales/fa.yaml | 58 ++++----- locales/fr.yaml | 55 +++++---- locales/it.yaml | 45 ++++--- locales/ko.yaml | 89 +++++++------- locales/pt.yaml | 51 ++++---- locales/ru.yaml | 59 +++++---- locales/uk.yaml | 57 +++++---- tests/bot/modules/orders/takeOrder.spec.ts | 115 ++++++++++++++++++ 14 files changed, 491 insertions(+), 388 deletions(-) create mode 100644 tests/bot/modules/orders/takeOrder.spec.ts diff --git a/bot/messages.ts b/bot/messages.ts index d223fe11..d170eaeb 100644 --- a/bot/messages.ts +++ b/bot/messages.ts @@ -1002,11 +1002,12 @@ const userTakerIsBlockedByUserOrder = async ( const notMeetingRequirementsMessage = async ( ctx: MainContext, user: UserDocument, + requirements?: { min_days_using_bot: number; min_completed_orders: number }, ) => { try { await ctx.telegram.sendMessage( user.tg_id, - ctx.i18n.t('not_meeting_requirements'), + ctx.i18n.t('not_meeting_requirements', requirements), ); } catch (error) { logger.error(error); diff --git a/bot/modules/orders/takeOrder.ts b/bot/modules/orders/takeOrder.ts index e878de35..f4852fc7 100644 --- a/bot/modules/orders/takeOrder.ts +++ b/bot/modules/orders/takeOrder.ts @@ -79,10 +79,10 @@ export const takebuy = async ( if (await isBannedFromCommunity(user, order.community_id)) return await messages.bannedUserErrorMessage(ctx, user); - if (!(await meetsCounterpartyRequirements(ctx, user, userOffer))) return; - if (!(await validateTakeBuyOrder(ctx, bot, user, order))) return; + if (!(await meetsCounterpartyRequirements(ctx, user, userOffer))) return; + const { randomImage } = generateRandomImage(user._id.toString()); order.status = 'WAITING_PAYMENT'; @@ -138,9 +138,9 @@ export const takesell = async ( if (await isBannedFromCommunity(user, order.community_id)) return await messages.bannedUserErrorMessage(ctx, user); - if (!(await meetsCounterpartyRequirements(ctx, user, seller))) return; - if (!(await validateTakeSellOrder(ctx, bot, user, order))) return; + + if (!(await meetsCounterpartyRequirements(ctx, user, seller))) return; order.status = 'WAITING_BUYER_INVOICE'; order.buyer_id = user._id; order.taken_at = new Date(Date.now()); @@ -158,7 +158,7 @@ export const takesell = async ( } }; -const meetsCounterpartyRequirements = async ( +export const meetsCounterpartyRequirements = async ( ctx: MainContext, user: UserDocument, orderCreator: UserDocument, @@ -170,15 +170,24 @@ const meetsCounterpartyRequirements = async ( if (min_days_using_bot > 0) { const ageInDays = getUserAge(user); - if (ageInDays < min_days_using_bot) { - await messages.notMeetingRequirementsMessage(ctx, user); + // Legacy accounts without a created_at yield NaN here. Such accounts + // predate created_at tracking and are genuinely old, so we let them pass + // the age check explicitly instead of relying on NaN comparisons. + if (!Number.isNaN(ageInDays) && ageInDays < min_days_using_bot) { + await messages.notMeetingRequirementsMessage(ctx, user, { + min_days_using_bot, + min_completed_orders, + }); return false; } } if (min_completed_orders > 0) { if (user.trades_completed < min_completed_orders) { - await messages.notMeetingRequirementsMessage(ctx, user); + await messages.notMeetingRequirementsMessage(ctx, user, { + min_days_using_bot, + min_completed_orders, + }); return false; } } diff --git a/bot/modules/user/scenes/settings.ts b/bot/modules/user/scenes/settings.ts index e2b96ab5..ff216c5a 100644 --- a/bot/modules/user/scenes/settings.ts +++ b/bot/modules/user/scenes/settings.ts @@ -15,6 +15,16 @@ const readNonNegativeInt = (value: string | undefined, fallback: number) => { return Number.isInteger(parsed) && parsed >= 0 ? parsed : fallback; }; +const DEFAULT_COUNTERPARTY_REQUIREMENTS = { + min_days_using_bot: 0, + min_completed_orders: 0, +}; + +// Fallback caps when the corresponding MAX_COUNTERPARTY_* env vars are unset, +// mirroring the values documented in .env-sample. +const DEFAULT_MAX_COUNTERPARTY_AGE = 30; +const DEFAULT_MAX_COUNTERPARTY_ORDERS = 10; + function make() { const resetMessage = async (ctx: CommunityContext, next: () => void) => { const state = ctx.scene.state as CommunityWizardState; @@ -142,92 +152,52 @@ function make() { } }); - scene.command( - 'counterpartyage', - resetMessage, - async (ctx: CommunityContext) => { + // counterpartyage and counterpartyorders only differ in the field they set, + // the env cap, its fallback, and the feedback key/param, so we build both + // from a single factory. + const makeRequirementCommand = ({ + command, + envVar, + fallbackMax, + field, + feedbackKey, + paramKey, + }: { + command: string; + envVar: string; + fallbackMax: number; + field: 'min_days_using_bot' | 'min_completed_orders'; + feedbackKey: string; + paramKey: string; + }) => { + scene.command(command, resetMessage, async (ctx: CommunityContext) => { try { await ctx.deleteMessage(); const state = ctx.scene.state as CommunityWizardState; if (ctx.message === undefined || !('text' in ctx.message)) throw new Error('ctx.message is undefined'); - const [, days] = ctx.message.text.trim().split(' '); - const min_days = parseInt(days); - if (isNaN(min_days) || min_days < 0) throw new Error('NotValidNumber'); - const maxAge = readNonNegativeInt( - process.env.MAX_COUNTERPARTY_AGE_REQUIREMENT, - 30, - ); - if (min_days > maxAge) { - state.error = { - i18n: 'invalid_range', - command: '/counterpartyage', - max: maxAge, - }; - return await updateMessage(ctx); - } - const user = state.user; - if (!user.counterparty_requirements) { - user.counterparty_requirements = { - min_days_using_bot: 0, - min_completed_orders: 0, - }; - } - user.counterparty_requirements.min_days_using_bot = min_days; - await user.save(); - state.feedback = { i18n: 'counterpartyage_updated', days: min_days }; - await updateMessage(ctx); - } catch (err) { - logger.error(err); - (ctx.scene.state as CommunityWizardState).error = { - i18n: - err instanceof Error && err.message === 'NotValidNumber' - ? 'invalid_number' - : 'generic_error', - }; - await updateMessage(ctx); - } - }, - ); - - scene.command( - 'counterpartyorders', - resetMessage, - async (ctx: CommunityContext) => { - try { - await ctx.deleteMessage(); - const state = ctx.scene.state as CommunityWizardState; - if (ctx.message === undefined || !('text' in ctx.message)) - throw new Error('ctx.message is undefined'); - const [, orders] = ctx.message.text.trim().split(' '); - const min_orders = parseInt(orders); - if (isNaN(min_orders) || min_orders < 0) + const [, value] = ctx.message.text.trim().split(' '); + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed < 0) throw new Error('NotValidNumber'); - const maxOrders = readNonNegativeInt( - process.env.MAX_COUNTERPARTY_ORDERS_REQUIREMENT, - 10, - ); - if (min_orders > maxOrders) { + const max = readNonNegativeInt(process.env[envVar], fallbackMax); + if (parsed > max) { state.error = { i18n: 'invalid_range', - command: '/counterpartyorders', - max: maxOrders, + command: '/' + command, + max, }; return await updateMessage(ctx); } const user = state.user; if (!user.counterparty_requirements) { user.counterparty_requirements = { - min_days_using_bot: 0, - min_completed_orders: 0, + ...DEFAULT_COUNTERPARTY_REQUIREMENTS, }; } - user.counterparty_requirements.min_completed_orders = min_orders; + user.counterparty_requirements[field] = parsed; await user.save(); - state.feedback = { - i18n: 'counterpartyorders_updated', - orders: min_orders, - }; + state.feedback = { i18n: feedbackKey, [paramKey]: parsed }; await updateMessage(ctx); } catch (err) { logger.error(err); @@ -239,8 +209,26 @@ function make() { }; await updateMessage(ctx); } - }, - ); + }); + }; + + makeRequirementCommand({ + command: 'counterpartyage', + envVar: 'MAX_COUNTERPARTY_AGE_REQUIREMENT', + fallbackMax: DEFAULT_MAX_COUNTERPARTY_AGE, + field: 'min_days_using_bot', + feedbackKey: 'counterpartyage_updated', + paramKey: 'days', + }); + + makeRequirementCommand({ + command: 'counterpartyorders', + envVar: 'MAX_COUNTERPARTY_ORDERS_REQUIREMENT', + fallbackMax: DEFAULT_MAX_COUNTERPARTY_ORDERS, + field: 'min_completed_orders', + feedbackKey: 'counterpartyorders_updated', + paramKey: 'orders', + }); scene.command( 'resetrequirements', @@ -251,8 +239,7 @@ function make() { const state = ctx.scene.state as CommunityWizardState; const user = state.user; user.counterparty_requirements = { - min_days_using_bot: 0, - min_completed_orders: 0, + ...DEFAULT_COUNTERPARTY_REQUIREMENTS, }; await user.save(); state.feedback = { i18n: 'requirements_reset' }; diff --git a/locales/de.yaml b/locales/de.yaml index e3cf7dab..fceb25f4 100644 --- a/locales/de.yaml +++ b/locales/de.yaml @@ -29,7 +29,7 @@ start: | Weitere Informationen zur Verwendung dieses Bots finden Sie hier 👇 https://lnp2pbot.com/learn - + Mache eine schnelle und sichere Transaktion! init_bot_error: Um diesen Bot zu verwenden, musst du zuerst den Boot mit dem Befehl /start initialisieren non_handle_error: 👤 Um diesen Bot zu nutzen, musst du deinen Telegram-Benutzernamen aktivieren. Um ihn zu aktivieren, öffne das Hamburger-Menü oben links und wähle Einstellungen -> Profil bearbeiten -> Benutzernamen @@ -158,7 +158,7 @@ buyer_took_your_order: | 🤖 Order Id: #${orderId} @${buyerUsername} hat deinen Auftrag angenommen und möchte deine Sats kaufen. Nimm Kontakt mit ihm auf und sag ihm, wie er dir ${currency} ${fiatAmount} über ${paymentMethod} senden kann. - + Ich werde dich benachrichtigen, sobald der Käufer mir mitteilt, dass er das Fiat-Geld gesendet hat. Danach musst du überprüfen, ob es angekommen ist. Wenn der Käufer nicht antwortet, kannst du eine Stornierung oder eine Streitigkeit einleiten. Denk daran, dass dich ein Administrator NIE kontaktieren wird, um deine Bestellung zu klären, es sei denn, du öffnest zuerst eine Streitigkeit. @@ -290,9 +290,9 @@ you_have_been_banned: Du wurdest gesperrt! I_told_seller_you_sent_fiat: 🤖 Ich habe @${sellerUsername} gesagt, dass du FIAT-Geld geschickt hast. Wenn der Verkäufer bestätigt, dass er dein Geld erhalten hat, muss er die Mittel freigeben. Falls er sich weigert, kannst du eine Streitigkeit eröffnen. buyer_told_me_that_sent_fiat: | 🤖 @${buyerUsername} hat mitgeteilt, dass er dir das FIAT-Geld geschickt hat. Sobald du den Erhalt des Geldes bestätigst, bitte gib die Mittel frei. Beachte, dass du bis zur Freigabe der Mittel keine neue Bestellung erstellen oder übernehmen kannst. - + Nachdem du freigegeben hast, geht das Geld an den Käufer und es gibt kein Zurück mehr. Daher führe diesen Prozess nur durch, wenn du dir 💯 sicher bist. - + Drücke den folgenden Befehl, wenn du die Sats für den Käufer freigeben möchtest 👇 release_order_cmd: /release you_have_orders_waiting: 🤖 Du hast eine oder mehrere Aufträge, bei denen der Käufer dir mitteilt, dass das Geld an dich geschickt wurde, du es aber noch nicht freigegeben hast. Du kannst keine neuen Aufträge erstellen, bis du das Geld freigibst. @@ -327,13 +327,13 @@ ok_cooperativecancel: '👍 Die Gegenpartei hat zugestimmt und der Auftrag mit d refund_cooperativecancel: 💰 Du hast eine Rückerstattung deiner Lightning-Zahlung erhalten, es gibt keine weiteren Schritte zu unternehmen init_cooperativecancel: | 🕒 Du hast mit der Stornierung des Auftrages mit der Id ${orderId} gestartet. Dein Gegenüber muss mir ebenfalls mitteilen, dass er die Stornierung wünscht. Falls er/sie nicht antwortet, kannst du eine Streitigkeit eröffnen. - + Kein Administrator wird dich kontaktieren, um deine Bestellung zu stornieren, es sei denn, du eröffnest zuerst eine Streitigkeit. counterparty_wants_cooperativecancel: | 😳 Deine Gegenpartei möchte den Auftrag mit der Id ${orderId} stornieren. - + Kein Administrator wird dich kontaktieren, um deine Bestellung zu stornieren, es sei denn, du eröffnest zuerst eine Streitigkeit. - + Wenn du einverstanden bist, benutze den Befehl 👇 invoice_payment_failed: ⛔ Ich habe versucht, dir die Sats zu schicken, aber die Bezahlung deiner LN-Rechnung ist fehlgeschlagen. Ich werde es noch ${attempts} weitere Male in ${pendingPaymentWindow} Minuten-Intervallen versuchen. Bitte überprüfe, ob dein Node/Wallet online ist. cant_take_more_orders: ⛔ Sorry! Du kannst keinen weiteren Auftrag annehmen, während andere auf dich warten @@ -597,12 +597,11 @@ npub_not_valid: | Beispiel: /setnpub npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 # END modules/nostr - # START modules/community community_admin: | Community Admin Mode > ${community.name} (${community.group}) - + Public: ${community.public ? 'Yes' : 'No'} Fee: @@ -626,7 +625,7 @@ community_npub_updated: You added the community's pubkey ${npub} successfully! community_language_updated: Du hast die Sprache der Community erfolgreich auf ${language} aktualisiert! wizard_community_enter_language: 'Gib den Sprachcode für deine Community ein (en, es, fr, de, it, pt, ru, uk, ko, fa)' wizard_community_invalid_language: 'Ungültiger Sprachcode. Bitte gib einen der folgenden ein - en, es, fr, de, it, pt, ru, uk, ko, fa' -language: "Sprache" +language: 'Sprache' # END modules/community # START modules/orders @@ -656,7 +655,7 @@ user_settings: | /counterpartyorders <Aufträge> - Legt die Mindestanzahl abgeschlossener Aufträge fest. /resetrequirements - Setzt die Gegenpartei-Anforderungen auf Standardwerte zurück. /exit - um den Assistenten zu verlassen. -not_meeting_requirements: Du erfüllst nicht die Anforderungen der Gegenpartei, um diesen Auftrag anzunehmen. +not_meeting_requirements: Du erfüllst nicht die Anforderungen der Gegenpartei, um diesen Auftrag anzunehmen (erfordert mindestens ${min_days_using_bot} Tage Nutzung des Bots und ${min_completed_orders} abgeschlossene Aufträge). counterpartyage_updated: Altersanforderung der Gegenpartei auf ${days} Tage aktualisiert. counterpartyorders_updated: Auftragsanforderung der Gegenpartei auf ${orders} aktualisiert. requirements_reset: Gegenpartei-Anforderungen wurden auf Standardwerte zurückgesetzt. @@ -674,7 +673,7 @@ bot_info: | Max routing fee: ${routing_fee} Node URI: `${node_uri}` - + Node status: ${status} User info: @@ -702,7 +701,7 @@ setinvoice_no_response: Sie haben keine zu bezahlenden Aufträge already_cancelled: Die Bestellung wurde bereits storniert! privacy: | *Datenschutzrichtlinie* - + Ihre Privatsphäre ist uns wichtig, und wir sind verpflichtet, Ihre persönlichen Daten zu schützen. Diese Datenschutzrichtlinie erklärt, welche Informationen wir sammeln, wie und zu welchem Zweck. *1. Informationen, die wir sammeln:* @@ -719,31 +718,31 @@ blocklist_empty: Du hast keine gesperrten Benutzer orders_in_process: Es gibt laufende Aufträge mit diesem Benutzer user_order_is_blocked_by_user_taker: Du kannst diesen Auftrag nicht annehmen, da du seinen Ersteller gesperrt hast user_taker_is_blocked_by_user_order: Du kannst diesen Auftrag nicht annehmen, da dich sein Ersteller gesperrt hat -block_usage: "Verwendung: /block @Username oder /block telegramId" -unblock_usage: "Verwendung: /unblock @Username oder /unblock telegramId" -block_failed: "Fehler beim Blockieren des Benutzers" -unblock_failed: "Fehler beim Freigeben des Benutzers" +block_usage: 'Verwendung: /block @Username oder /block telegramId' +unblock_usage: 'Verwendung: /unblock @Username oder /unblock telegramId' +block_failed: 'Fehler beim Blockieren des Benutzers' +unblock_failed: 'Fehler beim Freigeben des Benutzers' check_solvers: Ihre Community ${communityName} hat keine Solver. Bitte fügen Sie innerhalb von ${remainingDays} Tagen mindestens einen hinzu, um zu verhindern, dass die Community deaktiviert wird. check_solvers_last_warning: Ihre Community ${communityName} hat keine Solver. Bitte fügen Sie noch heute mindestens einen hinzu, um zu verhindern, dass die Community deaktiviert wird. image_processing_error: Wir hatten einen Fehler beim Verarbeiten des Bildes, bitte warten Sie ein paar Minuten und versuchen Sie es erneut. -order_channel_validation_failed: "Ihre Bestellung konnte nicht veröffentlicht werden. Versuchen Sie, die Standard-Community mit /setcomm off zu deaktivieren, oder bitten Sie Ihren Community-Administrator, die Kanäle und Gruppen der Community neu zu konfigurieren." -community_payment_methods: "Zahlungsmethoden" -enter_community_payment_methods: "Gib die in deiner Community akzeptierten Zahlungsmethoden ein, getrennt durch Kommas (z.B.: Banküberweisung, Bargeld, PayPal)" -current_payment_methods: "Aktuelle Zahlungsmethoden: ${methods}" -select_payment_methods: "Wähle eine oder mehrere Zahlungsmethoden:" -confirm_payment_methods: "✅ Bestätigen" -no_payment_method_selected: "Bitte wähle mindestens eine Zahlungsmethode aus" -payment_methods_saved: "Zahlungsmethoden gespeichert ✅" -custom_payment_method: "✍️ Benutzerdefinierte Zahlungsmethode" -payment_methods_reset: "Zahlungsmethoden entfernt. Benutzer können jetzt beliebige Zahlungsmethoden frei eingeben." +order_channel_validation_failed: 'Ihre Bestellung konnte nicht veröffentlicht werden. Versuchen Sie, die Standard-Community mit /setcomm off zu deaktivieren, oder bitten Sie Ihren Community-Administrator, die Kanäle und Gruppen der Community neu zu konfigurieren.' +community_payment_methods: 'Zahlungsmethoden' +enter_community_payment_methods: 'Gib die in deiner Community akzeptierten Zahlungsmethoden ein, getrennt durch Kommas (z.B.: Banküberweisung, Bargeld, PayPal)' +current_payment_methods: 'Aktuelle Zahlungsmethoden: ${methods}' +select_payment_methods: 'Wähle eine oder mehrere Zahlungsmethoden:' +confirm_payment_methods: '✅ Bestätigen' +no_payment_method_selected: 'Bitte wähle mindestens eine Zahlungsmethode aus' +payment_methods_saved: 'Zahlungsmethoden gespeichert ✅' +custom_payment_method: '✍️ Benutzerdefinierte Zahlungsmethode' +payment_methods_reset: 'Zahlungsmethoden entfernt. Benutzer können jetzt beliebige Zahlungsmethoden frei eingeben.' payment_methods_wizard_commands: "/reset — alle Zahlungsmethoden entfernen und Standardverhalten wiederherstellen\n/exit — ohne Speichern beenden" community_disabled_by_admin: Ein Administrator hat deine Community ${communityName} deaktiviert community_enabled_by_admin: Ein Administrator hat deine Community ${communityName} wieder aktiviert -community_creation_requirements_not_met_header: "Du erfüllst nicht die Anforderungen zur Erstellung einer Community:" -community_creation_requirements_not_met_orders: "* Bestellungen: ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* Volumen: ${userVolume} / ${requiredVolume}" -community_creation_requirements_not_met_days: "* Tage der Nutzung des Bots: ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* Reputation: ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_header: 'Du erfüllst nicht die Anforderungen zur Erstellung einer Community:' +community_creation_requirements_not_met_orders: '* Bestellungen: ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* Volumen: ${userVolume} / ${requiredVolume}' +community_creation_requirements_not_met_days: '* Tage der Nutzung des Bots: ${userDays} / ${requiredDays}' +community_creation_requirements_not_met_rep: '* Reputation: ${userRep} / ${requiredRep}' community_already_disabled: Diese Community ist bereits deaktiviert community_already_enabled: Diese Community ist bereits aktiviert ambiguous_community_input: Mehrere Communities stimmen mit diesem Benutzernamen überein, bitte verwende stattdessen die Community-ID diff --git a/locales/en.yaml b/locales/en.yaml index 6a51fb7f..360dfd09 100644 --- a/locales/en.yaml +++ b/locales/en.yaml @@ -3,7 +3,7 @@ start: | ${disclaimer} ---———— TERMS AND CONDITIONS ————--- - + This bot will help you complete P2P Bitcoin transactions through the Lightning Network (LN). Once you start up the bot, you can use the following commands: @@ -31,7 +31,7 @@ start: | You can find more information on how to use this bot here 👇 https://lnp2pbot.com/learn - + Make a quick and safe transaction! init_bot_error: to use this bot, you need to first initialize the boot with the command /start non_handle_error: 👤 To use this bot, you need to activate your Telegram Username. To activate it open the hamburger menu on the top left and select settings -> edit profile -> username @@ -117,7 +117,7 @@ begin_take_buy: | 🤖 Press Continue to take the offer, if you press Cancel, you will be released from the order and it will be republished. Note: Remember this image because you will see it again inside the invoice to pay - + You have ${expirationTime} minutes before this order expires. 👇 continue: Continue cancel: Cancel @@ -162,7 +162,7 @@ buyer_took_your_order: | 🤖 Order ID: #${orderId} @${buyerUsername} has taken your order and wants to buy your sats. Get in touch and tell him how to send you ${currency} ${fiatAmount} through ${paymentMethod}. - + I will notify you when the buyer indicates that they have sent the fiat. After that, you should check if it has arrived. If the buyer does not respond, you can initiate a cancellation or a dispute. Remember, an administrator will NEVER contact you to resolve your order unless you open a dispute first. @@ -179,7 +179,7 @@ order_detail: | ID: `${order._id}` Status previous to dispute: ${previousDisputeStatus} - + Status: ${status} Settled by admin: ${settledByAdmin} @@ -296,7 +296,7 @@ you_have_been_banned: You have been banned! I_told_seller_you_sent_fiat: 🤖 I told @${sellerUsername} that you have sent the fiat money. When the seller confirms that they have received your money, they should release the funds. If they refuse, you can open a dispute. buyer_told_me_that_sent_fiat: | 🤖 @${buyerUsername} has informed that he already sent you the fiat money. Once you confirm the reception, please release funds. You will not be able to create another order until you release funds. - + After releasing, the money will go to the buyer and there will be no turning back, so only proceed with this process if you are 💯 sure. Press the following command if you want to release the sats to the buyer 👇 @@ -335,15 +335,15 @@ ok_cooperativecancel: '👍 Counterparty agreed and the order ID: ${orderId} has refund_cooperativecancel: 💰 You have received a refund of your lightning payment, there is no further action to make init_cooperativecancel: | 🕒 You have started the cancellation of the order ID: ${orderId}, your counterparty must agree on the cancellation too. If they do not respond, you can open a dispute. - - No administrator will contact you to cancel your order unless you open a dispute first. - + + No administrator will contact you to cancel your order unless you open a dispute first. + counterparty_wants_cooperativecancel: | 😳 Your counterparty wants to cancel order ID: ${orderId}. - + No administrator will contact you to cancel your order unless you open a dispute first. - - If you agree on such cancellation, please execute the following command 👇 + + If you agree on such cancellation, please execute the following command 👇 invoice_payment_failed: ⛔ I tried to send you the sats but the payment of your invoice failed, I will try ${attempts} more times in ${pendingPaymentWindow} minutes window, please check your node/wallet is online cant_take_more_orders: ⛔ Sorry! You can't take another order while you have others waiting for you seller_released: 💸 Seller has already released the satoshis, you must wait for your invoice to be paid. @@ -592,7 +592,7 @@ maintenance: 🚨 Bot in maintenance, please try again later 🚨 community_admin: | Community Admin Mode > ${community.name} (${community.group}) - + Public: ${community.public ? 'Yes' : 'No'} Fee: @@ -635,7 +635,6 @@ npub_not_valid: | Example: /setnpub npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 # END modules/nostr - # START modules/orders order_not_found: Order not found. # END modules/orders @@ -663,7 +662,7 @@ user_settings: | /counterpartyorders <orders> - Sets the minimum number of completed orders for the counterparty. /resetrequirements - Resets counterparty requirements to default. /exit - to exit the wizard. -not_meeting_requirements: You do not meet the counterparty requirements to take this order. +not_meeting_requirements: You do not meet the counterparty requirements to take this order (requires at least ${min_days_using_bot} days using the bot and ${min_completed_orders} completed orders). counterpartyage_updated: Counterparty age requirement updated to ${days} days. counterpartyorders_updated: Counterparty completed orders requirement updated to ${orders}. requirements_reset: Counterparty requirements have been reset to default. @@ -681,7 +680,7 @@ bot_info: | Max routing fee: ${routing_fee} Node URI: `${node_uri}` - + Node status: ${status} User info: @@ -708,7 +707,7 @@ dispute_solver: 👮‍♂️ A solver will be attending your dispute, you can w setinvoice_no_response: You have no orders to be paid privacy: | *Privacy Policy* - + Your privacy is important to us, and we are committed to protecting your personal information. This Privacy Policy explains what information we collect, how, and for what purpose. *1. Information We Collect:* @@ -725,31 +724,31 @@ blocklist_empty: You do not have any blocked user orders_in_process: There are orders in process with this user user_order_is_blocked_by_user_taker: You can't take this order because you blocked its maker user_taker_is_blocked_by_user_order: You can't take this order because its maker blocked you -block_usage: "Usage: /block @Username or /block telegramId" -unblock_usage: "Usage: /unblock @Username or /unblock telegramId" -block_failed: "Error blocking the user" -unblock_failed: "Error unblocking the user" +block_usage: 'Usage: /block @Username or /block telegramId' +unblock_usage: 'Usage: /unblock @Username or /unblock telegramId' +block_failed: 'Error blocking the user' +unblock_failed: 'Error unblocking the user' check_solvers: Your community ${communityName} does not have any solvers. Please add at least one within ${remainingDays} days to prevent the community from being disabled. check_solvers_last_warning: Your community ${communityName} does not have any solvers. Please add at least one today to prevent the community from being disabled. image_processing_error: We had an error processing the image, please wait a few minutes and try again -order_channel_validation_failed: "Unable to publish your order. Try disabling the default community /setcomm off, or ask your community administrator to reconfigure the community channels and groups." -community_payment_methods: "Payment methods" -enter_community_payment_methods: "Enter the payment methods accepted in your community, separated by commas (e.g.: Bank transfer, Cash, PayPal)" -current_payment_methods: "Current payment methods: ${methods}" -select_payment_methods: "Select one or more payment methods:" -confirm_payment_methods: "✅ Confirm" -no_payment_method_selected: "Please select at least one payment method" -payment_methods_saved: "Payment methods saved ✅" -custom_payment_method: "✍️ Custom payment method" -payment_methods_reset: "Payment methods removed. Users can now enter any payment method freely." +order_channel_validation_failed: 'Unable to publish your order. Try disabling the default community /setcomm off, or ask your community administrator to reconfigure the community channels and groups.' +community_payment_methods: 'Payment methods' +enter_community_payment_methods: 'Enter the payment methods accepted in your community, separated by commas (e.g.: Bank transfer, Cash, PayPal)' +current_payment_methods: 'Current payment methods: ${methods}' +select_payment_methods: 'Select one or more payment methods:' +confirm_payment_methods: '✅ Confirm' +no_payment_method_selected: 'Please select at least one payment method' +payment_methods_saved: 'Payment methods saved ✅' +custom_payment_method: '✍️ Custom payment method' +payment_methods_reset: 'Payment methods removed. Users can now enter any payment method freely.' payment_methods_wizard_commands: "/reset — remove all payment methods and restore default behavior\n/exit — exit without saving" community_disabled_by_admin: An administrator has disabled your community ${communityName} community_enabled_by_admin: An administrator has re-enabled your community ${communityName} -community_creation_requirements_not_met_header: "You do not meet the requirements to create a community:" -community_creation_requirements_not_met_orders: "* Orders: ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* Volume: ${userVolume} / ${requiredVolume}" -community_creation_requirements_not_met_days: "* Days using the bot: ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* Reputation: ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_header: 'You do not meet the requirements to create a community:' +community_creation_requirements_not_met_orders: '* Orders: ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* Volume: ${userVolume} / ${requiredVolume}' +community_creation_requirements_not_met_days: '* Days using the bot: ${userDays} / ${requiredDays}' +community_creation_requirements_not_met_rep: '* Reputation: ${userRep} / ${requiredRep}' community_already_disabled: This community is already disabled community_already_enabled: This community is already enabled ambiguous_community_input: Multiple communities match that username, please use the community ID instead diff --git a/locales/es.yaml b/locales/es.yaml index 5bdbba88..c9b4a2d8 100644 --- a/locales/es.yaml +++ b/locales/es.yaml @@ -109,7 +109,7 @@ invoice_require_hash: La factura necesita un hash order_id_invalid: Id de orden incorrecto order_invalid_type: Esta orden es una ${type} order_already_taken: Esta orden ya ha sido tomada por otro usuario -order_already_settled: Esta orden ya ha sido liquidada. +order_already_settled: Esta orden ya ha sido liquidada. invalid_data: Has enviado datos incorrectos, inténtalo nuevamente. begin_take_buy: | 🤖 Presiona Continuar para tomar la oferta, si presionas Cancelar te desvincularé de la orden y será publicada nuevamente, tienes ${expirationTime} minutos o la orden expirará 👇 @@ -174,9 +174,9 @@ sell_sats: Vender satoshis buy_sats: Comprar satoshis order_detail: | Id: `${order._id}` - + Status previo a disputa: ${previousDisputeStatus} - + Status: ${status} Completada por admin: ${settledByAdmin} @@ -587,7 +587,7 @@ maintenance: 🚨 Bot en mantenimiento, inténtalo de nuevo más tarde 🚨 community_admin: | Community Admin Mode > ${community.name} (${community.group}) - + Pública: ${community.public ? 'Si' : 'No'} Fee: @@ -611,7 +611,7 @@ community_npub_updated: ¡Has configurado la pubkey ${npub} de la comunidad exit community_language_updated: ¡Has configurado el idioma ${language} de la comunidad exitosamente! wizard_community_enter_language: 'Ingresa el idioma de la comunidad, ej: es, en, pt, fr, de, it, etc.' wizard_community_invalid_language: 'El idioma debe ser uno de los siguientes: es, en, pt, fr, de, it, etc.' -language: "Idioma" +language: 'Idioma' # END modules/community # START modules/nostr @@ -631,7 +631,6 @@ npub_not_valid: | Ejemplo: /setnpub npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 # END modules/nostr - # START modules/orders order_not_found: No se encontró la orden. # END modules/orders @@ -659,7 +658,7 @@ user_settings: | /counterpartyorders <órdenes> - Establece el mínimo de órdenes completadas para la contraparte. /resetrequirements - Restablece los requisitos de contraparte al valor por defecto. /exit - para salir del asistente. -not_meeting_requirements: No cumples los requisitos de la contraparte para tomar esta orden. +not_meeting_requirements: No cumples los requisitos de la contraparte para tomar esta orden (requiere al menos ${min_days_using_bot} días usando el bot y ${min_completed_orders} órdenes completadas). counterpartyage_updated: Requisito de antigüedad de contraparte actualizado a ${days} días. counterpartyorders_updated: Requisito de órdenes completadas de contraparte actualizado a ${orders}. requirements_reset: Los requisitos de contraparte han sido restablecidos al valor por defecto. @@ -677,7 +676,7 @@ bot_info: | Max routing fee: ${routing_fee} Node URI: `${node_uri}` - + Node status: ${status} User info: @@ -705,7 +704,7 @@ setinvoice_no_response: No tienes ordenes a ser pagadas already_cancelled: ¡La orden ya ha sido cancelada! privacy: | *Política de Privacidad* - + Tu privacidad es importante para nosotros, y estamos comprometidos a proteger tu información personal. Esta Política de Privacidad explica qué información recopilamos, cómo, y con qué propósito. *1. Información que Recopilamos:* @@ -722,31 +721,31 @@ blocklist_empty: No tienes ningun usuario bloqueado orders_in_process: Hay ordenes en proceso con este usuario user_order_is_blocked_by_user_taker: No puedes aceptar esta oferta porque has bloqueado a su creador user_taker_is_blocked_by_user_order: No puedes aceptar esta oferta porque su creador te ha bloqueado -block_usage: "Uso: /block @Username o /block telegramId" -unblock_usage: "Uso: /unblock @Username o /unblock telegramId" -block_failed: "Error al bloquear al usuario" -unblock_failed: "Error al desbloquear al usuario" +block_usage: 'Uso: /block @Username o /block telegramId' +unblock_usage: 'Uso: /unblock @Username o /unblock telegramId' +block_failed: 'Error al bloquear al usuario' +unblock_failed: 'Error al desbloquear al usuario' image_processing_error: Hemos tenido un error procesando la imagen, por favor espera unos minutos y vuelve a intentarlo. check_solvers: Tu comunidad ${communityName} no tiene ningún solucionador. Agregue al menos uno dentro de ${remainingDays} días para evitar que se deshabilite la comunidad. check_solvers_last_warning: Tu comunidad ${communityName} no tiene ningún solucionador. Agregue al menos uno hoy para evitar que la comunidad quede inhabilitada. -order_channel_validation_failed: "No se pudo publicar la orden, prueba desactivando la comunidad por defecto /setcomm off, o pídele al administrador de tu comunidad que reconfigure los canales y grupos de comunidad." -community_payment_methods: "Métodos de pago" -enter_community_payment_methods: "Ingresa los métodos de pago aceptados en tu comunidad, separados por comas (ej.: Transferencia bancaria, Efectivo, PayPal)" -current_payment_methods: "Métodos de pago actuales: ${methods}" -select_payment_methods: "Selecciona uno o más métodos de pago:" -confirm_payment_methods: "✅ Confirmar" -no_payment_method_selected: "Por favor selecciona al menos un método de pago" -payment_methods_saved: "Métodos de pago guardados ✅" -custom_payment_method: "✍️ Método de pago personalizado" -payment_methods_reset: "Métodos de pago eliminados. Los usuarios ahora pueden ingresar cualquier método de pago libremente." +order_channel_validation_failed: 'No se pudo publicar la orden, prueba desactivando la comunidad por defecto /setcomm off, o pídele al administrador de tu comunidad que reconfigure los canales y grupos de comunidad.' +community_payment_methods: 'Métodos de pago' +enter_community_payment_methods: 'Ingresa los métodos de pago aceptados en tu comunidad, separados por comas (ej.: Transferencia bancaria, Efectivo, PayPal)' +current_payment_methods: 'Métodos de pago actuales: ${methods}' +select_payment_methods: 'Selecciona uno o más métodos de pago:' +confirm_payment_methods: '✅ Confirmar' +no_payment_method_selected: 'Por favor selecciona al menos un método de pago' +payment_methods_saved: 'Métodos de pago guardados ✅' +custom_payment_method: '✍️ Método de pago personalizado' +payment_methods_reset: 'Métodos de pago eliminados. Los usuarios ahora pueden ingresar cualquier método de pago libremente.' payment_methods_wizard_commands: "/reset — eliminar todos los métodos de pago y restaurar el comportamiento predeterminado\n/exit — salir sin guardar" community_disabled_by_admin: Un administrador ha deshabilitado tu comunidad ${communityName} community_enabled_by_admin: Un administrador ha reactivado tu comunidad ${communityName} -community_creation_requirements_not_met_header: "No cumples con los requisitos para crear una comunidad:" -community_creation_requirements_not_met_orders: "* Órdenes: ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* Volumen: ${userVolume} / ${requiredVolume}" -community_creation_requirements_not_met_days: "* Días usando el bot: ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* Reputación: ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_header: 'No cumples con los requisitos para crear una comunidad:' +community_creation_requirements_not_met_orders: '* Órdenes: ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* Volumen: ${userVolume} / ${requiredVolume}' +community_creation_requirements_not_met_days: '* Días usando el bot: ${userDays} / ${requiredDays}' +community_creation_requirements_not_met_rep: '* Reputación: ${userRep} / ${requiredRep}' community_already_disabled: Esta comunidad ya está deshabilitada community_already_enabled: Esta comunidad ya está habilitada ambiguous_community_input: Varias comunidades coinciden con ese nombre de usuario, por favor usa el ID de la comunidad diff --git a/locales/fa.yaml b/locales/fa.yaml index d193f012..cfb92de2 100644 --- a/locales/fa.yaml +++ b/locales/fa.yaml @@ -392,7 +392,7 @@ not_rate_for_currency: | هیچ نرخ تبدیلی برای این ارز روی ${fiatRateProvider} وجود ندارد؛ اگر می‌خواهید از این ارز استفاده کنید، باید مشخص کنید چه تعداد ساتوشی می‌خواهید. اگر تمایل دارید این ارز در لیست باشد، به لینک زیر بروید و درخواست ثبت کنید. 👇 - 🌐 https://yadio.io/api.html + 🌐 https://yadio.io/api.html invoice_with_incorrect_amount: مقدار ذکر شده در صورتحساب، اشتباه است. invoice_updated: '📝 صورتحساب به درستی به‌روزرسانی شده است!' invoice_updated_and_will_be_paid: 'صورتحساب به درستی به‌روزرسانی شده است و تا لحظاتی دیگر پرداخت خواهد شد!' @@ -437,7 +437,7 @@ name: نام group: گروه channel: کانال solver: داور -published: منتشر شده +published: منتشر شده created: ایجاد شده yes: بله no: خیر @@ -669,7 +669,7 @@ maintenance: 🚨 ربات در دست تعمیر است، لطفاً بعداً community_admin: | حالت مدیر اجتماع > ${community.name} (${community.group}) - + عمومی: ${community.public ? 'بله' : 'خیر'} @@ -678,7 +678,7 @@ community_admin: | درآمد: ${community.earnings} - + زبان: ${community.language || 'fa'} @@ -693,12 +693,12 @@ community_admin: | community_admin_help: | حالت مدیر اجتماع - + # commands - + /setnpub <npub> ثبت کلید عمومی نوستر اجتماع - + /setlanguage <lang> تعیین زبان اجتماع برای پیام‌های منتشر شده community_npub_updated: 'شما با موفقیت ${npub} را به عنوان کلید عمومی اجتماع اضافه کردید!' @@ -757,7 +757,7 @@ user_settings: | خروج از راهنما: /exit -not_meeting_requirements: شما واجد الزامات طرف مقابل برای پذیرش این سفارش نیستید. +not_meeting_requirements: شما واجد الزامات طرف مقابل برای پذیرش این سفارش نیستید (حداقل ${min_days_using_bot} روز استفاده از ربات و ${min_completed_orders} سفارش تکمیل‌شده لازم است). counterpartyage_updated: الزامات سابقه طرف مقابل به ${days} روز به‌روزرسانی شد. counterpartyorders_updated: الزامات سفارش‌های تکمیل شده طرف مقابل به ${orders} عدد به‌روزرسانی شد. requirements_reset: الزامات طرف مقابل به مقادیر پیش‌فرض بازگردانده شد. @@ -793,9 +793,9 @@ disclaimer: | این ربات یک نرم‌افزار منبع باز است که برای استفاده، تکثیر، اصلاح و اجرا در دسترس همگان قرار دارد. توسعه‌دهندگان هیچ گونه مسئولیتی در قبال کارهایی که دیگران با استفاده از ربات انجام می‌دهند، شامل کارهای قانونی یا غیرقانونی، صادقانه یا متقلبانه، ندارند. این ربات «همان طور که هست» و «در صورت در دسترس بودن» در اختیار کاربران گذاشته می‌شود و توسعه‌دهندگان هیچ گونه ضمانت صریح یا ضمنی در رابطه با ربات و استفاده آن نمی‌کنند. - + توسعه‌دهندگان و داوران مشاجره‌ها نهایت تلاش خود را برای جلوگیری از عوامل بد، شیادی و کلاهبرداری در استفاده از ربات خواهند کرد، اما کاربر می‌داند که سیستم می‌تواند مورد سوء استفاده قرار گیرد و هنگام استفاده از آن مسئولیت کامل را می‌پذیرد. - + توسعه‌دهندگان و حل‌کنندگان مشاجره‌ها مسئول هیچ زیان یا آسیبی که کاربر ممکن است بر اثر استفاده از این ربات متحمل شود نخواهند بود. order_frozen: شما سفارش را مسدود کردید paytobuyer_only_frozen_orders: 'دستور paytobuyer تنها برای سفارش‌هایی با وضعیت «مسدود شده» یا PAID_HOLD_INVOICE می‌تواند استفاده شود.' @@ -819,31 +819,31 @@ blocklist_empty: شما هیچ کاربر مسدود شده‌ای ندارید. orders_in_process: سفارش‌های در جریانی وجود دارند که این کاربر در آن‌ها دخیل است. user_order_is_blocked_by_user_taker: شما نمی‌توانید این سفارش را بردارید زیرا گذارنده آن را مسدود کرده‌اید. user_taker_is_blocked_by_user_order: شما نمی‌توانید این سفارش را بردارید زیرا توسط گذارنده آن مسدود شده‌اید. -block_usage: "استفاده: /block @Username یا /block telegramId" -unblock_usage: "استفاده: /unblock @Username یا /unblock telegramId" -block_failed: "خطا در مسدود کردن کاربر" -unblock_failed: "خطا در رفع مسدودیت کاربر" +block_usage: 'استفاده: /block @Username یا /block telegramId' +unblock_usage: 'استفاده: /unblock @Username یا /unblock telegramId' +block_failed: 'خطا در مسدود کردن کاربر' +unblock_failed: 'خطا در رفع مسدودیت کاربر' check_solvers: اجتماع شما ${communityName} هیچ داوری ندارد. لطفاً برای جلوگیری از غیرفعال شدن اجتماع، تا ${remainingDays} روز آینده حداقل یک داور به آن اضافه کنید. check_solvers_last_warning: اجتماع شما ${communityName} هیچ داوری ندارد. برای جلوگیری از غیرفعال شدن اجتماع، امروز حداقل یک داور به آن اضافه کنید. image_processing_error: هنگام پردازش تصویر با خطایی مواجه شدیم، لطفاً چند دقیقه صبر کرده و دوباره امتحان کنید. -order_channel_validation_failed: "امکان انتشار سفارش شما وجود ندارد. سعی کنید انجمن پیش‌فرض را با /setcomm off غیرفعال کنید یا از مدیر انجمن خود بخواهید کانال‌ها و گروه‌های انجمن را مجدداً پیکربندی کند." -community_payment_methods: "روش‌های پرداخت" -enter_community_payment_methods: "روش‌های پرداخت پذیرفته‌شده در اجتماع خود را با کاما از هم جدا کرده وارد کنید (مثال: انتقال بانکی، نقد، PayPal)" -current_payment_methods: "روش‌های پرداخت فعلی: ${methods}" -select_payment_methods: "یک یا چند روش پرداخت انتخاب کنید:" -confirm_payment_methods: "✅ تأیید" -no_payment_method_selected: "لطفاً حداقل یک روش پرداخت انتخاب کنید" -payment_methods_saved: "روش‌های پرداخت ذخیره شد ✅" -custom_payment_method: "✍️ روش پرداخت سفارشی" -payment_methods_reset: "روش‌های پرداخت حذف شدند. کاربران اکنون می‌توانند هر روش پرداختی را آزادانه وارد کنند." +order_channel_validation_failed: 'امکان انتشار سفارش شما وجود ندارد. سعی کنید انجمن پیش‌فرض را با /setcomm off غیرفعال کنید یا از مدیر انجمن خود بخواهید کانال‌ها و گروه‌های انجمن را مجدداً پیکربندی کند.' +community_payment_methods: 'روش‌های پرداخت' +enter_community_payment_methods: 'روش‌های پرداخت پذیرفته‌شده در اجتماع خود را با کاما از هم جدا کرده وارد کنید (مثال: انتقال بانکی، نقد، PayPal)' +current_payment_methods: 'روش‌های پرداخت فعلی: ${methods}' +select_payment_methods: 'یک یا چند روش پرداخت انتخاب کنید:' +confirm_payment_methods: '✅ تأیید' +no_payment_method_selected: 'لطفاً حداقل یک روش پرداخت انتخاب کنید' +payment_methods_saved: 'روش‌های پرداخت ذخیره شد ✅' +custom_payment_method: '✍️ روش پرداخت سفارشی' +payment_methods_reset: 'روش‌های پرداخت حذف شدند. کاربران اکنون می‌توانند هر روش پرداختی را آزادانه وارد کنند.' payment_methods_wizard_commands: "/reset — حذف همه روش‌های پرداخت و بازگرداندن رفتار پیش‌فرض\n/exit — خروج بدون ذخیره" community_disabled_by_admin: یک مدیر جامعه ${communityName} شما را غیرفعال کرد community_enabled_by_admin: یک مدیر جامعه ${communityName} شما را دوباره فعال کرد -community_creation_requirements_not_met_header: "شما شرایط لازم برای ایجاد جامعه را ندارید:" -community_creation_requirements_not_met_orders: "* سفارش‌ها: ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* حجم: ${userVolume} / ${requiredVolume}" -community_creation_requirements_not_met_days: "* روزهای استفاده از ربات: ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* اعتبار: ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_header: 'شما شرایط لازم برای ایجاد جامعه را ندارید:' +community_creation_requirements_not_met_orders: '* سفارش‌ها: ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* حجم: ${userVolume} / ${requiredVolume}' +community_creation_requirements_not_met_days: '* روزهای استفاده از ربات: ${userDays} / ${requiredDays}' +community_creation_requirements_not_met_rep: '* اعتبار: ${userRep} / ${requiredRep}' community_already_disabled: این جامعه از قبل غیرفعال است community_already_enabled: این جامعه از قبل فعال است ambiguous_community_input: چندین جامعه با این نام کاربری مطابقت دارند، لطفاً از شناسه جامعه استفاده کنید diff --git a/locales/fr.yaml b/locales/fr.yaml index 07229619..49c822a0 100644 --- a/locales/fr.yaml +++ b/locales/fr.yaml @@ -3,7 +3,7 @@ start: | ${disclaimer} ---———— TERMS AND CONDITIONS ————--- - + Ce bot vous aidera à effectuer des transactions P2P Bitcoin via le réseau Lightning Network (LN). Une fois le bot lancé, vous pouvez utiliser les commandes suivantes: @@ -235,9 +235,9 @@ dispute_started_channel: | @${initiatorUser} a été impliqué.e dans ${buyerDisputes} litiges @${counterPartyUser} a été impliqué.e dans ${sellerDisputes} litiges -you_started : '🥴 Vous avez commencé un litige sur votre commande Id : ${orderId}.' -counterpart_started : '🥴 Votre contrepartie a démarré un litige sur votre commande Id : ${orderId}.' -dispute_started : "${who} Un solver va bientôt venir vous voir, lorsqu'il/elle sera assigné(e) à votre litige, le bot vous indiquera son nom d'utilisateur, il/elle seul(e) sera en mesure de venir vous voir. Vous pouvez lui écrire directement, mais s'il vous contacte en premier, vous devez lui demander de vous dire quel est le jeton de votre litige, votre jeton est : ${token}." +you_started: '🥴 Vous avez commencé un litige sur votre commande Id : ${orderId}.' +counterpart_started: '🥴 Votre contrepartie a démarré un litige sur votre commande Id : ${orderId}.' +dispute_started: "${who} Un solver va bientôt venir vous voir, lorsqu'il/elle sera assigné(e) à votre litige, le bot vous indiquera son nom d'utilisateur, il/elle seul(e) sera en mesure de venir vous voir. Vous pouvez lui écrire directement, mais s'il vous contacte en premier, vous devez lui demander de vous dire quel est le jeton de votre litige, votre jeton est : ${token}." must_be_valid_currency: 'Le code FIAT doit être valide, par exemple : XOF, XAF, EUR, USD... Tu peux afficher la liste complète des codes FIAT avec la commande /listcurrencies' must_be_number_or_range: 'Le montant fiat doit être un nombre entier ou une plage de valeur entières dans le format -' invalid_lightning_address: Adresse Lightning invalide ! @@ -332,7 +332,7 @@ init_cooperativecancel: | Aucun administrateur ne te contactera pour annuler ta commande, à moins que tu n'ouvres un litige d'abord." counterparty_wants_cooperativecancel: | "😳 Votre contrepartie souhaite annuler l'offre ID : ${orderId}. - + Aucun administrateur ne te contactera pour annuler ta commande, à moins que tu n'ouvres un litige d'abord. Si vous acceptez cette annulation, veuillez exécuter la commande suivante 👇" @@ -458,8 +458,8 @@ buying: Achat selling_sats: Vente de sats buying_sats: Achat de sats receive_payment: Réception du paiement -showusername_buying_sats: "@${username} achète des sats" -showusername_selling_sats: "@${username} vend des sats" +showusername_buying_sats: '@${username} achète des sats' +showusername_selling_sats: '@${username} vend des sats' pay: Payer is: est trading_volume: 'Volume de transactions : ${volume} sats' @@ -584,7 +584,7 @@ maintenance: 🚨 Bot en maintenance, veuillez réessayer plus tard 🚨 community_admin: | Mode Admin de la Communauté > ${community.name} (${community.group}) - + Public: ${community.public ? 'Oui' : 'Non'} Fee: @@ -608,7 +608,7 @@ community_language_updated: Vous avez configuré la langue de la communauté en wizard_community_enter_language: 'Entrez le code de la langue de votre communauté (en, es, fr, de, it, pt, ru, uk, ko, fa)' wizard_community_invalid_language: "Code de langue invalide. Veuillez entrer l'un des suivants - en, es, fr, de, it, pt, ru, uk, ko, fa" community_npub_updated: Vous avez ajouté la clé publique de la communauté ${npub} avec succès ! -language: "Langue" +language: 'Langue' # END modules/community # START modules/nostr @@ -627,7 +627,6 @@ npub_not_valid: | Exemple: /setnpub npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 # END modules/nostr - # START modules/orders order_not_found: Ordre non trouvé. # END modules/orders @@ -655,7 +654,7 @@ user_settings: | /counterpartyorders <ordres> - Définit le nombre minimum d'ordres complétés pour la contrepartie. /resetrequirements - Réinitialise les exigences de contrepartie aux valeurs par défaut. /exit - pour quitter l'assistant. -not_meeting_requirements: Vous ne remplissez pas les exigences de la contrepartie pour prendre cet ordre. +not_meeting_requirements: Vous ne remplissez pas les exigences de la contrepartie pour prendre cet ordre (nécessite au moins ${min_days_using_bot} jours d'utilisation du bot et ${min_completed_orders} ordres complétés). counterpartyage_updated: Exigence d'âge de la contrepartie mise à jour à ${days} jours. counterpartyorders_updated: Exigence d'ordres complétés de la contrepartie mise à jour à ${orders}. requirements_reset: Les exigences de contrepartie ont été réinitialisées aux valeurs par défaut. @@ -673,7 +672,7 @@ bot_info: | Max routing fee: ${routing_fee} Node URI: `${node_uri}` - + Node status: ${status} User info: @@ -697,11 +696,11 @@ order_frozen: Vous avez gelé la commande paytobuyer_only_frozen_orders: La commande paytobuyer ne peut être utilisée que sur des commandes avec le statut FROZEN ou PAID_HOLD_INVOICE settleorder_only_dispute_orders: La commande settleorder ne peut être utilisée que sur des commandes avec le statut DISPUTE dispute_solver: 👮‍♂️ Un résolveur va s'occuper de votre litige, vous pouvez lui écrire directement en tapant son nom d'utilisateur => @${solver} <=, si le résolveur vous écrit en premier, vous devriez lui demander de vous dire quel est le jeton de votre litige, votre jeton est ${token}. -setinvoice_no_response : Vous n'avez pas d'ordre à payer +setinvoice_no_response: Vous n'avez pas d'ordre à payer already_cancelled: L'offre a déjà été annulée ! privacy: | *Politique de Confidentialité* - + Votre vie privée est importante pour nous, et nous nous engageons à protéger vos informations personnelles. Cette Politique de Confidentialité explique quelles informations nous collectons, comment, et à quelle fin. *1. Informations que nous collectons:* @@ -718,31 +717,31 @@ blocklist_empty: Vous n'avez aucun utilisateur bloqué orders_in_process: Il y a des ordres en cours avec cet utilisateur user_order_is_blocked_by_user_taker: Vous ne pouvez pas accepter cette offre car vous avez bloqué son créateur user_taker_is_blocked_by_user_order: Vous ne pouvez pas accepter cette offre car son créateur vous a bloqué -block_usage: "Utilisation : /block @Username ou /block telegramId" -unblock_usage: "Utilisation : /unblock @Username ou /unblock telegramId" +block_usage: 'Utilisation : /block @Username ou /block telegramId' +unblock_usage: 'Utilisation : /unblock @Username ou /unblock telegramId' block_failed: "Erreur lors du blocage de l'utilisateur" unblock_failed: "Erreur lors du déblocage de l'utilisateur" check_solvers: Votre communauté ${communityName} ne possède aucun solveur. Veuillez en ajouter au moins un dans les ${remainingDays} jours pour éviter que la communauté ne soit désactivée. check_solvers_last_warning: Votre communauté ${communityName} ne possède aucun solveur. Veuillez en ajouter au moins un aujourd'hui pour éviter que la communauté ne soit désactivée. image_processing_error: Nous avons eu une erreur lors du traitement de l'image, veuillez attendre quelques minutes et réessayer. order_channel_validation_failed: "Impossible de publier votre commande. Essayez de désactiver la communauté par défaut avec /setcomm off, ou demandez à l'administrateur de votre communauté de reconfigurer les canaux et groupes de la communauté." -community_payment_methods: "Méthodes de paiement" -enter_community_payment_methods: "Entrez les méthodes de paiement acceptées dans votre communauté, séparées par des virgules (ex. : Virement bancaire, Espèces, PayPal)" -current_payment_methods: "Méthodes de paiement actuelles : ${methods}" -select_payment_methods: "Sélectionnez une ou plusieurs méthodes de paiement :" -confirm_payment_methods: "✅ Confirmer" -no_payment_method_selected: "Veuillez sélectionner au moins une méthode de paiement" -payment_methods_saved: "Méthodes de paiement enregistrées ✅" -custom_payment_method: "✍️ Méthode de paiement personnalisée" +community_payment_methods: 'Méthodes de paiement' +enter_community_payment_methods: 'Entrez les méthodes de paiement acceptées dans votre communauté, séparées par des virgules (ex. : Virement bancaire, Espèces, PayPal)' +current_payment_methods: 'Méthodes de paiement actuelles : ${methods}' +select_payment_methods: 'Sélectionnez une ou plusieurs méthodes de paiement :' +confirm_payment_methods: '✅ Confirmer' +no_payment_method_selected: 'Veuillez sélectionner au moins une méthode de paiement' +payment_methods_saved: 'Méthodes de paiement enregistrées ✅' +custom_payment_method: '✍️ Méthode de paiement personnalisée' payment_methods_reset: "Méthodes de paiement supprimées. Les utilisateurs peuvent désormais saisir n'importe quelle méthode de paiement librement." payment_methods_wizard_commands: "/reset — supprimer toutes les méthodes de paiement et restaurer le comportement par défaut\n/exit — quitter sans enregistrer" community_disabled_by_admin: Un administrateur a désactivé votre communauté ${communityName} community_enabled_by_admin: Un administrateur a réactivé votre communauté ${communityName} -community_creation_requirements_not_met_header: "Vous ne remplissez pas les conditions pour créer une communauté :" -community_creation_requirements_not_met_orders: "* Commandes : ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* Volume : ${userVolume} / ${requiredVolume}" +community_creation_requirements_not_met_header: 'Vous ne remplissez pas les conditions pour créer une communauté :' +community_creation_requirements_not_met_orders: '* Commandes : ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* Volume : ${userVolume} / ${requiredVolume}' community_creation_requirements_not_met_days: "* Jours d'utilisation du bot : ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* Réputation : ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_rep: '* Réputation : ${userRep} / ${requiredRep}' community_already_disabled: Cette communauté est déjà désactivée community_already_enabled: Cette communauté est déjà activée ambiguous_community_input: Plusieurs communautés correspondent à ce nom d'utilisateur, veuillez utiliser l'ID de la communauté à la place diff --git a/locales/it.yaml b/locales/it.yaml index 7e97efb0..fe7b39f2 100644 --- a/locales/it.yaml +++ b/locales/it.yaml @@ -119,7 +119,7 @@ continue: Continua cancel: Cancella pay_invoice: | Nota: Conferma che l'immagine allegata corrisponda a quella inviata durante la creazione dell'ordine prima di pagare la fattura - + Si prega di pagare questa invoice di ${amount} sats per ${currency} ${fiatAmount} per iniziare lo scambio. payment_received: | 🤑 Pagamento ricevuto! @@ -166,7 +166,7 @@ waiting_seller_to_pay: "Ho inviato una richiesta di pagamento al venditore in mo sell_success: La vendita di sats è stata completata dopo la conferma del pagamento da parte di @${buyerUsername} ⚡️🍊⚡️ funds_released: 🕐 @${sellerUsername} ha rilasciato i satoshi, la vostra invoice verrà pagata da un momento all'altro. Ricordata che il tuo wallet deve essere online per ricevere attraverso la rete Lightning. rate_counterpart: 'Dai un voto alla tua controparte:' -choose_order_for_dispute: 'Scegli l''ordine per avviare il reclamo:' +choose_order_for_dispute: "Scegli l'ordine per avviare il reclamo:" cant_process_order: Quest'ordine non può essere elaborato, si prega di controllare che l'ID sia corretto. cant_release_order: L'ordine non può essere evaso, l'acquirente non ha inviato la richiesta di pagamento LN no_id_related: Non c'è nessun ordine associato a questo Id. @@ -325,7 +325,7 @@ order_completed_by_admin: "Un amministratore ha completato l'ordine ID: ${orderI have_to_wait_for_counterpart: 🕒 Hai già effettuato questa operazione, devi attendere l'azione della controparte. ok_cooperativecancel: "👍 La controparte ha accettato e l'ordine ID: ${orderId} has been cancelled" refund_cooperativecancel: 💰 Hai ricevuto il rimborso del pagamento LN, non ci sono altre azioni da eseguire. -init_cooperativecancel: | +init_cooperativecancel: | "🕒 Hai avviato la cancellazione dell'ordine Id: ${orderId}, anche la tua controparte deve indicarmi che desidera annullarlo. Se lui/lei non risponde, puoi aprire una disputa. Nessun amministratore ti contatterà per cancellare il tuo ordine, a meno che tu non apra prima una disputa." @@ -594,7 +594,6 @@ npub_not_valid: | Esempio: /setnpub npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 # END modules/nostr - # START modules/community community_admin: | Community Admin Mode @@ -623,7 +622,7 @@ community_language_updated: Hai aggiornato con successo la lingua della communit wizard_community_enter_language: 'Inserisci il codice lingua per la tua community (en, es, fr, de, it, pt, ru, uk, ko, fa)' wizard_community_invalid_language: 'Codice lingua non valido. Inserisci uno dei seguenti - en, es, fr, de, it, pt, ru, uk, ko, fa' community_npub_updated: You added the community's pubkey ${npub} successfully! -language: "Lingua" +language: 'Lingua' # END modules/community # START modules/orders @@ -653,7 +652,7 @@ user_settings: | /counterpartyorders <ordini> - Imposta il numero minimo di ordini completati per la controparte. /resetrequirements - Ripristina i requisiti della controparte ai valori predefiniti. /exit - per uscire dall'assistente. -not_meeting_requirements: Non soddisfi i requisiti della controparte per accettare questo ordine. +not_meeting_requirements: Non soddisfi i requisiti della controparte per accettare questo ordine (richiede almeno ${min_days_using_bot} giorni di utilizzo del bot e ${min_completed_orders} ordini completati). counterpartyage_updated: Requisito di età della controparte aggiornato a ${days} giorni. counterpartyorders_updated: Requisito di ordini completati della controparte aggiornato a ${orders}. requirements_reset: I requisiti della controparte sono stati ripristinati ai valori predefiniti. @@ -699,7 +698,7 @@ setinvoice_no_response: Non ci sono ordini da pagare. already_cancelled: L'offerta è già stata annullata! privacy: | *Informativa sulla Privacy* - + La tua privacy è importante per noi e siamo impegnati a proteggere le tue informazioni personali. Questa Informativa sulla Privacy spiega quali informazioni raccogliamo, come, e per quale scopo. *1. Informazioni che raccogliamo:* @@ -716,31 +715,31 @@ blocklist_empty: Non hai alcun utente bloccato orders_in_process: Ci sono ordini in corso con questo utente user_order_is_blocked_by_user_taker: Non puoi accettare questo ordine perché hai bloccato il suo creatore user_taker_is_blocked_by_user_order: Non puoi accettare questo ordine perché il suo creatore ti ha bloccato -block_usage: "Utilizzo: /block @Username o /block telegramId" -unblock_usage: "Utilizzo: /unblock @Username o /unblock telegramId" +block_usage: 'Utilizzo: /block @Username o /block telegramId' +unblock_usage: 'Utilizzo: /unblock @Username o /unblock telegramId' block_failed: "Errore nel bloccare l'utente" unblock_failed: "Errore nello sbloccare l'utente" check_solvers: La tua community ${communityName} non ha risolutori. Aggiungine almeno uno entro ${remainingDays} giorni per evitare che la community venga disabilitata. check_solvers_last_warning: La tua community ${communityName} non ha risolutori. Per favore aggiungine almeno uno oggi per evitare che la community venga disabilitata. image_processing_error: Abbiamo avuto un errore nel processare l'immagine, per favore attendi qualche minuto e prova di nuovo. order_channel_validation_failed: "Impossibile pubblicare il tuo ordine. Prova a disattivare la community predefinita con /setcomm off, o chiedi all'amministratore della tua community di riconfigurare i canali e i gruppi della community." -community_payment_methods: "Metodi di pagamento" -enter_community_payment_methods: "Inserisci i metodi di pagamento accettati nella tua community, separati da virgole (es.: Bonifico bancario, Contanti, PayPal)" -current_payment_methods: "Metodi di pagamento attuali: ${methods}" -select_payment_methods: "Seleziona uno o più metodi di pagamento:" -confirm_payment_methods: "✅ Conferma" -no_payment_method_selected: "Seleziona almeno un metodo di pagamento" -payment_methods_saved: "Metodi di pagamento salvati ✅" -custom_payment_method: "✍️ Metodo di pagamento personalizzato" -payment_methods_reset: "Metodi di pagamento rimossi. Gli utenti possono ora inserire qualsiasi metodo di pagamento liberamente." +community_payment_methods: 'Metodi di pagamento' +enter_community_payment_methods: 'Inserisci i metodi di pagamento accettati nella tua community, separati da virgole (es.: Bonifico bancario, Contanti, PayPal)' +current_payment_methods: 'Metodi di pagamento attuali: ${methods}' +select_payment_methods: 'Seleziona uno o più metodi di pagamento:' +confirm_payment_methods: '✅ Conferma' +no_payment_method_selected: 'Seleziona almeno un metodo di pagamento' +payment_methods_saved: 'Metodi di pagamento salvati ✅' +custom_payment_method: '✍️ Metodo di pagamento personalizzato' +payment_methods_reset: 'Metodi di pagamento rimossi. Gli utenti possono ora inserire qualsiasi metodo di pagamento liberamente.' payment_methods_wizard_commands: "/reset — rimuovere tutti i metodi di pagamento e ripristinare il comportamento predefinito\n/exit — uscire senza salvare" community_disabled_by_admin: Un amministratore ha disabilitato la tua comunità ${communityName} community_enabled_by_admin: Un amministratore ha riabilitato la tua comunità ${communityName} -community_creation_requirements_not_met_header: "Non soddisfi i requisiti per creare una comunità:" -community_creation_requirements_not_met_orders: "* Ordini: ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* Volume: ${userVolume} / ${requiredVolume}" -community_creation_requirements_not_met_days: "* Giorni di utilizzo del bot: ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* Reputazione: ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_header: 'Non soddisfi i requisiti per creare una comunità:' +community_creation_requirements_not_met_orders: '* Ordini: ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* Volume: ${userVolume} / ${requiredVolume}' +community_creation_requirements_not_met_days: '* Giorni di utilizzo del bot: ${userDays} / ${requiredDays}' +community_creation_requirements_not_met_rep: '* Reputazione: ${userRep} / ${requiredRep}' community_already_disabled: Questa comunità è già disabilitata community_already_enabled: Questa comunità è già abilitata ambiguous_community_input: Più comunità corrispondono a quel nome utente, usa invece l'ID della comunità diff --git a/locales/ko.yaml b/locales/ko.yaml index 244bd44f..0c2aa6a1 100644 --- a/locales/ko.yaml +++ b/locales/ko.yaml @@ -3,20 +3,20 @@ start: | ${disclaimer} ---———— TERMS AND CONDITIONS ————--- - + 이 텔레그램 봇은 당신이 라이트닝 네트워크를 통해 P2P로 비트코인을 전송하는 것을 도와줍니다. 봇을 시작한 후에, 다음과 같은 명령어들을 사용할 수 있습니다: 1. /buy 혹은 /sell 명령어를 통해 생성한 주문을 마켓에 등록하고 다음 지시를 따릅니다. 2. 다른 사용자가 당신의 주문에 "구매" 혹은 "판매" 버튼을 누를 때까지 기다립니다. 당신도 다른 사람들의 주문을 같은 방법으로 수락할 수 있습니다! - + 3. 당신의 주문과 평판은 ${channel} 채널에서 보여집니다. 4. 비트코인을 판매하는 경우, 봇은 해당 주문을 ${channel} 채널에 등록하고, 다른 누군가가 수락하기를 기다립니다. 이 판매 주문은 다른 사용자가 수락하기 전이라면 언제든지 /cancel 명령어로 취소할 수 있습니다. 5. 누군가가 당신의 주문을 수락할 경우, 봇은 당신에게 라이트닝 인보이스에 결제할 것을 요구합니다. 이 결제 내역은 에스크로 결제이며, 당신의 라이트닝 지갑에 아직 묶여 있는 상태입니다. 이 주문은 주문이 수락된 후 최대 ${orderExpiration}시간이 지난 후 비활성화됩니다. - + 봇은 구매자가 누구인지 알려주며, 당신은 구매자에게 어떤 형태로 법정화폐를 지불받을지에 대한 안내를 줄 수 있습니다. 법정화폐 결제를 받은 후에, 당신은 구매자에게 비트코인을 전송해주기 위해 반드시 /release 명령어를 입력해야 합니다. 6. 비트코인을 구매하려면, /buy 명령어를 통해 구매 주문을 등록하고, 판매자가 수락하기를 기다리면 됩니다. 해당 주문은 /cancel 명령어를 입력하여 언제든지 취소가 가능합니다. @@ -24,13 +24,13 @@ start: | 7. 누군가가 당신의 구매 주문을 수락하게 되면, 당신은 반드시 라이트닝 인보이스를 생성하여 봇에게 입력해주어야 합니다. 이후, 판매자와 연락하여 법정화폐 결제에 대한 안내를 받을 수 있습니다. 판매자에게 법정화폐를 지불한 후, 반드시 봇에게 /fiatsent 명령어를 입력하세요. 봇은 당신의 인보이스로 sats를 보내줄 것입니다. 8. 판매 주문을 수락했다면, 즉 비트코인을 구매할 경우, 당신은 sats를 받기 위한 라이트닝 인보이스를 생성해야 하고, 법정화폐 결제 방법에 대해 판매자에게 문의해야 합니다. 판매자는 법정화폐 결제를 받은 후에 /release 명령어를 입력하여 sats가 당신의 지갑으로 보내지도록 해야 합니다. - + 9. 구매 주문을 수락했다면, 즉 비트코인을 판매할 경우, 당신은 봇이 안내해주는 라이트닝 인보이스를 결제해야 합니다. 해당 비트코인은 구매자가 법정화폐 결제를 마칠 때까지 봇에 묶여 있을 것입니다. 구매자에게 연락하여 법정화폐 결제 방법에 대해 알려주세요. 법정화폐 결제를 받은 후에는, 반드시 봇에 묶여 있는 자금을 잠금 해제해주어야 합니다; /release 명령어를 입력하면, 비트코인은 자동으로 구매자의 지갑으로 보내집니다. 봇 사용법에 대해 더 많은 정보가 필요하다면 아래 링크를 참고하세요 👇 https://lnp2pbot.com/learn - + 빠르고 안전한 거래되시길! init_bot_error: 봇을 이용하기 위해서는, 먼저 /start 명령어로 봇을 초기화해주어야 합니다. non_handle_error: 👤 봇을 이용하기 위해서는, 당신의 텔레그램 사용자명 (Username)을 활성화해야 합니다. 활성화시키려면, 왼쪽 위에 있는 메뉴를 열고, 설정 (setting) -> 프로필 변경 (edit profile) -> 사용자명 (username)을 선택하세요. @@ -79,7 +79,7 @@ sell_correct_format: | `/sell 500 1000 KRW "결제 방법"` 3%의 \(프리미엄\)을 얹어서 판매 주문을 만들 때에는, \<_법정화폐 액수_\> 앞에 파라미터 0을 추가해야 하고, 마지막 파라미터로 3을 넣어주세요. 봇은 비트코인 시장가에 프리미엄 금액을 더해서 판매가를 계산해 줄 것입니다. - + `/sell 0 1000 KRW "결제 방법" 3` 판매 액수 범위를 제시하며 주문을 생성하기 위해서는, 고정된 법정화폐 금액 대신 최소 및 최대 금액을 하이픈 *\-*으로 분리해서 표현하면 됩니다. @@ -89,11 +89,11 @@ buy_correct_format: | /buy \<_비트코인 액수_\> \<_법정화폐 액수_\> \<_거래 통화_\> \<_결제 방법_\> \[_프리미엄/할인_\] 500 사토시를 1000 \(KRW\)에 구매하는 주문을 생성하고 법정화폐 결제 방법을 명시할 때, 위의 예시에서 \<\>와 \[\]는 빼는 것을 잊지 마세요. - + `/buy 500 1000 KRW "카카오톡 오픈챗 송금"` 지정가 거래를 원치 않고 시장가보다 낮은 가격에 구매하고 싶을 경우, 구매 주문에 할인율을 적용하여 구매 주문을 만들 수 있습니다. 해당 할인율은 주문이 등록되는 시점의 시장가에 적용됩니다. 이를 위해서는 \<_비트코인 액수_\> 앞에 파라미터 0을 추가하면, 봇은 비트코인 시장가에 프리미엄 금액을 더해서 구매 희망 가격을 계산해 줄 것입니다. 2%의 할인율을 적용하고자 한다면, 마지막 파라미터로 \-2를 넣어주세요. - + `/buy 0 1000 KRW "payment method" \-2` 구매 액수 범위를 제시하며 주문을 생성하기 위해서는, 고정된 법정화폐 금액 대신 최소 및 최대 금액을 하이픈 *\-*으로 분리해서 표현하면 됩니다. @@ -114,7 +114,7 @@ order_already_settled: 이 주문은 이미 정산되었습니다. invalid_data: 유효하지 않은 데이터를 보냈습니다. 다시 시도해보세요. begin_take_buy: | 🤖 주문을 수락하려면 `계속` 버튼을 눌러 주세요. `취소` 버튼을 누르면, 당신은 해당 주문에서 나오게 되고, 주문은 마켓 채널에 재등록됩니다. 주문이 만료되기까지 ${expirationTime}분 남았습니다. 👇 - + 참고: 결제 청구서에서 다시 보게 될 이미지이므로 기억해 두세요 continue: 계속 cancel: 취소 @@ -130,9 +130,9 @@ payment_received: | 잠시만 기다려주세요. 구매자가 응답하지 않을 경우, 결제된 담보물은 당신에게 그대로 돌아오게 됩니다. someone_took_your_order: | 🤖 누군가 당신의 주문을 수락하였고 봇에게 사토시를 이미 보냈습니다. 바로 돈을 보낼 수 있고 자금 동결의 위험이 없는 법정화폐 결제 방법을 사용하세요. - + 모종의 이유로 당신의 법정화폐 결제 솔루션이 결제를 못하게 막고 있을 경우, 자금이 ${expirationTime} 시간 안에 상대방에게 도착하지 않는다면, 사토시들은 판매자에게 돌아가며 구매자는 사토시를 받지 못할 위험에 빠지게 됩니다. 봇은 판매자에게 다시 사토시를 보내도록 강제할 수 없습니다. - + 판매자 평판: ${rate}, 봇 사용 일수: ${days} 위 내용을 이해하고 동의한다면, 아래 버튼을 눌러 계속해주세요 👇 @@ -146,14 +146,14 @@ get_in_touch_with_seller: | 🤖 주문 ID: #${orderId} 사용자 @${sellerUsername} 와 연락해서 어떻게 돈을 보낼지에 대해 좀 더 자세한 정보를 얻으세요. ${paymentMethod} 를 사용해서 ${currency} ${fiatAmount} 를 보내야 합니다. - + 돈을 보냈다면, 아래 명령어를 통해 봇에게 알려주세요 👇 fiatsent_order_cmd: /fiatsent get_in_touch_with_buyer: | 🤖 주문 ID: #${orderId} @${buyerUsername} 와 연락해서 어떻게 당신에게 ${paymentMethod} 를 사용해서 ${currency} ${fiatAmount} 를 보내야 하는지에 대해 알려주세요. 구매자가 당신에게 법정화폐 결제를 마쳤다고 확인하기 전까지는 절대로 비트코인을 release해서는 안 됩니다. - + 법정화폐 입금을 확인한 후에, 당신은 비트코인의 잠금을 해제해 주어야 합니다. buyer_took_your_order: | 🤖 주문 ID: #${orderId} @@ -378,7 +378,7 @@ wizard_community_enter_order_channels: | 두 개의 채널을 명시할 경우, 구매 주문과 판매 주문은 각기 다른 채널에 등록됩니다. 이 경우, 봇과 당신 모두는 해당 채널들의 관리자가 되어야 합니다. 채널의 이름을 알려주세요. 두 개의 채널을 원한다면 스페이스로 분리하여 이름들을 명시해주세요. - + 예: @내_판매_커뮤니티 @내_구매_커뮤니티 wizard_community_one_or_two_channels: 한 개 혹은 두 개의 채널을 명시해야 합니다. wizard_community_enter_solvers: 이제, 분쟁 해결을 담당할 사용자들을 스페이스로 분리하여 적어주세요. @@ -412,13 +412,13 @@ expired_order_to_buyer: | 🚨🚨🚨 이 주문은 곧 만료될 예정이며, 즉시 완료되거나 취소되어야 합니다. 당신이 법정화폐 입금을 하기 전이라면 /cancel 명령어를 통해 취소할 수 있습니다. 만약 법정화폐 입금을 마쳤지만 판매자가 비트코인의 락업 해제를 하지 않은 상황이라면, /dispute 명령어를 통해 분쟁 조정 절차에 들어갈 수 있습니다. 락업된 hodl 인보이스는 유효기간이 있으므로, 유효기간이 끝나기 전에 주문을 완료하지 않으면 당신의 법정화폐를 잃게 됩니다. - + 도움이 필요하시다면, ${helpGroup} 그룹에 메세지를 보내주세요. expired_order_to_seller: | 🚨🚨🚨 이 주문은 곧 만료될 예정이며, 즉시 완료되거나 취소되어야 합니다. 당신이 법정화폐 입금을 받기 전이라면 /cancel 명령어를 통해 취소할 수 있습니다. 법정화폐 입금을 받았다면, /release 명령어를 통해 락업을 해제해 주세요. 해제하지 않을 경우, 구매자가 분쟁 조정 절차를 시작하면서 당신의 매매 평판에 악영향을 줄 수 있습니다. - + 도움이 필요하시다면, ${helpGroup} 그룹에 메세지를 보내주세요. didnt_add_invoice: '🤨 아직 주문 ID: ${orderId}에 대해 비트코인을 받기 위한 인보이스를 보내지 않으셨습니다.' buyer_havent_add_invoice: '😔 아직 구매자가 주문 ID: ${orderId}에 대해 비트코인을 받기 위한 인보이스를 보내지 않았습니다. 당신의 비트코인은 무사합니다!' @@ -448,7 +448,7 @@ pending_payment_failed_earnings: | 🤖 봇이 당신의 출금 인보이스를 결제하기 위해 ${attempts}회 시도하였으나 실패했습니다. 다른 지갑에서 새 인보이스를 생성하여 다시 시도해 주세요. pending_payment_failed_to_admin: | 사용자 @${username}님의 구매 주문 ${orderId}에 대한 인보이스 결제가 실패하였습니다. - + 결제 시도 횟수: ${attempts} selling: 팝니다 @@ -462,7 +462,7 @@ trading_volume: '거래량: ${volume} sats' showusername_buying_sats: '@${username} 님이 sats를 구매합니다' showusername_selling_sats: '@${username} 님이 sats를 판매합니다' satoshis: 사토시 -by: 방법 - +by: 방법 - rate: 환율 has_successful_trades: ${trades}회의 성공적인 거래 user_age: "봇을 사용한 기간: ${pluralize(days, 'day', 'days')}" @@ -582,7 +582,7 @@ maintenance: 🚨 봇이 정비 중에 있습니다. 잠시 후 다시 시도해 community_admin: | 커뮤니티 관리 모드 > ${community.name} (${community.group}) - + 공개: ${community.public ? 'Yes' : 'No'} 수수료: @@ -606,7 +606,7 @@ community_language_updated: 성공적으로 커뮤니티의 언어를 ${language wizard_community_enter_language: '커뮤니티의 언어를 입력하세요. (en, es, fr, de, it, pt, ru, uk, ko, fa)' wizard_community_invalid_language: '유효하지 않은 언어입니다. 다음 중 하나를 입력하세요: en, es, fr, de, it, pt, ru, uk, ko, fa' community_npub_updated: 성공적으로 커뮤니티의 공개키 ${npub}을 추가하였습니다! -language: "언어" +language: '언어' # END modules/community # START modules/nostr @@ -625,7 +625,6 @@ npub_not_valid: | 예시: /setnpub npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 # END modules/nostr - # START modules/orders order_not_found: 주문을 찾을 수 없습니다. # END modules/orders @@ -653,7 +652,7 @@ user_settings: | /counterpartyorders <주문> - 거래 상대방의 최소 완료 주문 수를 설정합니다. /resetrequirements - 거래 상대방 요구 사항을 기본값으로 초기화합니다. /exit - 설정 모드 나가기. -not_meeting_requirements: 귀하는 이 주문을 수락하기 위한 거래 상대방 요구 사항을 충족하지 않습니다. +not_meeting_requirements: 귀하는 이 주문을 수락하기 위한 거래 상대방 요구 사항을 충족하지 않습니다 (봇 사용 최소 ${min_days_using_bot}일 및 완료된 주문 ${min_completed_orders}건 필요). counterpartyage_updated: 거래 상대방 가입 기간 요구 사항이 ${days}일로 업데이트되었습니다. counterpartyorders_updated: 거래 상대방 완료 주문 수 요구 사항이 ${orders}개로 업데이트되었습니다. requirements_reset: 거래 상대방 요구 사항이 기본값으로 초기화되었습니다. @@ -671,7 +670,7 @@ bot_info: | 최대 라우팅 수수료: ${routing_fee} 라이트닝 노드 URI: `${node_uri}` - + 라이트닝 노드 상태: ${status} 사용자 정보: @@ -685,9 +684,9 @@ disclaimer: | *이 P2P 거래 봇을 이용함으로써, 당신은 아래의 약관에 동의하는 것입니다:* 이 봇은 누구나 사용하거나, 복사, 수정, 실행이 가능한 오픈 소스 소프트웨어입니다. 개발자들은 다른 사용자들이 이 소프트웨어를 합법/불법적, 정직/정직하지 않은 어떤 형태로 이용함에 있어 책임을 지지 않습니다. - + 이 봇은 "있는 그대로" 그리고 "사용 가능한" 상태로 제공되며, 개발자들은 이 봇의 어떠한 사용에 있어 표현되어 있거나 의미하는 바와 상관 없이 어떠한 형태의 책임을 지지 않습니다. - + 개발자들과 분쟁 해소자들은 봇일 이용한 불건전한 행위자, 사기, 스캠들을 방지하기 위해 최선을 다하겠지만, 사용자들은 이 시스템이 악용될 수 있다는 사실을 알고, 이를 이용함에 있어 스스로 모든 책임을 진다는 점을 받아 들여야 합니다. 개발자나 분쟁 해소자 모두 봇을 사용하는 사용자들이 겪는 어떠한 손실이나 손해에 대한 어떠한 책임을 지지 않습니다. @@ -699,7 +698,7 @@ setinvoice_no_response: 결제할 주문이 없습니다. already_cancelled: 오퍼가 이미 취소되었습니다! privacy: | *개인정보 보호정책* - + 귀하의 개인정보는 저희에게 중요하며, 저희는 귀하의 개인정보를 보호하기 위해 최선을 다하고 있습니다. 이 개인정보 보호정책은 저희가 어떤 정보를 수집하고, 어떻게 그리고 어떤 목적으로 사용하는지 설명합니다. *1. 수집하는 정보:* @@ -716,31 +715,31 @@ blocklist_empty: You do not have any blocked user orders_in_process: There are orders in process with this user user_order_is_blocked_by_user_taker: You can't take this order because you blocked its maker user_taker_is_blocked_by_user_order: You can't take this order because its maker blocked you -block_usage: "사용법: /block @Username 또는 /block telegramId" -unblock_usage: "사용법: /unblock @Username 또는 /unblock telegramId" -block_failed: "사용자 차단 중 오류 발생" -unblock_failed: "사용자 차단 해제 중 오류 발생" +block_usage: '사용법: /block @Username 또는 /block telegramId' +unblock_usage: '사용법: /unblock @Username 또는 /unblock telegramId' +block_failed: '사용자 차단 중 오류 발생' +unblock_failed: '사용자 차단 해제 중 오류 발생' check_solvers: ${communityName} 커뮤니티에 해결사가 없습니다. 커뮤니티가 비활성화되는 것을 방지하려면 ${remainingDays}일 이내에 하나 이상 추가하세요. check_solvers_last_warning: ${communityName} 커뮤니티에 해결사가 없습니다. 커뮤니티가 비활성화되는 것을 방지하려면 오늘 하나 이상 추가하세요. image_processing_error: 이미지 처리에 오류가 발생했습니다. 몇 분 후에 다시 시도해 주세요. -order_channel_validation_failed: "주문을 등록할 수 없습니다. /setcomm off 로 기본 커뮤니티를 비활성화하거나, 커뮤니티 관리자에게 커뮤니티 채널 및 그룹을 재설정해 달라고 요청하세요." -community_payment_methods: "결제 방법" -enter_community_payment_methods: "커뮤니티에서 허용되는 결제 방법을 쉼표로 구분하여 입력하세요 (예: 은행 이체, 현금, PayPal)" -current_payment_methods: "현재 결제 방법: ${methods}" -select_payment_methods: "하나 이상의 결제 방법을 선택하세요:" -confirm_payment_methods: "✅ 확인" -no_payment_method_selected: "결제 방법을 하나 이상 선택해 주세요" -payment_methods_saved: "결제 방법이 저장되었습니다 ✅" -custom_payment_method: "✍️ 사용자 지정 결제 방법" -payment_methods_reset: "결제 방법이 삭제되었습니다. 이제 사용자는 어떤 결제 방법이든 자유롭게 입력할 수 있습니다." +order_channel_validation_failed: '주문을 등록할 수 없습니다. /setcomm off 로 기본 커뮤니티를 비활성화하거나, 커뮤니티 관리자에게 커뮤니티 채널 및 그룹을 재설정해 달라고 요청하세요.' +community_payment_methods: '결제 방법' +enter_community_payment_methods: '커뮤니티에서 허용되는 결제 방법을 쉼표로 구분하여 입력하세요 (예: 은행 이체, 현금, PayPal)' +current_payment_methods: '현재 결제 방법: ${methods}' +select_payment_methods: '하나 이상의 결제 방법을 선택하세요:' +confirm_payment_methods: '✅ 확인' +no_payment_method_selected: '결제 방법을 하나 이상 선택해 주세요' +payment_methods_saved: '결제 방법이 저장되었습니다 ✅' +custom_payment_method: '✍️ 사용자 지정 결제 방법' +payment_methods_reset: '결제 방법이 삭제되었습니다. 이제 사용자는 어떤 결제 방법이든 자유롭게 입력할 수 있습니다.' payment_methods_wizard_commands: "/reset — 모든 결제 방법을 삭제하고 기본 동작을 복원합니다\n/exit — 저장하지 않고 종료" community_disabled_by_admin: 관리자가 커뮤니티 ${communityName}을(를) 비활성화했습니다 community_enabled_by_admin: 관리자가 커뮤니티 ${communityName}을(를) 다시 활성화했습니다 -community_creation_requirements_not_met_header: "커뮤니티를 생성하기 위한 요건을 충족하지 못했습니다:" -community_creation_requirements_not_met_orders: "* 주문: ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* 거래량: ${userVolume} / ${requiredVolume}" -community_creation_requirements_not_met_days: "* 봇 사용 일수: ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* 평판: ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_header: '커뮤니티를 생성하기 위한 요건을 충족하지 못했습니다:' +community_creation_requirements_not_met_orders: '* 주문: ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* 거래량: ${userVolume} / ${requiredVolume}' +community_creation_requirements_not_met_days: '* 봇 사용 일수: ${userDays} / ${requiredDays}' +community_creation_requirements_not_met_rep: '* 평판: ${userRep} / ${requiredRep}' community_already_disabled: 이 커뮤니티는 이미 비활성화되어 있습니다 community_already_enabled: 이 커뮤니티는 이미 활성화되어 있습니다 ambiguous_community_input: 해당 사용자 이름과 일치하는 커뮤니티가 여러 개 있습니다. 커뮤니티 ID를 사용해 주세요 diff --git a/locales/pt.yaml b/locales/pt.yaml index 7f02090f..b34f6360 100644 --- a/locales/pt.yaml +++ b/locales/pt.yaml @@ -291,7 +291,7 @@ you_have_been_banned: Você foi banido! I_told_seller_you_sent_fiat: 🤖 Informei a @${sellerUsername} que você enviou o dinheiro fiat, quando o vendedor confirmar que recebeu seu dinheiro, ele deverá liberar os fundos. Se ele se recusar, você pode abrir uma disputa. buyer_told_me_that_sent_fiat: | 🤖 @${buyerUsername} informou que já enviou o dinheiro fiduciário, depois de confirmar que você o recebeu, libere fundos. - + Após liberar, o dinheiro irá para o comprador e não há volta, então só realize este processo se estiver 💯 certo. Pressione o seguinte comando se quiser liberar os Sats para o comprador 👇 @@ -596,12 +596,11 @@ npub_not_valid: | Exemplo: /setnpub npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 # END modules/nostr - # START modules/community community_admin: | Community Admin Mode > ${community.name} (${community.group}) - + Public: ${community.public ? 'Yes' : 'No'} Fee: @@ -625,7 +624,7 @@ community_language_updated: Você atualizou o idioma da comunidade para ${langua wizard_community_enter_language: 'Insira o código de idioma da sua comunidade (en, es, fr, de, it, pt, ru, uk, ko, fa)' wizard_community_invalid_language: 'Código de idioma inválido. Insira um dos seguintes - en, es, fr, de, it, pt, ru, uk, ko, fa' community_npub_updated: You added the community's pubkey ${npub} successfully! -language: "Idioma" +language: 'Idioma' # END modules/community # START modules/orders @@ -655,7 +654,7 @@ user_settings: | /counterpartyorders <ordens> - Define o número mínimo de ordens concluídas para a contraparte. /resetrequirements - Redefine os requisitos de contraparte para os valores padrão. /exit - para sair do assistente. -not_meeting_requirements: Você não cumpre os requisitos da contraparte para aceitar esta ordem. +not_meeting_requirements: Você não cumpre os requisitos da contraparte para aceitar esta ordem (requer pelo menos ${min_days_using_bot} dias usando o bot e ${min_completed_orders} ordens concluídas). counterpartyage_updated: Requisito de antiguidade da contraparte atualizado para ${days} dias. counterpartyorders_updated: Requisito de ordens concluídas da contraparte atualizado para ${orders}. requirements_reset: Os requisitos de contraparte foram redefinidos para os valores padrão. @@ -673,7 +672,7 @@ bot_info: | Max routing fee: ${routing_fee} Node URI: `${node_uri}` - + Node status: ${status} User info: @@ -701,7 +700,7 @@ setinvoice_no_response: Você não tem ordens a serem pagas already_cancelled: A oferta já foi cancelada! privacy: | *Política de Privacidade* - + Sua privacidade é importante para nós, e estamos comprometidos em proteger suas informações pessoais. Esta Política de Privacidade explica quais informações coletamos, como, e com qual propósito. *1. Informações que Coletamos:* @@ -718,31 +717,31 @@ blocklist_empty: Você não tem nenhum usuário bloqueado orders_in_process: Existem ordens em andamento com este usuário user_order_is_blocked_by_user_taker: Você não pode aceitar esta oferta porque bloqueou seu criador user_taker_is_blocked_by_user_order: Você não pode aceitar esta oferta porque seu criador bloqueou você -block_usage: "Uso: /block @Username ou /block telegramId" -unblock_usage: "Uso: /unblock @Username ou /unblock telegramId" -block_failed: "Erro ao bloquear o usuário" -unblock_failed: "Erro ao desbloquear o usuário" +block_usage: 'Uso: /block @Username ou /block telegramId' +unblock_usage: 'Uso: /unblock @Username ou /unblock telegramId' +block_failed: 'Erro ao bloquear o usuário' +unblock_failed: 'Erro ao desbloquear o usuário' check_solvers: Sua comunidade ${communityName} não possui solucionadores. Adicione pelo menos um dentro de ${remainingDays} dias para evitar que a comunidade seja desativada. check_solvers_last_warning: Sua comunidade ${communityName} não possui solucionadores. Adicione pelo menos um hoje para evitar que a comunidade seja desativada. image_processing_error: Tivemos um erro ao processar a imagem, por favor aguarde alguns minutos e tente novamente. -order_channel_validation_failed: "Não foi possível publicar a sua ordem. Tente desativar a comunidade padrão com /setcomm off ou peça ao administrador da comunidade para reconfigurar os canais e grupos da comunidade." -community_payment_methods: "Métodos de pagamento" -enter_community_payment_methods: "Insira os métodos de pagamento aceitos em sua comunidade, separados por vírgulas (ex.: Transferência bancária, Dinheiro, PayPal)" -current_payment_methods: "Métodos de pagamento atuais: ${methods}" -select_payment_methods: "Selecione um ou mais métodos de pagamento:" -confirm_payment_methods: "✅ Confirmar" -no_payment_method_selected: "Por favor selecione pelo menos um método de pagamento" -payment_methods_saved: "Métodos de pagamento salvos ✅" -custom_payment_method: "✍️ Método de pagamento personalizado" -payment_methods_reset: "Métodos de pagamento removidos. Os usuários agora podem inserir qualquer método de pagamento livremente." +order_channel_validation_failed: 'Não foi possível publicar a sua ordem. Tente desativar a comunidade padrão com /setcomm off ou peça ao administrador da comunidade para reconfigurar os canais e grupos da comunidade.' +community_payment_methods: 'Métodos de pagamento' +enter_community_payment_methods: 'Insira os métodos de pagamento aceitos em sua comunidade, separados por vírgulas (ex.: Transferência bancária, Dinheiro, PayPal)' +current_payment_methods: 'Métodos de pagamento atuais: ${methods}' +select_payment_methods: 'Selecione um ou mais métodos de pagamento:' +confirm_payment_methods: '✅ Confirmar' +no_payment_method_selected: 'Por favor selecione pelo menos um método de pagamento' +payment_methods_saved: 'Métodos de pagamento salvos ✅' +custom_payment_method: '✍️ Método de pagamento personalizado' +payment_methods_reset: 'Métodos de pagamento removidos. Os usuários agora podem inserir qualquer método de pagamento livremente.' payment_methods_wizard_commands: "/reset — remover todos os métodos de pagamento e restaurar o comportamento padrão\n/exit — sair sem salvar" community_disabled_by_admin: Um administrador desativou sua comunidade ${communityName} community_enabled_by_admin: Um administrador reativou sua comunidade ${communityName} -community_creation_requirements_not_met_header: "Você não atende aos requisitos para criar uma comunidade:" -community_creation_requirements_not_met_orders: "* Pedidos: ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* Volume: ${userVolume} / ${requiredVolume}" -community_creation_requirements_not_met_days: "* Dias usando o bot: ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* Reputação: ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_header: 'Você não atende aos requisitos para criar uma comunidade:' +community_creation_requirements_not_met_orders: '* Pedidos: ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* Volume: ${userVolume} / ${requiredVolume}' +community_creation_requirements_not_met_days: '* Dias usando o bot: ${userDays} / ${requiredDays}' +community_creation_requirements_not_met_rep: '* Reputação: ${userRep} / ${requiredRep}' community_already_disabled: Esta comunidade já está desativada community_already_enabled: Esta comunidade já está ativada ambiguous_community_input: Várias comunidades correspondem a esse nome de usuário, por favor use o ID da comunidade diff --git a/locales/ru.yaml b/locales/ru.yaml index ca8a723e..5086f645 100644 --- a/locales/ru.yaml +++ b/locales/ru.yaml @@ -55,7 +55,7 @@ pending_sell: | *Разработчики и арбитры споров не несут ответственности за потери или ущерб, которые пользователь может понести, если он не следует инструкциям* Примечание: Запомните это изображение, так как вы увидите его снова в счете на оплату - + Вы можете отменить эту заявку до того, как ее примет ктото другой, командой 👇 cancel_order_cmd: /cancel ${orderId} pending_buy: | @@ -173,7 +173,7 @@ sell_sats: Продать сатоши buy_sats: Купить сатоши order_detail: | Id: `${order._id}` - + Status previous to dispute: ${previousDisputeStatus} Статус: ${status} @@ -281,7 +281,7 @@ help: | /deldispute <_username_> <_id order_> - Удаляет спор от пользователя в сообществе, по умолчанию должно быть сообщество /ban <_username_> - Забанить пользователя в сообществе, должно быть сообщество по умолчанию /unban <_username_> - Unban a user from a community, there should be a default community - + /version - Показывает текущую версию бота /help - Показать ключевые команды must_be_gt_or_eq: ${fieldName} должно быть больше или равно ${qty} @@ -325,9 +325,9 @@ have_to_wait_for_counterpart: Вы уже выполнили эту операц ok_cooperativecancel: 'Ваш контрагент согласился, и идентификатор заявки: ${orderId} был отменен.' refund_cooperativecancel: Вы получили возврат платежа Lightning, больше ничего делать не нужно. init_cooperativecancel: | - 🕒 Ты начал отмену заказа Id: ${orderId}, твоя противоположная сторона также должна подтвердить, что хочет отменить его. Если он/она не ответит, можешь открыть спор. + 🕒 Ты начал отмену заказа Id: ${orderId}, твоя противоположная сторона также должна подтвердить, что хочет отменить его. Если он/она не ответит, можешь открыть спор. - Ни один администратор не свяжется с тобой для отмены заказа, если ты сначала не откроешь спор. + Ни один администратор не свяжется с тобой для отмены заказа, если ты сначала не откроешь спор. counterparty_wants_cooperativecancel: | 😳 Твоя противоположная сторона хочет отменить заказ Id: ${orderId} @@ -597,12 +597,11 @@ npub_not_valid: | Пример: /setnpub npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 # END modules/nostr - # START modules/community community_admin: | Community Admin Mode > ${community.name} (${community.group}) - + Public: ${community.public ? 'Yes' : 'No'} Fee: @@ -626,7 +625,7 @@ community_language_updated: Вы успешно обновили язык соо wizard_community_enter_language: 'Введите код языка для вашего сообщества (en, es, fr, de, it, pt, ru, uk, ko, fa)' wizard_community_invalid_language: 'Недопустимый код языка. Пожалуйста, введите один из следующих - en, es, fr, de, it, pt, ru, uk, ko, fa' community_npub_updated: You added the community's pubkey ${npub} successfully! -language: "Язык" +language: 'Язык' # END modules/community # START modules/orders @@ -656,7 +655,7 @@ user_settings: | /counterpartyorders <ордеров> - Устанавливает минимальное количество выполненных ордеров для контрагента. /resetrequirements - Сбрасывает требования к контрагенту до значений по умолчанию. /exit - выйти из мастера. -not_meeting_requirements: Вы не соответствуете требованиям контрагента для принятия этого ордера. +not_meeting_requirements: Вы не соответствуете требованиям контрагента для принятия этого ордера (требуется не менее ${min_days_using_bot} дней использования бота и ${min_completed_orders} завершённых ордеров). counterpartyage_updated: Требование к возрасту контрагента обновлено до ${days} дней. counterpartyorders_updated: Требование к выполненным ордерам контрагента обновлено до ${orders}. requirements_reset: Требования к контрагенту сброшены до значений по умолчанию. @@ -674,7 +673,7 @@ bot_info: | Max routing fee: ${routing_fee} Node URI: `${node_uri}` - + Node status: ${status} User info: @@ -702,7 +701,7 @@ setinvoice_no_response: У вас нет заказов для оплаты already_cancelled: Предложение уже отменено! privacy: | *Политика конфиденциальности* - + Ваша конфиденциальность важна для нас, и мы стремимся защищать вашу личную информацию. Эта Политика конфиденциальности объясняет, какую информацию мы собираем, как и с какой целью. *1. Информация, которую мы собираем:* @@ -719,31 +718,31 @@ blocklist_empty: You do not have any blocked user orders_in_process: There are orders in process with this user user_order_is_blocked_by_user_taker: You can't take this order because you blocked its maker user_taker_is_blocked_by_user_order: You can't take this order because its maker blocked you -block_usage: "Использование: /block @Username или /block telegramId" -unblock_usage: "Использование: /unblock @Username или /unblock telegramId" -block_failed: "Ошибка при блокировке пользователя" -unblock_failed: "Ошибка при разблокировке пользователя" +block_usage: 'Использование: /block @Username или /block telegramId' +unblock_usage: 'Использование: /unblock @Username или /unblock telegramId' +block_failed: 'Ошибка при блокировке пользователя' +unblock_failed: 'Ошибка при разблокировке пользователя' check_solvers: В вашем сообществе ${communityName} нет решателей. Добавьте хотя бы одно в течение ${remainingDays} дн., чтобы сообщество не было отключено. check_solvers_last_warning: В вашем сообществе ${communityName} нет решателей. Пожалуйста, добавьте хотя бы один сегодня, чтобы предотвратить отключение сообщества. image_processing_error: У нас возникла ошибка при обработке изображения, пожалуйста, подождите несколько минут и попробуйте снова. -order_channel_validation_failed: "Не удалось опубликовать ваш ордер. Попробуйте отключить сообщество по умолчанию с помощью /setcomm off или попросите администратора сообщества перенастроить каналы и группы сообщества." -community_payment_methods: "Способы оплаты" -enter_community_payment_methods: "Введите способы оплаты, принятые в вашем сообществе, разделённые запятыми (напр.: Банковский перевод, Наличные, PayPal)" -current_payment_methods: "Текущие способы оплаты: ${methods}" -select_payment_methods: "Выберите один или несколько способов оплаты:" -confirm_payment_methods: "✅ Подтвердить" -no_payment_method_selected: "Пожалуйста, выберите хотя бы один способ оплаты" -payment_methods_saved: "Способы оплаты сохранены ✅" -custom_payment_method: "✍️ Пользовательский способ оплаты" -payment_methods_reset: "Способы оплаты удалены. Пользователи теперь могут свободно вводить любой способ оплаты." +order_channel_validation_failed: 'Не удалось опубликовать ваш ордер. Попробуйте отключить сообщество по умолчанию с помощью /setcomm off или попросите администратора сообщества перенастроить каналы и группы сообщества.' +community_payment_methods: 'Способы оплаты' +enter_community_payment_methods: 'Введите способы оплаты, принятые в вашем сообществе, разделённые запятыми (напр.: Банковский перевод, Наличные, PayPal)' +current_payment_methods: 'Текущие способы оплаты: ${methods}' +select_payment_methods: 'Выберите один или несколько способов оплаты:' +confirm_payment_methods: '✅ Подтвердить' +no_payment_method_selected: 'Пожалуйста, выберите хотя бы один способ оплаты' +payment_methods_saved: 'Способы оплаты сохранены ✅' +custom_payment_method: '✍️ Пользовательский способ оплаты' +payment_methods_reset: 'Способы оплаты удалены. Пользователи теперь могут свободно вводить любой способ оплаты.' payment_methods_wizard_commands: "/reset — удалить все способы оплаты и восстановить поведение по умолчанию\n/exit — выйти без сохранения" community_disabled_by_admin: Администратор отключил ваше сообщество ${communityName} community_enabled_by_admin: Администратор повторно включил ваше сообщество ${communityName} -community_creation_requirements_not_met_header: "Вы не соответствуете требованиям для создания сообщества:" -community_creation_requirements_not_met_orders: "* Заказы: ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* Объем: ${userVolume} / ${requiredVolume}" -community_creation_requirements_not_met_days: "* Дней использования бота: ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* Репутация: ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_header: 'Вы не соответствуете требованиям для создания сообщества:' +community_creation_requirements_not_met_orders: '* Заказы: ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* Объем: ${userVolume} / ${requiredVolume}' +community_creation_requirements_not_met_days: '* Дней использования бота: ${userDays} / ${requiredDays}' +community_creation_requirements_not_met_rep: '* Репутация: ${userRep} / ${requiredRep}' community_already_disabled: Это сообщество уже отключено community_already_enabled: Это сообщество уже включено ambiguous_community_input: Несколько сообществ соответствуют этому имени пользователя, пожалуйста, используйте ID сообщества diff --git a/locales/uk.yaml b/locales/uk.yaml index 3683173e..7e8bcca3 100644 --- a/locales/uk.yaml +++ b/locales/uk.yaml @@ -118,7 +118,7 @@ continue: Продовжити cancel: Відмінити pay_invoice: | Примітка: Перед оплатою рахунку підтвердьте, що прикріплене зображення збігається із зображенням, надісланим під час створення замовлення - + Будь ласка, сплатіть цей рахунок з ${amount} сатоші у вибраній ${currency} ${fiatAmount} для початку операції. payment_received: | 🤑 Платіж отриманий! @@ -173,7 +173,7 @@ sell_sats: Продати сатоші buy_sats: Купити сатоші order_detail: | Id: `${order._id}` - + Status previous to dispute: ${previousDisputeStatus} Статус: ${status} @@ -324,11 +324,11 @@ order_completed_by_admin: 'Адміністратори виконали зая have_to_wait_for_counterpart: '🕒 Ви вже виконали цю операцію, тепер потрібно дочекатися дій контрагента.' ok_cooperativecancel: '👍 Ваш контрагент погодився, ідентифікатор заявки: ${orderId} було скасовано.' refund_cooperativecancel: '💰 Ви отримали повернення Lightning платежу, більше нічого робити не потрібно.' -init_cooperativecancel: | +init_cooperativecancel: | 🕒 Ви розпочали скасування замовлення з Id: ${orderId}. Ваша сторона також повинна підтвердити, що хоче скасувати його. Якщо вона не відповість, ви можете відкрити суперечку. Ніхто з адміністраторів не зв'яжеться з вами для скасування вашого замовлення, якщо ви спочатку не відкриєте суперечку. -counterparty_wants_cooperativecancel: | +counterparty_wants_cooperativecancel: | 😳 Ваша сторона хоче скасувати замовлення з Id: ${orderId} Ніхто з адміністраторів не зв'яжеться з вами для скасування вашого замовлення, якщо ви спочатку не відкриєте суперечку. @@ -593,12 +593,11 @@ npub_not_valid: | приклад: /setnpub npub180cvv07tjdrrgpa0j7j7tmnyl2yr6yr7l8j4s3evf6u64th6gkwsyjh6w6 # END modules/nostr - # START modules/community community_admin: | Community Admin Mode > ${community.name} (${community.group}) - + Public: ${community.public ? 'Yes' : 'No'} Fee: @@ -622,7 +621,7 @@ community_language_updated: Ви успішно оновили мову спіл wizard_community_enter_language: 'Введіть код мови для вашої спільноти (en, es, fr, de, it, pt, ru, uk, ko, fa)' wizard_community_invalid_language: 'Недійсний код мови. Будь ласка, введіть один із таких - en, es, fr, de, it, pt, ru, uk, ko, fa' community_npub_updated: You added the community's pubkey ${npub} successfully! -language: "Мова" +language: 'Мова' # END modules/community # START modules/orders @@ -652,7 +651,7 @@ user_settings: | /counterpartyorders <ордерів> - Встановлює мінімальну кількість виконаних ордерів для контрагента. /resetrequirements - Скидає вимоги до контрагента до значень за замовчуванням. /exit - вийти з майстра. -not_meeting_requirements: Ви не відповідаєте вимогам контрагента для прийняття цього ордера. +not_meeting_requirements: Ви не відповідаєте вимогам контрагента для прийняття цього ордера (потрібно щонайменше ${min_days_using_bot} днів використання бота та ${min_completed_orders} завершених ордерів). counterpartyage_updated: Вимогу до віку контрагента оновлено до ${days} днів. counterpartyorders_updated: Вимогу до виконаних ордерів контрагента оновлено до ${orders}. requirements_reset: Вимоги до контрагента скинуто до значень за замовчуванням. @@ -670,7 +669,7 @@ bot_info: | Max routing fee: ${routing_fee} Node URI: `${node_uri}` - + Node status: ${status} User info: @@ -698,7 +697,7 @@ setinvoice_no_response: У вас немає замовлень для опла already_cancelled: Пропозицію вже скасовано! privacy: | *Політика конфіденційності* - + Ваша конфіденційність важлива для нас, і ми прагнемо захищати вашу особисту інформацію. Ця Політика конфіденційності пояснює, яку інформацію ми збираємо, як і з якою метою. *1. Інформація, яку ми збираємо:* @@ -715,31 +714,31 @@ blocklist_empty: You do not have any blocked user orders_in_process: There are orders in process with this user user_order_is_blocked_by_user_taker: You can't take this order because you blocked its maker user_taker_is_blocked_by_user_order: You can't take this order because its maker blocked you -block_usage: "Використання: /block @Username або /block telegramId" -unblock_usage: "Використання: /unblock @Username або /unblock telegramId" -block_failed: "Помилка при блокуванні користувача" -unblock_failed: "Помилка при розблокуванні користувача" +block_usage: 'Використання: /block @Username або /block telegramId' +unblock_usage: 'Використання: /unblock @Username або /unblock telegramId' +block_failed: 'Помилка при блокуванні користувача' +unblock_failed: 'Помилка при розблокуванні користувача' check_solvers: У вашій спільноті ${communityName} немає розв’язувачів. Додайте принаймні одну протягом ${remainingDays} днів, щоб запобігти вимкненню спільноти. check_solvers_last_warning: У вашій спільноті ${communityName} немає розв’язувачів. Будь ласка, додайте принаймні одну сьогодні, щоб запобігти вимкненню спільноти. image_processing_error: У нас виникла помилка при обробці зображення, будь ласка, почекайте кілька хвилин і спробуйте знову. -order_channel_validation_failed: "Не вдалося опублікувати ваше замовлення. Спробуйте вимкнути спільноту за замовчуванням за допомогою /setcomm off або попросіть адміністратора спільноти переналаштувати канали та групи спільноти." -community_payment_methods: "Способи оплати" -enter_community_payment_methods: "Введіть способи оплати, прийняті у вашій спільноті, розділені комами (напр.: Банківський переказ, Готівка, PayPal)" -current_payment_methods: "Поточні способи оплати: ${methods}" -select_payment_methods: "Оберіть один або кілька способів оплати:" -confirm_payment_methods: "✅ Підтвердити" -no_payment_method_selected: "Будь ласка, оберіть принаймні один спосіб оплати" -payment_methods_saved: "Способи оплати збережено ✅" -custom_payment_method: "✍️ Власний спосіб оплати" -payment_methods_reset: "Способи оплати видалено. Користувачі тепер можуть вільно вводити будь-який спосіб оплати." +order_channel_validation_failed: 'Не вдалося опублікувати ваше замовлення. Спробуйте вимкнути спільноту за замовчуванням за допомогою /setcomm off або попросіть адміністратора спільноти переналаштувати канали та групи спільноти.' +community_payment_methods: 'Способи оплати' +enter_community_payment_methods: 'Введіть способи оплати, прийняті у вашій спільноті, розділені комами (напр.: Банківський переказ, Готівка, PayPal)' +current_payment_methods: 'Поточні способи оплати: ${methods}' +select_payment_methods: 'Оберіть один або кілька способів оплати:' +confirm_payment_methods: '✅ Підтвердити' +no_payment_method_selected: 'Будь ласка, оберіть принаймні один спосіб оплати' +payment_methods_saved: 'Способи оплати збережено ✅' +custom_payment_method: '✍️ Власний спосіб оплати' +payment_methods_reset: 'Способи оплати видалено. Користувачі тепер можуть вільно вводити будь-який спосіб оплати.' payment_methods_wizard_commands: "/reset — видалити всі способи оплати та відновити поведінку за замовчуванням\n/exit — вийти без збереження" community_disabled_by_admin: Адміністратор вимкнув вашу спільноту ${communityName} community_enabled_by_admin: Адміністратор повторно увімкнув вашу спільноту ${communityName} -community_creation_requirements_not_met_header: "Ви не відповідаєте вимогам для створення спільноти:" -community_creation_requirements_not_met_orders: "* Замовлення: ${userOrders} / ${requiredOrders}" -community_creation_requirements_not_met_volume: "* Обсяг: ${userVolume} / ${requiredVolume}" -community_creation_requirements_not_met_days: "* Днів використання бота: ${userDays} / ${requiredDays}" -community_creation_requirements_not_met_rep: "* Репутація: ${userRep} / ${requiredRep}" +community_creation_requirements_not_met_header: 'Ви не відповідаєте вимогам для створення спільноти:' +community_creation_requirements_not_met_orders: '* Замовлення: ${userOrders} / ${requiredOrders}' +community_creation_requirements_not_met_volume: '* Обсяг: ${userVolume} / ${requiredVolume}' +community_creation_requirements_not_met_days: '* Днів використання бота: ${userDays} / ${requiredDays}' +community_creation_requirements_not_met_rep: '* Репутація: ${userRep} / ${requiredRep}' community_already_disabled: Ця спільнота вже вимкнена community_already_enabled: Ця спільнота вже увімкнена ambiguous_community_input: Кілька спільнот відповідають цьому імені користувача, будь ласка, використовуйте ID спільноти diff --git a/tests/bot/modules/orders/takeOrder.spec.ts b/tests/bot/modules/orders/takeOrder.spec.ts new file mode 100644 index 00000000..ddce4706 --- /dev/null +++ b/tests/bot/modules/orders/takeOrder.spec.ts @@ -0,0 +1,115 @@ +export {}; + +const { expect } = require('chai'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire'); + +// Stub the two collaborators the requirements gate depends on so we can drive +// getUserAge and observe the denial message without loading the LN stack. +const getUserAgeStub = sinon.stub(); +const messagesMock = { + notMeetingRequirementsMessage: sinon.stub().resolves(), + '@noCallThru': true, +}; + +const { meetsCounterpartyRequirements } = proxyquire( + '../../../../bot/modules/orders/takeOrder', + { + '../../../util': { getUserAge: getUserAgeStub }, + '../../messages': messagesMock, + }, +); + +describe('meetsCounterpartyRequirements', () => { + const ctx: any = {}; + let taker: any; + let maker: any; + + beforeEach(() => { + getUserAgeStub.reset(); + messagesMock.notMeetingRequirementsMessage.resetHistory(); + taker = { tg_id: '1', trades_completed: 5, created_at: '2021-01-01' }; + maker = { tg_id: '2', counterparty_requirements: undefined }; + }); + + it('passes legacy makers without requirements', async () => { + const result = await meetsCounterpartyRequirements(ctx, taker, maker); + expect(result).to.equal(true); + expect(messagesMock.notMeetingRequirementsMessage.called).to.equal(false); + }); + + it('passes when requirements are all zero', async () => { + maker.counterparty_requirements = { + min_days_using_bot: 0, + min_completed_orders: 0, + }; + const result = await meetsCounterpartyRequirements(ctx, taker, maker); + expect(result).to.equal(true); + expect(messagesMock.notMeetingRequirementsMessage.called).to.equal(false); + }); + + it('passes when age equals the minimum (boundary)', async () => { + getUserAgeStub.returns(30); + maker.counterparty_requirements = { + min_days_using_bot: 30, + min_completed_orders: 0, + }; + const result = await meetsCounterpartyRequirements(ctx, taker, maker); + expect(result).to.equal(true); + expect(messagesMock.notMeetingRequirementsMessage.called).to.equal(false); + }); + + it('fails and notifies when age is below the minimum', async () => { + getUserAgeStub.returns(10); + maker.counterparty_requirements = { + min_days_using_bot: 30, + min_completed_orders: 0, + }; + const result = await meetsCounterpartyRequirements(ctx, taker, maker); + expect(result).to.equal(false); + expect(messagesMock.notMeetingRequirementsMessage.calledOnce).to.equal( + true, + ); + // The taker gets told the thresholds it failed. + const params = messagesMock.notMeetingRequirementsMessage.firstCall.args[2]; + expect(params).to.deep.equal({ + min_days_using_bot: 30, + min_completed_orders: 0, + }); + }); + + it('passes when completed orders equal the minimum (boundary)', async () => { + taker.trades_completed = 5; + maker.counterparty_requirements = { + min_days_using_bot: 0, + min_completed_orders: 5, + }; + const result = await meetsCounterpartyRequirements(ctx, taker, maker); + expect(result).to.equal(true); + expect(messagesMock.notMeetingRequirementsMessage.called).to.equal(false); + }); + + it('fails and notifies when completed orders are below the minimum', async () => { + taker.trades_completed = 2; + maker.counterparty_requirements = { + min_days_using_bot: 0, + min_completed_orders: 5, + }; + const result = await meetsCounterpartyRequirements(ctx, taker, maker); + expect(result).to.equal(false); + expect(messagesMock.notMeetingRequirementsMessage.calledOnce).to.equal( + true, + ); + }); + + it('lets legacy takers with no created_at (NaN age) pass the age check', async () => { + getUserAgeStub.returns(NaN); + maker.counterparty_requirements = { + min_days_using_bot: 30, + min_completed_orders: 0, + }; + const result = await meetsCounterpartyRequirements(ctx, taker, maker); + expect(result).to.equal(true); + expect(messagesMock.notMeetingRequirementsMessage.called).to.equal(false); + }); +});