Sfoglia il codice sorgente

chore(go): referral improvements (#28368)

Victor Navarro 4 mesi fa
parent
commit
b20b569b0e

+ 3 - 66
packages/console/app/src/component/go-referral.css

@@ -183,61 +183,8 @@
     }
   }
 
-  [data-slot="rewards-title"] {
-    display: flex;
-    flex-direction: column;
-    gap: var(--space-1);
-    padding-top: var(--space-2);
-
-    h2 {
-      margin: 0;
-      color: var(--color-text);
-      font-size: var(--font-size-md);
-      font-weight: 600;
-      line-height: 1.2;
-      letter-spacing: -0.03125rem;
-    }
-
-    p {
-      margin: 0;
-      color: var(--color-text-muted);
-      font-size: var(--font-size-sm);
-      line-height: 1.5;
-    }
-  }
-
-  [data-slot="referral-stats"] {
-    display: grid;
-    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
-    gap: var(--space-6);
-
-    @media (max-width: 30rem) {
-      grid-template-columns: 1fr;
-      gap: var(--space-4);
-    }
-
-    > div {
-      display: flex;
-      flex-direction: column;
-      gap: var(--space-2);
-      padding: var(--space-4);
-      border: 1px solid var(--color-border);
-      border-radius: var(--border-radius-sm);
-    }
-
-    span {
-      color: var(--color-text-muted);
-      font-size: var(--font-size-sm);
-      font-weight: 600;
-      text-transform: uppercase;
-      letter-spacing: -0.025rem;
-    }
-
-    strong {
-      color: var(--color-text);
-      font-size: var(--font-size-md);
-      font-weight: 600;
-    }
+  [data-component="go-referral-overview"] + [data-slot="section-title"] {
+    margin-top: var(--space-4);
   }
 
   [data-slot="referrals-table"] {
@@ -296,17 +243,7 @@
       &[data-slot="referral-source"] {
         color: var(--color-text-secondary);
         font-family: var(--font-sans);
-
-        span {
-          display: block;
-        }
-
-        [data-slot="referral-email"] {
-          margin-top: var(--space-1);
-          color: var(--color-text-muted);
-          line-height: 1.4;
-          white-space: normal;
-        }
+        white-space: nowrap;
       }
 
       &[data-slot="referral-action"] {

+ 82 - 99
packages/console/app/src/component/go-referral.tsx

@@ -1,4 +1,4 @@
-import { action, createAsync, json, query, useAction, useSubmission } from "@solidjs/router"
+import { action, json, query, useAction, useSubmission } from "@solidjs/router"
 import { createEffect, createMemo, createSignal, For, onCleanup, Show } from "solid-js"
 import { getRequestEvent } from "solid-js/web"
 import { Referral } from "@opencode-ai/console-core/referral.js"
@@ -13,6 +13,7 @@ import "./go-referral.css"
 
 type GoReferralSummary = Awaited<ReturnType<typeof Referral.summary>>
 type GoReferralReward = GoReferralSummary["rewards"][number]
+type GoLiteSubscription = Awaited<ReturnType<typeof queryLiteSubscription>>
 type GoReferralUsagePreview = NonNullable<Awaited<ReturnType<typeof Referral.usagePreview>>>
 type GoReferralUsagePreviewItem = GoReferralUsagePreview["rollingUsage"]
 
@@ -57,17 +58,15 @@ function formatDate(value: string | Date, locale: string) {
   return new Intl.DateTimeFormat(locale, { month: "short", day: "numeric", year: "numeric" }).format(new Date(value))
 }
 
-function rewardTitleKey(reward: GoReferralReward) {
-  if (reward.status === "pending" && reward.source === "invitee")
-    return "workspace.referral.reward.source.pendingInvitee" as const
-  if (reward.status === "pending") return "workspace.referral.reward.source.pendingInviter" as const
-  if (reward.status === "applied") return "workspace.referral.reward.source.applied" as const
-  return "workspace.referral.reward.source.available" as const
+function rewardDescriptionKey(source: GoReferralReward["source"]) {
+  if (source === "invitee") return "workspace.referral.reward.description.invitee" as const
+  return "workspace.referral.reward.description.inviter" as const
 }
 
-function rewardPendingStatusKey(source: GoReferralReward["source"]) {
-  if (source === "invitee") return "workspace.referral.reward.status.pendingInvitee" as const
-  return "workspace.referral.reward.status.pendingInviter" as const
+function rewardActionKey(reward: GoReferralReward, hasActiveGo: boolean) {
+  if (reward.status === "applied") return "workspace.referral.reward.action.applied" as const
+  if (reward.status === "pending" || !hasActiveGo) return "workspace.referral.reward.action.subscribeUnlock" as const
+  return "workspace.referral.reward.action.view" as const
 }
 
 function CopyInviteLink(props: { summary: GoReferralSummary }) {
@@ -113,18 +112,21 @@ function CopyInviteLink(props: { summary: GoReferralSummary }) {
   )
 }
 
-export function GoReferralSection(props: { workspaceID: string; summary: GoReferralSummary }) {
+export function GoReferralSection(props: {
+  workspaceID: string
+  summary: GoReferralSummary
+  lite: GoLiteSubscription | undefined
+}) {
   const i18n = useI18n()
   const language = useLanguage()
   const apply = useAction(applyGoReferralReward)
   const submission = useSubmission(applyGoReferralReward)
   const [selected, setSelected] = createSignal<GoReferralReward>()
   const [preview, setPreview] = createSignal<GoReferralUsagePreview | null>()
-  const lite = createAsync(() => queryLiteSubscription(props.workspaceID))
   const displayPreview = createMemo(() => {
     const loaded = preview()
     if (loaded) return loaded
-    const current = lite()
+    const current = props.lite
     if (!current) return emptyUsagePreview
     return {
       rollingUsage: currentUsagePreview(current.rollingUsage),
@@ -158,92 +160,73 @@ export function GoReferralSection(props: { workspaceID: string; summary: GoRefer
   }
 
   return (
-    <section data-component="go-referral-section">
-      <div data-slot="section-title">
-        <h2>{i18n.t("workspace.referral.overview.title")}</h2>
-        <p>
-          {i18n.t("workspace.referral.overview.subtitle", {
-            reward: formatCurrency(props.summary.rewardAmount),
-          })}
-        </p>
-      </div>
-      <div data-component="go-referral-overview">
-        <div data-slot="referral-stats">
-          <div>
-            <span>{i18n.t("workspace.referral.stats.invites")}</span>
-            <strong>{props.summary.inviteCount}</strong>
-          </div>
-          <div>
-            <span>{i18n.t("workspace.referral.stats.earned")}</span>
-            <strong>{formatCurrency(props.summary.totalEarned)}</strong>
-          </div>
-          <div>
-            <span>{i18n.t("workspace.referral.stats.applied")}</span>
-            <strong>{formatCurrency(props.summary.totalApplied)}</strong>
-          </div>
-        </div>
-        <CopyInviteLink summary={props.summary} />
-        <div data-slot="instructions">
-          <ol>
-            <li>{i18n.t("workspace.referral.instructions.share")}</li>
-            <li>{i18n.t("workspace.referral.instructions.subscribe")}</li>
-            <li>{i18n.t("workspace.referral.instructions.claim")}</li>
-          </ol>
-        </div>
-      </div>
-      <Show
-        when={props.summary.rewards.length > 0}
-        fallback={<div data-component="empty-state">{i18n.t("workspace.referral.rewards.empty")}</div>}
-      >
-        <div data-slot="referrals-table">
-          <table data-slot="referrals-table-element">
-            <thead>
-              <tr>
-                <th>{i18n.t("workspace.referral.table.reward")}</th>
-                <th>{i18n.t("workspace.referral.table.referral")}</th>
-                <th>{i18n.t("workspace.referral.table.date")}</th>
-                <th></th>
-              </tr>
-            </thead>
-            <tbody>
-              <For each={props.summary.rewards}>
-                {(reward) => {
-                  const applied = reward.status === "applied"
-                  const pending = reward.status === "pending"
-                  const earnedAt = () => formatDate(reward.timeCreated, language.tag(language.locale()))
-                  return (
-                    <tr data-status={reward.status} data-source={reward.source}>
-                      <td data-slot="referral-amount">{formatCurrency(reward.amount)}</td>
-                      <td data-slot="referral-source">
-                        <span>{i18n.t(rewardTitleKey(reward))}</span>
-                        <span data-slot="referral-email">{reward.email}</span>
-                      </td>
-                      <td data-slot="referral-date" title={earnedAt()}>
-                        {earnedAt()}
-                      </td>
-                      <td data-slot="referral-action">
-                        <button
-                          type="button"
-                          disabled={reward.status !== "available" || !props.summary.hasActiveGo || submission.pending}
-                          onClick={() => setSelected(reward)}
-                        >
-                          <Show when={!applied} fallback={i18n.t("workspace.referral.reward.status.applied")}>
-                            {pending
-                              ? i18n.t(rewardPendingStatusKey(reward.source))
-                              : props.summary.hasActiveGo
-                                ? i18n.t("workspace.referral.apply.preview")
-                                : i18n.t("workspace.referral.apply.noGo")}
-                          </Show>
-                        </button>
-                      </td>
-                    </tr>
-                  )
-                }}
-              </For>
-            </tbody>
-          </table>
-        </div>
+    <>
+      <Show when={props.lite || props.summary.hasReferral}>
+        <section data-component="go-referral-section">
+          <Show when={props.lite}>
+            <div data-slot="section-title">
+              <h2>{i18n.t("workspace.referral.overview.title")}</h2>
+              <p>{i18n.t("workspace.referral.overview.subtitle")}</p>
+            </div>
+            <div data-component="go-referral-overview">
+              <CopyInviteLink summary={props.summary} />
+              <div data-slot="instructions">
+                <ol>
+                  <li>{i18n.t("workspace.referral.instructions.share")}</li>
+                  <li>{i18n.t("workspace.referral.instructions.subscribe")}</li>
+                  <li>{i18n.t("workspace.referral.instructions.claim")}</li>
+                </ol>
+              </div>
+            </div>
+          </Show>
+          <Show when={props.summary.hasReferral}>
+            <div data-slot="section-title">
+              <h2>{i18n.t("workspace.referral.rewards.title")}</h2>
+              <p>{i18n.t("workspace.referral.rewards.description")}</p>
+            </div>
+            <div data-slot="referrals-table">
+              <table data-slot="referrals-table-element">
+                <thead>
+                  <tr>
+                    <th>{i18n.t("workspace.referral.table.reward")}</th>
+                    <th>{i18n.t("workspace.referral.table.referral")}</th>
+                    <th>{i18n.t("workspace.referral.table.date")}</th>
+                    <th></th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <For each={props.summary.rewards}>
+                    {(reward) => {
+                      const earnedAt = () => formatDate(reward.timeCreated, language.tag(language.locale()))
+                      return (
+                        <tr data-status={reward.status} data-source={reward.source}>
+                          <td data-slot="referral-amount">{formatCurrency(reward.amount)}</td>
+                          <td data-slot="referral-source">
+                            {i18n.t(rewardDescriptionKey(reward.source), { email: reward.email ?? "" })}
+                          </td>
+                          <td data-slot="referral-date" title={earnedAt()}>
+                            {earnedAt()}
+                          </td>
+                          <td data-slot="referral-action">
+                            <button
+                              type="button"
+                              disabled={reward.status !== "available" || !props.lite || submission.pending}
+                              onClick={() => setSelected(reward)}
+                            >
+                              {i18n.t(rewardActionKey(reward, !!props.lite))}
+                            </button>
+                          </td>
+                        </tr>
+                      )
+                    }}
+                  </For>
+                </tbody>
+              </table>
+            </div>
+          </Show>
+        </section>
       </Show>
+
       <Modal
         open={!!selected()}
         onClose={() => setSelected(undefined)}
@@ -266,7 +249,7 @@ export function GoReferralSection(props: { workspaceID: string; summary: GoRefer
           </div>
         </div>
       </Modal>
-    </section>
+    </>
   )
 }
 

+ 18 - 15
packages/console/app/src/i18n/ar.ts

@@ -662,32 +662,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "نسخ الرابط",
   "workspace.referral.copied": "تم النسخ",
-  "workspace.referral.overview.title": "ادعُ أصدقاءك إلى Go",
-  "workspace.referral.overview.subtitle": "احصل على رصيد Go بقيمة $5 عند اشتراك صديق. وسيحصل هو أيضًا على $5.",
-  "workspace.referral.stats.invites": "الدعوات",
-  "workspace.referral.stats.earned": "المُكتسب",
-  "workspace.referral.stats.applied": "المُطبَّق",
-  "workspace.referral.instructions.share": "شارك رابط دعوتك",
-  "workspace.referral.instructions.subscribe": "يشترك صديقك في Go",
-  "workspace.referral.instructions.claim": "طبِّق رصيد $5 الخاص بك أدناه",
+  "workspace.referral.overview.title": "ادعُ أصدقاءك",
+  "workspace.referral.overview.subtitle": "احصل على $5 عند اشتراك صديق. وسيحصل هو أيضًا على $5.",
+  "workspace.referral.instructions.share": "شارك رابط الإحالة الخاص بك",
+  "workspace.referral.instructions.subscribe": "ينضم صديقك ويشترك في Go",
+  "workspace.referral.instructions.claim": "تحصلان كلاكما على رصيد استخدام بقيمة $5 لتطبيقه على حدود استخدام Go",
   "workspace.referral.rewards.title": "مكافآت الإحالة",
+  "workspace.referral.rewards.description": "طبّق أرصدة الإحالة المتاحة على استخدامك لـ Go.",
   "workspace.referral.rewards.subtitle": "تم تطبيق {{applied}} / {{total}} من المكافآت.",
   "workspace.referral.rewards.empty": "لا توجد مكافآت إحالة بعد.",
   "workspace.referral.table.reward": "المكافأة",
   "workspace.referral.table.referral": "الوصف",
   "workspace.referral.table.date": "التاريخ",
+  "workspace.referral.reward.description.inviter": "تمت دعوة {{email}}",
+  "workspace.referral.reward.description.invitee": "تمت دعوتك بواسطة {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "اشترك لإلغاء القفل",
+  "workspace.referral.reward.action.view": "عرض المكافأة",
+  "workspace.referral.reward.action.applied": "تم تطبيق المكافأة",
   "workspace.referral.reward.source.pendingInviter": "بانتظار اشتراكه",
   "workspace.referral.reward.source.pendingInvitee": "اشترك لإلغاء قفل المكافأة",
   "workspace.referral.reward.source.available": "المكافأة جاهزة للتطبيق",
   "workspace.referral.reward.source.applied": "تم تطبيق المكافأة",
-  "workspace.referral.reward.status.applied": "مُطبَّق",
-  "workspace.referral.reward.status.pendingInviter": "تطبيق",
-  "workspace.referral.reward.status.pendingInvitee": "تطبيق",
-  "workspace.referral.apply.noGo": "الاشتراك في Go",
-  "workspace.referral.apply.preview": "معاينة",
+  "workspace.referral.reward.status.applied": "تم تطبيق المكافأة",
+  "workspace.referral.reward.status.pendingInviter": "اشترك لإلغاء القفل",
+  "workspace.referral.reward.status.pendingInvitee": "اشترك لإلغاء القفل",
+  "workspace.referral.apply.noGo": "اشترك لإلغاء القفل",
+  "workspace.referral.apply.preview": "عرض المكافأة",
   "workspace.referral.apply.action": "تطبيق",
-  "workspace.referral.apply.confirmTitle": "تطبيق مكافأة Go",
-  "workspace.referral.apply.confirmBody": "طبِّق {{amount}} لتقليل عدّادات استخدام Go الحالية في مساحة العمل هذه.",
+  "workspace.referral.apply.confirmTitle": "تطبيق المكافأة",
+  "workspace.referral.apply.confirmBody": "طبِّق {{amount}} لتقليل الاستخدام الحالي في مساحة العمل هذه.",
   "workspace.referral.apply.confirmAction": "تطبيق",
 
   "download.title": "OpenCode | تنزيل",

+ 18 - 16
packages/console/app/src/i18n/br.ts

@@ -672,33 +672,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Copiar link",
   "workspace.referral.copied": "Copiado",
-  "workspace.referral.overview.title": "Convide amigos para o Go",
-  "workspace.referral.overview.subtitle": "Ganhe $5 em crédito Go quando um amigo assinar. Ele também ganha $5.",
-  "workspace.referral.stats.invites": "Convites",
-  "workspace.referral.stats.earned": "Ganhos",
-  "workspace.referral.stats.applied": "Aplicados",
-  "workspace.referral.instructions.share": "Compartilhe seu link de convite",
-  "workspace.referral.instructions.subscribe": "Seu amigo assina o Go",
-  "workspace.referral.instructions.claim": "Aplique seu crédito de $5 abaixo",
+  "workspace.referral.overview.title": "Convide amigos",
+  "workspace.referral.overview.subtitle": "Ganhe $5 quando um amigo assinar. Ele também ganha $5.",
+  "workspace.referral.instructions.share": "Compartilhe seu link de indicação",
+  "workspace.referral.instructions.subscribe": "Seu amigo entra e assina o Go",
+  "workspace.referral.instructions.claim": "Vocês dois ganham um crédito de uso de $5 para aplicar aos seus limites de uso do Go",
   "workspace.referral.rewards.title": "Recompensas de indicação",
+  "workspace.referral.rewards.description": "Aplique os créditos de indicação disponíveis no seu uso do Go.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} recompensas aplicadas.",
   "workspace.referral.rewards.empty": "Ainda não há recompensas de indicação.",
   "workspace.referral.table.reward": "Recompensa",
   "workspace.referral.table.referral": "Descrição",
   "workspace.referral.table.date": "Data",
+  "workspace.referral.reward.description.inviter": "Convidou {{email}}",
+  "workspace.referral.reward.description.invitee": "Convidado por {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Assine para desbloquear",
+  "workspace.referral.reward.action.view": "Ver recompensa",
+  "workspace.referral.reward.action.applied": "Recompensa aplicada",
   "workspace.referral.reward.source.pendingInviter": "Aguardando ele assinar",
   "workspace.referral.reward.source.pendingInvitee": "Assine para desbloquear a recompensa",
   "workspace.referral.reward.source.available": "Recompensa pronta para usar",
   "workspace.referral.reward.source.applied": "Recompensa aplicada",
-  "workspace.referral.reward.status.applied": "Aplicada",
-  "workspace.referral.reward.status.pendingInviter": "Aplicar",
-  "workspace.referral.reward.status.pendingInvitee": "Aplicar",
-  "workspace.referral.apply.noGo": "Assinar Go",
-  "workspace.referral.apply.preview": "Visualizar",
+  "workspace.referral.reward.status.applied": "Recompensa aplicada",
+  "workspace.referral.reward.status.pendingInviter": "Assine para desbloquear",
+  "workspace.referral.reward.status.pendingInvitee": "Assine para desbloquear",
+  "workspace.referral.apply.noGo": "Assine para desbloquear",
+  "workspace.referral.apply.preview": "Ver recompensa",
   "workspace.referral.apply.action": "Aplicar",
-  "workspace.referral.apply.confirmTitle": "Aplicar recompensa Go",
-  "workspace.referral.apply.confirmBody":
-    "Aplique {{amount}} para reduzir os contadores atuais de uso do Go deste workspace.",
+  "workspace.referral.apply.confirmTitle": "Aplicar recompensa",
+  "workspace.referral.apply.confirmBody": "Aplique {{amount}} para reduzir o uso atual deste workspace.",
   "workspace.referral.apply.confirmAction": "Aplicar",
 
   "download.title": "OpenCode | Baixar",

+ 18 - 16
packages/console/app/src/i18n/da.ts

@@ -668,33 +668,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Kopiér link",
   "workspace.referral.copied": "Kopieret",
-  "workspace.referral.overview.title": "Inviter venner til Go",
-  "workspace.referral.overview.subtitle": "Få $5 i Go-kredit, når en ven abonnerer. De får også $5.",
-  "workspace.referral.stats.invites": "Invitationer",
-  "workspace.referral.stats.earned": "Optjent",
-  "workspace.referral.stats.applied": "Brugt",
-  "workspace.referral.instructions.share": "Del dit invitationslink",
-  "workspace.referral.instructions.subscribe": "Din ven abonnerer på Go",
-  "workspace.referral.instructions.claim": "Brug din $5-kredit nedenfor",
+  "workspace.referral.overview.title": "Inviter venner",
+  "workspace.referral.overview.subtitle": "Få $5, når en ven abonnerer. De får også $5.",
+  "workspace.referral.instructions.share": "Del dit henvisningslink",
+  "workspace.referral.instructions.subscribe": "Din ven tilmelder sig og abonnerer på Go",
+  "workspace.referral.instructions.claim": "I får begge $5 i forbrugskredit til at bruge på jeres Go-forbrugsgrænser",
   "workspace.referral.rewards.title": "Henvisningsbelønninger",
+  "workspace.referral.rewards.description": "Brug tilgængelige henvisningskreditter på dit Go-forbrug.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} belønninger brugt.",
   "workspace.referral.rewards.empty": "Ingen henvisningsbelønninger endnu.",
   "workspace.referral.table.reward": "Belønning",
   "workspace.referral.table.referral": "Beskrivelse",
   "workspace.referral.table.date": "Dato",
+  "workspace.referral.reward.description.inviter": "Inviterede {{email}}",
+  "workspace.referral.reward.description.invitee": "Inviteret af {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Abonner for at låse op",
+  "workspace.referral.reward.action.view": "Vis belønning",
+  "workspace.referral.reward.action.applied": "Belønning brugt",
   "workspace.referral.reward.source.pendingInviter": "Venter på, at de abonnerer",
   "workspace.referral.reward.source.pendingInvitee": "Abonner for at låse belønningen op",
   "workspace.referral.reward.source.available": "Belønning klar til brug",
   "workspace.referral.reward.source.applied": "Belønning brugt",
-  "workspace.referral.reward.status.applied": "Brugt",
-  "workspace.referral.reward.status.pendingInviter": "Brug",
-  "workspace.referral.reward.status.pendingInvitee": "Brug",
-  "workspace.referral.apply.noGo": "Abonner på Go",
-  "workspace.referral.apply.preview": "Forhåndsvis",
+  "workspace.referral.reward.status.applied": "Belønning brugt",
+  "workspace.referral.reward.status.pendingInviter": "Abonner for at låse op",
+  "workspace.referral.reward.status.pendingInvitee": "Abonner for at låse op",
+  "workspace.referral.apply.noGo": "Abonner for at låse op",
+  "workspace.referral.apply.preview": "Vis belønning",
   "workspace.referral.apply.action": "Brug",
-  "workspace.referral.apply.confirmTitle": "Brug Go-belønning",
-  "workspace.referral.apply.confirmBody":
-    "Brug {{amount}} til at reducere dette workspaces nuværende Go-forbrugstællere.",
+  "workspace.referral.apply.confirmTitle": "Brug belønning",
+  "workspace.referral.apply.confirmBody": "Brug {{amount}} til at reducere dette workspaces nuværende forbrug.",
   "workspace.referral.apply.confirmAction": "Brug",
 
   "download.title": "OpenCode | Download",

+ 18 - 15
packages/console/app/src/i18n/de.ts

@@ -671,33 +671,36 @@ export const dict = {
 
   "workspace.referral.copyLink": "Link kopieren",
   "workspace.referral.copied": "Kopiert",
-  "workspace.referral.overview.title": "Freunde zu Go einladen",
-  "workspace.referral.overview.subtitle": "Erhalte $5 Go-Guthaben, wenn ein Freund abonniert. Er bekommt ebenfalls $5.",
-  "workspace.referral.stats.invites": "Einladungen",
-  "workspace.referral.stats.earned": "Verdient",
-  "workspace.referral.stats.applied": "Eingelöst",
-  "workspace.referral.instructions.share": "Teile deinen Einladungslink",
-  "workspace.referral.instructions.subscribe": "Dein Freund abonniert Go",
-  "workspace.referral.instructions.claim": "Löse unten dein $5-Guthaben ein",
+  "workspace.referral.overview.title": "Freunde einladen",
+  "workspace.referral.overview.subtitle": "Erhalte $5, wenn ein Freund abonniert. Er bekommt ebenfalls $5.",
+  "workspace.referral.instructions.share": "Teile deinen Empfehlungslink",
+  "workspace.referral.instructions.subscribe": "Dein Freund tritt bei und abonniert Go",
+  "workspace.referral.instructions.claim": "Ihr erhaltet beide ein Nutzungsguthaben von $5, das ihr auf eure Go-Nutzungslimits anrechnen könnt",
   "workspace.referral.rewards.title": "Empfehlungsbelohnungen",
+  "workspace.referral.rewards.description": "Verfügbare Empfehlungsguthaben auf deine Go-Nutzung anwenden.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} Belohnungen eingelöst.",
   "workspace.referral.rewards.empty": "Noch keine Empfehlungsbelohnungen.",
   "workspace.referral.table.reward": "Belohnung",
   "workspace.referral.table.referral": "Beschreibung",
   "workspace.referral.table.date": "Datum",
+  "workspace.referral.reward.description.inviter": "{{email}} eingeladen",
+  "workspace.referral.reward.description.invitee": "Eingeladen von {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Abonnieren zum Freischalten",
+  "workspace.referral.reward.action.view": "Belohnung ansehen",
+  "workspace.referral.reward.action.applied": "Belohnung eingelöst",
   "workspace.referral.reward.source.pendingInviter": "Warten auf das Abo des Freundes",
   "workspace.referral.reward.source.pendingInvitee": "Abonnieren, um Belohnung freizuschalten",
   "workspace.referral.reward.source.available": "Belohnung kann eingelöst werden",
   "workspace.referral.reward.source.applied": "Belohnung eingelöst",
-  "workspace.referral.reward.status.applied": "Eingelöst",
-  "workspace.referral.reward.status.pendingInviter": "Einlösen",
-  "workspace.referral.reward.status.pendingInvitee": "Einlösen",
-  "workspace.referral.apply.noGo": "Go abonnieren",
-  "workspace.referral.apply.preview": "Vorschau",
+  "workspace.referral.reward.status.applied": "Belohnung eingelöst",
+  "workspace.referral.reward.status.pendingInviter": "Abonnieren zum Freischalten",
+  "workspace.referral.reward.status.pendingInvitee": "Abonnieren zum Freischalten",
+  "workspace.referral.apply.noGo": "Abonnieren zum Freischalten",
+  "workspace.referral.apply.preview": "Belohnung ansehen",
   "workspace.referral.apply.action": "Einlösen",
-  "workspace.referral.apply.confirmTitle": "Go-Belohnung einlösen",
+  "workspace.referral.apply.confirmTitle": "Belohnung einlösen",
   "workspace.referral.apply.confirmBody":
-    "Löse {{amount}} ein, um die aktuellen Go-Nutzungszähler dieses Workspace zu reduzieren.",
+    "Löse {{amount}} ein, um die aktuelle Nutzung dieses Workspace zu reduzieren.",
   "workspace.referral.apply.confirmAction": "Einlösen",
 
   "download.title": "OpenCode | Download",

+ 18 - 15
packages/console/app/src/i18n/en.ts

@@ -664,32 +664,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Copy Link",
   "workspace.referral.copied": "Copied",
-  "workspace.referral.overview.title": "Invite friends to Go",
-  "workspace.referral.overview.subtitle": "Earn $5 in Go credit when a friend subscribes. They’ll get $5 too.",
-  "workspace.referral.stats.invites": "Invites",
-  "workspace.referral.stats.earned": "Earned",
-  "workspace.referral.stats.applied": "Applied",
-  "workspace.referral.instructions.share": "Share your invite link",
-  "workspace.referral.instructions.subscribe": "Your friend subscribes to Go",
-  "workspace.referral.instructions.claim": "Apply your $5 credit below",
+  "workspace.referral.overview.title": "Invite friends",
+  "workspace.referral.overview.subtitle": "Earn $5 when a friend subscribes. They’ll get $5 too.",
+  "workspace.referral.instructions.share": "Share your referral link",
+  "workspace.referral.instructions.subscribe": "Your friend joins and subscribes to Go",
+  "workspace.referral.instructions.claim": "You both get a $5 usage credit to apply toward your Go usage limits",
   "workspace.referral.rewards.title": "Referral rewards",
+  "workspace.referral.rewards.description": "Apply available referral credits toward your Go usage.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} rewards applied.",
   "workspace.referral.rewards.empty": "No referral rewards yet.",
   "workspace.referral.table.reward": "Reward",
   "workspace.referral.table.referral": "Description",
   "workspace.referral.table.date": "Date",
+  "workspace.referral.reward.description.inviter": "Invited {{email}}",
+  "workspace.referral.reward.description.invitee": "Invited by {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Subscribe to unlock",
+  "workspace.referral.reward.action.view": "View Reward",
+  "workspace.referral.reward.action.applied": "Reward Applied",
   "workspace.referral.reward.source.pendingInviter": "Waiting for them to subscribe",
   "workspace.referral.reward.source.pendingInvitee": "Subscribe to unlock reward",
   "workspace.referral.reward.source.available": "Reward ready to apply",
   "workspace.referral.reward.source.applied": "Reward applied",
-  "workspace.referral.reward.status.applied": "Applied",
-  "workspace.referral.reward.status.pendingInviter": "Apply",
-  "workspace.referral.reward.status.pendingInvitee": "Apply",
-  "workspace.referral.apply.noGo": "Subscribe to Go",
-  "workspace.referral.apply.preview": "Preview",
+  "workspace.referral.reward.status.applied": "Reward Applied",
+  "workspace.referral.reward.status.pendingInviter": "Subscribe to unlock",
+  "workspace.referral.reward.status.pendingInvitee": "Subscribe to unlock",
+  "workspace.referral.apply.noGo": "Subscribe to unlock",
+  "workspace.referral.apply.preview": "View Reward",
   "workspace.referral.apply.action": "Apply",
-  "workspace.referral.apply.confirmTitle": "Apply Go reward",
-  "workspace.referral.apply.confirmBody": "Apply {{amount}} to reduce this workspace's current Go usage counters.",
+  "workspace.referral.apply.confirmTitle": "Apply reward",
+  "workspace.referral.apply.confirmBody": "Apply {{amount}} to reduce this workspace's current usage.",
   "workspace.referral.apply.confirmAction": "Apply",
 
   "download.title": "OpenCode | Download",

+ 18 - 16
packages/console/app/src/i18n/es.ts

@@ -672,33 +672,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Copiar enlace",
   "workspace.referral.copied": "Copiado",
-  "workspace.referral.overview.title": "Invita amigos a Go",
-  "workspace.referral.overview.subtitle": "Gana $5 de crédito Go cuando un amigo se suscriba. Él también recibirá $5.",
-  "workspace.referral.stats.invites": "Invitaciones",
-  "workspace.referral.stats.earned": "Ganado",
-  "workspace.referral.stats.applied": "Aplicado",
-  "workspace.referral.instructions.share": "Comparte tu enlace de invitación",
-  "workspace.referral.instructions.subscribe": "Tu amigo se suscribe a Go",
-  "workspace.referral.instructions.claim": "Aplica tu crédito de $5 abajo",
+  "workspace.referral.overview.title": "Invita amigos",
+  "workspace.referral.overview.subtitle": "Gana $5 cuando un amigo se suscriba. Él también recibirá $5.",
+  "workspace.referral.instructions.share": "Comparte tu enlace de referido",
+  "workspace.referral.instructions.subscribe": "Tu amigo se une y se suscribe a Go",
+  "workspace.referral.instructions.claim": "Ambos reciben un crédito de uso de $5 para aplicar a sus límites de uso de Go",
   "workspace.referral.rewards.title": "Recompensas por referidos",
+  "workspace.referral.rewards.description": "Aplica los créditos por referidos disponibles a tu uso de Go.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} recompensas aplicadas.",
   "workspace.referral.rewards.empty": "Aún no hay recompensas por referidos.",
   "workspace.referral.table.reward": "Recompensa",
   "workspace.referral.table.referral": "Descripción",
   "workspace.referral.table.date": "Fecha",
+  "workspace.referral.reward.description.inviter": "Invitaste a {{email}}",
+  "workspace.referral.reward.description.invitee": "Invitado por {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Suscríbete para desbloquear",
+  "workspace.referral.reward.action.view": "Ver recompensa",
+  "workspace.referral.reward.action.applied": "Recompensa aplicada",
   "workspace.referral.reward.source.pendingInviter": "Esperando a que se suscriba",
   "workspace.referral.reward.source.pendingInvitee": "Suscríbete para desbloquear la recompensa",
   "workspace.referral.reward.source.available": "Recompensa lista para aplicar",
   "workspace.referral.reward.source.applied": "Recompensa aplicada",
-  "workspace.referral.reward.status.applied": "Aplicada",
-  "workspace.referral.reward.status.pendingInviter": "Aplicar",
-  "workspace.referral.reward.status.pendingInvitee": "Aplicar",
-  "workspace.referral.apply.noGo": "Suscribirse a Go",
-  "workspace.referral.apply.preview": "Vista previa",
+  "workspace.referral.reward.status.applied": "Recompensa aplicada",
+  "workspace.referral.reward.status.pendingInviter": "Suscríbete para desbloquear",
+  "workspace.referral.reward.status.pendingInvitee": "Suscríbete para desbloquear",
+  "workspace.referral.apply.noGo": "Suscríbete para desbloquear",
+  "workspace.referral.apply.preview": "Ver recompensa",
   "workspace.referral.apply.action": "Aplicar",
-  "workspace.referral.apply.confirmTitle": "Aplicar recompensa de Go",
-  "workspace.referral.apply.confirmBody":
-    "Aplica {{amount}} para reducir los contadores actuales de uso de Go de este workspace.",
+  "workspace.referral.apply.confirmTitle": "Aplicar recompensa",
+  "workspace.referral.apply.confirmBody": "Aplica {{amount}} para reducir el uso actual de este workspace.",
   "workspace.referral.apply.confirmAction": "Aplicar",
 
   "download.title": "OpenCode | Descargar",

+ 18 - 16
packages/console/app/src/i18n/fr.ts

@@ -678,33 +678,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Copier le lien",
   "workspace.referral.copied": "Copié",
-  "workspace.referral.overview.title": "Inviter des amis sur Go",
-  "workspace.referral.overview.subtitle": "Gagnez $5 de crédit Go lorsqu'un ami s'abonne. Il recevra également $5.",
-  "workspace.referral.stats.invites": "Invitations",
-  "workspace.referral.stats.earned": "Gagné",
-  "workspace.referral.stats.applied": "Utilisé",
-  "workspace.referral.instructions.share": "Partagez votre lien d'invitation",
-  "workspace.referral.instructions.subscribe": "Votre ami s'abonne à Go",
-  "workspace.referral.instructions.claim": "Utilisez votre crédit de $5 ci-dessous",
+  "workspace.referral.overview.title": "Inviter des amis",
+  "workspace.referral.overview.subtitle": "Gagnez $5 lorsqu'un ami s'abonne. Il recevra également $5.",
+  "workspace.referral.instructions.share": "Partagez votre lien de parrainage",
+  "workspace.referral.instructions.subscribe": "Votre ami rejoint et s'abonne à Go",
+  "workspace.referral.instructions.claim": "Vous recevez tous les deux un crédit d'utilisation de $5 à appliquer à vos limites d'utilisation Go",
   "workspace.referral.rewards.title": "Récompenses de parrainage",
+  "workspace.referral.rewards.description": "Utilisez les crédits de parrainage disponibles pour votre utilisation de Go.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} récompenses utilisées.",
   "workspace.referral.rewards.empty": "Aucune récompense de parrainage pour l'instant.",
   "workspace.referral.table.reward": "Récompense",
   "workspace.referral.table.referral": "Description",
   "workspace.referral.table.date": "Date",
+  "workspace.referral.reward.description.inviter": "Vous avez invité {{email}}",
+  "workspace.referral.reward.description.invitee": "Invité par {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Abonnez-vous pour débloquer",
+  "workspace.referral.reward.action.view": "Voir la récompense",
+  "workspace.referral.reward.action.applied": "Récompense utilisée",
   "workspace.referral.reward.source.pendingInviter": "En attente de son abonnement",
   "workspace.referral.reward.source.pendingInvitee": "Abonnez-vous pour débloquer la récompense",
   "workspace.referral.reward.source.available": "Récompense prête à utiliser",
   "workspace.referral.reward.source.applied": "Récompense utilisée",
-  "workspace.referral.reward.status.applied": "Utilisée",
-  "workspace.referral.reward.status.pendingInviter": "Utiliser",
-  "workspace.referral.reward.status.pendingInvitee": "Utiliser",
-  "workspace.referral.apply.noGo": "S'abonner à Go",
-  "workspace.referral.apply.preview": "Aperçu",
+  "workspace.referral.reward.status.applied": "Récompense utilisée",
+  "workspace.referral.reward.status.pendingInviter": "Abonnez-vous pour débloquer",
+  "workspace.referral.reward.status.pendingInvitee": "Abonnez-vous pour débloquer",
+  "workspace.referral.apply.noGo": "Abonnez-vous pour débloquer",
+  "workspace.referral.apply.preview": "Voir la récompense",
   "workspace.referral.apply.action": "Utiliser",
-  "workspace.referral.apply.confirmTitle": "Utiliser la récompense Go",
-  "workspace.referral.apply.confirmBody":
-    "Utilisez {{amount}} pour réduire les compteurs d'utilisation Go actuels de ce workspace.",
+  "workspace.referral.apply.confirmTitle": "Utiliser la récompense",
+  "workspace.referral.apply.confirmBody": "Utilisez {{amount}} pour réduire l'utilisation actuelle de ce workspace.",
   "workspace.referral.apply.confirmAction": "Utiliser",
 
   "download.title": "OpenCode | Téléchargement",

+ 18 - 16
packages/console/app/src/i18n/it.ts

@@ -670,33 +670,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Copia link",
   "workspace.referral.copied": "Copiato",
-  "workspace.referral.overview.title": "Invita amici su Go",
-  "workspace.referral.overview.subtitle": "Guadagna $5 di credito Go quando un amico si abbona. Anche lui riceverà $5.",
-  "workspace.referral.stats.invites": "Inviti",
-  "workspace.referral.stats.earned": "Guadagnato",
-  "workspace.referral.stats.applied": "Utilizzato",
-  "workspace.referral.instructions.share": "Condividi il tuo link di invito",
-  "workspace.referral.instructions.subscribe": "Il tuo amico si abbona a Go",
-  "workspace.referral.instructions.claim": "Usa il tuo credito di $5 qui sotto",
+  "workspace.referral.overview.title": "Invita amici",
+  "workspace.referral.overview.subtitle": "Guadagna $5 quando un amico si abbona. Anche lui riceverà $5.",
+  "workspace.referral.instructions.share": "Condividi il tuo link di referral",
+  "workspace.referral.instructions.subscribe": "Il tuo amico si iscrive e si abbona a Go",
+  "workspace.referral.instructions.claim": "Entrambi ricevete un credito di utilizzo di $5 da applicare ai vostri limiti di utilizzo Go",
   "workspace.referral.rewards.title": "Premi referral",
+  "workspace.referral.rewards.description": "Applica i crediti referral disponibili al tuo utilizzo di Go.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} premi utilizzati.",
   "workspace.referral.rewards.empty": "Nessun premio referral ancora.",
   "workspace.referral.table.reward": "Premio",
   "workspace.referral.table.referral": "Descrizione",
   "workspace.referral.table.date": "Data",
+  "workspace.referral.reward.description.inviter": "Hai invitato {{email}}",
+  "workspace.referral.reward.description.invitee": "Invitato da {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Abbonati per sbloccare",
+  "workspace.referral.reward.action.view": "Vedi premio",
+  "workspace.referral.reward.action.applied": "Premio utilizzato",
   "workspace.referral.reward.source.pendingInviter": "In attesa che si abboni",
   "workspace.referral.reward.source.pendingInvitee": "Abbonati per sbloccare il premio",
   "workspace.referral.reward.source.available": "Premio pronto da utilizzare",
   "workspace.referral.reward.source.applied": "Premio utilizzato",
-  "workspace.referral.reward.status.applied": "Utilizzato",
-  "workspace.referral.reward.status.pendingInviter": "Utilizza",
-  "workspace.referral.reward.status.pendingInvitee": "Utilizza",
-  "workspace.referral.apply.noGo": "Abbonati a Go",
-  "workspace.referral.apply.preview": "Anteprima",
+  "workspace.referral.reward.status.applied": "Premio utilizzato",
+  "workspace.referral.reward.status.pendingInviter": "Abbonati per sbloccare",
+  "workspace.referral.reward.status.pendingInvitee": "Abbonati per sbloccare",
+  "workspace.referral.apply.noGo": "Abbonati per sbloccare",
+  "workspace.referral.apply.preview": "Vedi premio",
   "workspace.referral.apply.action": "Utilizza",
-  "workspace.referral.apply.confirmTitle": "Utilizza premio Go",
-  "workspace.referral.apply.confirmBody":
-    "Utilizza {{amount}} per ridurre i contatori di utilizzo Go attuali di questo workspace.",
+  "workspace.referral.apply.confirmTitle": "Utilizza premio",
+  "workspace.referral.apply.confirmBody": "Utilizza {{amount}} per ridurre l'utilizzo attuale di questo workspace.",
   "workspace.referral.apply.confirmAction": "Utilizza",
 
   "download.title": "OpenCode | Download",

+ 18 - 17
packages/console/app/src/i18n/ja.ts

@@ -670,34 +670,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "リンクをコピー",
   "workspace.referral.copied": "コピーしました",
-  "workspace.referral.overview.title": "友達を Go に招待",
-  "workspace.referral.overview.subtitle":
-    "友達がサブスクライブすると $5 分の Go クレジットを獲得。友達にも $5 が付与されます。",
-  "workspace.referral.stats.invites": "招待",
-  "workspace.referral.stats.earned": "獲得",
-  "workspace.referral.stats.applied": "適用済み",
-  "workspace.referral.instructions.share": "招待リンクをシェア",
-  "workspace.referral.instructions.subscribe": "友達が Go にサブスクライブ",
-  "workspace.referral.instructions.claim": "下の $5 クレジットを適用",
+  "workspace.referral.overview.title": "友達を招待",
+  "workspace.referral.overview.subtitle": "友達がサブスクライブすると $5 を獲得。友達にも $5 が付与されます。",
+  "workspace.referral.instructions.share": "リファラルリンクをシェア",
+  "workspace.referral.instructions.subscribe": "友達が参加して Go にサブスクライブ",
+  "workspace.referral.instructions.claim": "二人とも $5 の利用クレジットを獲得し、Go の利用上限に充当できます",
   "workspace.referral.rewards.title": "リファラル特典",
+  "workspace.referral.rewards.description": "利用可能なリファラルクレジットを Go の利用に適用します。",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} 件の特典を適用済み。",
   "workspace.referral.rewards.empty": "リファラル特典はまだありません。",
   "workspace.referral.table.reward": "特典",
   "workspace.referral.table.referral": "説明",
   "workspace.referral.table.date": "日付",
+  "workspace.referral.reward.description.inviter": "{{email}} を招待しました",
+  "workspace.referral.reward.description.invitee": "{{email}} に招待されました",
+  "workspace.referral.reward.action.subscribeUnlock": "サブスクライブしてアンロック",
+  "workspace.referral.reward.action.view": "特典を表示",
+  "workspace.referral.reward.action.applied": "特典を適用済み",
   "workspace.referral.reward.source.pendingInviter": "友達のサブスクライブ待ち",
   "workspace.referral.reward.source.pendingInvitee": "サブスクライブして特典をアンロック",
   "workspace.referral.reward.source.available": "特典は適用可能です",
   "workspace.referral.reward.source.applied": "特典を適用済み",
-  "workspace.referral.reward.status.applied": "適用済み",
-  "workspace.referral.reward.status.pendingInviter": "適用",
-  "workspace.referral.reward.status.pendingInvitee": "適用",
-  "workspace.referral.apply.noGo": "Goを購読する",
-  "workspace.referral.apply.preview": "プレビュー",
+  "workspace.referral.reward.status.applied": "特典を適用済み",
+  "workspace.referral.reward.status.pendingInviter": "サブスクライブしてアンロック",
+  "workspace.referral.reward.status.pendingInvitee": "サブスクライブしてアンロック",
+  "workspace.referral.apply.noGo": "サブスクライブしてアンロック",
+  "workspace.referral.apply.preview": "特典を表示",
   "workspace.referral.apply.action": "適用",
-  "workspace.referral.apply.confirmTitle": "Go 特典を適用",
-  "workspace.referral.apply.confirmBody":
-    "{{amount}} を適用して、このワークスペースの現在の Go 使用カウンターを減らします。",
+  "workspace.referral.apply.confirmTitle": "特典を適用",
+  "workspace.referral.apply.confirmBody": "{{amount}} を適用して、このワークスペースの現在の使用量を減らします。",
   "workspace.referral.apply.confirmAction": "適用",
 
   "download.title": "OpenCode | ダウンロード",

+ 18 - 15
packages/console/app/src/i18n/ko.ts

@@ -662,32 +662,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "링크 복사",
   "workspace.referral.copied": "복사됨",
-  "workspace.referral.overview.title": "친구를 Go에 초대",
-  "workspace.referral.overview.subtitle": "친구가 구독하면 $5의 Go 크레딧을 받으세요. 친구도 $5를 받습니다.",
-  "workspace.referral.stats.invites": "초대",
-  "workspace.referral.stats.earned": "획득",
-  "workspace.referral.stats.applied": "사용",
-  "workspace.referral.instructions.share": "초대 링크 공유",
-  "workspace.referral.instructions.subscribe": "친구가 Go를 구독",
-  "workspace.referral.instructions.claim": "아래에서 $5 크레딧 사용",
+  "workspace.referral.overview.title": "친구 초대",
+  "workspace.referral.overview.subtitle": "친구가 구독하면 $5를 받으세요. 친구도 $5를 받습니다.",
+  "workspace.referral.instructions.share": "추천 링크 공유",
+  "workspace.referral.instructions.subscribe": "친구가 가입하고 Go를 구독",
+  "workspace.referral.instructions.claim": "두 분 모두 $5 사용 크레딧을 받아 Go 사용 한도에 적용할 수 있습니다",
   "workspace.referral.rewards.title": "추천 보상",
+  "workspace.referral.rewards.description": "사용 가능한 추천 크레딧을 Go 사용량에 적용합니다.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}}개 보상 사용됨.",
   "workspace.referral.rewards.empty": "아직 추천 보상이 없습니다.",
   "workspace.referral.table.reward": "보상",
   "workspace.referral.table.referral": "설명",
   "workspace.referral.table.date": "날짜",
+  "workspace.referral.reward.description.inviter": "{{email}} 초대됨",
+  "workspace.referral.reward.description.invitee": "{{email}}님이 초대",
+  "workspace.referral.reward.action.subscribeUnlock": "구독하여 잠금 해제",
+  "workspace.referral.reward.action.view": "보상 보기",
+  "workspace.referral.reward.action.applied": "보상 사용됨",
   "workspace.referral.reward.source.pendingInviter": "친구의 구독을 기다리는 중",
   "workspace.referral.reward.source.pendingInvitee": "구독하여 보상 잠금 해제",
   "workspace.referral.reward.source.available": "보상 사용 가능",
   "workspace.referral.reward.source.applied": "보상 사용됨",
-  "workspace.referral.reward.status.applied": "사용됨",
-  "workspace.referral.reward.status.pendingInviter": "사용",
-  "workspace.referral.reward.status.pendingInvitee": "사용",
-  "workspace.referral.apply.noGo": "Go 구독하기",
-  "workspace.referral.apply.preview": "미리 보기",
+  "workspace.referral.reward.status.applied": "보상 사용됨",
+  "workspace.referral.reward.status.pendingInviter": "구독하여 잠금 해제",
+  "workspace.referral.reward.status.pendingInvitee": "구독하여 잠금 해제",
+  "workspace.referral.apply.noGo": "구독하여 잠금 해제",
+  "workspace.referral.apply.preview": "보상 보기",
   "workspace.referral.apply.action": "사용",
-  "workspace.referral.apply.confirmTitle": "Go 보상 사용",
-  "workspace.referral.apply.confirmBody": "{{amount}}를 사용하여 이 워크스페이스의 현재 Go 사용 카운터를 줄입니다.",
+  "workspace.referral.apply.confirmTitle": "보상 사용",
+  "workspace.referral.apply.confirmBody": "{{amount}}를 사용하여 이 워크스페이스의 현재 사용량을 줄입니다.",
   "workspace.referral.apply.confirmAction": "사용",
 
   "download.title": "OpenCode | 다운로드",

+ 18 - 16
packages/console/app/src/i18n/no.ts

@@ -669,33 +669,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Kopier lenke",
   "workspace.referral.copied": "Kopiert",
-  "workspace.referral.overview.title": "Inviter venner til Go",
-  "workspace.referral.overview.subtitle": "Få $5 i Go-kreditt når en venn abonnerer. De får også $5.",
-  "workspace.referral.stats.invites": "Invitasjoner",
-  "workspace.referral.stats.earned": "Opptjent",
-  "workspace.referral.stats.applied": "Brukt",
-  "workspace.referral.instructions.share": "Del invitasjonslenken din",
-  "workspace.referral.instructions.subscribe": "Vennen din abonnerer på Go",
-  "workspace.referral.instructions.claim": "Bruk $5-kreditten din nedenfor",
+  "workspace.referral.overview.title": "Inviter venner",
+  "workspace.referral.overview.subtitle": "Få $5 når en venn abonnerer. De får også $5.",
+  "workspace.referral.instructions.share": "Del henvisningslenken din",
+  "workspace.referral.instructions.subscribe": "Vennen din blir med og abonnerer på Go",
+  "workspace.referral.instructions.claim": "Dere får begge $5 i brukskreditt å bruke på Go-bruksgrensene deres",
   "workspace.referral.rewards.title": "Henvisningsbelønninger",
+  "workspace.referral.rewards.description": "Bruk tilgjengelige henvisningskreditter på Go-bruken din.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} belønninger brukt.",
   "workspace.referral.rewards.empty": "Ingen henvisningsbelønninger ennå.",
   "workspace.referral.table.reward": "Belønning",
   "workspace.referral.table.referral": "Beskrivelse",
   "workspace.referral.table.date": "Dato",
+  "workspace.referral.reward.description.inviter": "Inviterte {{email}}",
+  "workspace.referral.reward.description.invitee": "Invitert av {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Abonner for å låse opp",
+  "workspace.referral.reward.action.view": "Vis belønning",
+  "workspace.referral.reward.action.applied": "Belønning brukt",
   "workspace.referral.reward.source.pendingInviter": "Venter på at de abonnerer",
   "workspace.referral.reward.source.pendingInvitee": "Abonner for å låse opp belønningen",
   "workspace.referral.reward.source.available": "Belønning klar til bruk",
   "workspace.referral.reward.source.applied": "Belønning brukt",
-  "workspace.referral.reward.status.applied": "Brukt",
-  "workspace.referral.reward.status.pendingInviter": "Bruk",
-  "workspace.referral.reward.status.pendingInvitee": "Bruk",
-  "workspace.referral.apply.noGo": "Abonner på Go",
-  "workspace.referral.apply.preview": "Forhåndsvis",
+  "workspace.referral.reward.status.applied": "Belønning brukt",
+  "workspace.referral.reward.status.pendingInviter": "Abonner for å låse opp",
+  "workspace.referral.reward.status.pendingInvitee": "Abonner for å låse opp",
+  "workspace.referral.apply.noGo": "Abonner for å låse opp",
+  "workspace.referral.apply.preview": "Vis belønning",
   "workspace.referral.apply.action": "Bruk",
-  "workspace.referral.apply.confirmTitle": "Bruk Go-belønning",
-  "workspace.referral.apply.confirmBody":
-    "Bruk {{amount}} for å redusere dette workspacets nåværende Go-forbrukstellere.",
+  "workspace.referral.apply.confirmTitle": "Bruk belønning",
+  "workspace.referral.apply.confirmBody": "Bruk {{amount}} for å redusere dette workspacets nåværende forbruk.",
   "workspace.referral.apply.confirmAction": "Bruk",
 
   "download.title": "OpenCode | Last ned",

+ 18 - 16
packages/console/app/src/i18n/pl.ts

@@ -670,33 +670,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Kopiuj link",
   "workspace.referral.copied": "Skopiowano",
-  "workspace.referral.overview.title": "Zaproś znajomych do Go",
-  "workspace.referral.overview.subtitle": "Zdobądź $5 kredytu Go, gdy znajomy się zasubskrybuje. On też dostanie $5.",
-  "workspace.referral.stats.invites": "Zaproszenia",
-  "workspace.referral.stats.earned": "Zdobyte",
-  "workspace.referral.stats.applied": "Wykorzystane",
-  "workspace.referral.instructions.share": "Udostępnij swój link z zaproszeniem",
-  "workspace.referral.instructions.subscribe": "Twój znajomy subskrybuje Go",
-  "workspace.referral.instructions.claim": "Wykorzystaj swój kredyt $5 poniżej",
+  "workspace.referral.overview.title": "Zaproś znajomych",
+  "workspace.referral.overview.subtitle": "Zdobądź $5, gdy znajomy się zasubskrybuje. On też dostanie $5.",
+  "workspace.referral.instructions.share": "Udostępnij swój link polecający",
+  "workspace.referral.instructions.subscribe": "Twój znajomy dołącza i subskrybuje Go",
+  "workspace.referral.instructions.claim": "Oboje otrzymujecie kredyt $5 do wykorzystania na limity użycia Go",
   "workspace.referral.rewards.title": "Nagrody za polecenia",
+  "workspace.referral.rewards.description": "Wykorzystaj dostępne środki za polecenia na swoje użycie Go.",
   "workspace.referral.rewards.subtitle": "Wykorzystano {{applied}} / {{total}} nagród.",
   "workspace.referral.rewards.empty": "Brak nagród za polecenia.",
   "workspace.referral.table.reward": "Nagroda",
   "workspace.referral.table.referral": "Opis",
   "workspace.referral.table.date": "Data",
+  "workspace.referral.reward.description.inviter": "Zaproszono {{email}}",
+  "workspace.referral.reward.description.invitee": "Zaproszony przez {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Subskrybuj, aby odblokować",
+  "workspace.referral.reward.action.view": "Zobacz nagrodę",
+  "workspace.referral.reward.action.applied": "Nagroda wykorzystana",
   "workspace.referral.reward.source.pendingInviter": "Oczekiwanie na jego subskrypcję",
   "workspace.referral.reward.source.pendingInvitee": "Subskrybuj, aby odblokować nagrodę",
   "workspace.referral.reward.source.available": "Nagroda gotowa do wykorzystania",
   "workspace.referral.reward.source.applied": "Nagroda wykorzystana",
-  "workspace.referral.reward.status.applied": "Wykorzystana",
-  "workspace.referral.reward.status.pendingInviter": "Wykorzystaj",
-  "workspace.referral.reward.status.pendingInvitee": "Wykorzystaj",
-  "workspace.referral.apply.noGo": "Subskrybuj Go",
-  "workspace.referral.apply.preview": "Podgląd",
+  "workspace.referral.reward.status.applied": "Nagroda wykorzystana",
+  "workspace.referral.reward.status.pendingInviter": "Subskrybuj, aby odblokować",
+  "workspace.referral.reward.status.pendingInvitee": "Subskrybuj, aby odblokować",
+  "workspace.referral.apply.noGo": "Subskrybuj, aby odblokować",
+  "workspace.referral.apply.preview": "Zobacz nagrodę",
   "workspace.referral.apply.action": "Wykorzystaj",
-  "workspace.referral.apply.confirmTitle": "Wykorzystaj nagrodę Go",
-  "workspace.referral.apply.confirmBody":
-    "Wykorzystaj {{amount}}, aby zmniejszyć aktualne liczniki użycia Go w tym workspace.",
+  "workspace.referral.apply.confirmTitle": "Wykorzystaj nagrodę",
+  "workspace.referral.apply.confirmBody": "Wykorzystaj {{amount}}, aby zmniejszyć aktualne użycie w tym workspace.",
   "workspace.referral.apply.confirmAction": "Wykorzystaj",
 
   "download.title": "OpenCode | Pobierz",

+ 18 - 16
packages/console/app/src/i18n/ru.ts

@@ -676,33 +676,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Копировать ссылку",
   "workspace.referral.copied": "Скопировано",
-  "workspace.referral.overview.title": "Пригласите друзей в Go",
-  "workspace.referral.overview.subtitle": "Получите $5 кредита Go, когда друг оформит подписку. Он тоже получит $5.",
-  "workspace.referral.stats.invites": "Приглашения",
-  "workspace.referral.stats.earned": "Заработано",
-  "workspace.referral.stats.applied": "Использовано",
-  "workspace.referral.instructions.share": "Поделитесь своей ссылкой-приглашением",
-  "workspace.referral.instructions.subscribe": "Ваш друг оформляет подписку на Go",
-  "workspace.referral.instructions.claim": "Используйте свой кредит $5 ниже",
+  "workspace.referral.overview.title": "Пригласите друзей",
+  "workspace.referral.overview.subtitle": "Получите $5, когда друг оформит подписку. Он тоже получит $5.",
+  "workspace.referral.instructions.share": "Поделитесь своей реферальной ссылкой",
+  "workspace.referral.instructions.subscribe": "Ваш друг присоединяется и оформляет подписку на Go",
+  "workspace.referral.instructions.claim": "Вы оба получаете кредит на использование $5, который можно применить к лимитам использования Go",
   "workspace.referral.rewards.title": "Реферальные награды",
+  "workspace.referral.rewards.description": "Используйте доступные реферальные кредиты для оплаты использования Go.",
   "workspace.referral.rewards.subtitle": "Использовано {{applied}} / {{total}} наград.",
   "workspace.referral.rewards.empty": "Реферальных наград пока нет.",
   "workspace.referral.table.reward": "Награда",
   "workspace.referral.table.referral": "Описание",
   "workspace.referral.table.date": "Дата",
+  "workspace.referral.reward.description.inviter": "Приглашён {{email}}",
+  "workspace.referral.reward.description.invitee": "Приглашены пользователем {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "Оформите подписку для разблокировки",
+  "workspace.referral.reward.action.view": "Посмотреть награду",
+  "workspace.referral.reward.action.applied": "Награда использована",
   "workspace.referral.reward.source.pendingInviter": "Ожидание его подписки",
   "workspace.referral.reward.source.pendingInvitee": "Подпишитесь, чтобы разблокировать награду",
   "workspace.referral.reward.source.available": "Награда готова к применению",
   "workspace.referral.reward.source.applied": "Награда использована",
-  "workspace.referral.reward.status.applied": "Использована",
-  "workspace.referral.reward.status.pendingInviter": "Применить",
-  "workspace.referral.reward.status.pendingInvitee": "Применить",
-  "workspace.referral.apply.noGo": "Подписаться на Go",
-  "workspace.referral.apply.preview": "Предпросмотр",
+  "workspace.referral.reward.status.applied": "Награда использована",
+  "workspace.referral.reward.status.pendingInviter": "Оформите подписку для разблокировки",
+  "workspace.referral.reward.status.pendingInvitee": "Оформите подписку для разблокировки",
+  "workspace.referral.apply.noGo": "Оформите подписку для разблокировки",
+  "workspace.referral.apply.preview": "Посмотреть награду",
   "workspace.referral.apply.action": "Применить",
-  "workspace.referral.apply.confirmTitle": "Применить награду Go",
-  "workspace.referral.apply.confirmBody":
-    "Используйте {{amount}}, чтобы уменьшить текущие счётчики использования Go этого workspace.",
+  "workspace.referral.apply.confirmTitle": "Применить награду",
+  "workspace.referral.apply.confirmBody": "Используйте {{amount}}, чтобы уменьшить текущее использование этого workspace.",
   "workspace.referral.apply.confirmAction": "Применить",
 
   "download.title": "OpenCode | Скачать",

+ 18 - 15
packages/console/app/src/i18n/th.ts

@@ -665,32 +665,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "คัดลอกลิงก์",
   "workspace.referral.copied": "คัดลอกแล้ว",
-  "workspace.referral.overview.title": "ชวนเพื่อนมาใช้ Go",
-  "workspace.referral.overview.subtitle": "รับเครดิต Go $5 เมื่อเพื่อนสมัครสมาชิก เพื่อนก็จะได้รับ $5 เช่นกัน",
-  "workspace.referral.stats.invites": "คำเชิญ",
-  "workspace.referral.stats.earned": "ได้รับ",
-  "workspace.referral.stats.applied": "ใช้แล้ว",
-  "workspace.referral.instructions.share": "แชร์ลิงก์เชิญของคุณ",
-  "workspace.referral.instructions.subscribe": "เพื่อนของคุณสมัครสมาชิก Go",
-  "workspace.referral.instructions.claim": "ใช้เครดิต $5 ของคุณด้านล่าง",
+  "workspace.referral.overview.title": "ชวนเพื่อน",
+  "workspace.referral.overview.subtitle": "รับ $5 เมื่อเพื่อนสมัครสมาชิก เพื่อนก็จะได้รับ $5 เช่นกัน",
+  "workspace.referral.instructions.share": "แชร์ลิงก์แนะนำของคุณ",
+  "workspace.referral.instructions.subscribe": "เพื่อนของคุณเข้าร่วมและสมัครสมาชิก Go",
+  "workspace.referral.instructions.claim": "คุณทั้งคู่จะได้รับเครดิตการใช้งาน $5 เพื่อใช้กับขีดจำกัดการใช้งาน Go",
   "workspace.referral.rewards.title": "รางวัลการแนะนำ",
+  "workspace.referral.rewards.description": "ใช้เครดิตการแนะนำที่มีอยู่กับการใช้งาน Go ของคุณ",
   "workspace.referral.rewards.subtitle": "ใช้แล้ว {{applied}} / {{total}} รางวัล",
   "workspace.referral.rewards.empty": "ยังไม่มีรางวัลการแนะนำ",
   "workspace.referral.table.reward": "รางวัล",
   "workspace.referral.table.referral": "คำอธิบาย",
   "workspace.referral.table.date": "วันที่",
+  "workspace.referral.reward.description.inviter": "เชิญ {{email}}",
+  "workspace.referral.reward.description.invitee": "ได้รับเชิญจาก {{email}}",
+  "workspace.referral.reward.action.subscribeUnlock": "สมัครสมาชิกเพื่อปลดล็อก",
+  "workspace.referral.reward.action.view": "ดูรางวัล",
+  "workspace.referral.reward.action.applied": "ใช้รางวัลแล้ว",
   "workspace.referral.reward.source.pendingInviter": "รอเพื่อนสมัครสมาชิก",
   "workspace.referral.reward.source.pendingInvitee": "สมัครสมาชิกเพื่อปลดล็อกรางวัล",
   "workspace.referral.reward.source.available": "รางวัลพร้อมใช้งาน",
   "workspace.referral.reward.source.applied": "ใช้รางวัลแล้ว",
-  "workspace.referral.reward.status.applied": "ใช้แล้ว",
-  "workspace.referral.reward.status.pendingInviter": "ใช้",
-  "workspace.referral.reward.status.pendingInvitee": "ใช้",
-  "workspace.referral.apply.noGo": "สมัครสมาชิก Go",
-  "workspace.referral.apply.preview": "ดูตัวอย่าง",
+  "workspace.referral.reward.status.applied": "ใช้รางวัลแล้ว",
+  "workspace.referral.reward.status.pendingInviter": "สมัครสมาชิกเพื่อปลดล็อก",
+  "workspace.referral.reward.status.pendingInvitee": "สมัครสมาชิกเพื่อปลดล็อก",
+  "workspace.referral.apply.noGo": "สมัครสมาชิกเพื่อปลดล็อก",
+  "workspace.referral.apply.preview": "ดูรางวัล",
   "workspace.referral.apply.action": "ใช้",
-  "workspace.referral.apply.confirmTitle": "ใช้รางวัล Go",
-  "workspace.referral.apply.confirmBody": "ใช้ {{amount}} เพื่อลดตัวนับการใช้งาน Go ปัจจุบันของ workspace นี้",
+  "workspace.referral.apply.confirmTitle": "ใช้รางวัล",
+  "workspace.referral.apply.confirmBody": "ใช้ {{amount}} เพื่อลดการใช้งานปัจจุบันของ workspace นี้",
   "workspace.referral.apply.confirmAction": "ใช้",
 
   "download.title": "OpenCode | ดาวน์โหลด",

+ 18 - 16
packages/console/app/src/i18n/tr.ts

@@ -672,33 +672,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "Bağlantıyı Kopyala",
   "workspace.referral.copied": "Kopyalandı",
-  "workspace.referral.overview.title": "Arkadaşlarını Go'ya davet et",
-  "workspace.referral.overview.subtitle": "Bir arkadaşın abone olduğunda $5 Go kredisi kazan. O da $5 alacak.",
-  "workspace.referral.stats.invites": "Davetler",
-  "workspace.referral.stats.earned": "Kazanılan",
-  "workspace.referral.stats.applied": "Kullanılan",
-  "workspace.referral.instructions.share": "Davet bağlantını paylaş",
-  "workspace.referral.instructions.subscribe": "Arkadaşın Go'ya abone olur",
-  "workspace.referral.instructions.claim": "Aşağıdaki $5 kredini kullan",
+  "workspace.referral.overview.title": "Arkadaşlarını davet et",
+  "workspace.referral.overview.subtitle": "Bir arkadaşın abone olduğunda $5 kazan. O da $5 alacak.",
+  "workspace.referral.instructions.share": "Referans bağlantını paylaş",
+  "workspace.referral.instructions.subscribe": "Arkadaşın katılır ve Go'ya abone olur",
+  "workspace.referral.instructions.claim": "İkiniz de Go kullanım limitlerinize uygulamak için $5 kullanım kredisi alırsınız",
   "workspace.referral.rewards.title": "Davet ödülleri",
+  "workspace.referral.rewards.description": "Mevcut davet kredilerini Go kullanımınıza uygulayın.",
   "workspace.referral.rewards.subtitle": "{{applied}} / {{total}} ödül kullanıldı.",
   "workspace.referral.rewards.empty": "Henüz davet ödülü yok.",
   "workspace.referral.table.reward": "Ödül",
   "workspace.referral.table.referral": "Açıklama",
   "workspace.referral.table.date": "Tarih",
+  "workspace.referral.reward.description.inviter": "{{email}} davet edildi",
+  "workspace.referral.reward.description.invitee": "{{email}} tarafından davet edildi",
+  "workspace.referral.reward.action.subscribeUnlock": "Kilidi açmak için abone ol",
+  "workspace.referral.reward.action.view": "Ödülü Görüntüle",
+  "workspace.referral.reward.action.applied": "Ödül Kullanıldı",
   "workspace.referral.reward.source.pendingInviter": "Abone olması bekleniyor",
   "workspace.referral.reward.source.pendingInvitee": "Ödülün kilidini açmak için abone ol",
   "workspace.referral.reward.source.available": "Ödül kullanıma hazır",
   "workspace.referral.reward.source.applied": "Ödül kullanıldı",
-  "workspace.referral.reward.status.applied": "Kullanıldı",
-  "workspace.referral.reward.status.pendingInviter": "Kullan",
-  "workspace.referral.reward.status.pendingInvitee": "Kullan",
-  "workspace.referral.apply.noGo": "Go'ya Abone Ol",
-  "workspace.referral.apply.preview": "Önizleme",
+  "workspace.referral.reward.status.applied": "Ödül Kullanıldı",
+  "workspace.referral.reward.status.pendingInviter": "Kilidi açmak için abone ol",
+  "workspace.referral.reward.status.pendingInvitee": "Kilidi açmak için abone ol",
+  "workspace.referral.apply.noGo": "Kilidi açmak için abone ol",
+  "workspace.referral.apply.preview": "Ödülü Görüntüle",
   "workspace.referral.apply.action": "Kullan",
-  "workspace.referral.apply.confirmTitle": "Go ödülünü kullan",
-  "workspace.referral.apply.confirmBody":
-    "Bu workspace'in mevcut Go kullanım sayaçlarını azaltmak için {{amount}} kullan.",
+  "workspace.referral.apply.confirmTitle": "Ödülü kullan",
+  "workspace.referral.apply.confirmBody": "Bu workspace'in mevcut kullanımını azaltmak için {{amount}} kullan.",
   "workspace.referral.apply.confirmAction": "Kullan",
 
   "download.title": "OpenCode | İndir",

+ 18 - 15
packages/console/app/src/i18n/zh.ts

@@ -645,32 +645,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "复制链接",
   "workspace.referral.copied": "已复制",
-  "workspace.referral.overview.title": "邀请好友使用 Go",
-  "workspace.referral.overview.subtitle": "好友订阅后,您可获得 $5 Go 抵用金,对方也可获得 $5。",
-  "workspace.referral.stats.invites": "邀请",
-  "workspace.referral.stats.earned": "已获得",
-  "workspace.referral.stats.applied": "已使用",
-  "workspace.referral.instructions.share": "分享您的邀请链接。",
-  "workspace.referral.instructions.subscribe": "好友订阅 Go。",
-  "workspace.referral.instructions.claim": "在下方使用您的 $5 抵用金。",
+  "workspace.referral.overview.title": "邀请好友",
+  "workspace.referral.overview.subtitle": "好友订阅后,您可获得 $5,对方也可获得 $5。",
+  "workspace.referral.instructions.share": "分享您的推荐链接。",
+  "workspace.referral.instructions.subscribe": "好友加入并订阅 Go。",
+  "workspace.referral.instructions.claim": "你们都将获得 $5 使用额度,可用于您的 Go 使用限额。",
   "workspace.referral.rewards.title": "邀请奖励",
+  "workspace.referral.rewards.description": "将可用的邀请积分应用到您的 Go 用量。",
   "workspace.referral.rewards.subtitle": "已使用 {{applied}} / {{total}} 个奖励。",
   "workspace.referral.rewards.empty": "暂无邀请奖励。",
   "workspace.referral.table.reward": "奖励",
   "workspace.referral.table.referral": "描述",
   "workspace.referral.table.date": "日期",
+  "workspace.referral.reward.description.inviter": "已邀请 {{email}}",
+  "workspace.referral.reward.description.invitee": "由 {{email}} 邀请",
+  "workspace.referral.reward.action.subscribeUnlock": "订阅以解锁",
+  "workspace.referral.reward.action.view": "查看奖励",
+  "workspace.referral.reward.action.applied": "奖励已使用",
   "workspace.referral.reward.source.pendingInviter": "等待对方订阅",
   "workspace.referral.reward.source.pendingInvitee": "订阅即可解锁奖励",
   "workspace.referral.reward.source.available": "奖励可使用",
   "workspace.referral.reward.source.applied": "奖励已使用",
-  "workspace.referral.reward.status.applied": "已使用",
-  "workspace.referral.reward.status.pendingInviter": "等待订阅",
-  "workspace.referral.reward.status.pendingInvitee": "订阅后解锁",
-  "workspace.referral.apply.noGo": "订阅 Go",
-  "workspace.referral.apply.preview": "预览",
+  "workspace.referral.reward.status.applied": "奖励已使用",
+  "workspace.referral.reward.status.pendingInviter": "订阅以解锁",
+  "workspace.referral.reward.status.pendingInvitee": "订阅以解锁",
+  "workspace.referral.apply.noGo": "订阅以解锁",
+  "workspace.referral.apply.preview": "查看奖励",
   "workspace.referral.apply.action": "使用",
-  "workspace.referral.apply.confirmTitle": "使用 Go 奖励",
-  "workspace.referral.apply.confirmBody": "使用 {{amount}} 抵扣当前工作区的 Go 用量计数。",
+  "workspace.referral.apply.confirmTitle": "使用奖励",
+  "workspace.referral.apply.confirmBody": "使用 {{amount}} 抵扣当前工作区的用量。",
   "workspace.referral.apply.confirmAction": "使用",
 
   "download.title": "OpenCode | 下载",

+ 18 - 15
packages/console/app/src/i18n/zht.ts

@@ -645,32 +645,35 @@ export const dict = {
 
   "workspace.referral.copyLink": "複製連結",
   "workspace.referral.copied": "已複製",
-  "workspace.referral.overview.title": "邀請朋友使用 Go",
-  "workspace.referral.overview.subtitle": "朋友訂閱後,您可獲得 $5 Go 抵用金,對方也可獲得 $5。",
-  "workspace.referral.stats.invites": "邀請",
-  "workspace.referral.stats.earned": "已獲得",
-  "workspace.referral.stats.applied": "已使用",
-  "workspace.referral.instructions.share": "分享您的邀請連結。",
-  "workspace.referral.instructions.subscribe": "朋友訂閱 Go。",
-  "workspace.referral.instructions.claim": "在下方使用您的 $5 抵用金。",
+  "workspace.referral.overview.title": "邀請朋友",
+  "workspace.referral.overview.subtitle": "朋友訂閱後,您可獲得 $5,對方也可獲得 $5。",
+  "workspace.referral.instructions.share": "分享您的推薦連結。",
+  "workspace.referral.instructions.subscribe": "朋友加入並訂閱 Go。",
+  "workspace.referral.instructions.claim": "你們都將獲得 $5 使用額度,可用於您的 Go 使用限額。",
   "workspace.referral.rewards.title": "邀請獎勵",
+  "workspace.referral.rewards.description": "將可用的邀請點數套用至您的 Go 使用量。",
   "workspace.referral.rewards.subtitle": "已使用 {{applied}} / {{total}} 個獎勵。",
   "workspace.referral.rewards.empty": "暫無邀請獎勵。",
   "workspace.referral.table.reward": "獎勵",
   "workspace.referral.table.referral": "描述",
   "workspace.referral.table.date": "日期",
+  "workspace.referral.reward.description.inviter": "已邀請 {{email}}",
+  "workspace.referral.reward.description.invitee": "由 {{email}} 邀請",
+  "workspace.referral.reward.action.subscribeUnlock": "訂閱以解鎖",
+  "workspace.referral.reward.action.view": "查看獎勵",
+  "workspace.referral.reward.action.applied": "獎勵已使用",
   "workspace.referral.reward.source.pendingInviter": "等待對方訂閱",
   "workspace.referral.reward.source.pendingInvitee": "訂閱即可解鎖獎勵",
   "workspace.referral.reward.source.available": "獎勵可使用",
   "workspace.referral.reward.source.applied": "獎勵已使用",
-  "workspace.referral.reward.status.applied": "已使用",
-  "workspace.referral.reward.status.pendingInviter": "等待訂閱",
-  "workspace.referral.reward.status.pendingInvitee": "訂閱後解鎖",
-  "workspace.referral.apply.noGo": "訂閱 Go",
-  "workspace.referral.apply.preview": "預覽",
+  "workspace.referral.reward.status.applied": "獎勵已使用",
+  "workspace.referral.reward.status.pendingInviter": "訂閱以解鎖",
+  "workspace.referral.reward.status.pendingInvitee": "訂閱以解鎖",
+  "workspace.referral.apply.noGo": "訂閱以解鎖",
+  "workspace.referral.apply.preview": "查看獎勵",
   "workspace.referral.apply.action": "使用",
-  "workspace.referral.apply.confirmTitle": "使用 Go 獎勵",
-  "workspace.referral.apply.confirmBody": "使用 {{amount}} 抵扣目前工作區的 Go 用量計數。",
+  "workspace.referral.apply.confirmTitle": "使用獎勵",
+  "workspace.referral.apply.confirmBody": "使用 {{amount}} 抵扣目前工作區的用量。",
   "workspace.referral.apply.confirmAction": "使用",
 
   "download.title": "OpenCode | 下載",

+ 2 - 9
packages/console/app/src/routes/go/index.tsx

@@ -1,5 +1,5 @@
 import "./index.css"
-import { createAsync, query, useLocation } from "@solidjs/router"
+import { createAsync, query } from "@solidjs/router"
 import { Title, Meta } from "@solidjs/meta"
 import { For, createMemo, createSignal, onCleanup, onMount } from "solid-js"
 //import { HttpHeader } from "@solidjs/start"
@@ -224,15 +224,8 @@ function LimitsGraph(props: { href: string }) {
 }
 
 export default function Home() {
-  const location = useLocation()
   const workspaceID = createAsync(() => checkLoggedIn())
-  const referralCode = createMemo(() => new URLSearchParams(location.search).get("ref") ?? undefined)
-  const subscribeUrl = createMemo(() => {
-    const code = referralCode()
-    const referral = code ? `?ref=${encodeURIComponent(code)}` : ""
-    if (workspaceID()) return `/workspace/${workspaceID()}/go${referral}`
-    return `/auth${referral}`
-  })
+  const subscribeUrl = createMemo(() => (workspaceID() ? `/workspace/${workspaceID()}/go` : "/auth"))
   const i18n = useI18n()
   const language = useLanguage()
   return (

+ 4 - 7
packages/console/app/src/routes/workspace/[id]/go/index.tsx

@@ -4,13 +4,14 @@ import { IconGo } from "~/component/icon"
 import { GoReferralSection, queryGoReferral } from "~/component/go-referral"
 import { useI18n } from "~/context/i18n"
 import { useLanguage } from "~/context/language"
-import { LiteSection } from "./lite-section"
+import { LiteSection, queryLiteSubscription } from "./lite-section"
 
 export default function () {
   const params = useParams()
   const i18n = useI18n()
   const language = useLanguage()
   const referral = createAsync(() => queryGoReferral(params.id!))
+  const lite = createAsync(() => queryLiteSubscription(params.id!))
 
   return (
     <div data-page="workspace-[id]">
@@ -28,13 +29,9 @@ export default function () {
       </section>
 
       <div data-slot="sections">
-        <LiteSection />
+        <LiteSection lite={lite()} />
         <Show when={referral()} fallback={<section>{i18n.t("workspace.lite.loading")}</section>}>
-          {(summary) => (
-            <Show when={summary().hasActiveGo || summary().rewards.length > 0}>
-              <GoReferralSection workspaceID={params.id!} summary={summary()} />
-            </Show>
-          )}
+          {(summary) => <GoReferralSection workspaceID={params.id!} summary={summary()} lite={lite()} />}
         </Show>
       </div>
     </div>

+ 6 - 5
packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx

@@ -68,6 +68,8 @@ export const queryLiteSubscription = query(async (workspaceID: string) => {
   }, workspaceID)
 }, "lite.subscription.get")
 
+type LiteSubscription = Awaited<ReturnType<typeof queryLiteSubscription>>
+
 const createLiteCheckoutUrl = action(
   async (workspaceID: string, successUrl: string, cancelUrl: string, method?: "alipay" | "upi") => {
     "use server"
@@ -147,13 +149,12 @@ function LiteUsageItem(props: { label: string; usage: { usagePercent: number; re
   )
 }
 
-export function LiteSection() {
+export function LiteSection(props: { lite: LiteSubscription | undefined }) {
   const params = useParams()
   const i18n = useI18n()
   const language = useLanguage()
   const billingInfo = createAsync(() => queryBillingInfo(params.id!))
   const isBlack = createMemo(() => billingInfo()?.subscriptionID || billingInfo()?.timeSubscriptionBooked)
-  const lite = createAsync(() => queryLiteSubscription(params.id!))
   const sessionAction = useAction(createSessionUrl)
   const sessionSubmission = useSubmission(createSessionUrl)
   const checkoutAction = useAction(createLiteCheckoutUrl)
@@ -193,7 +194,7 @@ export function LiteSection() {
           <p data-slot="other-message">{i18n.t("workspace.lite.black.message")}</p>
         </section>
       </Show>
-      <Show when={!isBlack() && lite() && lite()!.mine && lite()!}>
+      <Show when={!isBlack() && props.lite && props.lite.mine && props.lite}>
         {(sub) => (
           <section class={styles.root}>
             <div data-slot="section-title">
@@ -235,12 +236,12 @@ export function LiteSection() {
           </section>
         )}
       </Show>
-      <Show when={!isBlack() && lite() && !lite()!.mine}>
+      <Show when={!isBlack() && props.lite && !props.lite.mine}>
         <section class={styles.root}>
           <p data-slot="other-message">{i18n.t("workspace.lite.other.message")}</p>
         </section>
       </Show>
-      <Show when={!isBlack() && lite() === null}>
+      <Show when={!isBlack() && props.lite === null}>
         <section class={styles.root}>
           <p data-slot="promo-description">
             <For

+ 44 - 38
packages/console/core/src/referral.ts

@@ -1,5 +1,5 @@
 import { z } from "zod"
-import { and, desc, eq, isNull, sql, Database } from "./drizzle"
+import { and, asc, eq, isNull, sql, Database } from "./drizzle"
 import { Actor } from "./actor"
 import { Identifier } from "./identifier"
 import { LiteTable } from "./schema/billing.sql"
@@ -68,7 +68,7 @@ export namespace Referral {
     const accountID = Actor.account()
     const code = await ensureCode(workspaceID)
     const rows = await Database.use(async (tx) => {
-      const [rewards, invites, inviteeReferrals, inviteeRewards, lite] = await Promise.all([
+      const [rewards, invites, inviteeReferral, inviteeRewards] = await Promise.all([
         tx
           .select({
             referralID: ReferralRewardTable.referralID,
@@ -91,8 +91,7 @@ export namespace Referral {
               isNull(ReferralRewardTable.timeDeleted),
               isNull(ReferralTable.timeDeleted),
             ),
-          )
-          .orderBy(desc(ReferralRewardTable.timeCreated)),
+          ),
         tx
           .select({ id: ReferralTable.id, inviteeEmail: AuthTable.subject, timeCreated: ReferralTable.timeCreated })
           .from(ReferralTable)
@@ -102,13 +101,23 @@ export namespace Referral {
           )
           .where(and(eq(ReferralTable.workspaceID, workspaceID), isNull(ReferralTable.timeDeleted))),
         tx
-          .select({ id: ReferralTable.id, inviteeEmail: AuthTable.subject, timeCreated: ReferralTable.timeCreated })
+          .select({ id: ReferralTable.id, inviterEmail: AuthTable.subject, timeCreated: ReferralTable.timeCreated })
           .from(ReferralTable)
-          .innerJoin(
+          .leftJoin(
+            UserTable,
+            and(
+              eq(UserTable.workspaceID, ReferralTable.workspaceID),
+              eq(UserTable.role, "admin"),
+              isNull(UserTable.timeDeleted),
+            ),
+          )
+          .leftJoin(
             AuthTable,
-            and(eq(AuthTable.accountID, ReferralTable.inviteeAccountID), eq(AuthTable.provider, "email")),
+            and(eq(AuthTable.accountID, UserTable.accountID), eq(AuthTable.provider, "email")),
           )
-          .where(and(eq(ReferralTable.inviteeAccountID, accountID), isNull(ReferralTable.timeDeleted))),
+          .where(and(eq(ReferralTable.inviteeAccountID, accountID), isNull(ReferralTable.timeDeleted)))
+          .orderBy(asc(UserTable.timeCreated))
+          .then((rows) => rows.find((row) => row.inviterEmail) ?? rows[0]),
         tx
           .select({ referralID: ReferralRewardTable.referralID })
           .from(ReferralRewardTable)
@@ -120,27 +129,25 @@ export namespace Referral {
               isNull(ReferralTable.timeDeleted),
             ),
           ),
-        tx
-          .select({ id: LiteTable.id })
-          .from(LiteTable)
-          .where(and(eq(LiteTable.workspaceID, workspaceID), isNull(LiteTable.timeDeleted)))
-          .then((result) => result[0]),
       ])
 
-      return { inviteeReferrals, inviteeRewards, invites, lite, rewards }
+      return { inviteeReferral, inviteeRewards, invites, rewards }
     })
 
     const rewardReferralIDs = new Set(rows.rewards.map((reward) => reward.referralID))
     const inviteeRewardReferralIDs = new Set(rows.inviteeRewards.map((reward) => reward.referralID))
-    const rewards = rows.rewards.map((reward) => ({
-      id: reward.referralID,
-      source: reward.workspaceID === reward.referralWorkspaceID ? ("inviter" as const) : ("invitee" as const),
-      status: reward.timeApplied ? ("applied" as const) : ("available" as const),
-      email: reward.inviteeEmail,
-      amount: microCentsToCents(reward.amount),
-      timeCreated: reward.timeCreated,
-      timeApplied: reward.timeApplied,
-    }))
+    const rewards = rows.rewards.map((reward) => {
+      const source = reward.workspaceID === reward.referralWorkspaceID ? ("inviter" as const) : ("invitee" as const)
+      return {
+        id: reward.referralID,
+        source,
+        status: reward.timeApplied ? ("applied" as const) : ("available" as const),
+        email: source === "invitee" ? (rows.inviteeReferral?.inviterEmail ?? null) : reward.inviteeEmail,
+        amount: microCentsToCents(reward.amount),
+        timeCreated: reward.timeCreated,
+        timeApplied: reward.timeApplied,
+      }
+    })
     const pending = [
       ...rows.invites
         .filter((referral) => !rewardReferralIDs.has(referral.id))
@@ -153,28 +160,27 @@ export namespace Referral {
           timeCreated: referral.timeCreated,
           timeApplied: null,
         })),
-      ...rows.inviteeReferrals
-        .filter((referral) => !inviteeRewardReferralIDs.has(referral.id))
-        .map((referral) => ({
-          id: `${referral.id}:invitee`,
-          source: "invitee" as const,
-          status: "pending" as const,
-          email: referral.inviteeEmail,
-          amount: microCentsToCents(REWARD_AMOUNT),
-          timeCreated: referral.timeCreated,
-          timeApplied: null,
-        })),
+      ...(rows.inviteeReferral && !inviteeRewardReferralIDs.has(rows.inviteeReferral.id)
+        ? [
+            {
+              id: `${rows.inviteeReferral.id}:invitee`,
+              source: "invitee" as const,
+              status: "pending" as const,
+              email: rows.inviteeReferral.inviterEmail,
+              amount: microCentsToCents(REWARD_AMOUNT),
+              timeCreated: rows.inviteeReferral.timeCreated,
+              timeApplied: null,
+            },
+          ]
+        : []),
     ]
     const allRewards = [...pending, ...rewards].sort(
       (a, b) => new Date(b.timeCreated).getTime() - new Date(a.timeCreated).getTime(),
     )
     return {
       referralCode: code.code,
-      inviteCount: allRewards.length,
-      hasActiveGo: !!rows.lite,
+      hasReferral: allRewards.length > 0,
       rewardAmount: microCentsToCents(REWARD_AMOUNT),
-      totalEarned: rewards.reduce((total, reward) => total + reward.amount, 0),
-      totalApplied: rewards.filter((reward) => reward.timeApplied).reduce((total, reward) => total + reward.amount, 0),
       rewards: allRewards,
     }
   })

+ 1 - 0
packages/console/core/sst-env.d.ts

@@ -296,6 +296,7 @@ declare module "sst" {
     "AuthStorage": cloudflare.KVNamespace
     "Bucket": cloudflare.R2Bucket
     "EnterpriseStorage": cloudflare.R2Bucket
+    "GatewayKv": cloudflare.KVNamespace
     "LogProcessor": cloudflare.Service
     "Stat": cloudflare.Service
     "ZenData": cloudflare.R2Bucket

+ 1 - 0
packages/console/function/sst-env.d.ts

@@ -296,6 +296,7 @@ declare module "sst" {
     "AuthStorage": cloudflare.KVNamespace
     "Bucket": cloudflare.R2Bucket
     "EnterpriseStorage": cloudflare.R2Bucket
+    "GatewayKv": cloudflare.KVNamespace
     "LogProcessor": cloudflare.Service
     "Stat": cloudflare.Service
     "ZenData": cloudflare.R2Bucket

+ 1 - 0
packages/console/resource/sst-env.d.ts

@@ -296,6 +296,7 @@ declare module "sst" {
     "AuthStorage": cloudflare.KVNamespace
     "Bucket": cloudflare.R2Bucket
     "EnterpriseStorage": cloudflare.R2Bucket
+    "GatewayKv": cloudflare.KVNamespace
     "LogProcessor": cloudflare.Service
     "Stat": cloudflare.Service
     "ZenData": cloudflare.R2Bucket

+ 1 - 0
packages/enterprise/sst-env.d.ts

@@ -296,6 +296,7 @@ declare module "sst" {
     "AuthStorage": cloudflare.KVNamespace
     "Bucket": cloudflare.R2Bucket
     "EnterpriseStorage": cloudflare.R2Bucket
+    "GatewayKv": cloudflare.KVNamespace
     "LogProcessor": cloudflare.Service
     "Stat": cloudflare.Service
     "ZenData": cloudflare.R2Bucket

+ 1 - 0
packages/function/sst-env.d.ts

@@ -296,6 +296,7 @@ declare module "sst" {
     "AuthStorage": cloudflare.KVNamespace
     "Bucket": cloudflare.R2Bucket
     "EnterpriseStorage": cloudflare.R2Bucket
+    "GatewayKv": cloudflare.KVNamespace
     "LogProcessor": cloudflare.Service
     "Stat": cloudflare.Service
     "ZenData": cloudflare.R2Bucket

+ 4 - 0
sst-env.d.ts

@@ -106,6 +106,10 @@ declare module "sst" {
       "type": "sst.sst.Secret"
       "value": string
     }
+    "GatewayKv": {
+      "namespaceId": string
+      "type": "sst.cloudflare.Kv"
+    }
     "HONEYCOMB_API_KEY": {
       "type": "sst.sst.Secret"
       "value": string