fix: logo 右半部分从 CODING 改为 CODE

去掉难以正确渲染的 N 和 G 字母,右半部分简化为 CODE(4 字母),
与左半部分 AIR 组合为 AIR CODE。
This commit is contained in:
airlongdian
2026-06-14 09:54:53 +08:00
commit c4f9fe109e
5757 changed files with 1170016 additions and 0 deletions

View File

@@ -0,0 +1 @@
@import "./style/index.css";

View File

@@ -0,0 +1,44 @@
import { MetaProvider, Title, Meta } from "@solidjs/meta"
import { Router } from "@solidjs/router"
import { FileRoutes } from "@solidjs/start/router"
import { Suspense } from "solid-js"
import { Favicon } from "@opencode-ai/ui/favicon"
import { Font } from "@opencode-ai/ui/font"
import "@ibm/plex/css/ibm-plex.css"
import "./app.css"
import { LanguageProvider } from "~/context/language"
import { I18nProvider, useI18n } from "~/context/i18n"
import { strip } from "~/lib/language"
function AppMeta() {
const i18n = useI18n()
return (
<>
<Title>opencode</Title>
<Meta name="description" content={i18n.t("app.meta.description")} />
<Favicon />
<Font />
</>
)
}
export default function App() {
return (
<Router
explicitLinks={true}
transformUrl={strip}
root={(props) => (
<LanguageProvider>
<I18nProvider>
<MetaProvider>
<AppMeta />
<Suspense>{props.children}</Suspense>
</MetaProvider>
</I18nProvider>
</LanguageProvider>
)}
>
<FileRoutes />
</Router>
)
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 B

View File

@@ -0,0 +1,18 @@
<svg width="300" height="300" viewBox="0 0 300 300" fill="none" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(30, 0)">
<g clip-path="url(#clip0_1401_86283)">
<mask id="mask0_1401_86283" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="300">
<path d="M240 0H0V300H240V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86283)">
<path d="M180 240H60V120H180V240Z" fill="#4B4646"/>
<path d="M180 60H60V240H180V60ZM240 300H0V0H240V300Z" fill="#F1ECEC"/>
</g>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86283">
<rect width="240" height="300" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,16 @@
<svg width="240" height="300" viewBox="0 0 240 300" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1401_86283)">
<mask id="mask0_1401_86283" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="300">
<path d="M240 0H0V300H240V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86283)">
<path d="M180 240H60V120H180V240Z" fill="#4B4646"/>
<path d="M180 60H60V240H180V60ZM240 300H0V0H240V300Z" fill="#F1ECEC"/>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86283">
<rect width="240" height="300" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 B

View File

@@ -0,0 +1,18 @@
<svg width="300" height="300" viewBox="0 0 300 300" fill="none" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(30, 0)">
<g clip-path="url(#clip0_1401_86274)">
<mask id="mask0_1401_86274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="300">
<path d="M240 0H0V300H240V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86274)">
<path d="M180 240H60V120H180V240Z" fill="#CFCECD"/>
<path d="M180 60H60V240H180V60ZM240 300H0V0H240V300Z" fill="#211E1E"/>
</g>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86274">
<rect width="240" height="300" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@@ -0,0 +1,16 @@
<svg width="240" height="300" viewBox="0 0 240 300" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1401_86274)">
<mask id="mask0_1401_86274" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="240" height="300">
<path d="M240 0H0V300H240V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86274)">
<path d="M180 240H60V120H180V240Z" fill="#CFCECD"/>
<path d="M180 60H60V240H180V60ZM240 300H0V0H240V300Z" fill="#211E1E"/>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86274">
<rect width="240" height="300" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,30 @@
<svg width="641" height="115" viewBox="0 0 641 115" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1401_86292)">
<mask id="mask0_1401_86292" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="641" height="115">
<path d="M640.714 0H0V115H640.714V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86292)">
<path d="M49.2868 82.1433H16.4297V49.2861H49.2868V82.1433Z" fill="#4B4646"/>
<path d="M49.2857 32.8573H16.4286V82.143H49.2857V32.8573ZM65.7143 98.5716H0V16.4287H65.7143V98.5716Z" fill="#B7B1B1"/>
<path d="M131.427 82.1433H98.5703V49.2861H131.427V82.1433Z" fill="#4B4646"/>
<path d="M98.5692 82.143H131.426V32.8573H98.5692V82.143ZM147.855 98.5716H98.5692V115H82.1406V16.4287H147.855V98.5716Z" fill="#B7B1B1"/>
<path d="M229.997 65.7139V82.1424H180.711V65.7139H229.997Z" fill="#4B4646"/>
<path d="M230.003 65.7144H180.718V82.143H230.003V98.5716H164.289V16.4287H230.003V65.7144ZM180.718 49.2859H213.575V32.8573H180.718V49.2859Z" fill="#B7B1B1"/>
<path d="M295.717 98.5718H262.859V49.2861H295.717V98.5718Z" fill="#4B4646"/>
<path d="M295.715 32.8573H262.858V98.5716H246.43V16.4287H295.715V32.8573ZM312.144 98.5716H295.715V32.8573H312.144V98.5716Z" fill="#B7B1B1"/>
<path d="M394.286 82.1433H345V49.2861H394.286V82.1433Z" fill="#4B4646"/>
<path d="M394.285 32.8573H344.999V82.143H394.285V98.5716H328.57V16.4287H394.285V32.8573Z" fill="#F1ECEC"/>
<path d="M459.998 82.1433H427.141V49.2861H459.998V82.1433Z" fill="#4B4646"/>
<path d="M459.997 32.8573H427.14V82.143H459.997V32.8573ZM476.425 98.5716H410.711V16.4287H476.425V98.5716Z" fill="#F1ECEC"/>
<path d="M542.146 82.1433H509.289V49.2861H542.146V82.1433Z" fill="#4B4646"/>
<path d="M542.145 32.8571H509.288V82.1429H542.145V32.8571ZM558.574 98.5714H492.859V16.4286H542.145V0H558.574V98.5714Z" fill="#F1ECEC"/>
<path d="M640.715 65.7139V82.1424H591.43V65.7139H640.715Z" fill="#4B4646"/>
<path d="M591.429 32.8573V49.2859H624.286V32.8573H591.429ZM640.714 65.7144H591.429V82.143H640.714V98.5716H575V16.4287H640.714V65.7144Z" fill="#F1ECEC"/>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86292">
<rect width="640.714" height="115" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,30 @@
<svg width="640" height="115" viewBox="0 0 640 115" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1401_86330)">
<mask id="mask0_1401_86330" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="640" height="115">
<path d="M640 0H0V115H640V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86330)">
<path d="M49.2346 82.1433H16.4141V49.2861H49.2346V82.1433Z" fill="#CFCECD"/>
<path d="M49.2308 32.8573H16.4103V82.143H49.2308V32.8573ZM65.641 98.5716H0V16.4287H65.641V98.5716Z" fill="#656363"/>
<path d="M131.281 82.1433H98.4609V49.2861H131.281V82.1433Z" fill="#CFCECD"/>
<path d="M98.4649 82.143H131.285V32.8573H98.4649V82.143ZM147.696 98.5716H98.4649V115H82.0547V16.4287H147.696V98.5716Z" fill="#656363"/>
<path d="M229.746 65.7139V82.1424H180.516V65.7139H229.746Z" fill="#CFCECD"/>
<path d="M229.743 65.7144H180.512V82.143H229.743V98.5716H164.102V16.4287H229.743V65.7144ZM180.512 49.2859H213.332V32.8573H180.512V49.2859Z" fill="#656363"/>
<path d="M295.383 98.5718H262.562V49.2861H295.383V98.5718Z" fill="#CFCECD"/>
<path d="M295.387 32.8573H262.567V98.5716H246.156V16.4287H295.387V32.8573ZM311.797 98.5716H295.387V32.8573H311.797V98.5716Z" fill="#656363"/>
<path d="M393.848 82.1433H344.617V49.2861H393.848V82.1433Z" fill="#CFCECD"/>
<path d="M393.844 32.8573H344.613V82.143H393.844V98.5716H328.203V16.4287H393.844V32.8573Z" fill="#211E1E"/>
<path d="M459.485 82.1433H426.664V49.2861H459.485V82.1433Z" fill="#CFCECD"/>
<path d="M459.489 32.8573H426.668V82.143H459.489V32.8573ZM475.899 98.5716H410.258V16.4287H475.899V98.5716Z" fill="#211E1E"/>
<path d="M541.539 82.1433H508.719V49.2861H541.539V82.1433Z" fill="#CFCECD"/>
<path d="M541.535 32.8571H508.715V82.1428H541.535V32.8571ZM557.946 98.5714H492.305V16.4286H541.535V0H557.946V98.5714Z" fill="#211E1E"/>
<path d="M639.996 65.7139V82.1424H590.766V65.7139H639.996Z" fill="#CFCECD"/>
<path d="M590.77 32.8573V49.2859H623.59V32.8573H590.77ZM640 65.7144H590.77V82.143H640V98.5716H574.359V16.4287H640V65.7144Z" fill="#211E1E"/>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86330">
<rect width="640" height="115" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,22 @@
<svg width="641" height="115" viewBox="0 0 641 115" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1401_86315)">
<mask id="mask0_1401_86315" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="641" height="115">
<path d="M640.714 0H0V115H640.714V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86315)">
<path d="M49.2857 32.8573H16.4286V82.143H49.2857V32.8573ZM65.7143 98.5716H0V16.4287H65.7143V98.5716Z" fill="white"/>
<path d="M98.5692 82.143H131.426V32.8573H98.5692V82.143ZM147.855 98.5716H98.5692V115H82.1406V16.4287H147.855V98.5716Z" fill="white"/>
<path d="M230.003 65.7144H180.718V82.143H230.003V98.5716H164.289V16.4287H230.003V65.7144ZM180.718 49.2859H213.575V32.8573H180.718V49.2859Z" fill="white"/>
<path d="M295.715 32.8573H262.858V98.5716H246.43V16.4287H295.715V32.8573ZM312.144 98.5716H295.715V32.8573H312.144V98.5716Z" fill="white"/>
<path d="M394.285 32.8573H344.999V82.143H394.285V98.5716H328.57V16.4287H394.285V32.8573Z" fill="white"/>
<path d="M459.997 32.8573H427.14V82.143H459.997V32.8573ZM476.425 98.5716H410.711V16.4287H476.425V98.5716Z" fill="white"/>
<path d="M542.145 32.8571H509.288V82.1429H542.145V32.8571ZM558.574 98.5714H492.859V16.4286H542.145V0H558.574V98.5714Z" fill="white"/>
<path d="M591.429 32.8573V49.2859H624.286V32.8573H591.429ZM640.714 65.7144H591.429V82.143H640.714V98.5716H575V16.4287H640.714V65.7144Z" fill="white"/>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86315">
<rect width="640.714" height="115" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,22 @@
<svg width="640" height="115" viewBox="0 0 640 115" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1401_86353)">
<mask id="mask0_1401_86353" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="640" height="115">
<path d="M640 0H0V115H640V0Z" fill="white"/>
</mask>
<g mask="url(#mask0_1401_86353)">
<path d="M49.2308 32.8573H16.4103V82.143H49.2308V32.8573ZM65.641 98.5716H0V16.4287H65.641V98.5716Z" fill="black"/>
<path d="M98.4649 82.143H131.285V32.8573H98.4649V82.143ZM147.696 98.5716H98.4649V115H82.0547V16.4287H147.696V98.5716Z" fill="black"/>
<path d="M229.743 65.7144H180.512V82.143H229.743V98.5716H164.102V16.4287H229.743V65.7144ZM180.512 49.2859H213.332V32.8573H180.512V49.2859Z" fill="black"/>
<path d="M295.387 32.8573H262.567V98.5716H246.156V16.4287H295.387V32.8573ZM311.797 98.5716H295.387V32.8573H311.797V98.5716Z" fill="black"/>
<path d="M393.844 32.8573H344.613V82.143H393.844V98.5716H328.203V16.4287H393.844V32.8573Z" fill="black"/>
<path d="M459.489 32.8573H426.668V82.143H459.489V32.8573ZM475.899 98.5716H410.258V16.4287H475.899V98.5716Z" fill="black"/>
<path d="M541.535 32.8571H508.715V82.1428H541.535V32.8571ZM557.946 98.5714H492.305V16.4286H541.535V0H557.946V98.5714Z" fill="black"/>
<path d="M590.77 32.8573V49.2859H623.59V32.8573H590.77ZM640 65.7144H590.77V82.143H640V98.5716H574.359V16.4287H640V65.7144Z" fill="black"/>
</g>
</g>
<defs>
<clipPath id="clip0_1401_86353">
<rect width="640" height="115" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -0,0 +1,6 @@
<svg width="54" height="30" viewBox="0 0 54 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 30H0V0H24V6H6V24H18V18H12V12H24V30Z" fill="#F1ECEC"/>
<path d="M12 18H18V24H6V12H12V18Z" fill="#4B4646"/>
<path d="M48 12V24H36V12H48Z" fill="#4B4646"/>
<path d="M54 30H30V0H54V30ZM36 24H48V6H36V24Z" fill="#F1ECEC"/>
</svg>

After

Width:  |  Height:  |  Size: 333 B

View File

@@ -0,0 +1,6 @@
<svg width="54" height="30" viewBox="0 0 54 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 30H0V0H24V6H6V24H18V18H12V12H24V30Z" fill="#211E1E"/>
<path d="M12 18H18V24H6V12H12V18Z" fill="#CFCECD"/>
<path d="M48 12V24H36V12H48Z" fill="#CFCECD"/>
<path d="M54 30H30V0H54V30ZM36 24H48V6H36V24Z" fill="#211E1E"/>
</svg>

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -0,0 +1,10 @@
<svg width="22" height="26" viewBox="0 0 22 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 7H7V19H15V7ZM19 23H3V3H19V23Z" fill="url(#paint0_linear_1311_94922)" stroke="#F1ECEC"/>
<path d="M3 0V26M19 0V26M15 0V26M7 0V26M0 3H22M0 7H22M0 19H22M0 23H22" stroke="#4B4646" stroke-opacity="0.4"/>
<defs>
<linearGradient id="paint0_linear_1311_94922" x1="11" y1="3" x2="11" y2="23" gradientUnits="userSpaceOnUse">
<stop stop-color="#1B1818"/>
<stop offset="1" stop-color="#2D2828"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 526 B

View File

@@ -0,0 +1,10 @@
<svg width="22" height="26" viewBox="0 0 22 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 7H7V19H15V7ZM19 23H3V3H19V23Z" fill="url(#paint0_linear_1311_94913)" stroke="#8E8B8B"/>
<path d="M3 0V26M19 0V26M15 0V26M7 0V26M0 3H22M0 7H22M0 19H22M0 23H22" stroke="#110000" stroke-opacity="0.121569"/>
<defs>
<linearGradient id="paint0_linear_1311_94913" x1="11" y1="3" x2="11" y2="23" gradientUnits="userSpaceOnUse">
<stop stop-color="#F9F8F8"/>
<stop offset="1" stop-color="#E9E8E8"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 531 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6 14.3581L10.0541 17.7027L18 7" stroke="#8E8B8B" stroke-width="1.5" stroke-linecap="square"/>
</svg>

After

Width:  |  Height:  |  Size: 207 B

View File

@@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.75 8.75V2.75H21.25V15.25H15.25M15.25 8.75H2.75V21.25H15.25V8.75Z" stroke="#8E8B8B" stroke-width="1.5" stroke-linecap="square"/>
</svg>

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,11 @@
<svg width="22" height="26" viewBox="0 0 22 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1311_94916)">
<path d="M15 19H7V11H15V19Z" fill="#4B4646"/>
<path d="M15 7H7V19H15V7ZM19 23H3V3H19V23Z" fill="#F1ECEC"/>
</g>
<defs>
<clipPath id="clip0_1311_94916">
<rect width="16" height="20" fill="white" transform="translate(3 3)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 385 B

View File

@@ -0,0 +1,11 @@
<svg width="22" height="26" viewBox="0 0 22 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1311_94907)">
<path d="M15 19H7V11H15V19Z" fill="#BCBBBB"/>
<path d="M15 7H7V19H15V7ZM19 23H3V3H19V23Z" fill="#211E1E"/>
</g>
<defs>
<clipPath id="clip0_1311_94907">
<rect width="16" height="20" fill="white" transform="translate(3 3)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -0,0 +1,11 @@
<svg width="32" height="40" viewBox="0 0 32 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1311_94973)">
<path d="M24 32H8V16H24V32Z" fill="#4B4646"/>
<path d="M24 8H8V32H24V8ZM32 40H0V0H32V40Z" fill="#F1ECEC"/>
</g>
<defs>
<clipPath id="clip0_1311_94973">
<rect width="32" height="40" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 358 B

View File

@@ -0,0 +1,11 @@
<svg width="32" height="40" viewBox="0 0 32 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1311_94969)">
<path d="M24 32H8V16H24V32Z" fill="#BCBBBB"/>
<path d="M24 8H8V32H24V8ZM32 40H0V0H32V40Z" fill="#211E1E"/>
</g>
<defs>
<clipPath id="clip0_1311_94969">
<rect width="32" height="40" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,25 @@
<svg width="234" height="42" viewBox="0 0 234 42" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1311_95032)">
<path d="M18 30H6V18H18V30Z" fill="#4B4646"/>
<path d="M18 12H6V30H18V12ZM24 36H0V6H24V36Z" fill="#B7B1B1"/>
<path d="M48 30H36V18H48V30Z" fill="#4B4646"/>
<path d="M36 30H48V12H36V30ZM54 36H36V42H30V6H54V36Z" fill="#B7B1B1"/>
<path d="M84 24V30H66V24H84Z" fill="#4B4646"/>
<path d="M84 24H66V30H84V36H60V6H84V24ZM66 18H78V12H66V18Z" fill="#B7B1B1"/>
<path d="M108 36H96V18H108V36Z" fill="#4B4646"/>
<path d="M108 12H96V36H90V6H108V12ZM114 36H108V12H114V36Z" fill="#B7B1B1"/>
<path d="M144 30H126V18H144V30Z" fill="#4B4646"/>
<path d="M144 12H126V30H144V36H120V6H144V12Z" fill="#F1ECEC"/>
<path d="M168 30H156V18H168V30Z" fill="#4B4646"/>
<path d="M168 12H156V30H168V12ZM174 36H150V6H174V36Z" fill="#F1ECEC"/>
<path d="M198 30H186V18H198V30Z" fill="#4B4646"/>
<path d="M198 12H186V30H198V12ZM204 36H180V6H198V0H204V36Z" fill="#F1ECEC"/>
<path d="M234 24V30H216V24H234Z" fill="#4B4646"/>
<path d="M216 12V18H228V12H216ZM234 24H216V30H234V36H210V6H234V24Z" fill="#F1ECEC"/>
</g>
<defs>
<clipPath id="clip0_1311_95032">
<rect width="234" height="42" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,25 @@
<svg width="234" height="42" viewBox="0 0 234 42" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1311_95049)">
<path d="M18 30H6V18H18V30Z" fill="#CFCECD"/>
<path d="M18 12H6V30H18V12ZM24 36H0V6H24V36Z" fill="#656363"/>
<path d="M48 30H36V18H48V30Z" fill="#CFCECD"/>
<path d="M36 30H48V12H36V30ZM54 36H36V42H30V6H54V36Z" fill="#656363"/>
<path d="M84 24V30H66V24H84Z" fill="#CFCECD"/>
<path d="M84 24H66V30H84V36H60V6H84V24ZM66 18H78V12H66V18Z" fill="#656363"/>
<path d="M108 36H96V18H108V36Z" fill="#CFCECD"/>
<path d="M108 12H96V36H90V6H108V12ZM114 36H108V12H114V36Z" fill="#656363"/>
<path d="M144 30H126V18H144V30Z" fill="#CFCECD"/>
<path d="M144 12H126V30H144V36H120V6H144V12Z" fill="#211E1E"/>
<path d="M168 30H156V18H168V30Z" fill="#CFCECD"/>
<path d="M168 12H156V30H168V12ZM174 36H150V6H174V36Z" fill="#211E1E"/>
<path d="M198 30H186V18H198V30Z" fill="#CFCECD"/>
<path d="M198 12H186V30H198V12ZM204 36H180V6H198V0H204V36Z" fill="#211E1E"/>
<path d="M234 24V30H216V24H234Z" fill="#CFCECD"/>
<path d="M216 12V18H228V12H216ZM234 24H216V30H234V36H210V6H234V24Z" fill="#211E1E"/>
</g>
<defs>
<clipPath id="clip0_1311_95049">
<rect width="234" height="42" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

View File

@@ -0,0 +1,3 @@
<svg width="22" height="26" viewBox="0 0 22 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.33203 7.99967V6.33301H10.9987M17.6654 7.99967V6.33301H10.9987M10.9987 6.33301V19.6663M10.9987 19.6663H9.33203M10.9987 19.6663H12.6654" stroke="#F1ECEC" stroke-width="2" stroke-linecap="square"/>
</svg>

After

Width:  |  Height:  |  Size: 310 B

View File

@@ -0,0 +1,3 @@
<svg width="22" height="26" viewBox="0 0 22 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.33203 7.99967V6.33301H10.9987M17.6654 7.99967V6.33301H10.9987M10.9987 6.33301V19.6663M10.9987 19.6663H9.33203M10.9987 19.6663H12.6654" stroke="black" stroke-width="2" stroke-linecap="square"/>
</svg>

After

Width:  |  Height:  |  Size: 308 B

View File

@@ -0,0 +1,18 @@
<svg width="234" height="42" viewBox="0 0 234 42" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 30H6V18H18V30Z" fill="#4B4646"/>
<path d="M18 12H6V30H18V12ZM24 36H0V6H24V36Z" fill="#B7B1B1"/>
<path d="M48 30H36V18H48V30Z" fill="#4B4646"/>
<path d="M36 30H48V12H36V30ZM54 36H36V42H30V6H54V36Z" fill="#B7B1B1"/>
<path d="M84 24V30H66V24H84Z" fill="#4B4646"/>
<path d="M84 24H66V30H84V36H60V6H84V24ZM66 18H78V12H66V18Z" fill="#B7B1B1"/>
<path d="M108 36H96V18H108V36Z" fill="#4B4646"/>
<path d="M108 12H96V36H90V6H108V12ZM114 36H108V12H114V36Z" fill="#B7B1B1"/>
<path d="M144 30H126V18H144V30Z" fill="#4B4646"/>
<path d="M144 12H126V30H144V36H120V6H144V12Z" fill="#F1ECEC"/>
<path d="M168 30H156V18H168V30Z" fill="#4B4646"/>
<path d="M168 12H156V30H168V12ZM174 36H150V6H174V36Z" fill="#F1ECEC"/>
<path d="M198 30H186V18H198V30Z" fill="#4B4646"/>
<path d="M198 12H186V30H198V12ZM204 36H180V6H198V0H204V36Z" fill="#F1ECEC"/>
<path d="M234 24V30H216V24H234Z" fill="#4B4646"/>
<path d="M216 12V18H228V12H216ZM234 24H216V30H234V36H210V6H234V24Z" fill="#F1ECEC"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,18 @@
<svg width="234" height="42" viewBox="0 0 234 42" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 30H6V18H18V30Z" fill="#CFCECD"/>
<path d="M18 12H6V30H18V12ZM24 36H0V6H24V36Z" fill="#656363"/>
<path d="M48 30H36V18H48V30Z" fill="#CFCECD"/>
<path d="M36 30H48V12H36V30ZM54 36H36V42H30V6H54V36Z" fill="#656363"/>
<path d="M84 24V30H66V24H84Z" fill="#CFCECD"/>
<path d="M84 24H66V30H84V36H60V6H84V24ZM66 18H78V12H66V18Z" fill="#656363"/>
<path d="M108 36H96V18H108V36Z" fill="#CFCECD"/>
<path d="M108 12H96V36H90V6H108V12ZM114 36H108V12H114V36Z" fill="#656363"/>
<path d="M144 30H126V18H144V30Z" fill="#CFCECD"/>
<path d="M144 12H126V30H144V36H120V6H144V12Z" fill="#211E1E"/>
<path d="M168 30H156V18H168V30Z" fill="#CFCECD"/>
<path d="M168 12H156V30H168V12ZM174 36H150V6H174V36Z" fill="#211E1E"/>
<path d="M198 30H186V18H198V30Z" fill="#CFCECD"/>
<path d="M198 12H186V30H198V12ZM204 36H180V6H198V0H204V36Z" fill="#211E1E"/>
<path d="M234 24V30H216V24H234Z" fill="#CFCECD"/>
<path d="M216 12V18H228V12H216ZM234 24H216V30H234V36H210V6H234V24Z" fill="#211E1E"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,18 @@
<svg width="234" height="42" viewBox="0 0 234 42" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 30H6V18H18V30Z" fill="#CFCECD"/>
<path d="M18 12H6V30H18V12ZM24 36H0V6H24V36Z" fill="#656363"/>
<path d="M48 30H36V18H48V30Z" fill="#CFCECD"/>
<path d="M36 30H48V12H36V30ZM54 36H36V42H30V6H54V36Z" fill="#656363"/>
<path d="M84 24V30H66V24H84Z" fill="#CFCECD"/>
<path d="M84 24H66V30H84V36H60V6H84V24ZM66 18H78V12H66V18Z" fill="#656363"/>
<path d="M108 36H96V18H108V36Z" fill="#CFCECD"/>
<path d="M108 12H96V36H90V6H108V12ZM114 36H108V12H114V36Z" fill="#656363"/>
<path d="M144 30H126V18H144V30Z" fill="#CFCECD"/>
<path d="M144 12H126V30H144V36H120V6H144V12Z" fill="#211E1E"/>
<path d="M168 30H156V18H168V30Z" fill="#CFCECD"/>
<path d="M168 12H156V30H168V12ZM174 36H150V6H174V36Z" fill="#211E1E"/>
<path d="M198 30H186V18H198V30Z" fill="#CFCECD"/>
<path d="M198 12H186V30H198V12ZM204 36H180V6H198V0H204V36Z" fill="#211E1E"/>
<path d="M234 24V30H216V24H234Z" fill="#CFCECD"/>
<path d="M216 12V18H228V12H216ZM234 24H216V30H234V36H210V6H234V24Z" fill="#211E1E"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,8 @@
<svg width="84" height="30" viewBox="0 0 84 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 24H6V18H18V12H24V24ZM6 18H0V12H6V18Z" fill="#4B4646"/>
<path d="M6 24H24V30H0V18H6V24ZM18 18H6V12H18V18ZM24 12H18V6H0V0H24V12Z" fill="#F1ECEC"/>
<path d="M54 18V24H36V18H54Z" fill="#4B4646"/>
<path d="M54 18H36V24H54V30H30V0H54V18ZM36 12H48V6H36V12Z" fill="#F1ECEC"/>
<path d="M78 30H66V12H78V30Z" fill="#4B4646"/>
<path d="M78 6H66V30H60V0H78V6ZM84 30H78V6H84V30Z" fill="#F1ECEC"/>
</svg>

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -0,0 +1,8 @@
<svg width="84" height="30" viewBox="0 0 84 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 24H6V18H18V12H24V24ZM6 18H0V12H6V18Z" fill="#CFCECD"/>
<path d="M6 24H24V30H0V18H6V24ZM18 18H6V12H18V18ZM24 12H18V6H0V0H24V12Z" fill="#211E1E"/>
<path d="M54 18V24H36V18H54Z" fill="#CFCECD"/>
<path d="M54 18H36V24H54V30H30V0H54V18ZM36 12H48V6H36V12Z" fill="#211E1E"/>
<path d="M78 30H66V12H78V30Z" fill="#CFCECD"/>
<path d="M78 6H66V30H60V0H78V6ZM84 30H78V6H84V30Z" fill="#211E1E"/>
</svg>

After

Width:  |  Height:  |  Size: 499 B

View File

@@ -0,0 +1,80 @@
[data-component="dropdown"] {
position: relative;
[data-slot="trigger"] {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-2);
padding: var(--space-2) var(--space-3);
border: none;
border-radius: var(--border-radius-sm);
background-color: transparent;
color: var(--color-text);
font-size: var(--font-size-sm);
font-family: var(--font-sans);
cursor: pointer;
transition: all 0.15s ease;
&:hover {
background-color: var(--color-surface-hover);
}
span {
flex: 1;
text-align: left;
font-weight: 500;
}
}
[data-slot="chevron"] {
flex-shrink: 0;
color: var(--color-text-secondary);
}
[data-slot="dropdown"] {
position: absolute;
top: 100%;
z-index: 1000;
margin-top: var(--space-1);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-sm);
background-color: var(--color-bg);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
min-width: 160px;
&[data-align="left"] {
left: 0;
}
&[data-align="right"] {
right: 0;
}
@media (prefers-color-scheme: dark) {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
}
[data-slot="item"] {
display: block;
width: 100%;
padding: var(--space-2-5) var(--space-3);
border: none;
background: none;
color: var(--color-text);
font-size: var(--font-size-sm);
font-family: var(--font-sans);
text-align: left;
cursor: pointer;
transition: background-color 0.15s ease;
&:hover {
background-color: var(--color-bg-surface);
}
&[data-selected="true"] {
background-color: var(--color-accent-alpha);
}
}
}

View File

@@ -0,0 +1,79 @@
import { JSX, Show, createEffect, onCleanup } from "solid-js"
import { createStore } from "solid-js/store"
import { IconChevron } from "./icon"
import "./dropdown.css"
interface DropdownProps {
trigger: JSX.Element | string
children: JSX.Element
open?: boolean
onOpenChange?: (open: boolean) => void
align?: "left" | "right"
class?: string
}
export function Dropdown(props: DropdownProps) {
const [store, setStore] = createStore({
isOpen: props.open ?? false,
})
let dropdownRef: HTMLDivElement | undefined
createEffect(() => {
if (props.open !== undefined) {
setStore("isOpen", props.open)
}
})
createEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
if (dropdownRef && !dropdownRef.contains(event.target as Node)) {
setStore("isOpen", false)
props.onOpenChange?.(false)
}
}
document.addEventListener("click", handleClickOutside)
onCleanup(() => document.removeEventListener("click", handleClickOutside))
})
const toggle = () => {
const newValue = !store.isOpen
setStore("isOpen", newValue)
props.onOpenChange?.(newValue)
}
return (
<div data-component="dropdown" class={props.class} ref={dropdownRef}>
<button data-slot="trigger" type="button" onClick={toggle}>
{typeof props.trigger === "string" ? <span>{props.trigger}</span> : props.trigger}
<IconChevron data-slot="chevron" />
</button>
<Show when={store.isOpen}>
<div data-slot="dropdown" data-align={props.align ?? "left"}>
{props.children}
</div>
</Show>
</div>
)
}
interface DropdownItemProps {
children: JSX.Element
selected?: boolean
onClick?: () => void
type?: "button" | "submit" | "reset"
}
export function DropdownItem(props: DropdownItemProps) {
return (
<button
data-slot="item"
data-selected={props.selected ?? false}
type={props.type ?? "button"}
onClick={props.onClick}
>
{props.children}
</button>
)
}

View File

@@ -0,0 +1,47 @@
import { action, useSubmission } from "@solidjs/router"
import { Resource } from "@opencode-ai/console-resource"
import { Show } from "solid-js"
import { useI18n } from "~/context/i18n"
const emailSignup = action(async (formData: FormData) => {
"use server"
const emailAddress = formData.get("email")!
const listId = "8b9bb82c-9d5f-11f0-975f-0df6fd1e4945"
const response = await fetch(`https://api.emailoctopus.com/lists/${listId}/contacts`, {
method: "PUT",
headers: {
Authorization: `Bearer ${Resource.EMAILOCTOPUS_API_KEY.value}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
email_address: emailAddress,
}),
})
console.log(response)
return true
})
export function EmailSignup() {
const submission = useSubmission(emailSignup)
const i18n = useI18n()
return (
<section data-component="email">
<div data-slot="section-title">
<h3>{i18n.t("email.title")}</h3>
<p>{i18n.t("email.subtitle")}</p>
</div>
<form data-slot="form" action={emailSignup} method="post">
<input type="email" name="email" placeholder={i18n.t("email.placeholder")} required />
<button type="submit" disabled={submission.pending}>
{i18n.t("email.subscribe")}
</button>
</form>
<Show when={submission.result}>
<div style="color: #03B000; margin-top: 24px;">{i18n.t("email.success")}</div>
</Show>
<Show when={submission.error}>
<div style="color: #FF408F; margin-top: 24px;">{submission.error}</div>
</Show>
</section>
)
}

View File

@@ -0,0 +1,33 @@
import { Collapsible } from "@kobalte/core/collapsible"
import { ParentProps } from "solid-js"
export function Faq(props: ParentProps & { question: string }) {
return (
<Collapsible data-slot="faq-item">
<Collapsible.Trigger data-slot="faq-question">
<svg
data-slot="faq-icon-plus"
width="24"
height="24"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M12.5 11.5H19V12.5H12.5V19H11.5V12.5H5V11.5H11.5V5H12.5V11.5Z" fill="currentColor" />
</svg>
<svg
data-slot="faq-icon-minus"
width="24"
height="24"
viewBox="0 0 24 24"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M5 11.5H19V12.5H5Z" fill="currentColor" />
</svg>
<div data-slot="faq-question-text">{props.question}</div>
</Collapsible.Trigger>
<Collapsible.Content data-slot="faq-answer">{props.children}</Collapsible.Content>
</Collapsible>
)
}

View File

@@ -0,0 +1,48 @@
import { createAsync } from "@solidjs/router"
import { createMemo } from "solid-js"
import { github } from "~/lib/github"
import { config } from "~/config"
import { useLanguage } from "~/context/language"
import { useI18n } from "~/context/i18n"
export function Footer() {
const language = useLanguage()
const i18n = useI18n()
const community = createMemo(() => {
const locale = language.locale()
return locale === "zh" || locale === "zht"
? ({ key: "footer.feishu", link: language.route("/feishu") } as const)
: ({ key: "footer.discord", link: language.route("/discord") } as const)
})
const githubData = createAsync(() => github())
const starCount = createMemo(() =>
githubData()?.stars
? new Intl.NumberFormat(language.tag(language.locale()), {
notation: "compact",
compactDisplay: "short",
}).format(githubData()!.stars!)
: config.github.starsFormatted.compact,
)
return (
<footer data-component="footer">
<div data-slot="cell">
<a href={config.github.repoUrl} target="_blank">
{i18n.t("footer.github")} <span>[{starCount()}]</span>
</a>
</div>
<div data-slot="cell">
<a href={language.route("/docs")}>{i18n.t("footer.docs")}</a>
</div>
<div data-slot="cell">
<a href={language.route("/changelog")}>{i18n.t("footer.changelog")}</a>
</div>
<div data-slot="cell">
<a href={community().link}>{i18n.t(community().key)}</a>
</div>
<div data-slot="cell">
<a href={config.social.twitter}>{i18n.t("footer.x")}</a>
</div>
</footer>
)
}

View File

@@ -0,0 +1,289 @@
[data-component="go-credit-confirm"] {
display: flex;
flex-direction: column;
gap: var(--space-4);
min-width: min(34rem, calc(100vw - var(--space-8)));
p {
margin: 0;
color: var(--color-text-secondary);
font-size: var(--font-size-sm);
line-height: 1.6;
}
[data-slot="usage-preview"] {
display: flex;
flex-direction: column;
gap: var(--space-5);
padding: var(--space-4);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-sm);
background-color: var(--color-bg-surface);
}
[data-slot="usage-preview-item"] {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
[data-slot="usage-preview-header"] {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--space-3);
}
[data-slot="usage-preview-label"] {
color: var(--color-text);
font-size: var(--font-size-sm);
font-weight: 500;
}
[data-slot="usage-preview-value"] {
display: inline-flex;
align-items: center;
gap: var(--space-1);
color: var(--color-text-muted);
font-family: var(--font-mono);
font-size: var(--font-size-xs);
white-space: nowrap;
}
[data-slot="usage-preview-after-value"] {
color: var(--color-accent);
font-weight: 600;
}
[data-slot="usage-preview-progress"] {
position: relative;
height: 8px;
overflow: hidden;
border-radius: var(--border-radius-sm);
background-color: var(--color-bg);
}
[data-slot="usage-preview-before"],
[data-slot="usage-preview-after"] {
position: absolute;
top: 0;
bottom: 0;
left: 0;
border-radius: var(--border-radius-sm);
}
[data-slot="usage-preview-before"] {
background-color: var(--color-border);
}
[data-slot="usage-preview-after"] {
background-color: var(--color-accent);
transition: width 0.35s ease;
}
[data-slot="usage-preview-reset"] {
color: var(--color-text-muted);
font-size: var(--font-size-xs);
}
[data-slot="modal-actions"] {
display: flex;
justify-content: flex-end;
gap: var(--space-3);
}
}
[data-slot="invite-link-box"] {
display: flex;
flex-direction: column;
gap: var(--space-3);
> div {
display: flex;
align-items: center;
gap: var(--space-3);
border-radius: var(--border-radius-sm);
@media (max-width: 40rem) {
align-items: stretch;
flex-direction: column;
}
}
code {
flex: 1;
min-width: 0;
padding: var(--space-3);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-sm);
background-color: var(--color-bg);
color: var(--color-text);
font-family: var(--font-mono);
font-size: var(--font-size-sm);
line-height: 1.4;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@media (max-width: 40rem) {
padding: var(--space-2-5);
font-size: var(--font-size-xs);
}
}
button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
min-width: 130px;
white-space: nowrap;
@media (max-width: 40rem) {
min-width: 96px;
padding: var(--space-2-5) var(--space-3);
font-size: var(--font-size-xs);
}
}
}
[data-slot="instructions"] {
display: flex;
flex-direction: column;
gap: var(--space-3);
ol {
display: flex;
flex-direction: column;
gap: var(--space-2);
margin: 0;
padding-left: 0;
color: var(--color-text-secondary);
font-size: var(--font-size-md);
list-style-position: inside;
line-height: 1.5;
}
}
[data-component="go-referral-section"] {
[data-component="go-referral-overview"] {
display: flex;
flex-direction: column;
gap: var(--space-8);
padding: var(--space-6);
border: 1px dashed var(--color-border);
border-radius: var(--border-radius-sm);
background-color: var(--color-bg-surface);
@media (max-width: 30rem) {
gap: var(--space-8);
padding: var(--space-4);
}
}
[data-component="go-referral-overview"] + [data-slot="section-title"] {
margin-top: var(--space-4);
}
[data-slot="referrals-table"] {
overflow-x: auto;
}
[data-component="empty-state"] {
padding: var(--space-4);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-sm);
background-color: var(--color-bg-surface);
color: var(--color-text-muted);
font-size: var(--font-size-sm);
}
[data-slot="referrals-table-element"] {
width: 100%;
border-collapse: collapse;
font-size: var(--font-size-sm);
thead {
border-bottom: 1px solid var(--color-border);
}
th {
padding: var(--space-3) var(--space-4);
text-align: left;
font-weight: normal;
color: var(--color-text-muted);
text-transform: uppercase;
&:nth-child(1) {
width: 120px;
}
&:nth-child(3) {
width: 180px;
}
&:nth-child(4) {
width: 140px;
}
}
td {
padding: var(--space-3) var(--space-4);
border-bottom: 1px solid var(--color-border-muted);
color: var(--color-text-muted);
font-family: var(--font-mono);
&[data-slot="referral-amount"] {
color: var(--color-text);
font-weight: 500;
}
&[data-slot="referral-source"] {
color: var(--color-text-secondary);
font-family: var(--font-sans);
white-space: nowrap;
}
&[data-slot="referral-action"] {
text-align: right;
font-family: var(--font-sans);
white-space: nowrap;
button {
min-width: 96px;
}
}
}
tbody tr {
&[data-status="applied"] {
td:not([data-slot="referral-action"]) {
opacity: 0.68;
}
}
&[data-status="pending"] {
td[data-slot="referral-amount"],
td[data-slot="referral-date"] {
color: var(--color-text-muted);
}
td[data-slot="referral-source"] {
color: var(--color-text);
}
}
&:last-child td {
border-bottom: none;
}
}
@media (max-width: 40rem) {
th,
td {
padding: var(--space-2) var(--space-3);
font-size: var(--font-size-xs);
}
}
}
}

View File

@@ -0,0 +1,306 @@
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"
import { withActor } from "~/context/auth.withActor"
import { Modal } from "~/component/modal"
import { IconCheck, IconCopy } from "~/component/icon"
import { useI18n } from "~/context/i18n"
import { useLanguage } from "~/context/language"
import { formatResetTime, liteResetTimeKeys } from "~/lib/format-reset-time"
import { queryLiteSubscription } from "~/routes/workspace/[id]/go/lite-section"
import { createReferralFromCookie } from "~/lib/referral-invite"
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"]
const emptyUsagePreview = {
rollingUsage: { beforePercent: 0, afterPercent: 0, resetInSec: 0 },
weeklyUsage: { beforePercent: 0, afterPercent: 0, resetInSec: 0 },
monthlyUsage: { beforePercent: 0, afterPercent: 0, resetInSec: 0 },
} satisfies GoReferralUsagePreview
export const queryGoReferral = query(async (workspaceID: string) => {
"use server"
return withActor(async () => {
await createReferralFromCookie()
return Referral.summary()
}, workspaceID)
}, "go.referral.get")
export const queryGoReferralUsagePreview = query(async (workspaceID: string, referralID?: string) => {
"use server"
if (!referralID) return null
return withActor(() => Referral.usagePreview({ referralID }), workspaceID)
}, "go.referral.usagePreview")
export const applyGoReferralReward = action(async (workspaceID: string, referralID: string) => {
"use server"
return json(await withActor(() => Referral.applyReward({ referralID }), workspaceID), {
revalidate: [queryGoReferral.key, queryGoReferralUsagePreview.key, queryLiteSubscription.key],
})
}, "go.referral.reward.apply")
function currentUsagePreview(usage: { resetInSec: number; usagePercent: number }) {
return {
beforePercent: usage.usagePercent,
afterPercent: usage.usagePercent,
resetInSec: usage.resetInSec,
}
}
function formatCurrency(amount: number) {
if (amount % 100 === 0) return `$${amount / 100}`
return `$${(amount / 100).toFixed(2)}`
}
function formatDate(value: string | Date, locale: string) {
return new Intl.DateTimeFormat(locale, { month: "short", day: "numeric", year: "numeric" }).format(new Date(value))
}
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 rewardActionKey(reward: GoReferralReward, hasActiveGo: boolean) {
if (reward.status === "applied") return "workspace.referral.reward.action.applied" as const
if (reward.status === "pending" && reward.source === "inviter")
return "workspace.referral.reward.source.pendingInviter" 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 }) {
const i18n = useI18n()
const [copied, setCopied] = createSignal(false)
const event = getRequestEvent()
const origin = event
? new URL(event.request.url).origin
: typeof window === "object"
? window.location.origin
: undefined
const inviteUrl = createMemo(() => {
const path = `/go?ref=${props.summary.referralCode}`
if (!origin) return path
return new URL(path, origin).toString()
})
async function copy() {
if (typeof navigator !== "object") return
await navigator.clipboard.writeText(inviteUrl())
setCopied(true)
window.setTimeout(() => setCopied(false), 1600)
}
return (
<div data-slot="invite-link-box">
<div>
<code title={inviteUrl()}>{inviteUrl()}</code>
<button type="button" onClick={copy}>
<Show
when={copied()}
fallback={
<>
<IconCopy style={{ width: "16px", height: "16px" }} /> {i18n.t("workspace.referral.copyLink")}
</>
}
>
<IconCheck style={{ width: "16px", height: "16px" }} /> {i18n.t("workspace.referral.copied")}
</Show>
</button>
</div>
</div>
)
}
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 displayPreview = createMemo(() => {
const loaded = preview()
if (loaded) return loaded
const current = props.lite
if (!current) return emptyUsagePreview
return {
rollingUsage: currentUsagePreview(current.rollingUsage),
weeklyUsage: currentUsagePreview(current.weeklyUsage),
monthlyUsage: currentUsagePreview(current.monthlyUsage),
} satisfies GoReferralUsagePreview
})
createEffect(() => {
const reward = selected()
if (!reward) {
setPreview(undefined)
return
}
const request = { cancelled: false }
setPreview(undefined)
queryGoReferralUsagePreview(props.workspaceID, reward.id).then((result) => {
if (request.cancelled) return
setPreview(result)
})
onCleanup(() => {
request.cancelled = true
})
})
async function onApply() {
const reward = selected()
if (!reward) return
await apply(props.workspaceID, reward.id)
setSelected(undefined)
}
return (
<>
<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)}
title={i18n.t("workspace.referral.apply.confirmTitle")}
>
<div data-component="go-credit-confirm">
<p>
{i18n.t("workspace.referral.apply.confirmBody", {
amount: formatCurrency(selected()?.amount ?? 0),
})}
</p>
<GoReferralUsagePreview preview={displayPreview()} />
<div data-slot="modal-actions">
<button type="button" onClick={() => setSelected(undefined)}>
{i18n.t("common.cancel")}
</button>
<button type="button" data-color="primary" disabled={submission.pending} onClick={onApply}>
{submission.pending ? i18n.t("workspace.lite.loading") : i18n.t("workspace.referral.apply.confirmAction")}
</button>
</div>
</div>
</Modal>
</>
)
}
function GoReferralUsagePreview(props: { preview: GoReferralUsagePreview }) {
const i18n = useI18n()
return (
<div data-slot="usage-preview">
<GoReferralUsagePreviewRow
label={i18n.t("workspace.lite.subscription.rollingUsage")}
usage={props.preview.rollingUsage}
/>
<GoReferralUsagePreviewRow
label={i18n.t("workspace.lite.subscription.weeklyUsage")}
usage={props.preview.weeklyUsage}
/>
<GoReferralUsagePreviewRow
label={i18n.t("workspace.lite.subscription.monthlyUsage")}
usage={props.preview.monthlyUsage}
/>
</div>
)
}
function GoReferralUsagePreviewRow(props: { label: string; usage: GoReferralUsagePreviewItem }) {
const i18n = useI18n()
return (
<div data-slot="usage-preview-item">
<div data-slot="usage-preview-header">
<span data-slot="usage-preview-label">{props.label}</span>
<span data-slot="usage-preview-value">
<span>{props.usage.beforePercent}%</span>
<span aria-hidden="true">-&gt;</span>
<span data-slot="usage-preview-after-value">{props.usage.afterPercent}%</span>
</span>
</div>
<div data-slot="usage-preview-progress">
<div data-slot="usage-preview-before" style={{ width: `${props.usage.beforePercent}%` }} />
<div data-slot="usage-preview-after" style={{ width: `${props.usage.afterPercent}%` }} />
</div>
<span data-slot="usage-preview-reset">
{i18n.t("workspace.lite.subscription.resetsIn")}{" "}
{formatResetTime(props.usage.resetInSec, i18n, liteResetTimeKeys)}
</span>
</div>
)
}

View File

@@ -0,0 +1,63 @@
.context-menu {
position: fixed;
z-index: 1000;
min-width: 160px;
border-radius: 8px;
background-color: var(--color-background);
box-shadow:
0 0 0 1px rgba(19, 16, 16, 0.08),
0 6px 8px -4px rgba(19, 16, 16, 0.12),
0 4px 3px -2px rgba(19, 16, 16, 0.12),
0 1px 2px -1px rgba(19, 16, 16, 0.12);
padding: 6px;
@media (prefers-color-scheme: dark) {
box-shadow: 0 0 0 1px rgba(247, 237, 237, 0.1);
}
}
.context-menu-item {
display: flex;
gap: 12px;
width: 100%;
padding: 8px 16px 8px 8px;
font-weight: 500;
cursor: pointer;
background: none;
border: none;
align-items: center;
color: var(--color-text);
font-size: var(--font-size-sm);
text-align: left;
border-radius: 2px;
transition: background-color 0.2s ease;
[data-slot="copy dark"] {
display: none;
}
@media (prefers-color-scheme: dark) {
[data-slot="copy light"] {
display: none;
}
[data-slot="copy dark"] {
display: block;
}
}
&:hover {
background-color: var(--color-background-weak-hover);
color: var(--color-text-strong);
}
img {
width: 22px;
height: 26px;
}
}
.context-menu-divider {
border: none;
border-top: 1px solid var(--color-border);
margin: var(--space-1) 0;
}

View File

@@ -0,0 +1,288 @@
import logoLight from "../asset/logo-ornate-light.svg"
import logoDark from "../asset/logo-ornate-dark.svg"
import copyLogoLight from "../asset/lander/logo-light.svg"
import copyLogoDark from "../asset/lander/logo-dark.svg"
import copyWordmarkLight from "../asset/lander/wordmark-light.svg"
import copyWordmarkDark from "../asset/lander/wordmark-dark.svg"
import copyBrandAssetsLight from "../asset/lander/brand-assets-light.svg"
import copyBrandAssetsDark from "../asset/lander/brand-assets-dark.svg"
// SVG files for copying (separate from button icons)
// Replace these with your actual SVG files for copying
import copyLogoSvgLight from "../asset/lander/opencode-logo-light.svg"
import copyLogoSvgDark from "../asset/lander/opencode-logo-dark.svg"
import copyWordmarkSvgLight from "../asset/lander/opencode-wordmark-light.svg"
import copyWordmarkSvgDark from "../asset/lander/opencode-wordmark-dark.svg"
import { A, useNavigate } from "@solidjs/router"
import { createMemo, Match, Show, Switch } from "solid-js"
import { createStore } from "solid-js/store"
import { createEffect, onCleanup } from "solid-js"
import { config } from "~/config"
import { useI18n } from "~/context/i18n"
import { useLanguage } from "~/context/language"
import "./header-context-menu.css"
const isDarkMode = () => window.matchMedia("(prefers-color-scheme: dark)").matches
const fetchSvgContent = async (svgPath: string): Promise<string> => {
try {
const response = await fetch(svgPath)
const svgText = await response.text()
return svgText
} catch (err) {
console.error("Failed to fetch SVG content:", err)
throw err
}
}
export function Header(props: { zen?: boolean; go?: boolean; hideGetStarted?: boolean }) {
const navigate = useNavigate()
const i18n = useI18n()
const language = useLanguage()
const [store, setStore] = createStore({
mobileMenuOpen: false,
contextMenuOpen: false,
contextMenuPosition: { x: 0, y: 0 },
})
createEffect(() => {
const handleClickOutside = () => {
setStore("contextMenuOpen", false)
}
const handleContextMenu = (event: MouseEvent) => {
event.preventDefault()
setStore("contextMenuOpen", false)
}
const handleKeyDown = (event: KeyboardEvent) => {
if (event.key === "Escape") {
setStore("contextMenuOpen", false)
}
}
if (store.contextMenuOpen) {
document.addEventListener("click", handleClickOutside)
document.addEventListener("contextmenu", handleContextMenu)
document.addEventListener("keydown", handleKeyDown)
onCleanup(() => {
document.removeEventListener("click", handleClickOutside)
document.removeEventListener("contextmenu", handleContextMenu)
document.removeEventListener("keydown", handleKeyDown)
})
}
})
const handleLogoContextMenu = (event: MouseEvent) => {
event.preventDefault()
const logoElement = (event.currentTarget as HTMLElement).querySelector("a")
if (logoElement) {
const rect = logoElement.getBoundingClientRect()
setStore("contextMenuPosition", {
x: rect.left - 16,
y: rect.bottom + 8,
})
}
setStore("contextMenuOpen", true)
}
const copyWordmarkToClipboard = async () => {
try {
const isDark = isDarkMode()
const wordmarkSvgPath = isDark ? copyWordmarkSvgDark : copyWordmarkSvgLight
const wordmarkSvg = await fetchSvgContent(wordmarkSvgPath)
await navigator.clipboard.writeText(wordmarkSvg)
} catch (err) {
console.error("Failed to copy wordmark to clipboard:", err)
}
}
const copyLogoToClipboard = async () => {
try {
const isDark = isDarkMode()
const logoSvgPath = isDark ? copyLogoSvgDark : copyLogoSvgLight
const logoSvg = await fetchSvgContent(logoSvgPath)
await navigator.clipboard.writeText(logoSvg)
} catch (err) {
console.error("Failed to copy logo to clipboard:", err)
}
}
return (
<section data-component="top">
<div onContextMenu={handleLogoContextMenu}>
<A href={language.route("/")}>
<img data-slot="logo light" src={logoLight} alt={i18n.t("nav.logoAlt")} width="189" height="34" />
<img data-slot="logo dark" src={logoDark} alt={i18n.t("nav.logoAlt")} width="189" height="34" />
</A>
</div>
<Show when={store.contextMenuOpen}>
<div
class="context-menu"
style={`left: ${store.contextMenuPosition.x}px; top: ${store.contextMenuPosition.y}px;`}
>
<button class="context-menu-item" onClick={copyLogoToClipboard}>
<img data-slot="copy light" src={copyLogoLight} alt="" />
<img data-slot="copy dark" src={copyLogoDark} alt="" />
{i18n.t("nav.context.copyLogo")}
</button>
<button class="context-menu-item" onClick={copyWordmarkToClipboard}>
<img data-slot="copy light" src={copyWordmarkLight} alt="" />
<img data-slot="copy dark" src={copyWordmarkDark} alt="" />
{i18n.t("nav.context.copyWordmark")}
</button>
<button class="context-menu-item" onClick={() => navigate(language.route("/brand"))}>
<img data-slot="copy light" src={copyBrandAssetsLight} alt="" />
<img data-slot="copy dark" src={copyBrandAssetsDark} alt="" />
{i18n.t("nav.context.brandAssets")}
</button>
</div>
</Show>
<nav data-component="nav-desktop">
<ul>
<li>
<a href={config.github.repoUrl} target="_blank" style="white-space: nowrap;">
{i18n.t("nav.github")}
</a>
</li>
<li>
<a href={language.route("/docs")}>{i18n.t("nav.docs")}</a>
</li>
<li>
<a href={language.route("/data")}>{i18n.t("nav.data")}</a>
</li>
<li>
<A href={language.route("/zen")}>{i18n.t("nav.zen")}</A>
</li>
<li>
<A href={language.route("/go")}>{i18n.t("nav.go")}</A>
</li>
<li>
<A href={language.route("/enterprise")}>{i18n.t("nav.enterprise")}</A>
</li>
<Show when={props.zen || props.go}>
<li>
<a href="/auth">{i18n.t("nav.login")}</a>
</li>
</Show>
<Show when={!props.hideGetStarted}>
<li>
<A href={language.route("/download")} data-slot="cta-button">
<svg
width="18"
height="18"
viewBox="0 0 18 18"
fill="none"
xmlns="http://www.w3.org/2000/svg"
style="flex-shrink: 0;"
>
<path
d="M12.1875 9.75L9.00001 12.9375L5.8125 9.75M9.00001 2.0625L9 12.375M14.4375 15.9375H3.5625"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="square"
/>
</svg>
{i18n.t("nav.free")}
</A>
</li>
</Show>
</ul>
</nav>
<nav data-component="nav-mobile">
<button
type="button"
data-component="nav-mobile-toggle"
aria-expanded="false"
aria-controls="nav-mobile-menu"
class="nav-toggle"
onClick={() => setStore("mobileMenuOpen", !store.mobileMenuOpen)}
>
<span class="sr-only">{i18n.t("nav.openMenu")}</span>
<Switch>
<Match when={store.mobileMenuOpen}>
<svg
class="icon icon-close"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
aria-hidden="true"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M12.7071 11.9993L18.0104 17.3026L17.3033 18.0097L12 12.7064L6.6967 18.0097L5.98959 17.3026L11.2929 11.9993L5.98959 6.69595L6.6967 5.98885L12 11.2921L17.3033 5.98885L18.0104 6.69595L12.7071 11.9993Z"
fill="currentColor"
/>
</svg>
</Match>
<Match when={!store.mobileMenuOpen}>
<svg
class="icon icon-hamburger"
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
aria-hidden="true"
xmlns="http://www.w3.org/2000/svg"
>
<path d="M19 17H5V16H19V17Z" fill="currentColor" />
<path d="M19 8H5V7H19V8Z" fill="currentColor" />
</svg>
</Match>
</Switch>
</button>
<Show when={store.mobileMenuOpen}>
<div id="nav-mobile-menu" data-component="nav-mobile">
<nav data-component="nav-mobile-menu-list">
<ul>
<li>
<A href={language.route("/")}>{i18n.t("nav.home")}</A>
</li>
<li>
<a href={config.github.repoUrl} target="_blank" style="white-space: nowrap;">
{i18n.t("nav.github")}
</a>
</li>
<li>
<a href={language.route("/docs")}>{i18n.t("nav.docs")}</a>
</li>
<li>
<a href={language.route("/data")}>{i18n.t("nav.data")}</a>
</li>
<Show when={!props.zen}>
<li>
<A href={language.route("/zen")}>{i18n.t("nav.zen")}</A>
</li>
</Show>
<Show when={!props.go}>
<li>
<A href={language.route("/go")}>{i18n.t("nav.go")}</A>
</li>
</Show>
<li>
<A href={language.route("/enterprise")}>{i18n.t("nav.enterprise")}</A>
</li>
<Show when={props.zen || props.go}>
<li>
<a href="/auth">{i18n.t("nav.login")}</a>
</li>
</Show>
<Show when={!props.hideGetStarted}>
<li>
<A href={language.route("/download")} data-slot="cta-button">
{i18n.t("nav.getStartedFree")}
</A>
</li>
</Show>
</ul>
</nav>
</div>
</Show>
</nav>
</section>
)
}

View File

@@ -0,0 +1,286 @@
import { JSX } from "solid-js"
export function IconZen(_props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg width="84" height="30" viewBox="0 0 84 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 24H6V18H18V12H24V24ZM6 18H0V12H6V18Z" fill="currentColor" fill-opacity="0.2" />
<path d="M6 24H24V30H0V18H6V24ZM18 18H6V12H18V18ZM24 12H18V6H0V0H24V12Z" fill="currentColor" />
<path d="M54 18V24H36V18H54Z" fill="currentColor" fill-opacity="0.2" />
<path d="M54 18H36V24H54V30H30V0H54V18ZM36 12H48V6H36V12Z" fill="currentColor" />
<path d="M78 30H66V12H78V30Z" fill="currentColor" fill-opacity="0.2" />
<path d="M78 6H66V30H60V0H78V6ZM84 30H78V6H84V30Z" fill="currentColor" />
</svg>
)
}
export function IconGo(_props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg width="54" height="30" viewBox="0 0 54 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M24 30H0V0H24V6H6V24H18V18H12V12H24V30Z" fill="currentColor" />
<path d="M12 18H18V24H6V12H12V18Z" fill="currentColor" fill-opacity="0.2" />
<path d="M48 12V24H36V12H48Z" fill="currentColor" fill-opacity="0.2" />
<path d="M54 30H30V0H54V30ZM36 24H48V6H36V24Z" fill="currentColor" />
</svg>
)
}
export function IconCopy(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M8.75 8.75V2.75H21.25V15.25H15.25M15.25 8.75H2.75V21.25H15.25V8.75Z"
stroke="currentColor"
stroke-width="1.5"
stroke-linecap="square"
/>
</svg>
)
}
export function IconCheck(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.75 15.0938L9 20.25L21.25 3.75" stroke="#03B000" stroke-width="2" stroke-linecap="square" />
</svg>
)
}
export function IconCreditCard(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 24 24">
<path
fill="currentColor"
d="M20 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 14H4V8h16v10z"
/>
</svg>
)
}
export function IconStripe(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 24 24">
<path
fill="currentColor"
d="M15.827 12.506c0 .672-.31 1.175-.771 1.175-.293 0-.468-.106-.589-.237l-.007-1.855c.13-.143.31-.247.596-.247.456-.001.771.51.771 1.164zm3.36-1.253c-.312 0-.659.236-.659.798h1.291c0-.562-.325-.798-.632-.798zm4.813-5.253v12c0 1.104-.896 2-2 2h-20c-1.104 0-2-.896-2-2v-12c0-1.104.896-2 2-2h20c1.104 0 2 .896 2 2zm-17.829 7.372c0-1.489-1.909-1.222-1.909-1.784 0-.195.162-.271.424-.271.38 0 .862.116 1.242.321v-1.176c-.414-.165-.827-.228-1.241-.228-1.012.001-1.687.53-1.687 1.414 0 1.382 1.898 1.158 1.898 1.754 0 .231-.201.305-.479.305-.414 0-.947-.171-1.366-.399v1.192c.464.2.935.283 1.365.283 1.038.001 1.753-.512 1.753-1.411zm2.422-3.054h-.949l-.001-1.084-1.219.259-.005 4.006c0 .739.556 1.285 1.297 1.285.408 0 .71-.074.876-.165v-1.016c-.16.064-.948.293-.948-.443v-1.776h.948v-1.066zm2.596 0c-.166-.06-.75-.169-1.042.369l-.078-.369h-1.079v4.377h1.248v-2.967c.295-.388.793-.313.952-.262v-1.148zm1.554 0h-1.253v4.377h1.253v-4.377zm0-1.664l-1.253.266v1.017l1.253-.266v-1.017zm4.314 3.824c0-1.454-.826-2.244-1.703-2.243-.489 0-.805.23-.978.392l-.065-.309h-1.099v5.828l1.249-.265.003-1.413c.179.131.446.316.883.316.893 0 1.71-.719 1.71-2.306zm3.943.045c0-1.279-.619-2.288-1.805-2.288-1.188 0-1.911 1.01-1.911 2.281 0 1.506.852 2.267 2.068 2.267.597 0 1.045-.136 1.384-.324v-1.006c-.34.172-.731.276-1.227.276-.487 0-.915-.172-.971-.758h2.444l.018-.448z"
/>
</svg>
)
}
export function IconAlipay(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M2.541 0H13.5a2.55 2.55 0 0 1 2.54 2.563v8.297c-.006 0-.531-.046-2.978-.813-.412-.14-.916-.327-1.479-.536q-.456-.17-.957-.353a13 13 0 0 0 1.325-3.373H8.822V4.649h3.831v-.634h-3.83V2.121H7.26c-.274 0-.274.273-.274.273v1.621H3.11v.634h3.875v1.136h-3.2v.634H9.99c-.227.789-.532 1.53-.894 2.202-2.013-.67-4.161-1.212-5.51-.878-.864.214-1.42.597-1.746.998-1.499 1.84-.424 4.633 2.741 4.633 1.872 0 3.675-1.053 5.072-2.787 2.08 1.008 6.37 2.738 6.387 2.745v.105A2.55 2.55 0 0 1 13.5 16H2.541A2.55 2.55 0 0 1 0 13.437V2.563A2.55 2.55 0 0 1 2.541 0" />
<path d="M2.309 9.27c-1.22 1.073-.49 3.034 1.978 3.034 1.434 0 2.868-.925 3.994-2.406-1.602-.789-2.959-1.353-4.425-1.207-.397.04-1.14.217-1.547.58Z" />
</svg>
)
}
export function IconUpi(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="10 16 100 28" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M95.678 42.9 110 29.835l-6.784-13.516Z" />
<path d="M90.854 42.9 105.176 29.835l-6.784-13.516Z" />
<path
d="M22.41 16.47 16.38 37.945l21.407.15 5.88-21.625h5.427l-7.05 25.14c-.27.96-1.298 1.74-2.295 1.74H12.31c-1.664 0-2.65-1.3-2.2-2.9l6.724-23.98Zm66.182-.15h5.427l-7.538 27.03h-5.58ZM49.698 27.582l27.136-.15 1.81-5.707H51.054l1.658-5.256 29.4-.27c1.83-.017 2.92 1.4 2.438 3.167L81.78 29.49c-.483 1.766-2.36 3.197-4.19 3.197H53.316L50.454 43.8h-5.28Z"
fill-rule="evenodd"
/>
</svg>
)
}
export function IconWechat(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 24 24" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M9.27099 14.6689C8.9532 14.8312 8.56403 14.7122 8.39132 14.4L8.3477 14.3054L6.53019 10.3069C6.52269 10.2588 6.52269 10.2097 6.53019 10.1615C6.53017 10.0735 6.56564 9.98916 6.62857 9.9276C6.6915 9.86603 6.7766 9.83243 6.86462 9.83438C6.93567 9.83269 7.00508 9.85582 7.06091 9.89981L9.24191 11.4265C9.40329 11.5346 9.59293 11.5928 9.78716 11.5937C9.90424 11.5945 10.0203 11.5723 10.1289 11.5283L20.176 7.02816C18.091 4.72544 15.1103 3.43931 12.0045 3.5022C6.4793 3.5022 2.00098 7.23172 2.00098 11.87C2.06681 14.4052 3.35646 16.7515 5.4615 18.1658C5.6878 18.3326 5.78402 18.6241 5.70141 18.8928L5.25067 20.594C5.22336 20.6714 5.20625 20.7521 5.19978 20.8339C5.19777 20.9232 5.23236 21.0094 5.29552 21.0726C5.35868 21.1358 5.44491 21.1703 5.5342 21.1684C5.60098 21.1645 5.66583 21.1445 5.72322 21.1102L7.90423 19.8452C8.06383 19.7467 8.2474 19.6939 8.43494 19.6925C8.53352 19.6923 8.63157 19.707 8.72574 19.7361C9.78781 20.0363 10.8863 20.188 11.99 20.1869C17.5152 20.1869 22.001 16.4574 22.001 11.8554C22.0108 10.4834 21.6301 9.13687 20.903 7.97326L9.35096 14.6253L9.27099 14.6689Z" />
</svg>
)
}
export function IconChevron(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} width="8" height="6" viewBox="0 0 8 6" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
fill="currentColor"
d="M4.00024 5.04041L7.37401 1.66663L6.66691 0.959525L4.00024 3.62619L1.33357 0.959525L0.626465 1.66663L4.00024 5.04041Z"
/>
</svg>
)
}
export function IconWorkspaceLogo(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} width="24" height="30" viewBox="0 0 24 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M18 6H6V24H18V6ZM24 30H0V0H24V30Z" fill="currentColor" />
</svg>
)
}
export function IconOpenAI(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22" fill="none">
<path
d="M8.43799 8.06943V6.09387C8.43799 5.92749 8.50347 5.80267 8.65601 5.71959L12.8206 3.43211C13.3875 3.1202 14.0635 2.9747 14.7611 2.9747C17.3775 2.9747 19.0347 4.9087 19.0347 6.96734C19.0347 7.11288 19.0347 7.27926 19.0128 7.44564L14.6956 5.03335C14.434 4.88785 14.1723 4.88785 13.9107 5.03335L8.43799 8.06943ZM18.1624 15.7637V11.0431C18.1624 10.7519 18.0315 10.544 17.7699 10.3984L12.2972 7.36234L14.0851 6.3849C14.2377 6.30182 14.3686 6.30182 14.5212 6.3849L18.6858 8.67238C19.8851 9.3379 20.6917 10.7519 20.6917 12.1243C20.6917 13.7047 19.7106 15.1604 18.1624 15.7636V15.7637ZM7.15158 11.6047L5.36369 10.6066C5.21114 10.5235 5.14566 10.3986 5.14566 10.2323V5.65735C5.14566 3.43233 6.93355 1.7478 9.35381 1.7478C10.2697 1.7478 11.1199 2.039 11.8396 2.55886L7.54424 4.92959C7.28268 5.07508 7.15181 5.28303 7.15181 5.57427V11.6049L7.15158 11.6047ZM11 13.7258L8.43799 12.3533V9.44209L11 8.06965L13.5618 9.44209V12.3533L11 13.7258ZM12.6461 20.0476C11.7303 20.0476 10.8801 19.7564 10.1604 19.2366L14.4557 16.8658C14.7173 16.7203 14.8482 16.5124 14.8482 16.2211V10.1905L16.658 11.1886C16.8105 11.2717 16.876 11.3965 16.876 11.563V16.1379C16.876 18.3629 15.0662 20.0474 12.6461 20.0474V20.0476ZM7.47863 15.4103L3.314 13.1229C2.11471 12.4573 1.30808 11.0433 1.30808 9.67088C1.30808 8.06965 2.31106 6.6348 3.85903 6.03168V10.773C3.85903 11.0642 3.98995 11.2721 4.25151 11.4177L9.70253 14.4328L7.91464 15.4103C7.76209 15.4934 7.63117 15.4934 7.47863 15.4103ZM7.23892 18.8207C4.77508 18.8207 2.96533 17.0531 2.96533 14.8696C2.96533 14.7032 2.98719 14.5368 3.00886 14.3704L7.30418 16.7412C7.56574 16.8867 7.82752 16.8867 8.08909 16.7412L13.5618 13.726V15.7015C13.5618 15.8679 13.4964 15.9927 13.3438 16.0758L9.17918 18.3633C8.61225 18.6752 7.93631 18.8207 7.23869 18.8207H7.23892ZM12.6461 21.2952C15.2844 21.2952 17.4865 19.5069 17.9882 17.1362C20.4301 16.5331 22 14.3495 22 12.1245C22 10.6688 21.346 9.25482 20.1685 8.23581C20.2775 7.79908 20.343 7.36234 20.343 6.92582C20.343 3.95215 17.8137 1.72691 14.892 1.72691C14.3034 1.72691 13.7365 1.80999 13.1695 1.99726C12.1882 1.08223 10.8364 0.5 9.35381 0.5C6.71557 0.5 4.51352 2.28829 4.01185 4.65902C1.56987 5.26214 0 7.44564 0 9.67067C0 11.1264 0.654039 12.5404 1.83147 13.5594C1.72246 13.9961 1.65702 14.4328 1.65702 14.8694C1.65702 17.8431 4.1863 20.0683 7.108 20.0683C7.69661 20.0683 8.26354 19.9852 8.83046 19.7979C9.81155 20.713 11.1634 21.2952 12.6461 21.2952Z"
fill="currentColor"
/>
</svg>
)
}
export function IconAnthropic(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor" d="M13.7891 3.93188L20.2223 20.068H23.7502L17.317 3.93188H13.7891Z" />
<path
fill="currentColor"
d="M6.32538 13.6827L8.52662 8.01201L10.7279 13.6827H6.32538ZM6.68225 3.93188L0.25 20.068H3.84652L5.16202 16.6794H11.8914L13.2067 20.068H16.8033L10.371 3.93188H6.68225Z"
/>
</svg>
)
}
export function IconXai(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
<path
d="M9.16861 16.0529L17.2018 9.85156C17.5957 9.54755 18.1586 9.66612 18.3463 10.1384C19.3339 12.6288 18.8926 15.6217 16.9276 17.6766C14.9626 19.7314 12.2285 20.1821 9.72948 19.1557L6.9995 20.4775C10.9151 23.2763 15.6699 22.5841 18.6411 19.4749C20.9979 17.0103 21.7278 13.6508 21.0453 10.6214L21.0515 10.6278C20.0617 6.17736 21.2948 4.39847 23.8207 0.760904C23.8804 0.674655 23.9402 0.588405 24 0.5L20.6762 3.97585V3.96506L9.16658 16.0551"
fill="currentColor"
/>
<path
d="M7.37742 16.7017C4.67579 14.0395 5.14158 9.91963 7.44676 7.54383C9.15135 5.78544 11.9442 5.06779 14.3821 6.12281L17.0005 4.87559C16.5288 4.52392 15.9242 4.14566 15.2305 3.87986C12.0948 2.54882 8.34069 3.21127 5.79171 5.8386C3.33985 8.36779 2.56881 12.2567 3.89286 15.5751C4.88192 18.0552 3.26056 19.8094 1.62731 21.5801C1.04853 22.2078 0.467774 22.8355 0 23.5L7.3754 16.7037"
fill="currentColor"
/>
</svg>
)
}
export function IconAlibaba(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22" fill="none">
<path
fill-rule="evenodd"
clip-rule="evenodd"
fill="currentColor"
d="M11.6043 0.340162C11.9973 1.03016 12.3883 1.72215 12.7783 2.41514C12.7941 2.44286 12.8169 2.46589 12.8445 2.48187C12.8721 2.49786 12.9034 2.50624 12.9353 2.50614H18.4873C18.6612 2.50614 18.8092 2.61614 18.9332 2.83314L20.3872 5.40311C20.5772 5.74011 20.6272 5.88111 20.4112 6.24011C20.1512 6.6701 19.8982 7.1041 19.6512 7.54009L19.2842 8.19809C19.1782 8.39409 19.0612 8.47809 19.2442 8.71008L21.8962 13.347C22.0682 13.648 22.0072 13.841 21.8532 14.117C21.4162 14.902 20.9712 15.681 20.5182 16.457C20.3592 16.729 20.1662 16.832 19.8382 16.827C19.0612 16.811 18.2863 16.817 17.5113 16.843C17.4946 16.8439 17.4785 16.8489 17.4644 16.8576C17.4502 16.8664 17.4385 16.8785 17.4303 16.893C16.5361 18.4773 15.6344 20.0573 14.7253 21.633C14.5563 21.926 14.3453 21.996 14.0003 21.997C13.0033 22 11.9983 22.001 10.9833 21.999C10.8889 21.9987 10.7961 21.9735 10.7145 21.9259C10.6328 21.8783 10.5652 21.8101 10.5184 21.728L9.18337 19.405C9.1756 19.3898 9.16368 19.3771 9.14898 19.3684C9.13429 19.3598 9.11743 19.3554 9.10037 19.356H3.98244C3.69744 19.386 3.42944 19.355 3.17745 19.264L1.57447 16.494C1.52706 16.412 1.50193 16.319 1.50158 16.2243C1.50123 16.1296 1.52567 16.0364 1.57247 15.954L2.77945 13.834C2.79665 13.8041 2.80569 13.7701 2.80569 13.7355C2.80569 13.701 2.79665 13.667 2.77945 13.637C2.15073 12.5485 1.52573 11.4579 0.904476 10.3651L0.114486 8.97008C-0.0455115 8.66008 -0.0585113 8.47409 0.209485 8.00509C0.674479 7.1921 1.13647 6.38011 1.59647 5.56911C1.72847 5.33512 1.90046 5.23512 2.18046 5.23412C3.04344 5.23048 3.90644 5.23015 4.76943 5.23312C4.79123 5.23295 4.81259 5.22704 4.83138 5.21597C4.85016 5.20491 4.8657 5.1891 4.87643 5.17012L7.68239 0.275163C7.72491 0.200697 7.78631 0.138751 7.86039 0.0955646C7.93448 0.0523783 8.01863 0.0294762 8.10439 0.0291651C8.62838 0.0281651 9.15737 0.029165 9.68736 0.0231651L10.7044 0.000165317C11.0453 -0.00283466 11.4283 0.032165 11.6043 0.340162ZM8.17238 0.743158C8.16185 0.743152 8.15149 0.745921 8.14236 0.751187C8.13323 0.756454 8.12565 0.764031 8.12038 0.773158L5.25442 5.78811C5.24066 5.81174 5.22097 5.83137 5.19729 5.84505C5.17361 5.85873 5.14677 5.86599 5.11942 5.86611H2.25346C2.19746 5.86611 2.18346 5.89111 2.21246 5.94011L8.02239 16.096C8.04739 16.138 8.03539 16.158 7.98839 16.159L5.19342 16.174C5.15256 16.1727 5.11214 16.1828 5.07678 16.2033C5.04141 16.2238 5.01253 16.2539 4.99342 16.29L3.67344 18.6C3.62944 18.678 3.65244 18.718 3.74144 18.718L9.45737 18.726C9.50337 18.726 9.53737 18.746 9.56137 18.787L10.9643 21.241C11.0103 21.322 11.0563 21.323 11.1033 21.241L16.1093 12.481L16.8923 11.0991C16.897 11.0905 16.904 11.0834 16.9125 11.0785C16.9209 11.0735 16.9305 11.0709 16.9403 11.0709C16.9501 11.0709 16.9597 11.0735 16.9681 11.0785C16.9765 11.0834 16.9835 11.0905 16.9883 11.0991L18.4123 13.629C18.4229 13.648 18.4385 13.6637 18.4573 13.6746C18.4761 13.6855 18.4975 13.6912 18.5193 13.691L21.2822 13.671C21.2893 13.6711 21.2963 13.6693 21.3024 13.6658C21.3086 13.6623 21.3137 13.6572 21.3172 13.651C21.3206 13.6449 21.3224 13.638 21.3224 13.631C21.3224 13.624 21.3206 13.6172 21.3172 13.611L18.4173 8.52508C18.4068 8.50809 18.4013 8.48853 18.4013 8.46859C18.4013 8.44864 18.4068 8.42908 18.4173 8.41209L18.7102 7.90509L19.8302 5.92811C19.8542 5.88711 19.8422 5.86611 19.7952 5.86611H8.20038C8.14138 5.86611 8.12738 5.84011 8.15738 5.78911L9.59137 3.28413C9.60211 3.26706 9.60781 3.24731 9.60781 3.22714C9.60781 3.20697 9.60211 3.18721 9.59137 3.17014L8.22538 0.774158C8.22016 0.764697 8.21248 0.756822 8.20315 0.751365C8.19382 0.745909 8.18319 0.743073 8.17238 0.743158ZM14.4623 8.76308C14.5083 8.76308 14.5203 8.78308 14.4963 8.82308L13.6643 10.2881L11.0513 14.873C11.0464 14.8819 11.0392 14.8894 11.0304 14.8945C11.0216 14.8996 11.0115 14.9022 11.0013 14.902C10.9912 14.902 10.9813 14.8993 10.9725 14.8942C10.9637 14.8891 10.9564 14.8818 10.9513 14.873L7.49839 8.84108C7.47839 8.80708 7.48839 8.78908 7.52639 8.78708L7.74239 8.77508L14.4643 8.76308H14.4623Z"
/>
</svg>
)
}
export function IconMoonshotAI(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M20.052 6.0364C18.7527 4.28846 16.8758 2.94985 14.6066 2.34296C12.3374 1.73606 10.0411 1.95816 8.04092 2.82331L20.052 6.0364ZM3.75774 6.34071C4.64576 5.04902 5.81872 3.99836 7.16325 3.25459L16.0115 5.62191C15.4308 5.95635 14.8088 6.53268 14.3273 7.16626L21.6025 9.11263C21.809 9.79398 21.9435 10.5003 22 11.2213L3.75774 6.34071ZM21.6866 14.5876C21.584 14.9707 21.4603 15.3425 21.3172 15.7019L2.10543 10.5623C2.16147 10.1792 2.24079 9.7957 2.34339 9.41263C2.58479 8.51262 2.94172 7.67459 3.39435 6.91016L12.7957 9.42554C12.4194 9.96271 12.0766 10.5464 11.7749 11.1709L21.8517 13.8671C21.8056 14.1077 21.7504 14.3478 21.6862 14.5884L21.6866 14.5876ZM2.58134 15.3529C2.11535 14.05 1.91662 12.6408 2.03215 11.2088L10.8985 13.5808C10.8347 13.7823 10.7748 13.9863 10.7192 14.1933C10.6062 14.6147 10.514 15.0352 10.4424 15.4527L20.0166 18.0142C19.5709 18.6051 19.0631 19.1406 18.5057 19.6132L2.58134 15.3529ZM9.42338 21.6568C6.40111 20.8481 4.07415 18.7424 2.88266 16.1001L10.0976 18.0305C10.0859 18.7024 10.1278 19.3571 10.2196 19.9851L15.4619 21.3874C13.5906 22.0743 11.496 22.2112 9.42338 21.6568Z"
fill="currentColor"
/>
</svg>
)
}
export function IconZai(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M12.105 2L9.927 4.953H.653L2.83 2h9.276zM23.254 19.048L21.078 22h-9.242l2.174-2.952h9.244zM24 2L9.264 22H0L14.736 2H24z"></path>
</svg>
)
}
export function IconMiniMax(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M16.278 2c1.156 0 2.093.927 2.093 2.07v12.501a.74.74 0 00.744.709.74.74 0 00.743-.709V9.099a2.06 2.06 0 012.071-2.049A2.06 2.06 0 0124 9.1v6.561a.649.649 0 01-.652.645.649.649 0 01-.653-.645V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v7.472a2.037 2.037 0 01-2.048 2.026 2.037 2.037 0 01-2.048-2.026v-12.5a.785.785 0 00-.788-.753.785.785 0 00-.789.752l-.001 15.904A2.037 2.037 0 0113.441 22a2.037 2.037 0 01-2.048-2.026V18.04c0-.356.292-.645.652-.645.36 0 .652.289.652.645v1.934c0 .263.142.506.372.638.23.131.514.131.744 0a.734.734 0 00.372-.638V4.07c0-1.143.937-2.07 2.093-2.07zm-5.674 0c1.156 0 2.093.927 2.093 2.07v11.523a.648.648 0 01-.652.645.648.648 0 01-.652-.645V4.07a.785.785 0 00-.789-.78.785.785 0 00-.789.78v14.013a2.06 2.06 0 01-2.07 2.048 2.06 2.06 0 01-2.071-2.048V9.1a.762.762 0 00-.766-.758.762.762 0 00-.766.758v3.8a2.06 2.06 0 01-2.071 2.049A2.06 2.06 0 010 12.9v-1.378c0-.357.292-.646.652-.646.36 0 .653.29.653.646V12.9c0 .418.343.757.766.757s.766-.339.766-.757V9.099a2.06 2.06 0 012.07-2.048 2.06 2.06 0 012.071 2.048v8.984c0 .419.343.758.767.758.423 0 .766-.339.766-.758V4.07c0-1.143.937-2.07 2.093-2.07z" />
</svg>
)
}
export function IconGemini(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 50 50" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
<path d="M49.04,24.001l-1.082-0.043h-0.001C36.134,23.492,26.508,13.866,26.042,2.043L25.999,0.96C25.978,0.424,25.537,0,25,0 s-0.978,0.424-0.999,0.96l-0.043,1.083C23.492,13.866,13.866,23.492,2.042,23.958L0.96,24.001C0.424,24.022,0,24.463,0,25 c0,0.537,0.424,0.978,0.961,0.999l1.082,0.042c11.823,0.467,21.449,10.093,21.915,21.916l0.043,1.083C24.022,49.576,24.463,50,25,50 s0.978-0.424,0.999-0.96l0.043-1.083c0.466-11.823,10.092-21.449,21.915-21.916l1.082-0.042C49.576,25.978,50,25.537,50,25 C50,24.463,49.576,24.022,49.04,24.001z"></path>
</svg>
)
}
export function IconDeepSeek(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.249-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 0 1-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 0 0-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 0 1-.465.137 9.597 9.597 0 0 0-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 0 0 1.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 0 1 1.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 0 1 .415-.287.302.302 0 0 1 .2.288.306.306 0 0 1-.31.307.303.303 0 0 1-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 0 1-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 0 1 .016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 0 1-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z" />
</svg>
)
}
export function IconMiMo(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0C8.016 0 4.756.255 2.493 2.516.23 4.776 0 8.033 0 12.012c0 3.98.23 7.235 2.494 9.497C4.757 23.77 8.017 24 12 24c3.983 0 7.243-.23 9.506-2.491C23.77 19.247 24 15.99 24 12.012c0-3.984-.233-7.243-2.502-9.504C19.234.252 15.978 0 12 0zM4.906 7.405h5.624c1.47 0 3.007.068 3.764.827.746.746.827 2.233.83 3.676v4.54a.15.15 0 0 1-.152.147h-1.947a.15.15 0 0 1-.152-.148V11.83c-.002-.806-.048-1.634-.464-2.051-.358-.36-1.026-.441-1.72-.458H7.158a.15.15 0 0 0-.151.147v6.98a.15.15 0 0 1-.152.148H4.906a.15.15 0 0 1-.15-.148V7.554a.15.15 0 0 1 .15-.149zm12.131 0h1.949a.15.15 0 0 1 .15.15v8.892a.15.15 0 0 1-.15.148h-1.949a.15.15 0 0 1-.151-.148V7.554a.15.15 0 0 1 .151-.149zM8.92 10.948h2.046c.083 0 .15.066.15.147v5.352a.15.15 0 0 1-.15.148H8.92a.15.15 0 0 1-.152-.148v-5.352a.15.15 0 0 1 .152-.147Z" />
</svg>
)
}
export function IconXiaomi(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0C8.016 0 4.756.255 2.493 2.516.23 4.776 0 8.033 0 12.012c0 3.98.23 7.235 2.494 9.497C4.757 23.77 8.017 24 12 24c3.983 0 7.243-.23 9.506-2.491C23.77 19.247 24 15.99 24 12.012c0-3.984-.233-7.243-2.502-9.504C19.234.252 15.978 0 12 0zM4.906 7.405h5.624c1.47 0 3.007.068 3.764.827.746.746.827 2.233.83 3.676v4.54a.15.15 0 0 1-.152.147h-1.947a.15.15 0 0 1-.152-.148V11.83c-.002-.806-.048-1.634-.464-2.051-.358-.36-1.026-.441-1.72-.458H7.158a.15.15 0 0 0-.151.147v6.98a.15.15 0 0 1-.152.148H4.906a.15.15 0 0 1-.15-.148V7.554a.15.15 0 0 1 .15-.149zm12.131 0h1.949a.15.15 0 0 1 .15.15v8.892a.15.15 0 0 1-.15.148h-1.949a.15.15 0 0 1-.151-.148V7.554a.15.15 0 0 1 .151-.149zM8.92 10.948h2.046c.083 0 .15.066.15.147v5.352a.15.15 0 0 1-.15.148H8.92a.15.15 0 0 1-.152-.148v-5.352a.15.15 0 0 1 .152-.147Z" />
</svg>
)
}
export function IconNvidia(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
<path d="M8.948 8.798v-1.43a6.7 6.7 0 0 1 .424-.018c3.922-.124 6.493 3.374 6.493 3.374s-2.774 3.851-5.75 3.851c-.398 0-.787-.062-1.158-.185v-4.346c1.528.185 1.837.857 2.747 2.385l2.04-1.714s-1.492-1.952-4-1.952a6.016 6.016 0 0 0-.796.035m0-4.735v2.138l.424-.027c5.45-.185 9.01 4.47 9.01 4.47s-4.08 4.964-8.33 4.964c-.37 0-.733-.035-1.095-.097v1.325c.3.035.61.062.91.062 3.957 0 6.82-2.023 9.593-4.408.459.371 2.34 1.263 2.73 1.652-2.633 2.208-8.772 3.984-12.253 3.984-.335 0-.653-.018-.971-.053v1.864H24V4.063zm0 10.326v1.131c-3.657-.654-4.673-4.46-4.673-4.46s1.758-1.944 4.673-2.262v1.237H8.94c-1.528-.186-2.73 1.245-2.73 1.245s.68 2.412 2.739 3.11M2.456 10.9s2.164-3.197 6.5-3.533V6.201C4.153 6.59 0 10.653 0 10.653s2.35 6.802 8.948 7.42v-1.237c-4.84-.6-6.492-5.936-6.492-5.936z" />
</svg>
)
}
export function IconArcee(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 37 32" fill="currentColor">
<path d="M20.4062 3.66602L4.24121 31.5928H0L18.2881 0L20.4062 3.66602Z" />
<path d="M25.8838 13.1553L11.0752 31.5928H6.36719L23.9131 9.74512L25.8838 13.1553Z" />
<path d="M36.5352 31.5928H21.6611L34.6191 28.2783L36.5352 31.5928Z" />
<path d="M31.2627 22.4648L19.1699 31.5898H13.0762L29.4131 19.2617L31.2627 22.4648Z" />
</svg>
)
}
export function IconStealth(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 18" fill="none">
<path
d="M24 15.5L18.1816 14.2871L18.1328 14.3115C16.9036 11.7879 15.6135 9.29301 14.2607 6.82812C14.0172 6.38435 13.771 5.94188 13.5234 5.5C13.6911 5.97998 13.8606 6.45942 14.0322 6.9375C14.9902 9.60529 16.012 12.2429 17.0947 14.8516L12 17.5L6.9043 14.8516C7.98712 12.2428 9.00977 9.6054 9.96777 6.9375C10.1394 6.45942 10.3089 5.97998 10.4766 5.5C10.229 5.94188 9.98281 6.38435 9.73926 6.82812C8.38629 9.29339 7.09557 11.7884 5.86621 14.3125L5.81738 14.2871L0 15.5L12 0.5L24 15.5Z"
fill="currentColor"
/>
</svg>
)
}
export function IconChevronLeft(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 20 20" fill="none">
<path d="M12 15L7 10L12 5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" />
</svg>
)
}
export function IconChevronRight(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} viewBox="0 0 20 20" fill="none">
<path d="M8 5L13 10L8 15" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" />
</svg>
)
}
export function IconBreakdown(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
return (
<svg {...props} width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M2 12L2 8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
<path d="M6 12L6 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
<path d="M10 12L10 6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
<path d="M14 12L14 9" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" />
</svg>
)
}

View File

@@ -0,0 +1,135 @@
[data-component="language-picker"] {
width: auto;
}
[data-component="footer"] [data-component="language-picker"] {
width: 100%;
}
[data-component="footer"] [data-component="language-picker"] [data-component="dropdown"] {
width: 100%;
}
/* Standard site footer (grid of cells) */
[data-component="footer"] [data-slot="cell"] [data-component="language-picker"] {
height: 100%;
}
[data-component="footer"] [data-slot="cell"] [data-component="language-picker"] [data-slot="trigger"] {
width: 100%;
padding: 2rem 0;
border-radius: 0;
justify-content: center;
gap: var(--space-2);
color: inherit;
font: inherit;
}
[data-component="footer"] [data-slot="cell"] [data-component="language-picker"] [data-slot="trigger"] span {
flex: 0 0 auto;
text-align: center;
font-weight: inherit;
}
[data-component="footer"] [data-slot="cell"] [data-component="language-picker"] [data-slot="trigger"]:hover {
background: var(--color-background-weak);
text-decoration: underline;
text-underline-offset: var(--space-1);
text-decoration-thickness: 1px;
}
/* Footer dropdown should open upward */
[data-component="footer"] [data-component="language-picker"] [data-slot="dropdown"] {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: var(--space-2);
max-height: min(60vh, 420px);
overflow: auto;
}
[data-component="legal"] {
flex-wrap: wrap;
row-gap: var(--space-2);
}
[data-component="legal"] [data-component="language-picker"] {
width: auto;
}
[data-component="legal"] [data-component="language-picker"] [data-slot="trigger"] {
padding: 0;
border-radius: 0;
background: transparent;
font: inherit;
color: var(--color-text-weak);
white-space: nowrap;
}
[data-component="legal"] [data-component="language-picker"] [data-slot="trigger"] span {
font-weight: inherit;
}
[data-component="legal"] [data-component="language-picker"] [data-slot="trigger"]:hover {
background: transparent;
color: var(--color-text);
text-decoration: underline;
text-underline-offset: var(--space-1);
text-decoration-thickness: 1px;
}
[data-component="legal"] [data-component="language-picker"] [data-slot="dropdown"] {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: var(--space-2);
max-height: min(60vh, 420px);
overflow: auto;
}
/* Black pages footer */
[data-page="black"] [data-component="language-picker"] {
width: auto;
}
[data-page="black"] [data-component="language-picker"] [data-component="dropdown"] {
width: auto;
}
[data-page="black"] [data-component="language-picker"] [data-slot="trigger"] {
padding: 0;
border-radius: 0;
background: transparent;
font: inherit;
color: rgba(255, 255, 255, 0.39);
}
[data-page="black"] [data-component="language-picker"] [data-slot="trigger"]:hover {
background: transparent;
text-decoration: underline;
text-underline-offset: 4px;
}
[data-page="black"] [data-component="language-picker"] [data-slot="dropdown"] {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: 12px;
background-color: #0e0e10;
border-color: rgba(255, 255, 255, 0.14);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.6);
max-height: min(60vh, 420px);
overflow: auto;
}
[data-page="black"] [data-component="language-picker"] [data-slot="item"] {
color: rgba(255, 255, 255, 0.86);
}
[data-page="black"] [data-component="language-picker"] [data-slot="item"]:hover {
background-color: rgba(255, 255, 255, 0.06);
}
[data-page="black"] [data-component="language-picker"] [data-slot="item"][data-selected="true"] {
background-color: rgba(255, 255, 255, 0.1);
}

View File

@@ -0,0 +1,40 @@
import { For, createSignal } from "solid-js"
import { useLocation, useNavigate } from "@solidjs/router"
import { Dropdown, DropdownItem } from "~/component/dropdown"
import { useLanguage } from "~/context/language"
import { route, strip } from "~/lib/language"
import "./language-picker.css"
export function LanguagePicker(props: { align?: "left" | "right" } = {}) {
const language = useLanguage()
const navigate = useNavigate()
const location = useLocation()
const [open, setOpen] = createSignal(false)
return (
<div data-component="language-picker">
<Dropdown
trigger={language.label(language.locale())}
align={props.align ?? "left"}
open={open()}
onOpenChange={setOpen}
>
<For each={language.locales}>
{(locale) => (
<DropdownItem
selected={locale === language.locale()}
onClick={() => {
language.setLocale(locale)
const href = `${route(locale, strip(location.pathname))}${location.search}${location.hash}`
if (href !== `${location.pathname}${location.search}${location.hash}`) navigate(href)
setOpen(false)
}}
>
{language.label(locale)}
</DropdownItem>
)}
</For>
</Dropdown>
</div>
)
}

View File

@@ -0,0 +1,28 @@
import { A } from "@solidjs/router"
import { LanguagePicker } from "~/component/language-picker"
import { useI18n } from "~/context/i18n"
import { useLanguage } from "~/context/language"
export function Legal() {
const i18n = useI18n()
const language = useLanguage()
return (
<div data-component="legal">
<span>
©{new Date().getFullYear()} <a href="https://anoma.ly">Anomaly</a>
</span>
<span>
<A href={language.route("/brand")}>{i18n.t("legal.brand")}</A>
</span>
<span>
<A href={language.route("/legal/privacy-policy")}>{i18n.t("legal.privacy")}</A>
</span>
<span>
<A href={language.route("/legal/terms-of-service")}>{i18n.t("legal.terms")}</A>
</span>
<span>
<LanguagePicker align="right" />
</span>
</div>
)
}

View File

@@ -0,0 +1,36 @@
import { Link } from "@solidjs/meta"
import { For } from "solid-js"
import { getRequestEvent } from "solid-js/web"
import { config } from "~/config"
import { useLanguage } from "~/context/language"
import { LOCALES, route, tag } from "~/lib/language"
function skip(path: string) {
const evt = getRequestEvent()
if (!evt) return false
const key = "__locale_links_seen"
const locals = evt.locals as Record<string, unknown>
const seen = locals[key] instanceof Set ? (locals[key] as Set<string>) : new Set<string>()
locals[key] = seen
if (seen.has(path)) return true
seen.add(path)
return false
}
export function LocaleLinks(props: { path: string }) {
const language = useLanguage()
if (skip(props.path)) return null
return (
<>
<Link rel="canonical" href={`${config.baseUrl}${route(language.locale(), props.path)}`} />
<For each={LOCALES}>
{(locale) => (
<Link rel="alternate" hreflang={tag(locale)} href={`${config.baseUrl}${route(locale, props.path)}`} />
)}
</For>
<Link rel="alternate" hreflang="x-default" href={`${config.baseUrl}${props.path}`} />
</>
)
}

View File

@@ -0,0 +1,134 @@
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
[data-component="modal"][data-slot="overlay"] {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
background-color: rgba(0, 0, 0, 0.5);
animation: fadeIn 0.2s ease;
@media (prefers-color-scheme: dark) {
background-color: rgba(0, 0, 0, 0.7);
}
[data-slot="content"] {
background-color: var(--color-bg);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-md);
padding: var(--space-6);
min-width: 400px;
max-width: 90vw;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
animation: slideUp 0.2s ease;
@media (max-width: 30rem) {
min-width: 300px;
padding: var(--space-4);
}
@media (prefers-color-scheme: dark) {
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
}
button {
display: inline-flex;
align-items: center;
justify-content: center;
padding: var(--space-3) var(--space-4);
border: 1px solid var(--color-border);
border-radius: var(--border-radius-sm);
background-color: var(--color-bg);
color: var(--color-text);
font-size: var(--font-size-sm);
font-family: var(--font-sans);
font-weight: 500;
line-height: 1;
cursor: pointer;
transition: all 0.15s ease;
&:hover:not(:disabled) {
background-color: var(--color-surface-hover);
border-color: var(--color-accent);
}
&:active:not(:disabled) {
transform: translateY(1px);
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
}
&[data-color="primary"] {
background-color: var(--color-primary);
border-color: var(--color-primary);
color: var(--color-primary-text);
&:hover:not(:disabled) {
background-color: var(--color-primary-hover);
border-color: var(--color-primary-hover);
}
}
&[data-color="ghost"] {
background-color: transparent;
border-color: transparent;
color: var(--color-text-muted);
&:hover:not(:disabled) {
background-color: var(--color-surface-hover);
border-color: var(--color-border);
color: var(--color-text);
}
}
}
}
[data-slot="title"] {
margin: 0 0 var(--space-4) 0;
font-size: var(--font-size-lg);
font-weight: 600;
color: var(--color-text);
text-align: center;
}
[data-slot="content"][data-variant="black"] {
background-color: #000;
border-color: rgba(255, 255, 255, 0.17);
color: rgba(255, 255, 255, 0.92);
font-family: var(--font-mono);
[data-slot="title"] {
color: rgba(255, 255, 255, 0.92);
font-family: var(--font-mono);
}
}
}

View File

@@ -0,0 +1,46 @@
import { Dialog as Kobalte } from "@kobalte/core/dialog"
import { JSX, Show } from "solid-js"
import "./modal.css"
interface ModalProps {
open: boolean
onClose: () => void
title?: string
variant?: "black"
children: JSX.Element
}
export function Modal(props: ModalProps) {
return (
<Show when={props.open}>
<Kobalte
modal
open={props.open}
preventScroll={false}
onOpenChange={(open) => {
if (!open) props.onClose()
}}
>
<Kobalte.Portal>
<Kobalte.Overlay data-component="modal" data-slot="overlay" onClick={props.onClose}>
<Kobalte.Content
data-slot="content"
data-variant={props.variant}
onClick={(e) => e.stopPropagation()}
onOpenAutoFocus={(e) => {
e.preventDefault()
const target = e.currentTarget as HTMLElement | null
target?.focus({ preventScroll: true })
}}
>
<Show when={props.title}>
<Kobalte.Title data-slot="title">{props.title}</Kobalte.Title>
</Show>
{props.children}
</Kobalte.Content>
</Kobalte.Overlay>
</Kobalte.Portal>
</Kobalte>
</Show>
)
}

View File

@@ -0,0 +1,15 @@
.spotlight-container {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 50dvh;
pointer-events: none;
overflow: hidden;
}
.spotlight-container canvas {
display: block;
width: 100%;
height: 100%;
}

View File

@@ -0,0 +1,820 @@
import { createSignal, createEffect, onMount, onCleanup, Accessor } from "solid-js"
import "./spotlight.css"
export interface ParticlesConfig {
enabled: boolean
amount: number
size: [number, number]
speed: number
opacity: number
drift: number
}
export interface SpotlightConfig {
placement: [number, number]
color: string
speed: number
spread: number
length: number
width: number
pulsating: false | [number, number]
distance: number
saturation: number
noiseAmount: number
distortion: number
opacity: number
particles: ParticlesConfig
}
export const defaultConfig: SpotlightConfig = {
placement: [0.5, -0.15],
color: "#ffffff",
speed: 0.8,
spread: 0.5,
length: 4.0,
width: 0.15,
pulsating: [0.95, 1.1],
distance: 3.5,
saturation: 0.35,
noiseAmount: 0.15,
distortion: 0.05,
opacity: 0.325,
particles: {
enabled: true,
amount: 70,
size: [1.25, 1.5],
speed: 0.75,
opacity: 0.9,
drift: 1.5,
},
}
export interface SpotlightAnimationState {
time: number
intensity: number
pulseValue: number
}
interface SpotlightProps {
config: Accessor<SpotlightConfig>
class?: string
onAnimationFrame?: (state: SpotlightAnimationState) => void
}
const hexToRgb = (hex: string): [number, number, number] => {
const m = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
return m ? [parseInt(m[1], 16) / 255, parseInt(m[2], 16) / 255, parseInt(m[3], 16) / 255] : [1, 1, 1]
}
const getAnchorAndDir = (
placement: [number, number],
w: number,
h: number,
): { anchor: [number, number]; dir: [number, number] } => {
const [px, py] = placement
const outside = 0.2
let anchorX = px * w
let anchorY = py * h
let dirX = 0
let dirY = 0
const centerX = 0.5
const centerY = 0.5
if (py <= 0.25) {
anchorY = -outside * h + py * h
dirY = 1
dirX = (centerX - px) * 0.5
} else if (py >= 0.75) {
anchorY = (1 + outside) * h - (1 - py) * h
dirY = -1
dirX = (centerX - px) * 0.5
} else if (px <= 0.25) {
anchorX = -outside * w + px * w
dirX = 1
dirY = (centerY - py) * 0.5
} else if (px >= 0.75) {
anchorX = (1 + outside) * w - (1 - px) * w
dirX = -1
dirY = (centerY - py) * 0.5
} else {
dirY = 1
}
const len = Math.sqrt(dirX * dirX + dirY * dirY)
if (len > 0) {
dirX /= len
dirY /= len
}
return { anchor: [anchorX, anchorY], dir: [dirX, dirY] }
}
interface UniformData {
iTime: number
iResolution: [number, number]
lightPos: [number, number]
lightDir: [number, number]
color: [number, number, number]
speed: number
lightSpread: number
lightLength: number
sourceWidth: number
pulsating: number
pulsatingMin: number
pulsatingMax: number
fadeDistance: number
saturation: number
noiseAmount: number
distortion: number
particlesEnabled: number
particleAmount: number
particleSizeMin: number
particleSizeMax: number
particleSpeed: number
particleOpacity: number
particleDrift: number
}
const WGSL_SHADER = `
struct Uniforms {
iTime: f32,
_pad0: f32,
iResolution: vec2<f32>,
lightPos: vec2<f32>,
lightDir: vec2<f32>,
color: vec3<f32>,
speed: f32,
lightSpread: f32,
lightLength: f32,
sourceWidth: f32,
pulsating: f32,
pulsatingMin: f32,
pulsatingMax: f32,
fadeDistance: f32,
saturation: f32,
noiseAmount: f32,
distortion: f32,
particlesEnabled: f32,
particleAmount: f32,
particleSizeMin: f32,
particleSizeMax: f32,
particleSpeed: f32,
particleOpacity: f32,
particleDrift: f32,
_pad1: f32,
_pad2: f32,
};
@group(0) @binding(0) var<uniform> uniforms: Uniforms;
struct VertexOutput {
@builtin(position) position: vec4<f32>,
@location(0) vUv: vec2<f32>,
};
@vertex
fn vertexMain(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {
var positions = array<vec2<f32>, 3>(
vec2<f32>(-1.0, -1.0),
vec2<f32>(3.0, -1.0),
vec2<f32>(-1.0, 3.0)
);
var output: VertexOutput;
let pos = positions[vertexIndex];
output.position = vec4<f32>(pos, 0.0, 1.0);
output.vUv = pos * 0.5 + 0.5;
return output;
}
fn hash(p: vec2<f32>) -> f32 {
let p3 = fract(p.xyx * 0.1031);
return fract((p3.x + p3.y) * p3.z + dot(p3, p3.yzx + 33.33));
}
fn hash2(p: vec2<f32>) -> vec2<f32> {
let n = sin(dot(p, vec2<f32>(41.0, 289.0)));
return fract(vec2<f32>(n * 262144.0, n * 32768.0));
}
fn fastNoise(st: vec2<f32>) -> f32 {
return fract(sin(dot(st, vec2<f32>(12.9898, 78.233))) * 43758.5453);
}
fn lightStrengthCombined(lightSource: vec2<f32>, lightRefDirection: vec2<f32>, coord: vec2<f32>) -> f32 {
let sourceToCoord = coord - lightSource;
let distSq = dot(sourceToCoord, sourceToCoord);
let distance = sqrt(distSq);
let baseSize = min(uniforms.iResolution.x, uniforms.iResolution.y);
let maxDistance = max(baseSize * uniforms.lightLength, 0.001);
if (distance > maxDistance) {
return 0.0;
}
let invDist = 1.0 / max(distance, 0.001);
let dirNorm = sourceToCoord * invDist;
let cosAngle = dot(dirNorm, lightRefDirection);
if (cosAngle < 0.0) {
return 0.0;
}
let side = dot(dirNorm, vec2<f32>(-lightRefDirection.y, lightRefDirection.x));
let time = uniforms.iTime;
let speed = uniforms.speed;
let asymNoise = fastNoise(vec2<f32>(side * 6.0 + time * 0.12, distance * 0.004 + cosAngle * 2.0));
let asymShift = (asymNoise - 0.5) * uniforms.distortion * 0.6;
let distortPhase = time * 1.4 + distance * 0.006 + cosAngle * 4.5 + side * 1.7;
let distortedAngle = cosAngle + uniforms.distortion * sin(distortPhase) * 0.22 + asymShift;
let flickerSeed = cosAngle * 9.0 + side * 4.0 + time * speed * 0.35;
let flicker = 0.86 + fastNoise(vec2<f32>(flickerSeed, distance * 0.01)) * 0.28;
let asymSpread = max(uniforms.lightSpread * (0.9 + (asymNoise - 0.5) * 0.25), 0.001);
let spreadFactor = pow(max(distortedAngle, 0.0), 1.0 / asymSpread);
let lengthFalloff = clamp(1.0 - distance / maxDistance, 0.0, 1.0);
let fadeMaxDist = max(baseSize * uniforms.fadeDistance, 0.001);
let fadeFalloff = clamp((fadeMaxDist - distance) / fadeMaxDist, 0.0, 1.0);
var pulse: f32 = 1.0;
if (uniforms.pulsating > 0.5) {
let pulseCenter = (uniforms.pulsatingMin + uniforms.pulsatingMax) * 0.5;
let pulseAmplitude = (uniforms.pulsatingMax - uniforms.pulsatingMin) * 0.5;
pulse = pulseCenter + pulseAmplitude * sin(time * speed * 3.0);
}
let timeSpeed = time * speed;
let wave = 0.5
+ 0.25 * sin(cosAngle * 28.0 + side * 8.0 + timeSpeed * 1.2)
+ 0.18 * cos(cosAngle * 22.0 - timeSpeed * 0.95 + side * 6.0)
+ 0.12 * sin(cosAngle * 35.0 + timeSpeed * 1.6 + asymNoise * 3.0);
let minStrength = 0.14 + asymNoise * 0.06;
let baseStrength = max(clamp(wave * (0.85 + asymNoise * 0.3), 0.0, 1.0), minStrength);
let lightStrength = baseStrength * lengthFalloff * fadeFalloff * spreadFactor * pulse * flicker;
let ambientLight = (0.06 + asymNoise * 0.04) * lengthFalloff * fadeFalloff * spreadFactor;
return max(lightStrength, ambientLight);
}
fn particle(coord: vec2<f32>, particlePos: vec2<f32>, size: f32) -> f32 {
let delta = coord - particlePos;
let distSq = dot(delta, delta);
let sizeSq = size * size;
if (distSq > sizeSq * 9.0) {
return 0.0;
}
let d = sqrt(distSq);
let core = smoothstep(size, size * 0.35, d);
let glow = smoothstep(size * 3.0, 0.0, d) * 0.55;
return core + glow;
}
fn renderParticles(coord: vec2<f32>, lightSource: vec2<f32>, lightDir: vec2<f32>) -> f32 {
if (uniforms.particlesEnabled < 0.5 || uniforms.particleAmount < 1.0) {
return 0.0;
}
var particleSum: f32 = 0.0;
let particleCount = i32(uniforms.particleAmount);
let time = uniforms.iTime * uniforms.particleSpeed;
let perpDir = vec2<f32>(-lightDir.y, lightDir.x);
let baseSize = min(uniforms.iResolution.x, uniforms.iResolution.y);
let maxDist = max(baseSize * uniforms.lightLength, 1.0);
let spreadScale = uniforms.lightSpread * baseSize * 0.65;
let coneHalfWidth = uniforms.lightSpread * baseSize * 0.55;
for (var i: i32 = 0; i < particleCount; i = i + 1) {
let fi = f32(i);
let seed = vec2<f32>(fi * 127.1, fi * 311.7);
let rnd = hash2(seed);
let lifeDuration = 2.0 + hash(seed + vec2<f32>(19.0, 73.0)) * 3.0;
let lifeOffset = hash(seed + vec2<f32>(91.0, 37.0)) * lifeDuration;
let lifeProgress = fract((time + lifeOffset) / lifeDuration);
let fadeIn = smoothstep(0.0, 0.2, lifeProgress);
let fadeOut = 1.0 - smoothstep(0.8, 1.0, lifeProgress);
let lifeFade = fadeIn * fadeOut;
if (lifeFade < 0.01) {
continue;
}
let alongLight = rnd.x * maxDist * 0.8;
let perpOffset = (rnd.y - 0.5) * spreadScale;
let floatPhase = rnd.y * 6.28318 + fi * 0.37;
let floatSpeed = 0.35 + rnd.x * 0.9;
let drift = vec2<f32>(
sin(time * floatSpeed + floatPhase),
cos(time * floatSpeed * 0.85 + floatPhase * 1.3)
) * uniforms.particleDrift * baseSize * 0.08;
let wobble = vec2<f32>(
sin(time * 1.4 + floatPhase * 2.1),
cos(time * 1.1 + floatPhase * 1.6)
) * uniforms.particleDrift * baseSize * 0.03;
let flowOffset = (rnd.x - 0.5) * baseSize * 0.12 + fract(time * 0.06 + rnd.y) * baseSize * 0.1;
let basePos = lightSource + lightDir * (alongLight + flowOffset) + perpDir * perpOffset + drift + wobble;
let toParticle = basePos - lightSource;
let projLen = dot(toParticle, lightDir);
if (projLen < 0.0 || projLen > maxDist) {
continue;
}
let sideDist = abs(dot(toParticle, perpDir));
if (sideDist > coneHalfWidth) {
continue;
}
let size = mix(uniforms.particleSizeMin, uniforms.particleSizeMax, rnd.x);
let twinkle = 0.7 + 0.3 * sin(time * (1.5 + rnd.y * 2.0) + floatPhase);
let distFade = 1.0 - smoothstep(maxDist * 0.2, maxDist * 0.95, projLen);
if (distFade < 0.01) {
continue;
}
let p = particle(coord, basePos, size);
if (p > 0.0) {
particleSum = particleSum + p * lifeFade * twinkle * distFade * uniforms.particleOpacity;
if (particleSum >= 1.0) {
break;
}
}
}
return min(particleSum, 1.0);
}
@fragment
fn fragmentMain(@builtin(position) fragCoord: vec4<f32>, @location(0) vUv: vec2<f32>) -> @location(0) vec4<f32> {
let coord = vec2<f32>(fragCoord.x, fragCoord.y);
let normalizedX = (coord.x / uniforms.iResolution.x) - 0.5;
let widthOffset = -normalizedX * uniforms.sourceWidth * uniforms.iResolution.x;
let perpDir = vec2<f32>(-uniforms.lightDir.y, uniforms.lightDir.x);
let adjustedLightPos = uniforms.lightPos + perpDir * widthOffset;
let lightValue = lightStrengthCombined(adjustedLightPos, uniforms.lightDir, coord);
if (lightValue < 0.001) {
let particles = renderParticles(coord, adjustedLightPos, uniforms.lightDir);
if (particles < 0.001) {
return vec4<f32>(0.0, 0.0, 0.0, 0.0);
}
let particleBrightness = particles * 1.8;
return vec4<f32>(uniforms.color * particleBrightness, particles * 0.9);
}
var fragColor = vec4<f32>(lightValue, lightValue, lightValue, lightValue);
if (uniforms.noiseAmount > 0.01) {
let n = fastNoise(coord * 0.5 + uniforms.iTime * 0.5);
let grain = mix(1.0, n, uniforms.noiseAmount * 0.5);
fragColor = vec4<f32>(fragColor.rgb * grain, fragColor.a);
}
let brightness = 1.0 - (coord.y / uniforms.iResolution.y);
fragColor = vec4<f32>(
fragColor.x * (0.15 + brightness * 0.85),
fragColor.y * (0.35 + brightness * 0.65),
fragColor.z * (0.55 + brightness * 0.45),
fragColor.a
);
if (abs(uniforms.saturation - 1.0) > 0.01) {
let gray = dot(fragColor.rgb, vec3<f32>(0.299, 0.587, 0.114));
fragColor = vec4<f32>(mix(vec3<f32>(gray), fragColor.rgb, uniforms.saturation), fragColor.a);
}
fragColor = vec4<f32>(fragColor.rgb * uniforms.color, fragColor.a);
let particles = renderParticles(coord, adjustedLightPos, uniforms.lightDir);
if (particles > 0.001) {
let particleBrightness = particles * 1.8;
fragColor = vec4<f32>(fragColor.rgb + uniforms.color * particleBrightness, max(fragColor.a, particles * 0.9));
}
return fragColor;
}
`
const UNIFORM_BUFFER_SIZE = 144
function updateUniformBuffer(buffer: Float32Array, data: UniformData): void {
buffer[0] = data.iTime
buffer[2] = data.iResolution[0]
buffer[3] = data.iResolution[1]
buffer[4] = data.lightPos[0]
buffer[5] = data.lightPos[1]
buffer[6] = data.lightDir[0]
buffer[7] = data.lightDir[1]
buffer[8] = data.color[0]
buffer[9] = data.color[1]
buffer[10] = data.color[2]
buffer[11] = data.speed
buffer[12] = data.lightSpread
buffer[13] = data.lightLength
buffer[14] = data.sourceWidth
buffer[15] = data.pulsating
buffer[16] = data.pulsatingMin
buffer[17] = data.pulsatingMax
buffer[18] = data.fadeDistance
buffer[19] = data.saturation
buffer[20] = data.noiseAmount
buffer[21] = data.distortion
buffer[22] = data.particlesEnabled
buffer[23] = data.particleAmount
buffer[24] = data.particleSizeMin
buffer[25] = data.particleSizeMax
buffer[26] = data.particleSpeed
buffer[27] = data.particleOpacity
buffer[28] = data.particleDrift
}
export default function Spotlight(props: SpotlightProps) {
let containerRef: HTMLDivElement | undefined
let canvasRef: HTMLCanvasElement | null = null
let deviceRef: GPUDevice | null = null
let contextRef: GPUCanvasContext | null = null
let pipelineRef: GPURenderPipeline | null = null
let uniformBufferRef: GPUBuffer | null = null
let bindGroupRef: GPUBindGroup | null = null
let animationIdRef: number | null = null
let cleanupFunctionRef: (() => void) | null = null
let uniformDataRef: UniformData | null = null
let uniformArrayRef: Float32Array | null = null
let configRef: SpotlightConfig = props.config()
let frameCount = 0
const [isVisible, setIsVisible] = createSignal(false)
createEffect(() => {
configRef = props.config()
})
onMount(() => {
if (!containerRef) return
const observer = new IntersectionObserver(
(entries) => {
const entry = entries[0]
setIsVisible(entry.isIntersecting)
},
{ threshold: 0.1 },
)
observer.observe(containerRef)
onCleanup(() => {
observer.disconnect()
})
})
createEffect(() => {
const visible = isVisible()
const config = props.config()
if (!visible || !containerRef) {
return
}
if (cleanupFunctionRef) {
cleanupFunctionRef()
cleanupFunctionRef = null
}
const initializeWebGPU = async () => {
if (!containerRef) {
return
}
await new Promise((resolve) => setTimeout(resolve, 10))
if (!containerRef) {
return
}
if (!navigator.gpu) {
console.warn("WebGPU is not supported in this browser")
return
}
const adapter = await navigator.gpu.requestAdapter({
powerPreference: "high-performance",
})
if (!adapter) {
console.warn("Failed to get WebGPU adapter")
return
}
const device = await adapter.requestDevice()
deviceRef = device
const canvas = document.createElement("canvas")
canvas.style.width = "100%"
canvas.style.height = "100%"
canvasRef = canvas
while (containerRef.firstChild) {
containerRef.removeChild(containerRef.firstChild)
}
containerRef.appendChild(canvas)
const context = canvas.getContext("webgpu")
if (!context) {
console.warn("Failed to get WebGPU context")
return
}
contextRef = context
const presentationFormat = navigator.gpu.getPreferredCanvasFormat()
context.configure({
device,
format: presentationFormat,
alphaMode: "premultiplied",
})
const shaderModule = device.createShaderModule({
code: WGSL_SHADER,
})
const uniformBuffer = device.createBuffer({
size: UNIFORM_BUFFER_SIZE,
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
})
uniformBufferRef = uniformBuffer
const bindGroupLayout = device.createBindGroupLayout({
entries: [
{
binding: 0,
visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,
buffer: { type: "uniform" },
},
],
})
const bindGroup = device.createBindGroup({
layout: bindGroupLayout,
entries: [
{
binding: 0,
resource: { buffer: uniformBuffer },
},
],
})
bindGroupRef = bindGroup
const pipelineLayout = device.createPipelineLayout({
bindGroupLayouts: [bindGroupLayout],
})
const pipeline = device.createRenderPipeline({
layout: pipelineLayout,
vertex: {
module: shaderModule,
entryPoint: "vertexMain",
},
fragment: {
module: shaderModule,
entryPoint: "fragmentMain",
targets: [
{
format: presentationFormat,
blend: {
color: {
srcFactor: "src-alpha",
dstFactor: "one-minus-src-alpha",
operation: "add",
},
alpha: {
srcFactor: "one",
dstFactor: "one-minus-src-alpha",
operation: "add",
},
},
},
],
},
primitive: {
topology: "triangle-list",
},
})
pipelineRef = pipeline
const { clientWidth: wCSS, clientHeight: hCSS } = containerRef
const dpr = Math.min(window.devicePixelRatio, 2)
const w = wCSS * dpr
const h = hCSS * dpr
const { anchor, dir } = getAnchorAndDir(config.placement, w, h)
uniformDataRef = {
iTime: 0,
iResolution: [w, h],
lightPos: anchor,
lightDir: dir,
color: hexToRgb(config.color),
speed: config.speed,
lightSpread: config.spread,
lightLength: config.length,
sourceWidth: config.width,
pulsating: config.pulsating !== false ? 1.0 : 0.0,
pulsatingMin: config.pulsating !== false ? config.pulsating[0] : 1.0,
pulsatingMax: config.pulsating !== false ? config.pulsating[1] : 1.0,
fadeDistance: config.distance,
saturation: config.saturation,
noiseAmount: config.noiseAmount,
distortion: config.distortion,
particlesEnabled: config.particles.enabled ? 1.0 : 0.0,
particleAmount: config.particles.amount,
particleSizeMin: config.particles.size[0],
particleSizeMax: config.particles.size[1],
particleSpeed: config.particles.speed,
particleOpacity: config.particles.opacity,
particleDrift: config.particles.drift,
}
const updatePlacement = () => {
if (!containerRef || !canvasRef || !uniformDataRef) {
return
}
const dpr = Math.min(window.devicePixelRatio, 2)
const { clientWidth: wCSS, clientHeight: hCSS } = containerRef
const w = Math.floor(wCSS * dpr)
const h = Math.floor(hCSS * dpr)
canvasRef.width = w
canvasRef.height = h
uniformDataRef.iResolution = [w, h]
const { anchor, dir } = getAnchorAndDir(configRef.placement, w, h)
uniformDataRef.lightPos = anchor
uniformDataRef.lightDir = dir
}
const loop = (t: number) => {
if (!deviceRef || !contextRef || !pipelineRef || !uniformBufferRef || !bindGroupRef || !uniformDataRef) {
return
}
const timeSeconds = t * 0.001
uniformDataRef.iTime = timeSeconds
frameCount++
if (props.onAnimationFrame && frameCount % 2 === 0) {
const pulsatingMin = configRef.pulsating !== false ? configRef.pulsating[0] : 1.0
const pulsatingMax = configRef.pulsating !== false ? configRef.pulsating[1] : 1.0
const pulseCenter = (pulsatingMin + pulsatingMax) * 0.5
const pulseAmplitude = (pulsatingMax - pulsatingMin) * 0.5
const pulseValue =
configRef.pulsating !== false
? pulseCenter + pulseAmplitude * Math.sin(timeSeconds * configRef.speed * 3.0)
: 1.0
const baseIntensity1 = 0.45 + 0.15 * Math.sin(timeSeconds * configRef.speed * 1.5)
const baseIntensity2 = 0.3 + 0.2 * Math.cos(timeSeconds * configRef.speed * 1.1)
const intensity = Math.max((baseIntensity1 + baseIntensity2) * pulseValue, 0.55)
props.onAnimationFrame({
time: timeSeconds,
intensity,
pulseValue: Math.max(pulseValue, 0.9),
})
}
try {
if (!uniformArrayRef) {
uniformArrayRef = new Float32Array(36)
}
updateUniformBuffer(uniformArrayRef, uniformDataRef)
deviceRef.queue.writeBuffer(uniformBufferRef, 0, uniformArrayRef.buffer)
const commandEncoder = deviceRef.createCommandEncoder()
const textureView = contextRef.getCurrentTexture().createView()
const renderPass = commandEncoder.beginRenderPass({
colorAttachments: [
{
view: textureView,
clearValue: { r: 0, g: 0, b: 0, a: 0 },
loadOp: "clear",
storeOp: "store",
},
],
})
renderPass.setPipeline(pipelineRef)
renderPass.setBindGroup(0, bindGroupRef)
renderPass.draw(3)
renderPass.end()
deviceRef.queue.submit([commandEncoder.finish()])
animationIdRef = requestAnimationFrame(loop)
} catch (error) {
console.warn("WebGPU rendering error:", error)
return
}
}
window.addEventListener("resize", updatePlacement)
updatePlacement()
animationIdRef = requestAnimationFrame(loop)
cleanupFunctionRef = () => {
if (animationIdRef) {
cancelAnimationFrame(animationIdRef)
animationIdRef = null
}
window.removeEventListener("resize", updatePlacement)
if (uniformBufferRef) {
uniformBufferRef.destroy()
uniformBufferRef = null
}
if (deviceRef) {
deviceRef.destroy()
deviceRef = null
}
if (canvasRef && canvasRef.parentNode) {
canvasRef.parentNode.removeChild(canvasRef)
}
canvasRef = null
contextRef = null
pipelineRef = null
bindGroupRef = null
uniformDataRef = null
}
}
void initializeWebGPU()
onCleanup(() => {
if (cleanupFunctionRef) {
cleanupFunctionRef()
cleanupFunctionRef = null
}
})
})
createEffect(() => {
if (!uniformDataRef || !containerRef) {
return
}
const config = props.config()
uniformDataRef.color = hexToRgb(config.color)
uniformDataRef.speed = config.speed
uniformDataRef.lightSpread = config.spread
uniformDataRef.lightLength = config.length
uniformDataRef.sourceWidth = config.width
uniformDataRef.pulsating = config.pulsating !== false ? 1.0 : 0.0
uniformDataRef.pulsatingMin = config.pulsating !== false ? config.pulsating[0] : 1.0
uniformDataRef.pulsatingMax = config.pulsating !== false ? config.pulsating[1] : 1.0
uniformDataRef.fadeDistance = config.distance
uniformDataRef.saturation = config.saturation
uniformDataRef.noiseAmount = config.noiseAmount
uniformDataRef.distortion = config.distortion
uniformDataRef.particlesEnabled = config.particles.enabled ? 1.0 : 0.0
uniformDataRef.particleAmount = config.particles.amount
uniformDataRef.particleSizeMin = config.particles.size[0]
uniformDataRef.particleSizeMax = config.particles.size[1]
uniformDataRef.particleSpeed = config.particles.speed
uniformDataRef.particleOpacity = config.particles.opacity
uniformDataRef.particleDrift = config.particles.drift
const dpr = Math.min(window.devicePixelRatio, 2)
const { clientWidth: wCSS, clientHeight: hCSS } = containerRef
const { anchor, dir } = getAnchorAndDir(config.placement, wCSS * dpr, hCSS * dpr)
uniformDataRef.lightPos = anchor
uniformDataRef.lightDir = dir
})
return (
<div
ref={containerRef}
class={`spotlight-container ${props.class ?? ""}`.trim()}
style={{ opacity: props.config().opacity }}
/>
)
}

View File

@@ -0,0 +1,29 @@
/**
* Application-wide constants and configuration
*/
export const config = {
// Base URL
baseUrl: "https://opencode.ai",
// GitHub
github: {
repoUrl: "https://github.com/anomalyco/opencode",
starsFormatted: {
compact: "160K",
full: "160,000",
},
},
// Social links
social: {
twitter: "https://x.com/opencode",
discord: "https://discord.gg/opencode",
},
// Static stats (used on landing page)
stats: {
contributors: "900",
commits: "13,000",
monthlyUsers: "7.5M",
},
} as const

View File

@@ -0,0 +1 @@
export {}

View File

@@ -0,0 +1,116 @@
import { getRequestEvent } from "solid-js/web"
import { and, Database, eq, inArray, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js"
import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js"
import { redirect } from "@solidjs/router"
import { Actor } from "@opencode-ai/console-core/actor.js"
import { createClient } from "@openauthjs/openauth/client"
export const AuthClient = createClient({
clientID: "app",
issuer: import.meta.env.VITE_AUTH_URL,
})
import { useSession } from "@solidjs/start/http"
import { Resource } from "@opencode-ai/console-resource"
export interface AuthSession {
account?: Record<
string,
{
id: string
email: string
}
>
current?: string
}
export function useAuthSession() {
return useSession<AuthSession>({
password: Resource.ZEN_SESSION_SECRET.value,
name: "auth",
maxAge: 60 * 60 * 24 * 365,
cookie: {
secure: false,
httpOnly: true,
},
})
}
export const getActor = async (workspace?: string): Promise<Actor.Info> => {
"use server"
const evt = getRequestEvent()
if (!evt) throw new Error("No request event")
if (evt.locals.actor) return evt.locals.actor
evt.locals.actor = (async () => {
const auth = await useAuthSession()
if (!workspace) {
const account = auth.data.account ?? {}
const current = account[auth.data.current ?? ""]
if (current) {
return {
type: "account",
properties: {
email: current.email,
accountID: current.id,
},
}
}
if (Object.keys(account).length > 0) {
const current = Object.values(account)[0]
await auth.update((val) => ({
...val,
current: current.id,
}))
return {
type: "account",
properties: {
email: current.email,
accountID: current.id,
},
}
}
return {
type: "public",
properties: {},
}
}
const accounts = Object.keys(auth.data.account ?? {})
if (accounts.length) {
const user = await Database.use((tx) =>
tx
.select()
.from(UserTable)
.where(
and(
eq(UserTable.workspaceID, workspace),
isNull(UserTable.timeDeleted),
inArray(UserTable.accountID, accounts),
),
)
.limit(1)
.execute()
.then((x) => x[0]),
)
if (user) {
await Database.use((tx) =>
tx
.update(UserTable)
.set({ timeSeen: sql`now()` })
.where(and(eq(UserTable.workspaceID, workspace), eq(UserTable.id, user.id))),
)
return {
type: "user",
properties: {
userID: user.id,
workspaceID: user.workspaceID,
accountID: user.accountID,
role: user.role,
},
}
}
}
throw redirect("/auth/authorize")
})()
return evt.locals.actor
}

View File

@@ -0,0 +1,7 @@
import { Actor } from "@opencode-ai/console-core/actor.js"
import { getActor } from "./auth"
export async function withActor<T>(fn: () => T, workspace?: string) {
const actor = await getActor(workspace)
return Actor.provide(actor.type, actor.properties, fn)
}

View File

@@ -0,0 +1,27 @@
import { createMemo } from "solid-js"
import { createSimpleContext } from "@opencode-ai/ui/context"
import { i18n, type Key } from "~/i18n"
import { useLanguage } from "~/context/language"
function resolve(text: string, params?: Record<string, string | number>) {
if (!params) return text
return text.replace(/\{\{(\w+)\}\}/g, (raw, key) => {
const value = params[key]
if (value === undefined || value === null) return raw
return String(value)
})
}
export const { use: useI18n, provider: I18nProvider } = createSimpleContext({
name: "I18n",
init: () => {
const language = useLanguage()
const dict = createMemo(() => i18n(language.locale()))
return {
t(key: Key, params?: Record<string, string | number>) {
return resolve(dict()[key], params)
},
}
},
})

View File

@@ -0,0 +1,72 @@
import { createEffect } from "solid-js"
import { createStore } from "solid-js/store"
import { getRequestEvent } from "solid-js/web"
import { createSimpleContext } from "@opencode-ai/ui/context"
import {
LOCALES,
type Locale,
clearCookie,
cookie,
detectFromLanguages,
dir as localeDir,
label as localeLabel,
localeFromCookieHeader,
localeFromRequest,
parseLocale,
route as localeRoute,
tag as localeTag,
} from "~/lib/language"
function initial() {
const evt = getRequestEvent()
if (evt) return localeFromRequest(evt.request)
if (typeof document === "object") {
const fromDom = parseLocale(document.documentElement.dataset.locale)
if (fromDom) return fromDom
const fromCookie = localeFromCookieHeader(document.cookie)
if (fromCookie) return fromCookie
}
if (typeof navigator !== "object") return "en" satisfies Locale
const languages = navigator.languages?.length ? navigator.languages : [navigator.language]
return detectFromLanguages(languages)
}
export const { use: useLanguage, provider: LanguageProvider } = createSimpleContext({
name: "Language",
init: () => {
const [store, setStore] = createStore({
locale: initial(),
})
createEffect(() => {
if (typeof document !== "object") return
document.documentElement.lang = localeTag(store.locale)
document.documentElement.dir = localeDir(store.locale)
document.documentElement.dataset.locale = store.locale
})
return {
locale: () => store.locale,
locales: LOCALES,
label: localeLabel,
tag: localeTag,
dir: localeDir,
route(pathname: string) {
return localeRoute(store.locale, pathname)
},
setLocale(next: Locale) {
setStore("locale", next)
if (typeof document !== "object") return
document.cookie = cookie(next)
},
clear() {
if (typeof document !== "object") return
document.cookie = clearCookie()
},
}
},
})

View File

@@ -0,0 +1,4 @@
// @refresh reload
import { mount, StartClient } from "@solidjs/start/client"
mount(() => <StartClient />, document.getElementById("app")!)

View File

@@ -0,0 +1,37 @@
// @refresh reload
import { createHandler, StartServer } from "@solidjs/start/server"
import { getRequestEvent } from "solid-js/web"
import { dir, localeFromRequest, tag } from "~/lib/language"
const criticalCSS = `[data-component="top"]{min-height:80px;display:flex;align-items:center}`
export default createHandler(
() => (
<StartServer
document={({ assets, children, scripts }) => {
const evt = getRequestEvent()
const locale = evt ? localeFromRequest(evt.request) : "en"
return (
<html lang={tag(locale)} dir={dir(locale)} data-locale={locale}>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta property="og:image" content="/social-share.png" />
<meta property="twitter:image" content="/social-share.png" />
<style>{criticalCSS}</style>
{assets}
</head>
<body>
<div id="app">{children}</div>
{scripts}
</body>
</html>
)
}}
/>
),
{
mode: "async",
},
)

5
packages/console/app/src/global.d.ts vendored Normal file
View File

@@ -0,0 +1,5 @@
/// <reference types="@solidjs/start/env" />
export declare module "@solidjs/start/server" {
export type APIEvent = { request: Request }
}

View File

@@ -0,0 +1,814 @@
import type { Dict } from "./en"
import { dict as en } from "./en"
export const dict = {
...en,
"nav.github": "GitHub",
"nav.docs": "الوثائق",
"nav.changelog": "سجل التغييرات",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "المؤسسات",
"nav.zen": "Zen",
"nav.login": "تسجيل الدخول",
"nav.free": "تحميل",
"nav.home": "الرئيسية",
"nav.openMenu": "فتح القائمة",
"nav.getStartedFree": "ابدأ مجانا",
"nav.logoAlt": "OpenCode",
"nav.context.copyLogo": "نسخ الشعار كـ SVG",
"nav.context.copyWordmark": "نسخ اسم العلامة كـ SVG",
"nav.context.brandAssets": "أصول العلامة التجارية",
"footer.github": "GitHub",
"footer.docs": "الوثائق",
"footer.changelog": "سجل التغييرات",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "العلامة التجارية",
"legal.privacy": "الخصوصية",
"legal.terms": "الشروط",
"email.title": "كن الأول في المعرفة عند إطلاق منتجات جديدة",
"email.subtitle": "انضم إلى قائمة الانتظار للحصول على وصول مبكر.",
"email.placeholder": "عنوان البريد الإلكتروني",
"email.subscribe": "اشتراك",
"email.success": "تبقّت خطوة واحدة: تحقق من بريدك وأكّد عنوانك",
"notFound.title": "غير موجود | opencode",
"notFound.heading": "404 - الصفحة غير موجودة",
"notFound.home": "الرئيسية",
"notFound.docs": "الوثائق",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"notFound.logoLightAlt": "شعار opencode الفاتح",
"notFound.logoDarkAlt": "شعار opencode الداكن",
"user.logout": "تسجيل الخروج",
"auth.callback.error.codeMissing": "لم يتم العثور على رمز التفويض.",
"workspace.select": "اختر مساحة العمل",
"workspace.createNew": "+ إنشاء مساحة عمل جديدة",
"workspace.modal.title": "إنشاء مساحة عمل جديدة",
"workspace.modal.placeholder": "أدخل اسم مساحة العمل",
"common.cancel": "إلغاء",
"common.creating": "جارٍ الإنشاء...",
"common.create": "إنشاء",
"common.videoUnsupported": "متصفحك لا يدعم وسم الفيديو.",
"common.figure": "شكل {{n}}.",
"common.faq": "الأسئلة الشائعة",
"common.learnMore": "اعرف المزيد",
"error.invalidPlan": "خطة غير صالحة",
"error.workspaceRequired": "معرف مساحة العمل مطلوب",
"error.alreadySubscribed": "مساحة العمل هذه لديها اشتراك بالفعل",
"error.limitRequired": "الحد مطلوب.",
"error.monthlyLimitInvalid": "قم بتعيين حد شهري صالح.",
"error.workspaceNameRequired": "اسم مساحة العمل مطلوب.",
"error.nameTooLong": "يجب أن يكون الاسم 255 حرفًا أو أقل.",
"error.emailRequired": "البريد الإلكتروني مطلوب",
"error.roleRequired": "الدور مطلوب",
"error.idRequired": "المعرف مطلوب",
"error.nameRequired": "الاسم مطلوب",
"error.providerRequired": "المزود مطلوب",
"error.apiKeyRequired": "مفتاح API مطلوب",
"error.modelRequired": "النموذج مطلوب",
"error.reloadAmountMin": "يجب أن يكون مبلغ الشحن ${{amount}} على الأقل",
"error.reloadTriggerMin": "يجب أن يكون حد الرصيد ${{amount}} على الأقل",
"app.meta.description": "OpenCode - وكيل البرمجة مفتوح المصدر.",
"home.title": "OpenCode | وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر",
"temp.title": "opencode | وكيل برمجة بالذكاء الاصطناعي مبني للطرفية",
"temp.hero.title": "وكيل البرمجة بالذكاء الاصطناعي المبني للطرفية",
"temp.zen": "opencode zen",
"temp.getStarted": "ابدأ",
"temp.feature.native.title": "واجهة طرفية أصلية",
"temp.feature.native.body": "واجهة مستخدم طرفية سريعة الاستجابة، أصلية، وقابلة للتخصيص",
"temp.feature.zen.beforeLink": "قائمة",
"temp.feature.zen.link": "منسقة من النماذج",
"temp.feature.zen.afterLink": "مقدمة من opencode",
"temp.feature.models.beforeLink": "يدعم أكثر من 75 مزود LLM من خلال",
"temp.feature.models.afterLink": "، بما في ذلك النماذج المحلية",
"temp.screenshot.caption": "واجهة OpenCode الطرفية مع سمة tokyonight",
"temp.screenshot.alt": "واجهة OpenCode الطرفية بسمة tokyonight",
"temp.logoLightAlt": "شعار opencode الفاتح",
"temp.logoDarkAlt": "شعار opencode الداكن",
"home.banner.badge": "جديد",
"home.banner.text": "تطبيق سطح المكتب متاح بنسخة تجريبية",
"home.banner.platforms": "على macOS، Windows، وLinux",
"home.banner.downloadNow": "حمّل الآن",
"home.banner.downloadBetaNow": "حمّل النسخة التجريبية لتطبيق سطح المكتب الآن",
"home.hero.title": "وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر",
"home.hero.subtitle.a": "نماذج مجانية مضمّنة أو اربط أي نموذج من أي مزوّد،",
"home.hero.subtitle.b": "بما في ذلك Claude، GPT، Gemini وغيرها.",
"home.install.ariaLabel": "خيارات التثبيت",
"home.what.title": "ما هو OpenCode؟",
"home.what.body": "OpenCode وكيل مفتوح المصدر يساعدك على كتابة الكود في الطرفية، IDE، أو سطح المكتب.",
"home.what.lsp.title": "دعم LSP",
"home.what.lsp.body": "يحمّل تلقائيًا موافقات LSP المناسبة للـ LLM",
"home.what.multiSession.title": "جلسات متعددة",
"home.what.multiSession.body": "ابدأ عدة وكلاء بالتوازي على نفس المشروع",
"home.what.shareLinks.title": "روابط المشاركة",
"home.what.shareLinks.body": "شارك رابطًا لأي جلسة للرجوع إليها أو لتصحيح الأخطاء",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "سجّل الدخول بـ GitHub لاستخدام حسابك في Copilot",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "سجّل الدخول بـ OpenAI لاستخدام حسابك في ChatGPT Plus أو Pro",
"home.what.anyModel.title": "أي نموذج",
"home.what.anyModel.body": "75+ مزوّد LLM عبر Models.dev، بما في ذلك النماذج المحلية",
"home.what.anyEditor.title": "أي محرر",
"home.what.anyEditor.body": "متاح كواجهة طرفية، وتطبيق سطح مكتب، وامتداد IDE",
"home.what.readDocs": "اقرأ الوثائق",
"home.growth.title": "وكيل برمجة بالذكاء الاصطناعي مفتوح المصدر",
"home.growth.body":
"مع أكثر من <strong>{{stars}}</strong> نجمة على GitHub، و<strong>{{contributors}}</strong> مساهمًا، وأكثر من <strong>{{commits}}</strong> Commit، يستخدم OpenCode ويثق به أكثر من <strong>{{monthlyUsers}}</strong> مطوّر كل شهر.",
"home.growth.githubStars": "نجوم GitHub",
"home.growth.contributors": "المساهمون",
"home.growth.monthlyDevs": "مطورون شهريًا",
"home.privacy.title": "مصمم للخصوصية أولاً",
"home.privacy.body": "لا يخزّن OpenCode أي كود أو بيانات سياق، ليتمكن من العمل في بيئات حساسة للخصوصية.",
"home.privacy.learnMore": "اعرف المزيد عن",
"home.privacy.link": "الخصوصية",
"home.faq.q1": "ما هو OpenCode؟",
"home.faq.a1":
"OpenCode وكيل مفتوح المصدر يساعدك على كتابة وتشغيل الكود مع أي نموذج ذكاء اصطناعي. متاح كواجهة طرفية، وتطبيق سطح مكتب، أو امتداد IDE.",
"home.faq.q2": "كيف أستخدم OpenCode؟",
"home.faq.a2.before": "أسهل طريقة للبدء هي قراءة",
"home.faq.a2.link": "المقدمة",
"home.faq.q3": "هل أحتاج لاشتراكات ذكاء اصطناعي إضافية لاستخدام OpenCode؟",
"home.faq.a3.p1":
"ليس بالضرورة، فـ OpenCode يأتي مع مجموعة من النماذج المجانية التي تستطيع استخدامها دون إنشاء حساب.",
"home.faq.a3.p2.beforeZen": "وبخلاف ذلك، يمكنك استخدام أي من نماذج البرمجة الشائعة بإنشاء حساب",
"home.faq.a3.p2.afterZen": ".",
"home.faq.a3.p3":
"مع أننا نشجّع المستخدمين على استخدام Zen، فإن OpenCode يعمل أيضًا مع كل المزودين الشائعين مثل OpenAI، Anthropic، xAI إلخ.",
"home.faq.a3.p4.beforeLocal": "ويمكنك أيضًا ربط",
"home.faq.a3.p4.localLink": "النماذج المحلية",
"home.faq.q4": "هل يمكنني استخدام اشتراكاتي الحالية مع OpenCode؟",
"home.faq.a4.p1":
"نعم، يدعم OpenCode خطط الاشتراك من كل المزودين الرئيسيين. يمكنك استخدام اشتراكات Claude Pro/Max، ChatGPT Plus/Pro، أو GitHub Copilot.",
"home.faq.q5": "هل يمكنني استخدام OpenCode في الطرفية فقط؟",
"home.faq.a5.beforeDesktop": "ليس بعد الآن! OpenCode متاح الآن كتطبيق لـ",
"home.faq.a5.desktop": "سطح المكتب",
"home.faq.a5.and": "و",
"home.faq.a5.web": "الويب",
"home.faq.q6": "كم تكلفة OpenCode؟",
"home.faq.a6":
"OpenCode مجاني 100% للاستخدام. كما يأتي مع مجموعة من النماذج المجانية. قد توجد تكاليف إضافية إذا ربطت مزوّدًا آخر.",
"home.faq.q7": "ماذا عن البيانات والخصوصية؟",
"home.faq.a7.p1": "لا يتم تخزين بياناتك ومعلوماتك إلا عندما تستخدم نماذجنا المجانية أو تنشئ روابط قابلة للمشاركة.",
"home.faq.a7.p2.beforeModels": "اعرف المزيد عن",
"home.faq.a7.p2.modelsLink": "نماذجنا",
"home.faq.a7.p2.and": "و",
"home.faq.a7.p2.shareLink": "صفحات المشاركة",
"home.faq.q8": "هل OpenCode مفتوح المصدر؟",
"home.faq.a8.p1": "نعم، OpenCode مفتوح المصدر بالكامل. الكود المصدري متاح علنًا على",
"home.faq.a8.p2": "بموجب",
"home.faq.a8.mitLicense": "رخصة MIT",
"home.faq.a8.p3":
"، مما يعني أن أي شخص يستطيع استخدامه أو تعديله أو المساهمة في تطويره. يمكن لأي شخص من المجتمع فتح قضايا، وتقديم طلبات سحب، وتوسيع الوظائف.",
"home.zenCta.title": "وصول لنماذج محسنة وموثوقة لوكلاء البرمجة",
"home.zenCta.body":
"يمنحك Zen الوصول إلى مجموعة مختارة بعناية من نماذج الذكاء الاصطناعي التي اختبرها OpenCode وقاس أداءها خصيصًا لوكلاء البرمجة. لا حاجة للقلق بشأن اختلاف الأداء والجودة بين المزودين، استخدم نماذج محققة تعمل بكفاءة.",
"home.zenCta.link": "تعرف على Zen",
"zen.title": "OpenCode Zen | مجموعة منسقة من النماذج المحسنة والموثوقة لوكلاء البرمجة",
"zen.hero.title": "نماذج محسنة وموثوقة لوكلاء البرمجة",
"zen.hero.body":
"يمنحك Zen الوصول إلى مجموعة منسقة من نماذج الذكاء الاصطناعي التي اختبرها OpenCode وقاس أداءها خصيصًا لوكلاء البرمجة. لا حاجة للقلق بشأن اختلاف الأداء والجودة، استخدم نماذج محققة تعمل بكفاءة.",
"zen.faq.q1": "ما هو OpenCode Zen؟",
"zen.faq.a1":
"Zen هو مجموعة منسقة من نماذج الذكاء الاصطناعي التي تم اختبارها وقياس أدائها لوكلاء البرمجة، أنشأها الفريق المطور لـ OpenCode.",
"zen.faq.q2": "ما الذي يجعل Zen أكثر دقة؟",
"zen.faq.a2":
"يوفر Zen فقط النماذج التي تم اختبارها وقياس أدائها خصيصًا لوكلاء البرمجة. لن تستخدم سكين زبدة لقطع شريحة لحم، فلا تستخدم نماذج ضعيفة للبرمجة.",
"zen.faq.q3": "هل Zen أرخص؟",
"zen.faq.a3":
"Zen ليس للربح. يمرر Zen التكاليف من مزودي النماذج إليك مباشرة. كلما زاد استخدام Zen، تمكن OpenCode من التفاوض على أسعار أفضل وتمريرها إليك.",
"zen.faq.q4": "كم تكلفة Zen؟",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "يحاسب لكل طلب",
"zen.faq.a4.p1.afterPricing": "بدون أي هوامش ربح، لذا تدفع بالضبط ما يفرضه مزود النموذج.",
"zen.faq.a4.p2.beforeAccount": "تعتمد تكلفتك الإجمالية على الاستخدام، ويمكنك تعيين حدود إنفاق شهرية في",
"zen.faq.a4.p2.accountLink": "حسابك",
"zen.faq.a4.p3":
"لتغطية التكاليف، يضيف OpenCode فقط رسومًا صغيرة لمعالجة الدفع قدرها 1.23 دولار لكل إعادة شحن رصيد بقيمة 20 دولارًا.",
"zen.faq.q5": "ماذا عن البيانات والخصوصية؟",
"zen.faq.a5.beforeExceptions":
"تتم استضافة جميع نماذج Zen في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
"zen.faq.a5.exceptionsLink": "الاستثناءات التالية",
"zen.faq.q6": "هل يمكنني تعيين حدود للإنفاق؟",
"zen.faq.a6": "نعم، يمكنك تعيين حدود إنفاق شهرية في حسابك.",
"zen.faq.q7": "هل يمكنني الإلغاء؟",
"zen.faq.a7": "نعم، يمكنك تعطيل الفوترة في أي وقت واستخدام رصيدك المتبقي.",
"zen.faq.q8": "هل يمكنني استخدام Zen مع وكلاء برمجة آخرين؟",
"zen.faq.a8":
"بينما يعمل Zen بشكل رائع مع OpenCode، يمكنك استخدام Zen مع أي وكيل. اتبع تعليمات الإعداد في وكيل البرمجة المفضل لديك.",
"zen.cta.start": "ابدأ مع Zen",
"zen.pricing.title": "أضف رصيد 20 دولار (دفع حسب الاستخدام)",
"zen.pricing.fee": "(+1.23 دولار رسوم معالجة البطاقة)",
"zen.pricing.body": "استخدمه مع أي وكيل. عيّن حدود الإنفاق الشهري. ألغِ في أي وقت.",
"zen.problem.title": "ما المشكلة التي يحلها Zen؟",
"zen.problem.body":
"هناك العديد من النماذج المتاحة، ولكن القليل منها فقط يعمل بشكل جيد مع وكلاء البرمجة. يقوم معظم مقدمي الخدمة بتكوينها بشكل مختلف مما يعطي نتائج متفاوتة.",
"zen.problem.subtitle": "نحن نعمل على إصلاح هذا للجميع، وليس فقط لمستخدمي OpenCode.",
"zen.problem.item1": "اختبار نماذج مختارة واستشارة فرقها",
"zen.problem.item2": "العمل مع مقدمي الخدمة لضمان تسليمها بشكل صحيح",
"zen.problem.item3": "قياس أداء جميع مجموعات النماذج والمزودين التي نوصي بها",
"zen.how.title": "كيف يعمل Zen",
"zen.how.body": "بينما نقترح عليك استخدام Zen مع OpenCode، يمكنك استخدام Zen مع أي وكيل.",
"zen.how.step1.title": "سجّل وأضف رصيدًا بقيمة 20 دولارًا",
"zen.how.step1.beforeLink": "اتبع",
"zen.how.step1.link": "تعليمات الإعداد",
"zen.how.step2.title": "استخدم Zen بتسعير شفاف",
"zen.how.step2.link": "ادفع لكل طلب",
"zen.how.step2.afterLink": "بدون أي هوامش ربح",
"zen.how.step3.title": "شحن تلقائي",
"zen.how.step3.body": "عندما يصل رصيدك إلى 5 دولارات، سنضيف تلقائيًا 20 دولارًا",
"zen.privacy.title": "خصوصيتك مهمة بالنسبة لنا",
"zen.privacy.beforeExceptions":
"تتم استضافة جميع نماذج Zen في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
"zen.privacy.exceptionsLink": "الاستثناءات التالية",
"go.title": "OpenCode Go | نماذج برمجة منخفضة التكلفة للجميع",
"go.meta.description":
"يبدأ Go من $5 للشهر الأول، ثم $10/شهر، مع حدود طلب سخية لمدة 5 ساعات لـ GLM-5.1 وGLM-5 وKimi K2.5 وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.5 وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash.",
"go.hero.title": "نماذج برمجة منخفضة التكلفة للجميع",
"go.hero.body":
"يجلب Go البرمجة الوكيلة للمبرمجين حول العالم. يوفر حدودًا سخية ووصولًا موثوقًا إلى أقوى النماذج مفتوحة المصدر، حتى تتمكن من البناء باستخدام وكلاء أقوياء دون القلق بشأن التكلفة أو التوفر.",
"go.cta.start": "اشترك في Go",
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "اشترك في Go",
"go.cta.price": "$10/شهر",
"go.cta.promo": "$5 للشهر الأول",
"go.pricing.body":
"استخدمه مع أي وكيل. $5 للشهر الأول، ثم $10/شهر. قم بزيادة الرصيد إذا لزم الأمر. الإلغاء في أي وقت.",
"go.graph.free": "مجاني",
"go.graph.freePill": "Big Pickle ونماذج مجانية",
"go.graph.go": "Go",
"go.graph.label": "الطلبات كل 5 ساعات",
"go.graph.usageLimits": "حدود الاستخدام",
"go.graph.tick": "{{n}}x",
"go.graph.aria": "الطلبات كل 5 ساعات: {{free}} مقابل {{go}}",
"go.testimonials.brand.zen": "Zen",
"go.testimonials.brand.go": "Go",
"go.testimonials.handle": "@OpenCode",
"go.testimonials.dax.name": "Dax Raad",
"go.testimonials.dax.title": "الرئيس التنفيذي السابق، منتجات Terminal",
"go.testimonials.dax.quoteAfter": "كان تغييرًا جذريًا في الحياة، إنه قرار لا يحتاج لتفكير.",
"go.testimonials.jay.name": "Jay V",
"go.testimonials.jay.title": "مؤسس سابق، SEED، PM، Melt، Pop، Dapt، Cadmus، وViewPoint",
"go.testimonials.jay.quoteBefore": "4 من كل 5 أشخاص في فريقنا يحبون استخدام",
"go.testimonials.jay.quoteAfter": ".",
"go.testimonials.adam.name": "Adam Elmore",
"go.testimonials.adam.title": "بطل سابق، AWS",
"go.testimonials.adam.quoteBefore": "لا أستطيع التوصية بـ",
"go.testimonials.adam.quoteAfter": "بما فيه الكفاية. بجدية، إنه جيد حقًا.",
"go.testimonials.david.name": "David Hill",
"go.testimonials.david.title": "رئيس التصميم السابق، Laravel",
"go.testimonials.david.quoteBefore": "مع",
"go.testimonials.david.quoteAfter": "أعلم أن جميع النماذج مختبرة ومثالية لوكلاء البرمجة.",
"go.testimonials.frank.name": "Frank Wang",
"go.testimonials.frank.title": "متدرب سابق، Nvidia (4 مرات)",
"go.testimonials.frank.quote": "أتمنى لو كنت لا أزال في Nvidia.",
"go.problem.title": "ما المشكلة التي يحلها Go؟",
"go.problem.body":
"نحن نركز على تقديم تجربة OpenCode لأكبر عدد ممكن من الناس. OpenCode Go هو اشتراك منخفض التكلفة: $5 للشهر الأول، ثم $10/شهر. يوفر حدودا سخية ووصولا موثوقا إلى نماذج المصدر المفتوح الأكثر قدرة.",
"go.problem.subtitle": " ",
"go.problem.item1": "أسعار اشتراك منخفضة التكلفة",
"go.problem.item2": "حدود سخية ووصول موثوق",
"go.problem.item3": "مصمم لأكبر عدد ممكن من المبرمجين",
"go.problem.item4":
"يتضمن GLM-5.1 وGLM-5 وKimi K2.5 وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.5 وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash",
"go.how.title": "كيف يعمل Go",
"go.how.body": "يبدأ Go من $5 للشهر الأول، ثم $10/شهر. يمكنك استخدامه مع OpenCode أو أي وكيل.",
"go.how.step1.title": "أنشئ حسابًا",
"go.how.step1.beforeLink": "اتبع",
"go.how.step1.link": "تعليمات الإعداد",
"go.how.step2.title": "اشترك في Go",
"go.how.step2.link": "$5 للشهر الأول",
"go.how.step2.afterLink": "ثم $10/شهر مع حدود سخية",
"go.how.step3.title": "ابدأ البرمجة",
"go.how.step3.body": "مع وصول موثوق لنماذج مفتوحة المصدر",
"go.privacy.title": "خصوصيتك مهمة بالنسبة لنا",
"go.privacy.body":
"تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر.",
"go.privacy.contactAfter": "إذا كان لديك أي أسئلة.",
"go.privacy.beforeExceptions":
"تتم استضافة نماذج Go في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
"go.privacy.exceptionsLink": "الاستثناءات التالية",
"go.faq.q1": "ما هو OpenCode Go؟",
"go.faq.a1": "Go هو اشتراك منخفض التكلفة يمنحك وصولًا موثوقًا إلى نماذج مفتوحة المصدر قادرة على البرمجة الوكيلة.",
"go.faq.q2": "ما النماذج التي يتضمنها Go؟",
"go.faq.a2": "يتضمن Go النماذج المدرجة أدناه، مع حدود سخية وإتاحة موثوقة.",
"go.faq.q3": "هل Go هو نفسه Zen؟",
"go.faq.a3":
"لا. Zen هو الدفع حسب الاستخدام، بينما يبدأ Go من $5 للشهر الأول، ثم $10/شهر، مع حدود سخية ووصول موثوق إلى نماذج المصدر المفتوح GLM-5.1 وGLM-5 وKimi K2.5 وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.5 وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash.",
"go.faq.q4": "كم تكلفة Go؟",
"go.faq.a4.p1.beforePricing": "تكلفة Go",
"go.faq.a4.p1.pricingLink": "$5 للشهر الأول",
"go.faq.a4.p1.afterPricing": "ثم $10/شهر مع حدود سخية.",
"go.faq.a4.p2.beforeAccount": "يمكنك إدارة اشتراكك في",
"go.faq.a4.p2.accountLink": "حسابك",
"go.faq.a4.p3": "ألغِ في أي وقت.",
"go.faq.q5": "ماذا عن البيانات والخصوصية؟",
"go.faq.a5.body":
"تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر. يتبع مزودونا سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج.",
"go.faq.a5.beforeExceptions":
"تتم استضافة نماذج Go في الولايات المتحدة. يتبع المزودون سياسة عدم الاحتفاظ بالبيانات ولا يستخدمون بياناتك لتدريب النماذج، مع",
"go.faq.a5.exceptionsLink": "الاستثناءات التالية",
"go.faq.q6": "هل يمكنني شحن رصيد إضافي؟",
"go.faq.a6": "إذا كنت بحاجة إلى مزيد من الاستخدام، يمكنك شحن رصيد في حسابك.",
"go.faq.q7": "هل يمكنني الإلغاء؟",
"go.faq.a7": "نعم، يمكنك الإلغاء في أي وقت.",
"go.faq.q8": "هل يمكنني استخدام Go مع وكلاء برمجة آخرين؟",
"go.faq.a8": "نعم، يمكنك استخدام Go مع أي وكيل. اتبع تعليمات الإعداد في وكيل البرمجة المفضل لديك.",
"go.faq.q9": "ما الفرق بين النماذج المجانية وGo؟",
"go.faq.a9":
"تشمل النماذج المجانية Big Pickle بالإضافة إلى النماذج الترويجية المتاحة في ذلك الوقت، مع حصة 200 طلب/يوم. يتضمن Go نماذج GLM-5.1 وGLM-5 وKimi K2.5 وKimi K2.6 وMiMo-V2.5-Pro وMiMo-V2.5 وQwen3.7 Max وQwen3.7 Plus وQwen3.6 Plus وMiniMax M2.5 وMiniMax M2.7 وMiniMax M3 وDeepSeek V4 Pro وDeepSeek V4 Flash مع حصص طلبات أعلى مطبقة عبر نوافذ متجددة (5 ساعات، أسبوعيًا، وشهريًا)، تعادل تقريبًا 12 دولارًا كل 5 ساعات، و30 دولارًا في الأسبوع، و60 دولارًا في الشهر (تختلف أعداد الطلبات الفعلية حسب النموذج والاستخدام).",
"zen.api.error.rateLimitExceeded": "تم تجاوز حد الطلبات. يرجى المحاولة مرة أخرى لاحقًا.",
"zen.api.error.modelNotSupported": "النموذج {{model}} غير مدعوم",
"zen.api.error.modelFormatNotSupported": "النموذج {{model}} غير مدعوم للتنسيق {{format}}",
"zen.api.error.noProviderAvailable": "لا يوجد مزود متاح",
"zen.api.error.providerNotSupported": "المزود {{provider}} غير مدعوم",
"zen.api.error.missingApiKey": "مفتاح API مفقود.",
"zen.api.error.invalidApiKey": "مفتاح API غير صالح.",
"zen.api.error.subscriptionQuotaExceeded": "تم تجاوز حصة الاشتراك. أعد المحاولة خلال {{retryIn}}.",
"zen.api.error.goSubscriptionRollingLimitExceeded":
"تم الوصول إلى حد الاستخدام لمدة 5 ساعات. تتم إعادة التعيين خلال {{retryIn}}. لمواصلة استخدام هذا النموذج الآن، فعّل الاستخدام من رصيدك المتاح: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionWeeklyLimitExceeded":
"تم الوصول إلى حد الاستخدام الأسبوعي. تتم إعادة التعيين خلال {{retryIn}}. لمواصلة استخدام هذا النموذج الآن، فعّل الاستخدام من رصيدك المتاح: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionMonthlyLimitExceeded":
"تم الوصول إلى حد الاستخدام الشهري. تتم إعادة التعيين خلال {{retryIn}}. لمواصلة استخدام هذا النموذج الآن، فعّل الاستخدام من رصيدك المتاح: {{consoleGoUrl}}",
"zen.api.error.noPaymentMethod": "لا توجد طريقة دفع. أضف طريقة دفع هنا: {{billingUrl}}",
"zen.api.error.insufficientBalance": "رصيد غير كاف. إدارة فواتيرك هنا: {{billingUrl}}",
"zen.api.error.workspaceMonthlyLimitReached":
"وصلت مساحة العمل الخاصة بك إلى حد الإنفاق الشهري البالغ ${{amount}}. إدارة حدودك هنا: {{billingUrl}}",
"zen.api.error.userMonthlyLimitReached":
"لقد وصلت إلى حد الإنفاق الشهري البالغ ${{amount}}. إدارة حدودك هنا: {{membersUrl}}",
"zen.api.error.modelDisabled": "النموذج معطل",
"zen.api.error.trialEnded":
"انتهى العرض المجاني لـ {{model}}. يمكنك مواصلة استخدام النموذج بالاشتراك في OpenCode Go - {{link}}",
"black.meta.title": "OpenCode Black | الوصول إلى أفضل نماذج البرمجة في العالم",
"black.meta.description": "احصل على وصول إلى Claude، GPT، Gemini والمزيد مع خطط اشتراك OpenCode Black.",
"black.hero.title": "الوصول إلى أفضل نماذج البرمجة في العالم",
"black.hero.subtitle": "بما في ذلك Claude، GPT، Gemini والمزيد",
"black.title": "OpenCode Black | الأسعار",
"black.paused": "التسجيل في خطة Black متوقف مؤقتًا.",
"black.plan.icon20": "خطة Black 20",
"black.plan.icon100": "خطة Black 100",
"black.plan.icon200": "خطة Black 200",
"black.plan.multiplier100": "استخدام أكثر بـ 5 أضعاف من Black 20",
"black.plan.multiplier200": "استخدام أكثر بـ 20 ضعفًا من Black 20",
"black.price.perMonth": "شهريًا",
"black.price.perPersonBilledMonthly": "للشخص الواحد، يُفوتر شهريًا",
"black.terms.1": "لن يبدأ اشتراكك على الفور",
"black.terms.2": "ستتم إضافتك إلى قائمة الانتظار وتفعيلك قريبًا",
"black.terms.3": "لن يتم خصم المبلغ من بطاقتك إلا عند تفعيل اشتراكك",
"black.terms.4": "تطبق حدود الاستخدام، وقد يصل الاستخدام المؤتمت بكثافة إلى الحدود بشكل أسرع",
"black.terms.5": "الاشتراكات للأفراد، تواصل مع قسم المؤسسات للفرق",
"black.terms.6": "قد يتم تعديل الحدود وقد يتم إيقاف الخطط في المستقبل",
"black.terms.7": "ألغِ اشتراكك في أي وقت",
"black.action.continue": "متابعة",
"black.finePrint.beforeTerms": "الأسعار المعروضة لا تشمل الضرائب المطبقة",
"black.finePrint.terms": "شروط الخدمة",
"black.workspace.title": "OpenCode Black | اختر مساحة العمل",
"black.workspace.selectPlan": "اختر مساحة عمل لهذه الخطة",
"black.workspace.name": "مساحة العمل {{n}}",
"black.subscribe.title": "اشترك في OpenCode Black",
"black.subscribe.paymentMethod": "طريقة الدفع",
"black.subscribe.loadingPaymentForm": "جارٍ تحميل نموذج الدفع...",
"black.subscribe.selectWorkspaceToContinue": "اختر مساحة عمل للمتابعة",
"black.subscribe.failurePrefix": "أوه لا!",
"black.subscribe.error.generic": "حدث خطأ",
"black.subscribe.error.invalidPlan": "خطة غير صالحة",
"black.subscribe.error.workspaceRequired": "معرف مساحة العمل مطلوب",
"black.subscribe.error.alreadySubscribed": "مساحة العمل هذه لديها اشتراك بالفعل",
"black.subscribe.processing": "جارٍ المعالجة...",
"black.subscribe.submit": "اشترك بمبلغ ${{plan}}",
"black.subscribe.form.chargeNotice": "لن يتم خصم المبلغ إلا عند تفعيل اشتراكك",
"black.subscribe.success.title": "أنت في قائمة انتظار OpenCode Black",
"black.subscribe.success.subscriptionPlan": "خطة الاشتراك",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "المبلغ",
"black.subscribe.success.amountValue": "${{plan}} شهريًا",
"black.subscribe.success.paymentMethod": "طريقة الدفع",
"black.subscribe.success.dateJoined": "تاريخ الانضمام",
"black.subscribe.success.chargeNotice": "سيتم خصم المبلغ من بطاقتك عند تفعيل اشتراكك",
"workspace.nav.zen": "Zen",
"workspace.nav.go": "Go",
"workspace.nav.usage": "الاستخدام",
"workspace.nav.apiKeys": "مفاتيح API",
"workspace.nav.members": "الأعضاء",
"workspace.nav.billing": "الفوترة",
"workspace.nav.settings": "الإعدادات",
"workspace.home.banner.beforeLink": "نماذج محسنة وموثوقة لوكلاء البرمجة.",
"workspace.lite.banner.beforeLink": "نماذج برمجة منخفضة التكلفة للجميع.",
"workspace.home.billing.loading": "جارٍ التحميل...",
"workspace.home.billing.enable": "تمكين الفوترة",
"workspace.home.billing.currentBalance": "الرصيد الحالي",
"workspace.newUser.feature.tested.title": "نماذج مُختبرة ومحققة",
"workspace.newUser.feature.tested.body": "لقد قمنا بقياس واختبار النماذج خصيصًا لوكلاء البرمجة لضمان أفضل أداء.",
"workspace.newUser.feature.quality.title": "أعلى جودة",
"workspace.newUser.feature.quality.body":
"الوصول إلى النماذج التي تم تكوينها لتحقيق الأداء الأمثل - لا تقليل للجودة أو توجيه إلى موفري خدمة أرخص.",
"workspace.newUser.feature.lockin.title": "لا قيود على المزود",
"workspace.newUser.feature.lockin.body":
"استخدم Zen مع أي وكيل برمجة، واستمر في استخدام موفرين آخرين مع opencode وقتما تشاء.",
"workspace.newUser.copyApiKey": "نسخ مفتاح API",
"workspace.newUser.copyKey": "نسخ المفتاح",
"workspace.newUser.copied": "تم النسخ!",
"workspace.newUser.step.enableBilling": "تمكين الفوترة",
"workspace.newUser.step.login.before": "شغّل",
"workspace.newUser.step.login.after": "واختر opencode",
"workspace.newUser.step.pasteKey": "الصق مفتاح API الخاص بك",
"workspace.newUser.step.models.before": "ابدأ opencode ثم نفّذ",
"workspace.newUser.step.models.after": "لاختيار نموذج",
"workspace.models.title": "النماذج",
"workspace.models.subtitle.beforeLink": "إدارة النماذج التي يمكن لأعضاء مساحة العمل الوصول إليها.",
"workspace.models.table.model": "النموذج",
"workspace.models.table.enabled": "ممكّن",
"workspace.providers.title": "أحضر مفتاحك الخاص",
"workspace.providers.subtitle": "قم بتكوين مفاتيح API الخاصة بك من موفري الذكاء الاصطناعي.",
"workspace.providers.placeholder": "أدخل مفتاح API لـ {{provider}} ({{prefix}}...)",
"workspace.providers.configure": "تكوين",
"workspace.providers.edit": "تعديل",
"workspace.providers.delete": "حذف",
"workspace.providers.saving": "جارٍ الحفظ...",
"workspace.providers.save": "حفظ",
"workspace.providers.table.provider": "المزود",
"workspace.providers.table.apiKey": "مفتاح API",
"workspace.usage.title": "تاريخ الاستخدام",
"workspace.usage.subtitle": "استخدام وتكاليف API الأخيرة.",
"workspace.usage.empty": "قم بإجراء أول استدعاء API للبدء.",
"workspace.usage.table.date": "التاريخ",
"workspace.usage.table.model": "النموذج",
"workspace.usage.table.input": "الدخل",
"workspace.usage.table.output": "الخرج",
"workspace.usage.table.cost": "التكلفة",
"workspace.usage.table.session": "الجلسة",
"workspace.usage.breakdown.input": "الدخل",
"workspace.usage.breakdown.cacheRead": "قراءة الكاش",
"workspace.usage.breakdown.cacheWrite": "كتابة الكاش",
"workspace.usage.breakdown.output": "الخرج",
"workspace.usage.breakdown.reasoning": "المنطق",
"workspace.usage.subscription": "Black (${{amount}})",
"workspace.usage.lite": "Go (${{amount}})",
"workspace.usage.byok": "BYOK (${{amount}})",
"workspace.cost.title": "التكلفة",
"workspace.cost.subtitle": "تكاليف الاستخدام مقسمة حسب النموذج.",
"workspace.cost.allModels": "جميع النماذج",
"workspace.cost.allKeys": "جميع المفاتيح",
"workspace.cost.deletedSuffix": "(محذوف)",
"workspace.cost.empty": "لا توجد بيانات استخدام متاحة للفترة المحددة.",
"workspace.cost.subscriptionShort": "اشتراك",
"workspace.keys.title": "مفاتيح API",
"workspace.keys.subtitle": "إدارة مفاتيح API الخاصة بك للوصول إلى خدمات opencode.",
"workspace.keys.create": "إنشاء مفتاح API",
"workspace.keys.placeholder": "أدخل اسم المفتاح",
"workspace.keys.empty": "أنشئ مفتاح API لبوابة opencode",
"workspace.keys.table.name": "الاسم",
"workspace.keys.table.key": "المفتاح",
"workspace.keys.table.createdBy": "تم الإنشاء بواسطة",
"workspace.keys.table.lastUsed": "آخر استخدام",
"workspace.keys.copyApiKey": "نسخ مفتاح API",
"workspace.keys.delete": "حذف",
"workspace.members.title": "الأعضاء",
"workspace.members.subtitle": "إدارة أعضاء مساحة العمل وأذوناتهم.",
"workspace.members.invite": "دعوة عضو",
"workspace.members.inviting": "جارٍ الدعوة...",
"workspace.members.beta.beforeLink": "مساحات العمل مجانية للفرق أثناء الفترة التجريبية.",
"workspace.members.form.invitee": "المدعو",
"workspace.members.form.emailPlaceholder": "أدخل البريد الإلكتروني",
"workspace.members.form.role": "الدور",
"workspace.members.form.monthlyLimit": "حد الإنفاق الشهري",
"workspace.members.noLimit": "لا يوجد حد",
"workspace.members.noLimitLowercase": "لا يوجد حد",
"workspace.members.invited": "تمت دعوته",
"workspace.members.edit": "تعديل",
"workspace.members.delete": "حذف",
"workspace.members.saving": "جارٍ الحفظ...",
"workspace.members.save": "حفظ",
"workspace.members.table.email": "البريد الإلكتروني",
"workspace.members.table.role": "الدور",
"workspace.members.table.monthLimit": "الحد الشهري",
"workspace.members.role.admin": "مسؤول",
"workspace.members.role.adminDescription": "يمكنه إدارة النماذج، والأعضاء، والفوترة",
"workspace.members.role.member": "عضو",
"workspace.members.role.memberDescription": "يمكنه فقط إنشاء مفاتيح API لنفسه",
"workspace.settings.title": "الإعدادات",
"workspace.settings.subtitle": "حدّث اسم مساحة العمل وتفضيلاتك.",
"workspace.settings.workspaceName": "اسم مساحة العمل",
"workspace.settings.defaultName": "افتراضي",
"workspace.settings.updating": "جارٍ التحديث...",
"workspace.settings.save": "حفظ",
"workspace.settings.edit": "تعديل",
"workspace.billing.title": "الفوترة",
"workspace.billing.subtitle.beforeLink": "إدارة طرق الدفع.",
"workspace.billing.contactUs": "اتصل بنا",
"workspace.billing.subtitle.afterLink": "إذا كان لديك أي أسئلة.",
"workspace.billing.currentBalance": "الرصيد الحالي",
"workspace.billing.add": "أضف $",
"workspace.billing.enterAmount": "أدخل المبلغ",
"workspace.billing.loading": "جارٍ التحميل...",
"workspace.billing.addAction": "إضافة",
"workspace.billing.addBalance": "إضافة رصيد",
"workspace.billing.alipay": "Alipay",
"workspace.billing.wechat": "WeChat Pay",
"workspace.billing.linkedToStripe": "مرتبط بـ Stripe",
"workspace.billing.manage": "إدارة",
"workspace.billing.enable": "تمكين الفوترة",
"workspace.monthlyLimit.title": "الحد الشهري",
"workspace.monthlyLimit.subtitle": "عيّن حد الاستخدام الشهري لحسابك.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "جارٍ التعيين...",
"workspace.monthlyLimit.set": "تعيين",
"workspace.monthlyLimit.edit": "تعديل الحد",
"workspace.monthlyLimit.noLimit": "لم يتم تعيين حد للاستخدام.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "الاستخدام الحالي لـ",
"workspace.monthlyLimit.currentUsage.beforeAmount": "هو $",
"workspace.redeem.title": "استرداد قسيمة",
"workspace.redeem.subtitle": "استرد رمز القسيمة للحصول على رصيد أو مزايا.",
"workspace.redeem.placeholder": "أدخل رمز القسيمة",
"workspace.redeem.redeem": "استرداد",
"workspace.redeem.redeeming": "جارٍ الاسترداد...",
"workspace.redeem.success": "تم استرداد القسيمة بنجاح.",
"workspace.reload.title": "إعادة الشحن التلقائي",
"workspace.reload.disabled.before": "إعادة الشحن التلقائي",
"workspace.reload.disabled.state": "معطّل",
"workspace.reload.disabled.after": "فعّلها لإعادة شحن الرصيد تلقائيًا عندما ينخفض.",
"workspace.reload.enabled.before": "إعادة الشحن التلقائي",
"workspace.reload.enabled.state": "ممكّن",
"workspace.reload.enabled.middle": "سنعيد شحن رصيدك بمبلغ",
"workspace.reload.processingFee": "رسوم معالجة",
"workspace.reload.enabled.after": "عندما يصل الرصيد إلى",
"workspace.reload.edit": "تعديل",
"workspace.reload.enable": "تفعيل",
"workspace.reload.enableAutoReload": "تفعيل إعادة الشحن التلقائي",
"workspace.reload.reloadAmount": "مبلغ الشحن $",
"workspace.reload.whenBalanceReaches": "عندما يصل الرصيد إلى $",
"workspace.reload.saving": "جارٍ الحفظ...",
"workspace.reload.save": "حفظ",
"workspace.reload.failedAt": "فشلت إعادة الشحن في",
"workspace.reload.reason": "السبب:",
"workspace.reload.updatePaymentMethod": "يرجى تحديث طريقة الدفع والمحاولة مرة أخرى.",
"workspace.reload.retrying": "جارٍ إعادة المحاولة...",
"workspace.reload.retry": "أعد المحاولة",
"workspace.reload.error.paymentFailed": "فشلت عملية الدفع.",
"workspace.payments.title": "سجل المدفوعات",
"workspace.payments.subtitle": "معاملات الدفع الأخيرة.",
"workspace.payments.table.date": "التاريخ",
"workspace.payments.table.paymentId": "معرف الدفع",
"workspace.payments.table.amount": "المبلغ",
"workspace.payments.table.receipt": "الإيصال",
"workspace.payments.type.credit": "رصيد",
"workspace.payments.type.subscription": "اشتراك",
"workspace.payments.view": "عرض",
"workspace.black.loading": "جارٍ التحميل...",
"workspace.black.time.day": "يوم",
"workspace.black.time.days": "أيام",
"workspace.black.time.hour": "ساعة",
"workspace.black.time.hours": "ساعات",
"workspace.black.time.minute": "دقيقة",
"workspace.black.time.minutes": "دقائق",
"workspace.black.time.fewSeconds": "بضع ثوان",
"workspace.black.subscription.title": "الاشتراك",
"workspace.black.subscription.message": "أنت مشترك في OpenCode Black مقابل ${{plan}} شهريًا.",
"workspace.black.subscription.manage": "إدارة الاشتراك",
"workspace.black.subscription.rollingUsage": "استخدام لمدة 5 ساعات",
"workspace.black.subscription.weeklyUsage": "الاستخدام الأسبوعي",
"workspace.black.subscription.resetsIn": "إعادة تعيين في",
"workspace.black.subscription.useBalance": "استخدم رصيدك المتوفر بعد الوصول إلى حدود الاستخدام",
"workspace.black.waitlist.title": "قائمة الانتظار",
"workspace.black.waitlist.joined": "أنت في قائمة الانتظار لخطة OpenCode Black بقيمة ${{plan}} شهريًا.",
"workspace.black.waitlist.ready": "نحن مستعدون لتسجيلك في خطة OpenCode Black بقيمة ${{plan}} شهريًا.",
"workspace.black.waitlist.leave": "ترك قائمة الانتظار",
"workspace.black.waitlist.leaving": "جارٍ المغادرة...",
"workspace.black.waitlist.left": "غادر",
"workspace.black.waitlist.enroll": "تسجيل",
"workspace.black.waitlist.enrolling": "جارٍ التسجيل...",
"workspace.black.waitlist.enrolled": "مسجل",
"workspace.black.waitlist.enrollNote": 'عند النقر فوق "تسجيل"، يبدأ اشتراكك على الفور وسيتم خصم الرسوم من بطاقتك.',
"workspace.lite.loading": "جارٍ التحميل...",
"workspace.lite.time.day": "يوم",
"workspace.lite.time.days": "أيام",
"workspace.lite.time.hour": "ساعة",
"workspace.lite.time.hours": "ساعات",
"workspace.lite.time.minute": "دقيقة",
"workspace.lite.time.minutes": "دقائق",
"workspace.lite.time.fewSeconds": "بضع ثوان",
"workspace.lite.subscription.message": "أنت مشترك في OpenCode Go.",
"workspace.lite.subscription.manage": "إدارة الاشتراك",
"workspace.lite.subscription.rollingUsage": "الاستخدام المتجدد",
"workspace.lite.subscription.weeklyUsage": "الاستخدام الأسبوعي",
"workspace.lite.subscription.monthlyUsage": "الاستخدام الشهري",
"workspace.lite.subscription.resetsIn": "إعادة تعيين في",
"workspace.lite.subscription.useBalance": "استخدم رصيدك المتوفر بعد الوصول إلى حدود الاستخدام",
"workspace.lite.subscription.selectProvider":
'اختر "OpenCode Go" كمزود في إعدادات opencode الخاصة بك لاستخدام نماذج Go.',
"workspace.lite.black.message":
"أنت مشترك حاليًا في OpenCode Black أو في قائمة الانتظار. يرجى إلغاء الاشتراك أولاً إذا كنت ترغب في التبديل إلى Go.",
"workspace.lite.other.message":
"عضو آخر في مساحة العمل هذه مشترك بالفعل في OpenCode Go. يمكن لعضو واحد فقط لكل مساحة عمل الاشتراك.",
"workspace.lite.promo.description":
"يبدأ OpenCode Go بسعر {{price}}، ثم $10/شهر، ويوفر وصولا موثوقا لنماذج البرمجة المفتوحة الشهيرة مع حدود استخدام سخية.",
"workspace.lite.promo.price": "$5 للشهر الأول",
"workspace.lite.promo.modelsTitle": "ما يتضمنه",
"workspace.lite.promo.footer":
"تم تصميم الخطة بشكل أساسي للمستخدمين الدوليين، مع استضافة النماذج في الولايات المتحدة والاتحاد الأوروبي وسنغافورة للحصول على وصول عالمي مستقر. قد تتغير الأسعار وحدود الاستخدام بناءً على تعلمنا من الاستخدام المبكر والملاحظات.",
"workspace.lite.promo.subscribe": "الاشتراك في Go",
"workspace.lite.promo.subscribing": "جارٍ إعادة التوجيه...",
"workspace.lite.promo.otherMethods": "طرق دفع أخرى",
"workspace.lite.promo.selectMethod": "اختر طريقة الدفع",
"workspace.referral.copyLink": "نسخ الرابط",
"workspace.referral.copied": "تم النسخ",
"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": "اشترك لإلغاء القفل",
"workspace.referral.apply.preview": "عرض المكافأة",
"workspace.referral.apply.action": "تطبيق",
"workspace.referral.apply.confirmTitle": "تطبيق المكافأة",
"workspace.referral.apply.confirmBody": "طبِّق {{amount}} لتقليل الاستخدام الحالي في مساحة العمل هذه.",
"workspace.referral.apply.confirmAction": "تطبيق",
"download.title": "OpenCode | تنزيل",
"download.meta.description": "نزّل OpenCode لـ macOS، Windows، وLinux",
"download.hero.title": "تنزيل OpenCode",
"download.hero.subtitle": "متاح في نسخة تجريبية لـ macOS، Windows، وLinux",
"download.hero.button": "تنزيل لـ {{os}}",
"download.section.terminal": "OpenCode للطرفية",
"download.section.desktop": "OpenCode لسطح المكتب (Beta)",
"download.section.extensions": "امتدادات OpenCode",
"download.section.integrations": "تكاملات OpenCode",
"download.action.download": "تنزيل",
"download.action.install": "تثبيت",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"ليس بالضرورة، ولكن على الأرجح. ستحتاج إلى اشتراك ذكاء اصطناعي إذا كنت تريد ربط OpenCode بمزوّد مدفوع، رغم أنه يمكنك العمل مع",
"download.faq.a3.localLink": "النماذج المحلية",
"download.faq.a3.afterLocal.beforeZen": "مجانًا. بينما نشجع المستخدمين على استخدام",
"download.faq.a3.afterZen": "، فإن OpenCode يعمل مع جميع المزودين الشائعين مثل OpenAI، Anthropic، xAI إلخ.",
"download.faq.a5.p1": "OpenCode مجاني 100% للاستخدام.",
"download.faq.a5.p2.beforeZen":
"أي تكاليف إضافية ستأتي من اشتراكك لدى مزود النماذج. بينما يعمل OpenCode مع أي مزود نماذج، نوصي باستخدام",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1": "يتم حفظ بياناتك ومعلوماتك فقط عند إنشاء روابط قابلة للمشاركة في OpenCode.",
"download.faq.a6.p2.beforeShare": "اعرف المزيد عن",
"download.faq.a6.shareLink": "صفحات المشاركة",
"enterprise.title": "OpenCode | حلول المؤسسات لمنظمتك",
"enterprise.meta.description": "تواصل مع OpenCode لحلول المؤسسات",
"enterprise.hero.title": "كودك ملكك",
"enterprise.hero.body1":
"يعمل OpenCode بأمان داخل مؤسستك دون تخزين أي بيانات أو سياق، ودون قيود ترخيص أو مطالبات ملكية. ابدأ تجربة مع فريقك، ثم انشره عبر مؤسستك من خلال دمجه مع SSO وبوابة الذكاء الاصطناعي الداخلية لديك.",
"enterprise.hero.body2": "أخبرنا كيف يمكننا المساعدة.",
"enterprise.form.name.label": "الاسم الكامل",
"enterprise.form.name.placeholder": "جيف بيزوس",
"enterprise.form.role.label": "المنصب",
"enterprise.form.role.placeholder": "رئيس مجلس الإدارة التنفيذي",
"enterprise.form.company.label": "الشركة",
"enterprise.form.company.placeholder": "Acme Inc",
"enterprise.form.email.label": "البريد الإلكتروني للشركة",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "رقم الهاتف",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.message.label": "ما المشكلة التي تحاول حلها؟",
"enterprise.form.message.placeholder": "نحتاج مساعدة في...",
"enterprise.form.send": "إرسال",
"enterprise.form.sending": "جارٍ الإرسال...",
"enterprise.form.success": "تم إرسال الرسالة، سنتواصل معك قريبًا.",
"enterprise.form.success.submitted": "تم إرسال النموذج بنجاح.",
"enterprise.form.error.allFieldsRequired": "جميع الحقول مطلوبة.",
"enterprise.form.error.invalidEmailFormat": "تنسيق البريد الإلكتروني غير صالح.",
"enterprise.form.error.internalServer": "خطأ داخلي في الخادم.",
"enterprise.faq.title": "الأسئلة الشائعة",
"enterprise.faq.q1": "ما هو OpenCode Enterprise؟",
"enterprise.faq.a1":
"OpenCode Enterprise مخصص للمؤسسات التي تريد التأكد من أن الكود والبيانات لا تغادر بنيتها التحتية أبدًا. يتحقق ذلك عبر استخدام تكوين مركزي يندمج مع SSO وبوابة الذكاء الاصطناعي الداخلية لديك.",
"enterprise.faq.q2": "كيف أبدأ مع OpenCode Enterprise؟",
"enterprise.faq.a2":
"ابدأ ببساطة بتجربة داخلية مع فريقك. افتراضيًا، لا يقوم OpenCode بتخزين الكود أو بيانات السياق، مما يجعل البدء سهلاً. ثم اتصل بنا لمناقشة الأسعار وخيارات التنفيذ.",
"enterprise.faq.q3": "كيف تعمل تسعيرة المؤسسات؟",
"enterprise.faq.a3":
"نقدم تسعيرًا للمؤسسات حسب المقعد. إذا كان لديك بوابة LLM خاصة بك، فلن نفرض رسومًا على التوكنات المستخدمة. لمزيد من التفاصيل، اتصل بنا للحصول على عرض سعر مخصص بناءً على احتياجات مؤسستك.",
"enterprise.faq.q4": "هل بياناتي آمنة مع OpenCode Enterprise؟",
"enterprise.faq.a4":
"نعم. لا يقوم OpenCode بتخزين الكود أو بيانات السياق. تتم جميع المعالجة محليًا أو عبر استدعاءات API مباشرة إلى مزود الذكاء الاصطناعي لديك. مع التكوين المركزي وتكامل SSO، تظل بياناتك آمنة داخل البنية التحتية لمؤسستك.",
"brand.title": "OpenCode | العلامة التجارية",
"brand.meta.description": "إرشادات العلامة التجارية لـ OpenCode",
"brand.heading": "إرشادات العلامة التجارية",
"brand.subtitle": "موارد وأصول لمساعدتك في العمل مع العلامة التجارية لـ OpenCode.",
"brand.downloadAll": "تنزيل جميع الأصول",
"changelog.title": "OpenCode | سجل التغييرات",
"changelog.meta.description": "ملاحظات الإصدار وسجل التغييرات لـ OpenCode",
"changelog.hero.title": "سجل التغييرات",
"changelog.hero.subtitle": "تحديثات وتحسينات جديدة لـ OpenCode",
"changelog.empty": "لم يتم العثور على مدخلات في سجل التغييرات.",
"changelog.viewJson": "عرض JSON",
"bench.list.title": "المعيار",
"bench.list.heading": "المعايير",
"bench.list.table.agent": "الوكيل",
"bench.list.table.model": "النموذج",
"bench.list.table.score": "الدرجة",
"bench.submission.error.allFieldsRequired": "جميع الحقول مطلوبة.",
"bench.detail.title": "المعيار - {{task}}",
"bench.detail.notFound": "المهمة غير موجودة",
"bench.detail.na": "غير متاح",
"bench.detail.labels.agent": "الوكيل",
"bench.detail.labels.model": "النموذج",
"bench.detail.labels.task": "المهمة",
"bench.detail.labels.repo": "المستودع",
"bench.detail.labels.from": "من",
"bench.detail.labels.to": "إلى",
"bench.detail.labels.prompt": "الموجه",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "متوسط المدة",
"bench.detail.labels.averageScore": "متوسط الدرجة",
"bench.detail.labels.averageCost": "متوسط التكلفة",
"bench.detail.labels.summary": "الملخص",
"bench.detail.labels.runs": "تشغيلات",
"bench.detail.labels.score": "الدرجة",
"bench.detail.labels.base": "الأساس",
"bench.detail.labels.penalty": "الجزاء",
"bench.detail.labels.weight": "الوزن",
"bench.detail.table.run": "تشغيل",
"bench.detail.table.score": "الدرجة (الأساس - الجزاء)",
"bench.detail.table.cost": "التكلفة",
"bench.detail.table.duration": "المدة",
"bench.detail.run.title": "تشغيل {{n}}",
"bench.detail.rawJson": "JSON خام",
} satisfies Dict

View File

@@ -0,0 +1,827 @@
import type { Dict } from "./en"
import { dict as en } from "./en"
export const dict = {
...en,
"nav.github": "GitHub",
"nav.docs": "Documentação",
"nav.changelog": "Changelog",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "Enterprise",
"nav.zen": "Zen",
"nav.login": "Entrar",
"nav.free": "Download",
"nav.home": "Início",
"nav.openMenu": "Abrir menu",
"nav.getStartedFree": "Começar grátis",
"nav.logoAlt": "OpenCode",
"nav.context.copyLogo": "Copiar logo como SVG",
"nav.context.copyWordmark": "Copiar marca como SVG",
"nav.context.brandAssets": "Recursos da marca",
"footer.github": "GitHub",
"footer.docs": "Documentação",
"footer.changelog": "Changelog",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "Marca",
"legal.privacy": "Privacidade",
"legal.terms": "Termos",
"email.title": "Seja o primeiro a saber quando lançarmos novos produtos",
"email.subtitle": "Entre na lista de espera para acesso antecipado.",
"email.placeholder": "Endereço de e-mail",
"email.subscribe": "Inscrever-se",
"email.success": "Quase lá, verifique sua caixa de entrada e confirme seu e-mail",
"notFound.title": "Não encontrado | opencode",
"notFound.heading": "404 - Página não encontrada",
"notFound.home": "Início",
"notFound.docs": "Documentação",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"notFound.logoLightAlt": "logo opencode claro",
"notFound.logoDarkAlt": "logo opencode escuro",
"user.logout": "Sair",
"auth.callback.error.codeMissing": "Nenhum código de autorização encontrado.",
"workspace.select": "Selecionar workspace",
"workspace.createNew": "+ Criar novo workspace",
"workspace.modal.title": "Criar novo workspace",
"workspace.modal.placeholder": "Digite o nome do workspace",
"common.cancel": "Cancelar",
"common.creating": "Criando...",
"common.create": "Criar",
"common.videoUnsupported": "Seu navegador não suporta a tag de vídeo.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Saiba mais",
"error.invalidPlan": "Plano inválido",
"error.workspaceRequired": "ID do workspace é obrigatório",
"error.alreadySubscribed": "Este workspace já possui uma assinatura",
"error.limitRequired": "Limite é obrigatório.",
"error.monthlyLimitInvalid": "Defina um limite mensal válido.",
"error.workspaceNameRequired": "Nome do workspace é obrigatório.",
"error.nameTooLong": "O nome deve ter 255 caracteres ou menos.",
"error.emailRequired": "E-mail é obrigatório",
"error.roleRequired": "Função é obrigatória",
"error.idRequired": "ID é obrigatório",
"error.nameRequired": "Nome é obrigatório",
"error.providerRequired": "Provedor é obrigatório",
"error.apiKeyRequired": "Chave de API é obrigatória",
"error.modelRequired": "Modelo é obrigatório",
"error.reloadAmountMin": "O valor de recarga deve ser de pelo menos ${{amount}}",
"error.reloadTriggerMin": "O gatilho de saldo deve ser de pelo menos ${{amount}}",
"app.meta.description": "OpenCode - O agente de codificação de código aberto.",
"home.title": "OpenCode | O agente de codificação de código aberto com IA",
"temp.title": "opencode | Agente de codificação com IA feito para o terminal",
"temp.hero.title": "O agente de codificação com IA feito para o terminal",
"temp.zen": "opencode zen",
"temp.getStarted": "Começar",
"temp.feature.native.title": "TUI Nativa",
"temp.feature.native.body": "Uma interface de terminal responsiva, nativa e personalizável",
"temp.feature.zen.beforeLink": "Uma",
"temp.feature.zen.link": "lista selecionada de modelos",
"temp.feature.zen.afterLink": "fornecida pela opencode",
"temp.feature.models.beforeLink": "Suporta mais de 75 provedores de LLM através do",
"temp.feature.models.afterLink": ", incluindo modelos locais",
"temp.screenshot.caption": "OpenCode TUI com o tema tokyonight",
"temp.screenshot.alt": "OpenCode TUI com tema tokyonight",
"temp.logoLightAlt": "logo opencode claro",
"temp.logoDarkAlt": "logo opencode escuro",
"home.banner.badge": "Novo",
"home.banner.text": "App desktop disponível em beta",
"home.banner.platforms": "no macOS, Windows e Linux",
"home.banner.downloadNow": "Baixar agora",
"home.banner.downloadBetaNow": "Baixe agora o beta do desktop",
"home.hero.title": "O agente de codificação de código aberto com IA",
"home.hero.subtitle.a": "Modelos grátis incluídos ou conecte qualquer modelo de qualquer provedor,",
"home.hero.subtitle.b": "incluindo Claude, GPT, Gemini e mais.",
"home.install.ariaLabel": "Opções de instalação",
"home.what.title": "O que é OpenCode?",
"home.what.body":
"OpenCode é um agente de código aberto que ajuda você a escrever código no seu terminal, IDE ou desktop.",
"home.what.lsp.title": "LSP habilitado",
"home.what.lsp.body": "Carrega automaticamente os LSPs certos para o LLM",
"home.what.multiSession.title": "Multissessão",
"home.what.multiSession.body": "Inicie vários agentes em paralelo no mesmo projeto",
"home.what.shareLinks.title": "Links compartilháveis",
"home.what.shareLinks.body": "Compartilhe um link para qualquer sessão para referência ou depuração",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Entre com o GitHub para usar sua conta do Copilot",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Entre com a OpenAI para usar sua conta do ChatGPT Plus ou Pro",
"home.what.anyModel.title": "Qualquer modelo",
"home.what.anyModel.body": "Mais de 75 provedores de LLM via Models.dev, incluindo modelos locais",
"home.what.anyEditor.title": "Qualquer editor",
"home.what.anyEditor.body": "Disponível como interface de terminal, app desktop e extensão de IDE",
"home.what.readDocs": "Ler documentação",
"home.growth.title": "O agente de codificação de código aberto com IA",
"home.growth.body":
"Com mais de <strong>{{stars}}</strong> estrelas no GitHub, <strong>{{contributors}}</strong> colaboradores e mais de <strong>{{commits}}</strong> commits, OpenCode é usado e confiado por mais de <strong>{{monthlyUsers}}</strong> desenvolvedores todos os meses.",
"home.growth.githubStars": "Estrelas no GitHub",
"home.growth.contributors": "Colaboradores",
"home.growth.monthlyDevs": "Devs mensais",
"home.privacy.title": "Feito com privacidade em primeiro lugar",
"home.privacy.body":
"OpenCode não armazena nenhum código seu nem dados de contexto, para que possa operar em ambientes sensíveis à privacidade.",
"home.privacy.learnMore": "Saiba mais sobre",
"home.privacy.link": "privacidade",
"home.faq.q1": "O que é OpenCode?",
"home.faq.a1":
"OpenCode é um agente de código aberto que ajuda você a escrever e executar código com qualquer modelo de IA. Está disponível como interface de terminal, app desktop ou extensão de IDE.",
"home.faq.q2": "Como eu uso o OpenCode?",
"home.faq.a2.before": "A maneira mais fácil de começar é ler a",
"home.faq.a2.link": "introdução",
"home.faq.q3": "Preciso de assinaturas extras de IA para usar o OpenCode?",
"home.faq.a3.p1":
"Não necessariamente, OpenCode vem com um conjunto de modelos grátis que você pode usar sem criar conta.",
"home.faq.a3.p2.beforeZen":
"Além disso, você pode usar qualquer um dos modelos de codificação populares criando uma conta",
"home.faq.a3.p2.afterZen": ".",
"home.faq.a3.p3":
"Embora incentivemos os usuários a usar o Zen, OpenCode também funciona com todos os provedores populares, como OpenAI, Anthropic, xAI etc.",
"home.faq.a3.p4.beforeLocal": "Você pode até conectar seus",
"home.faq.a3.p4.localLink": "modelos locais",
"home.faq.q4": "Posso usar minhas assinaturas de IA existentes com o OpenCode?",
"home.faq.a4.p1":
"Sim, OpenCode suporta planos de assinatura de todos os principais provedores. Você pode usar suas assinaturas Claude Pro/Max, ChatGPT Plus/Pro ou GitHub Copilot.",
"home.faq.q5": "Posso usar o OpenCode apenas no terminal?",
"home.faq.a5.beforeDesktop": "Não mais! OpenCode agora está disponível como um app para o seu",
"home.faq.a5.desktop": "desktop",
"home.faq.a5.and": "e",
"home.faq.a5.web": "web",
"home.faq.q6": "Quanto custa o OpenCode?",
"home.faq.a6":
"OpenCode é 100% gratuito para usar. Ele também vem com um conjunto de modelos gratuitos. Pode haver custos adicionais se você conectar qualquer outro provedor.",
"home.faq.q7": "E sobre dados e privacidade?",
"home.faq.a7.p1":
"Seus dados e informações só são armazenados quando você usa nossos modelos gratuitos ou cria links compartilháveis.",
"home.faq.a7.p2.beforeModels": "Saiba mais sobre",
"home.faq.a7.p2.modelsLink": "nossos modelos",
"home.faq.a7.p2.and": "e",
"home.faq.a7.p2.shareLink": "páginas de compartilhamento",
"home.faq.q8": "OpenCode é código aberto?",
"home.faq.a8.p1": "Sim, OpenCode é totalmente open source. O código-fonte é público no",
"home.faq.a8.p2": "sob a",
"home.faq.a8.mitLicense": "Licença MIT",
"home.faq.a8.p3":
", o que significa que qualquer pessoa pode usar, modificar ou contribuir para o seu desenvolvimento. Qualquer pessoa da comunidade pode abrir issues, enviar pull requests e estender a funcionalidade.",
"home.zenCta.title": "Acesse modelos confiáveis e otimizados para agentes de codificação",
"home.zenCta.body":
"O Zen dá acesso a um conjunto selecionado de modelos de IA que a OpenCode testou e avaliou especificamente para agentes de codificação. Não precisa se preocupar com desempenho e qualidade inconsistentes entre provedores, use modelos validados que funcionam.",
"home.zenCta.link": "Saiba mais sobre o Zen",
"zen.title": "OpenCode Zen | Um conjunto selecionado de modelos confiáveis e otimizados para agentes de codificação",
"zen.hero.title": "Modelos confiáveis e otimizados para agentes de codificação",
"zen.hero.body":
"O Zen dá acesso a um conjunto selecionado de modelos de IA que a OpenCode testou e avaliou especificamente para agentes de codificação. Não precisa se preocupar com desempenho e qualidade inconsistentes, use modelos validados que funcionam.",
"zen.faq.q1": "O que é OpenCode Zen?",
"zen.faq.a1":
"Zen é um conjunto selecionado de modelos de IA testados e avaliados para agentes de codificação, criado pela equipe por trás do OpenCode.",
"zen.faq.q2": "O que torna o Zen mais preciso?",
"zen.faq.a2":
"O Zen fornece apenas modelos que foram especificamente testados e avaliados para agentes de codificação. Você não usaria uma faca de manteiga para cortar um bife, não use modelos ruins para programar.",
"zen.faq.q3": "O Zen é mais barato?",
"zen.faq.a3":
"O Zen não tem fins lucrativos. O Zen repassa os custos dos provedores de modelos para você. Quanto maior o uso do Zen, mais a OpenCode pode negociar melhores taxas e repassá-las para você.",
"zen.faq.q4": "Quanto custa o Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "cobra por requisição",
"zen.faq.a4.p1.afterPricing": "sem margens de lucro, então você paga exatamente o que o provedor do modelo cobra.",
"zen.faq.a4.p2.beforeAccount": "Seu custo total depende do uso, e você pode definir limites de gastos mensais em sua",
"zen.faq.a4.p2.accountLink": "conta",
"zen.faq.a4.p3":
"Para cobrir custos, a OpenCode adiciona apenas uma pequena taxa de processamento de pagamento de $1,23 por recarga de $20.",
"zen.faq.q5": "E sobre dados e privacidade?",
"zen.faq.a5.beforeExceptions":
"Todos os modelos Zen são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as",
"zen.faq.a5.exceptionsLink": "seguintes exceções",
"zen.faq.q6": "Posso definir limites de gastos?",
"zen.faq.a6": "Sim, você pode definir limites de gastos mensais em sua conta.",
"zen.faq.q7": "Posso cancelar?",
"zen.faq.a7": "Sim, você pode desativar o faturamento a qualquer momento e usar seu saldo restante.",
"zen.faq.q8": "Posso usar o Zen com outros agentes de codificação?",
"zen.faq.a8":
"Embora o Zen funcione muito bem com o OpenCode, você pode usar o Zen com qualquer agente. Siga as instruções de configuração no seu agente de codificação preferido.",
"zen.cta.start": "Comece com o Zen",
"zen.pricing.title": "Adicionar $20 de saldo pré-pago",
"zen.pricing.fee": "(+$1,23 taxa de processamento do cartão)",
"zen.pricing.body": "Use com qualquer agente. Defina limites de gastos mensais. Cancele a qualquer momento.",
"zen.problem.title": "Que problema o Zen resolve?",
"zen.problem.body":
"Existem muitos modelos disponíveis, mas apenas alguns funcionam bem com agentes de codificação. A maioria dos provedores os configura de maneira diferente, com resultados variados.",
"zen.problem.subtitle": "Estamos corrigindo isso para todos, não apenas para os usuários do OpenCode.",
"zen.problem.item1": "Testando modelos selecionados e consultando suas equipes",
"zen.problem.item2": "Trabalhando com provedores para garantir que sejam entregues corretamente",
"zen.problem.item3": "Avaliando todas as combinações de modelo-provedor que recomendamos",
"zen.how.title": "Como o Zen funciona",
"zen.how.body": "Embora sugerimos que você use o Zen com o OpenCode, você pode usá-lo com qualquer agente.",
"zen.how.step1.title": "Cadastre-se e adicione $20 de saldo",
"zen.how.step1.beforeLink": "siga as",
"zen.how.step1.link": "instruções de configuração",
"zen.how.step2.title": "Use o Zen com preços transparentes",
"zen.how.step2.link": "pague por requisição",
"zen.how.step2.afterLink": "sem margens de lucro",
"zen.how.step3.title": "Recarga automática",
"zen.how.step3.body": "quando seu saldo atingir $5, adicionaremos automaticamente $20",
"zen.privacy.title": "Sua privacidade é importante para nós",
"zen.privacy.beforeExceptions":
"Todos os modelos Zen são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelo, com as",
"zen.privacy.exceptionsLink": "seguintes exceções",
"go.title": "OpenCode Go | Modelos de codificação de baixo custo para todos",
"go.meta.description":
"O Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos de solicitação de 5 horas para GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash.",
"go.hero.title": "Modelos de codificação de baixo custo para todos",
"go.hero.body":
"O Go traz a codificação com agentes para programadores em todo o mundo. Oferecendo limites generosos e acesso confiável aos modelos de código aberto mais capazes, para que você possa construir com agentes poderosos sem se preocupar com custos ou disponibilidade.",
"go.cta.start": "Assinar o Go",
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Assinar o Go",
"go.cta.price": "$10/mês",
"go.cta.promo": "$5 no primeiro mês",
"go.pricing.body":
"Use com qualquer agente. $5 no primeiro mês, depois $10/mês. Recarregue o crédito se necessário. Cancele a qualquer momento.",
"go.graph.free": "Grátis",
"go.graph.freePill": "Big Pickle e modelos gratuitos",
"go.graph.go": "Go",
"go.graph.label": "Requisições por 5 horas",
"go.graph.usageLimits": "Limites de uso",
"go.graph.tick": "{{n}}x",
"go.graph.aria": "Requisições por 5h: {{free}} vs {{go}}",
"go.testimonials.brand.zen": "Zen",
"go.testimonials.brand.go": "Go",
"go.testimonials.handle": "@OpenCode",
"go.testimonials.dax.name": "Dax Raad",
"go.testimonials.dax.title": "ex-CEO, Terminal Products",
"go.testimonials.dax.quoteAfter": "mudou minha vida, é realmente uma escolha óbvia.",
"go.testimonials.jay.name": "Jay V",
"go.testimonials.jay.title": "ex-Fundador, SEED, PM, Melt, Pop, Dapt, Cadmus e ViewPoint",
"go.testimonials.jay.quoteBefore": "4 de 5 pessoas em nossa equipe adoram usar",
"go.testimonials.jay.quoteAfter": ".",
"go.testimonials.adam.name": "Adam Elmore",
"go.testimonials.adam.title": "ex-Hero, AWS",
"go.testimonials.adam.quoteBefore": "Eu não consigo recomendar o",
"go.testimonials.adam.quoteAfter": "o suficiente. Sério, é muito bom.",
"go.testimonials.david.name": "David Hill",
"go.testimonials.david.title": "ex-Head de Design, Laravel",
"go.testimonials.david.quoteBefore": "Com o",
"go.testimonials.david.quoteAfter":
"eu sei que todos os modelos são testados e perfeitos para agentes de codificação.",
"go.testimonials.frank.name": "Frank Wang",
"go.testimonials.frank.title": "ex-Estagiário, Nvidia (4 vezes)",
"go.testimonials.frank.quote": "Eu queria ainda estar na Nvidia.",
"go.problem.title": "Que problema o Go resolve?",
"go.problem.body":
"Estamos focados em levar a experiência do OpenCode para o maior número de pessoas possível. OpenCode Go é uma assinatura de baixo custo: $5 no primeiro mês, depois $10/mês. Oferece limites generosos e acesso confiável aos modelos open source mais capazes.",
"go.problem.subtitle": " ",
"go.problem.item1": "Preço de assinatura de baixo custo",
"go.problem.item2": "Limites generosos e acesso confiável",
"go.problem.item3": "Feito para o maior número possível de programadores",
"go.problem.item4":
"Inclui GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash",
"go.how.title": "Como o Go funciona",
"go.how.body":
"O Go começa em $5 no primeiro mês, depois $10/mês. Você pode usá-lo com o OpenCode ou qualquer agente.",
"go.how.step1.title": "Crie uma conta",
"go.how.step1.beforeLink": "siga as",
"go.how.step1.link": "instruções de configuração",
"go.how.step2.title": "Assinar o Go",
"go.how.step2.link": "$5 no primeiro mês",
"go.how.step2.afterLink": "depois $10/mês com limites generosos",
"go.how.step3.title": "Comece a codificar",
"go.how.step3.body": "com acesso confiável a modelos de código aberto",
"go.privacy.title": "Sua privacidade é importante para nós",
"go.privacy.body":
"O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável.",
"go.privacy.contactAfter": "se você tiver alguma dúvida.",
"go.privacy.beforeExceptions":
"Os modelos Go são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as",
"go.privacy.exceptionsLink": "seguintes exceções",
"go.faq.q1": "O que é OpenCode Go?",
"go.faq.a1":
"Go é uma assinatura de baixo custo que oferece acesso confiável a modelos de código aberto capazes para codificação com agentes.",
"go.faq.q2": "Quais modelos o Go inclui?",
"go.faq.a2": "O Go inclui os modelos listados abaixo, com limites generosos e acesso confiável.",
"go.faq.q3": "O Go é o mesmo que o Zen?",
"go.faq.a3":
"Não. Zen é pay-as-you-go, enquanto o Go começa em $5 no primeiro mês, depois $10/mês, com limites generosos e acesso confiável aos modelos open source GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash.",
"go.faq.q4": "Quanto custa o Go?",
"go.faq.a4.p1.beforePricing": "O Go custa",
"go.faq.a4.p1.pricingLink": "$5 no primeiro mês",
"go.faq.a4.p1.afterPricing": "depois $10/mês com limites generosos.",
"go.faq.a4.p2.beforeAccount": "Você pode gerenciar sua assinatura em sua",
"go.faq.a4.p2.accountLink": "conta",
"go.faq.a4.p3": "Cancele a qualquer momento.",
"go.faq.q5": "E sobre dados e privacidade?",
"go.faq.a5.body":
"O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável. Nossos provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos.",
"go.faq.a5.beforeExceptions":
"Os modelos Go são hospedados nos EUA. Os provedores seguem uma política de retenção zero e não usam seus dados para treinamento de modelos, com as",
"go.faq.a5.exceptionsLink": "seguintes exceções",
"go.faq.q6": "Posso recarregar crédito?",
"go.faq.a6": "Se você precisar de mais uso, pode recarregar crédito em sua conta.",
"go.faq.q7": "Posso cancelar?",
"go.faq.a7": "Sim, você pode cancelar a qualquer momento.",
"go.faq.q8": "Posso usar o Go com outros agentes de codificação?",
"go.faq.a8":
"Sim, você pode usar o Go com qualquer agente. Siga as instruções de configuração no seu agente de codificação preferido.",
"go.faq.q9": "Qual a diferença entre os modelos gratuitos e o Go?",
"go.faq.a9":
"Os modelos gratuitos incluem Big Pickle e modelos promocionais disponíveis no momento, com uma cota de 200 requisições/dia. O Go inclui GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro e DeepSeek V4 Flash com cotas de requisição mais altas aplicadas em janelas móveis (5 horas, semanal e mensal), aproximadamente equivalentes a $12 por 5 horas, $30 por semana e $60 por mês (as contagens reais de requisições variam de acordo com o modelo e o uso).",
"zen.api.error.rateLimitExceeded": "Limite de taxa excedido. Por favor, tente novamente mais tarde.",
"zen.api.error.modelNotSupported": "Modelo {{model}} não suportado",
"zen.api.error.modelFormatNotSupported": "Modelo {{model}} não suportado para o formato {{format}}",
"zen.api.error.noProviderAvailable": "Nenhum provedor disponível",
"zen.api.error.providerNotSupported": "Provedor {{provider}} não suportado",
"zen.api.error.missingApiKey": "Chave de API ausente.",
"zen.api.error.invalidApiKey": "Chave de API inválida.",
"zen.api.error.subscriptionQuotaExceeded": "Cota de assinatura excedida. Tente novamente em {{retryIn}}.",
"zen.api.error.goSubscriptionRollingLimitExceeded":
"Limite de uso de 5 horas atingido. Será reiniciado em {{retryIn}}. Para continuar usando este modelo agora, habilite o uso a partir do seu saldo disponível: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionWeeklyLimitExceeded":
"Limite de uso semanal atingido. Será reiniciado em {{retryIn}}. Para continuar usando este modelo agora, habilite o uso a partir do seu saldo disponível: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionMonthlyLimitExceeded":
"Limite de uso mensal atingido. Será reiniciado em {{retryIn}}. Para continuar usando este modelo agora, habilite o uso a partir do seu saldo disponível: {{consoleGoUrl}}",
"zen.api.error.noPaymentMethod": "Nenhuma forma de pagamento. Adicione uma forma de pagamento aqui: {{billingUrl}}",
"zen.api.error.insufficientBalance": "Saldo insuficiente. Gerencie seu faturamento aqui: {{billingUrl}}",
"zen.api.error.workspaceMonthlyLimitReached":
"Seu workspace atingiu o limite de gastos mensais de ${{amount}}. Gerencie seus limites aqui: {{billingUrl}}",
"zen.api.error.userMonthlyLimitReached":
"Você atingiu seu limite de gastos mensais de ${{amount}}. Gerencie seus limites aqui: {{membersUrl}}",
"zen.api.error.modelDisabled": "O modelo está desabilitado",
"zen.api.error.trialEnded":
"A promoção gratuita do {{model}} terminou. Você pode continuar usando o modelo assinando o OpenCode Go - {{link}}",
"black.meta.title": "OpenCode Black | Acesse os melhores modelos de codificação do mundo",
"black.meta.description": "Tenha acesso ao Claude, GPT, Gemini e mais com os planos de assinatura OpenCode Black.",
"black.hero.title": "Acesse os melhores modelos de codificação do mundo",
"black.hero.subtitle": "Incluindo Claude, GPT, Gemini e mais",
"black.title": "OpenCode Black | Preços",
"black.paused": "A inscrição no plano Black está temporariamente pausada.",
"black.plan.icon20": "Plano Black 20",
"black.plan.icon100": "Plano Black 100",
"black.plan.icon200": "Plano Black 200",
"black.plan.multiplier100": "5x mais uso que o Black 20",
"black.plan.multiplier200": "20x mais uso que o Black 20",
"black.price.perMonth": "por mês",
"black.price.perPersonBilledMonthly": "por pessoa faturado mensalmente",
"black.terms.1": "Sua assinatura não começará imediatamente",
"black.terms.2": "Você será adicionado à lista de espera e ativado em breve",
"black.terms.3": "Seu cartão só será cobrado quando sua assinatura for ativada",
"black.terms.4": "Limites de uso se aplicam; uso fortemente automatizado pode atingir os limites mais cedo",
"black.terms.5": "Assinaturas são para indivíduos, contate Enterprise para equipes",
"black.terms.6": "Limites podem ser ajustados e planos podem ser descontinuados no futuro",
"black.terms.7": "Cancele sua assinatura a qualquer momento",
"black.action.continue": "Continuar",
"black.finePrint.beforeTerms": "Os preços mostrados não incluem impostos aplicáveis",
"black.finePrint.terms": "Termos de Serviço",
"black.workspace.title": "OpenCode Black | Selecionar Workspace",
"black.workspace.selectPlan": "Selecione um workspace para este plano",
"black.workspace.name": "Workspace {{n}}",
"black.subscribe.title": "Assinar OpenCode Black",
"black.subscribe.paymentMethod": "Forma de pagamento",
"black.subscribe.loadingPaymentForm": "Carregando formulário de pagamento...",
"black.subscribe.selectWorkspaceToContinue": "Selecione um workspace para continuar",
"black.subscribe.failurePrefix": "Ops!",
"black.subscribe.error.generic": "Ocorreu um erro",
"black.subscribe.error.invalidPlan": "Plano inválido",
"black.subscribe.error.workspaceRequired": "ID do workspace é obrigatório",
"black.subscribe.error.alreadySubscribed": "Este workspace já possui uma assinatura",
"black.subscribe.processing": "Processando...",
"black.subscribe.submit": "Assinar ${{plan}}",
"black.subscribe.form.chargeNotice": "Você só será cobrado quando sua assinatura for ativada",
"black.subscribe.success.title": "Você está na lista de espera do OpenCode Black",
"black.subscribe.success.subscriptionPlan": "Plano de assinatura",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Valor",
"black.subscribe.success.amountValue": "${{plan}} por mês",
"black.subscribe.success.paymentMethod": "Forma de pagamento",
"black.subscribe.success.dateJoined": "Data de entrada",
"black.subscribe.success.chargeNotice": "Seu cartão será cobrado quando sua assinatura for ativada",
"workspace.nav.zen": "Zen",
"workspace.nav.go": "Go",
"workspace.nav.usage": "Uso",
"workspace.nav.apiKeys": "Chaves de API",
"workspace.nav.members": "Membros",
"workspace.nav.billing": "Faturamento",
"workspace.nav.settings": "Configurações",
"workspace.home.banner.beforeLink": "Modelos otimizados e confiáveis para agentes de codificação.",
"workspace.lite.banner.beforeLink": "Modelos de codificação de baixo custo para todos.",
"workspace.home.billing.loading": "Carregando...",
"workspace.home.billing.enable": "Ativar faturamento",
"workspace.home.billing.currentBalance": "Saldo atual",
"workspace.newUser.feature.tested.title": "Modelos Testados e Verificados",
"workspace.newUser.feature.tested.body":
"Avaliamos e testamos modelos especificamente para agentes de codificação para garantir o melhor desempenho.",
"workspace.newUser.feature.quality.title": "Qualidade Máxima",
"workspace.newUser.feature.quality.body":
"Acesse modelos configurados para desempenho ideal - sem downgrades ou roteamento para provedores mais baratos.",
"workspace.newUser.feature.lockin.title": "Sem Fidelidade",
"workspace.newUser.feature.lockin.body":
"Use o Zen com qualquer agente de codificação e continue usando outros provedores com opencode sempre que quiser.",
"workspace.newUser.copyApiKey": "Copiar chave de API",
"workspace.newUser.copyKey": "Copiar Chave",
"workspace.newUser.copied": "Copiado!",
"workspace.newUser.step.enableBilling": "Ativar faturamento",
"workspace.newUser.step.login.before": "Execute",
"workspace.newUser.step.login.after": "e selecione opencode",
"workspace.newUser.step.pasteKey": "Cole sua chave de API",
"workspace.newUser.step.models.before": "Inicie o opencode e execute",
"workspace.newUser.step.models.after": "para selecionar um modelo",
"workspace.models.title": "Modelos",
"workspace.models.subtitle.beforeLink": "Gerencie quais modelos os membros do workspace podem acessar.",
"workspace.models.table.model": "Modelo",
"workspace.models.table.enabled": "Habilitado",
"workspace.providers.title": "Traga Sua Própria Chave",
"workspace.providers.subtitle": "Configure suas próprias chaves de API de provedores de IA.",
"workspace.providers.placeholder": "Insira a chave de API {{provider}} ({{prefix}}...)",
"workspace.providers.configure": "Configurar",
"workspace.providers.edit": "Editar",
"workspace.providers.delete": "Excluir",
"workspace.providers.saving": "Salvando...",
"workspace.providers.save": "Salvar",
"workspace.providers.table.provider": "Provedor",
"workspace.providers.table.apiKey": "Chave de API",
"workspace.usage.title": "Histórico de Uso",
"workspace.usage.subtitle": "Uso recente da API e custos.",
"workspace.usage.empty": "Faça sua primeira chamada de API para começar.",
"workspace.usage.table.date": "Data",
"workspace.usage.table.model": "Modelo",
"workspace.usage.table.input": "Entrada",
"workspace.usage.table.output": "Saída",
"workspace.usage.table.cost": "Custo",
"workspace.usage.table.session": "Sessão",
"workspace.usage.breakdown.input": "Entrada",
"workspace.usage.breakdown.cacheRead": "Leitura de Cache",
"workspace.usage.breakdown.cacheWrite": "Escrita em Cache",
"workspace.usage.breakdown.output": "Saída",
"workspace.usage.breakdown.reasoning": "Raciocínio",
"workspace.usage.subscription": "Black (${{amount}})",
"workspace.usage.lite": "Go (${{amount}})",
"workspace.usage.byok": "BYOK (${{amount}})",
"workspace.cost.title": "Custo",
"workspace.cost.subtitle": "Custos de uso discriminados por modelo.",
"workspace.cost.allModels": "Todos os Modelos",
"workspace.cost.allKeys": "Todas as Chaves",
"workspace.cost.deletedSuffix": "(excluído)",
"workspace.cost.empty": "Nenhum dado de uso disponível para o período selecionado.",
"workspace.cost.subscriptionShort": "ass",
"workspace.keys.title": "Chaves de API",
"workspace.keys.subtitle": "Gerencie suas chaves de API para acessar os serviços opencode.",
"workspace.keys.create": "Criar Chave de API",
"workspace.keys.placeholder": "Digite o nome da chave",
"workspace.keys.empty": "Crie uma chave de API do opencode Gateway",
"workspace.keys.table.name": "Nome",
"workspace.keys.table.key": "Chave",
"workspace.keys.table.createdBy": "Criado Por",
"workspace.keys.table.lastUsed": "Último Uso",
"workspace.keys.copyApiKey": "Copiar chave de API",
"workspace.keys.delete": "Excluir",
"workspace.members.title": "Membros",
"workspace.members.subtitle": "Gerencie os membros do workspace e suas permissões.",
"workspace.members.invite": "Convidar Membro",
"workspace.members.inviting": "Convidando...",
"workspace.members.beta.beforeLink": "Workspaces são gratuitos para equipes durante o beta.",
"workspace.members.form.invitee": "Convidado",
"workspace.members.form.emailPlaceholder": "Digite o e-mail",
"workspace.members.form.role": "Função",
"workspace.members.form.monthlyLimit": "Limite de gastos mensais",
"workspace.members.noLimit": "Sem limite",
"workspace.members.noLimitLowercase": "sem limite",
"workspace.members.invited": "convidado",
"workspace.members.edit": "Editar",
"workspace.members.delete": "Excluir",
"workspace.members.saving": "Salvando...",
"workspace.members.save": "Salvar",
"workspace.members.table.email": "E-mail",
"workspace.members.table.role": "Função",
"workspace.members.table.monthLimit": "Limite mensal",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Pode gerenciar modelos, membros e faturamento",
"workspace.members.role.member": "Membro",
"workspace.members.role.memberDescription": "Só pode gerar chaves de API para si mesmo",
"workspace.settings.title": "Configurações",
"workspace.settings.subtitle": "Atualize o nome e as preferências do seu workspace.",
"workspace.settings.workspaceName": "Nome do workspace",
"workspace.settings.defaultName": "Padrão",
"workspace.settings.updating": "Atualizando...",
"workspace.settings.save": "Salvar",
"workspace.settings.edit": "Editar",
"workspace.billing.title": "Faturamento",
"workspace.billing.subtitle.beforeLink": "Gerenciar formas de pagamento.",
"workspace.billing.contactUs": "Contate-nos",
"workspace.billing.subtitle.afterLink": "se você tiver alguma dúvida.",
"workspace.billing.currentBalance": "Saldo Atual",
"workspace.billing.add": "Adicionar $",
"workspace.billing.enterAmount": "Digite o valor",
"workspace.billing.loading": "Carregando...",
"workspace.billing.addAction": "Adicionar",
"workspace.billing.addBalance": "Adicionar Saldo",
"workspace.billing.alipay": "Alipay",
"workspace.billing.wechat": "WeChat Pay",
"workspace.billing.linkedToStripe": "Vinculado ao Stripe",
"workspace.billing.manage": "Gerenciar",
"workspace.billing.enable": "Ativar Faturamento",
"workspace.monthlyLimit.title": "Limite Mensal",
"workspace.monthlyLimit.subtitle": "Defina um limite de uso mensal para sua conta.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Definindo...",
"workspace.monthlyLimit.set": "Definir",
"workspace.monthlyLimit.edit": "Editar Limite",
"workspace.monthlyLimit.noLimit": "Nenhum limite de uso definido.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Uso atual para",
"workspace.monthlyLimit.currentUsage.beforeAmount": "é $",
"workspace.redeem.title": "Resgatar Cupom",
"workspace.redeem.subtitle": "Resgate um código de cupom para receber créditos ou vantagens.",
"workspace.redeem.placeholder": "Digite o código do cupom",
"workspace.redeem.redeem": "Resgatar",
"workspace.redeem.redeeming": "Resgatando...",
"workspace.redeem.success": "Cupom resgatado com sucesso.",
"workspace.reload.title": "Recarga Automática",
"workspace.reload.disabled.before": "A recarga automática está",
"workspace.reload.disabled.state": "desativada",
"workspace.reload.disabled.after": "Ative para recarregar automaticamente quando o saldo estiver baixo.",
"workspace.reload.enabled.before": "A recarga automática está",
"workspace.reload.enabled.state": "ativada",
"workspace.reload.enabled.middle": "Recarregaremos",
"workspace.reload.processingFee": "taxa de processamento",
"workspace.reload.enabled.after": "quando o saldo atingir",
"workspace.reload.edit": "Editar",
"workspace.reload.enable": "Ativar",
"workspace.reload.enableAutoReload": "Ativar Recarga Automática",
"workspace.reload.reloadAmount": "Recarregar $",
"workspace.reload.whenBalanceReaches": "Quando o saldo atingir $",
"workspace.reload.saving": "Salvando...",
"workspace.reload.save": "Salvar",
"workspace.reload.failedAt": "Recarga falhou em",
"workspace.reload.reason": "Motivo:",
"workspace.reload.updatePaymentMethod": "Por favor, atualize sua forma de pagamento e tente novamente.",
"workspace.reload.retrying": "Tentando novamente...",
"workspace.reload.retry": "Tentar novamente",
"workspace.reload.error.paymentFailed": "Pagamento falhou.",
"workspace.payments.title": "Histórico de Pagamentos",
"workspace.payments.subtitle": "Transações de pagamento recentes.",
"workspace.payments.table.date": "Data",
"workspace.payments.table.paymentId": "ID do Pagamento",
"workspace.payments.table.amount": "Valor",
"workspace.payments.table.receipt": "Recibo",
"workspace.payments.type.credit": "crédito",
"workspace.payments.type.subscription": "assinatura",
"workspace.payments.view": "Ver",
"workspace.black.loading": "Carregando...",
"workspace.black.time.day": "dia",
"workspace.black.time.days": "dias",
"workspace.black.time.hour": "hora",
"workspace.black.time.hours": "horas",
"workspace.black.time.minute": "minuto",
"workspace.black.time.minutes": "minutos",
"workspace.black.time.fewSeconds": "alguns segundos",
"workspace.black.subscription.title": "Assinatura",
"workspace.black.subscription.message": "Você assina o OpenCode Black por ${{plan}} por mês.",
"workspace.black.subscription.manage": "Gerenciar Assinatura",
"workspace.black.subscription.rollingUsage": "Uso de 5 horas",
"workspace.black.subscription.weeklyUsage": "Uso Semanal",
"workspace.black.subscription.resetsIn": "Reinicia em",
"workspace.black.subscription.useBalance": "Use seu saldo disponível após atingir os limites de uso",
"workspace.black.waitlist.title": "Lista de Espera",
"workspace.black.waitlist.joined": "Você está na lista de espera para o plano OpenCode Black de ${{plan}} por mês.",
"workspace.black.waitlist.ready": "Estamos prontos para inscrever você no plano OpenCode Black de ${{plan}} por mês.",
"workspace.black.waitlist.leave": "Sair da Lista de Espera",
"workspace.black.waitlist.leaving": "Saindo...",
"workspace.black.waitlist.left": "Saiu",
"workspace.black.waitlist.enroll": "Inscrever-se",
"workspace.black.waitlist.enrolling": "Inscrevendo-se...",
"workspace.black.waitlist.enrolled": "Inscrito",
"workspace.black.waitlist.enrollNote":
"Ao clicar em Inscrever-se, sua assinatura começará imediatamente e seu cartão será cobrado.",
"workspace.lite.loading": "Carregando...",
"workspace.lite.time.day": "dia",
"workspace.lite.time.days": "dias",
"workspace.lite.time.hour": "hora",
"workspace.lite.time.hours": "horas",
"workspace.lite.time.minute": "minuto",
"workspace.lite.time.minutes": "minutos",
"workspace.lite.time.fewSeconds": "alguns segundos",
"workspace.lite.subscription.message": "Você assina o OpenCode Go.",
"workspace.lite.subscription.manage": "Gerenciar Assinatura",
"workspace.lite.subscription.rollingUsage": "Uso Contínuo",
"workspace.lite.subscription.weeklyUsage": "Uso Semanal",
"workspace.lite.subscription.monthlyUsage": "Uso Mensal",
"workspace.lite.subscription.resetsIn": "Reinicia em",
"workspace.lite.subscription.useBalance": "Use seu saldo disponível após atingir os limites de uso",
"workspace.lite.subscription.selectProvider":
'Selecione "OpenCode Go" como provedor na sua configuração do opencode para usar os modelos Go.',
"workspace.lite.black.message":
"Você está atualmente inscrito no OpenCode Black ou na lista de espera. Por favor, cancele a assinatura primeiro se desejar mudar para o Go.",
"workspace.lite.other.message":
"Outro membro neste workspace já assina o OpenCode Go. Apenas um membro por workspace pode assinar.",
"workspace.lite.promo.description":
"O OpenCode Go começa em {{price}}, depois $10/mês, e oferece acesso confiável a modelos de codificação abertos populares com limites de uso generosos.",
"workspace.lite.promo.price": "$5 no primeiro mês",
"workspace.lite.promo.modelsTitle": "O que está incluído",
"workspace.lite.promo.footer":
"O plano é projetado principalmente para usuários internacionais, com modelos hospedados nos EUA, UE e Singapura para acesso global estável. Preços e limites de uso podem mudar conforme aprendemos com o uso inicial e feedback.",
"workspace.lite.promo.subscribe": "Assinar Go",
"workspace.lite.promo.subscribing": "Redirecionando...",
"workspace.lite.promo.otherMethods": "Outros métodos de pagamento",
"workspace.lite.promo.selectMethod": "Selecionar método de pagamento",
"workspace.referral.copyLink": "Copiar link",
"workspace.referral.copied": "Copiado",
"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": "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",
"workspace.referral.apply.confirmBody": "Aplique {{amount}} para reduzir o uso atual deste workspace.",
"workspace.referral.apply.confirmAction": "Aplicar",
"download.title": "OpenCode | Baixar",
"download.meta.description": "Baixe o OpenCode para macOS, Windows e Linux",
"download.hero.title": "Baixar OpenCode",
"download.hero.subtitle": "Disponível em Beta para macOS, Windows e Linux",
"download.hero.button": "Baixar para {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "Extensões OpenCode",
"download.section.integrations": "Integrações OpenCode",
"download.action.download": "Baixar",
"download.action.install": "Instalar",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Não necessariamente, mas provavelmente. Você precisará de uma assinatura de IA se quiser conectar o OpenCode a um provedor pago, embora você possa trabalhar com",
"download.faq.a3.localLink": "modelos locais",
"download.faq.a3.afterLocal.beforeZen": "de graça. Embora incentivemos os usuários a usar o",
"download.faq.a3.afterZen":
", o OpenCode funciona com todos os provedores populares, como OpenAI, Anthropic, xAI etc.",
"download.faq.a5.p1": "O OpenCode é 100% gratuito para usar.",
"download.faq.a5.p2.beforeZen":
"Quaisquer custos adicionais virão da sua assinatura de um provedor de modelo. Embora o OpenCode funcione com qualquer provedor de modelo, recomendamos o uso do",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1":
"Seus dados e informações só são armazenados quando você cria links compartilháveis no OpenCode.",
"download.faq.a6.p2.beforeShare": "Saiba mais sobre",
"download.faq.a6.shareLink": "páginas de compartilhamento",
"enterprise.title": "OpenCode | Soluções empresariais para sua organização",
"enterprise.meta.description": "Contate a OpenCode para soluções empresariais",
"enterprise.hero.title": "Seu código é seu",
"enterprise.hero.body1":
"O OpenCode opera com segurança dentro da sua organização, sem dados ou contexto armazenados e sem restrições de licenciamento ou reivindicações de propriedade. Inicie um teste com sua equipe e, em seguida, implante em toda a organização integrando-o ao seu SSO e gateway de IA interno.",
"enterprise.hero.body2": "Deixe-nos saber como podemos ajudar.",
"enterprise.form.name.label": "Nome completo",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Cargo",
"enterprise.form.role.placeholder": "Presidente Executivo",
"enterprise.form.company.label": "Empresa",
"enterprise.form.company.placeholder": "Acme Inc",
"enterprise.form.email.label": "E-mail corporativo",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Telefone",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.message.label": "Qual problema você está tentando resolver?",
"enterprise.form.message.placeholder": "Precisamos de ajuda com...",
"enterprise.form.send": "Enviar",
"enterprise.form.sending": "Enviando...",
"enterprise.form.success": "Mensagem enviada, entraremos em contato em breve.",
"enterprise.form.success.submitted": "Formulário enviado com sucesso.",
"enterprise.form.error.allFieldsRequired": "Todos os campos são obrigatórios.",
"enterprise.form.error.invalidEmailFormat": "Formato de e-mail inválido.",
"enterprise.form.error.internalServer": "Erro interno do servidor.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "O que é OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise é para organizações que desejam garantir que seu código e dados nunca saiam de sua infraestrutura. Isso pode ser feito usando uma configuração centralizada que se integra ao seu SSO e gateway de IA interno.",
"enterprise.faq.q2": "Como faço para começar com o OpenCode Enterprise?",
"enterprise.faq.a2":
"Basta começar com um teste interno com sua equipe. O OpenCode por padrão não armazena seu código ou dados de contexto, facilitando o início. Em seguida, entre em contato conosco para discutir opções de preços e implementação.",
"enterprise.faq.q3": "Como funciona o preço empresarial?",
"enterprise.faq.a3":
"Oferecemos preços empresariais por assento. Se você tiver seu próprio gateway de LLM, não cobramos pelos tokens usados. Para mais detalhes, entre em contato conosco para um orçamento personalizado com base nas necessidades da sua organização.",
"enterprise.faq.q4": "Meus dados estão seguros com o OpenCode Enterprise?",
"enterprise.faq.a4":
"Sim. O OpenCode não armazena seu código ou dados de contexto. Todo o processamento acontece localmente ou por meio de chamadas de API diretas para seu provedor de IA. Com configuração centralizada e integração de SSO, seus dados permanecem seguros dentro da infraestrutura de sua organização.",
"brand.title": "OpenCode | Marca",
"brand.meta.description": "Diretrizes da marca OpenCode",
"brand.heading": "Diretrizes da marca",
"brand.subtitle": "Recursos e ativos para ajudá-lo a trabalhar com a marca OpenCode.",
"brand.downloadAll": "Baixar todos os recursos",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "Notas de versão e changelog do OpenCode",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Novas atualizações e melhorias no OpenCode",
"changelog.empty": "Nenhuma entrada de changelog encontrada.",
"changelog.viewJson": "Ver JSON",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agente",
"bench.list.table.model": "Modelo",
"bench.list.table.score": "Pontuação",
"bench.submission.error.allFieldsRequired": "Todos os campos são obrigatórios.",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Tarefa não encontrada",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "Agente",
"bench.detail.labels.model": "Modelo",
"bench.detail.labels.task": "Tarefa",
"bench.detail.labels.repo": "Repositório",
"bench.detail.labels.from": "De",
"bench.detail.labels.to": "Para",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Duração Média",
"bench.detail.labels.averageScore": "Pontuação Média",
"bench.detail.labels.averageCost": "Custo Médio",
"bench.detail.labels.summary": "Resumo",
"bench.detail.labels.runs": "Execuções",
"bench.detail.labels.score": "Pontuação",
"bench.detail.labels.base": "Base",
"bench.detail.labels.penalty": "Penalidade",
"bench.detail.labels.weight": "peso",
"bench.detail.table.run": "Execução",
"bench.detail.table.score": "Pontuação (Base - Penalidade)",
"bench.detail.table.cost": "Custo",
"bench.detail.table.duration": "Duração",
"bench.detail.run.title": "Execução {{n}}",
"bench.detail.rawJson": "JSON Bruto",
} satisfies Dict

View File

@@ -0,0 +1,820 @@
import type { Dict } from "./en"
import { dict as en } from "./en"
export const dict = {
...en,
"nav.github": "GitHub",
"nav.docs": "Dokumentation",
"nav.changelog": "Changelog",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "Enterprise",
"nav.zen": "Zen",
"nav.login": "Log ind",
"nav.free": "Download",
"nav.home": "Hjem",
"nav.openMenu": "Åbn menu",
"nav.getStartedFree": "Kom i gang gratis",
"nav.logoAlt": "OpenCode",
"nav.context.copyLogo": "Kopier logo som SVG",
"nav.context.copyWordmark": "Kopier wordmark som SVG",
"nav.context.brandAssets": "Brand-assets",
"footer.github": "GitHub",
"footer.docs": "Dokumentation",
"footer.changelog": "Changelog",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "Brand",
"legal.privacy": "Privatliv",
"legal.terms": "Vilkår",
"email.title": "Få besked først, når vi lancerer nye produkter",
"email.subtitle": "Tilmeld dig ventelisten for tidlig adgang.",
"email.placeholder": "E-mailadresse",
"email.subscribe": "Tilmeld",
"email.success": "Næsten færdig - tjek din indbakke og bekræft din e-mailadresse",
"notFound.title": "Ikke fundet | opencode",
"notFound.heading": "404 - Siden blev ikke fundet",
"notFound.home": "Hjem",
"notFound.docs": "Dokumentation",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"notFound.logoLightAlt": "opencode logo light",
"notFound.logoDarkAlt": "opencode logo dark",
"user.logout": "Log ud",
"auth.callback.error.codeMissing": "Ingen autorisationskode fundet.",
"workspace.select": "Vælg workspace",
"workspace.createNew": "+ Opret nyt workspace",
"workspace.modal.title": "Opret nyt workspace",
"workspace.modal.placeholder": "Indtast workspace-navn",
"common.cancel": "Annuller",
"common.creating": "Opretter...",
"common.create": "Opret",
"common.videoUnsupported": "Din browser understøtter ikke video-tagget.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Læs mere",
"error.invalidPlan": "Ugyldig plan",
"error.workspaceRequired": "Workspace-ID er påkrævet",
"error.alreadySubscribed": "Dette workspace har allerede et abonnement",
"error.limitRequired": "Grænse er påkrævet.",
"error.monthlyLimitInvalid": "Angiv en gyldig månedlig grænse.",
"error.workspaceNameRequired": "Workspace-navn er påkrævet.",
"error.nameTooLong": "Navnet må højst være på 255 tegn.",
"error.emailRequired": "E-mail er påkrævet",
"error.roleRequired": "Rolle er påkrævet",
"error.idRequired": "ID er påkrævet",
"error.nameRequired": "Navn er påkrævet",
"error.providerRequired": "Udbyder er påkrævet",
"error.apiKeyRequired": "API-nøgle er påkrævet",
"error.modelRequired": "Model er påkrævet",
"error.reloadAmountMin": "Genopfyldningsbeløb skal være mindst ${{amount}}",
"error.reloadTriggerMin": "Saldogrænse skal være mindst ${{amount}}",
"app.meta.description": "OpenCode - Den open source kodningsagent.",
"home.title": "OpenCode | Den open source AI-kodningsagent",
"temp.title": "opencode | AI-kodningsagent bygget til terminalen",
"temp.hero.title": "AI-kodningsagenten bygget til terminalen",
"temp.zen": "opencode zen",
"temp.getStarted": "Kom i gang",
"temp.feature.native.title": "Native TUI",
"temp.feature.native.body": "En responsiv, native, tema-bar terminal-UI",
"temp.feature.zen.beforeLink": "En",
"temp.feature.zen.link": "kurateret liste over modeller",
"temp.feature.zen.afterLink": "leveret af opencode",
"temp.feature.models.beforeLink": "Understøtter 75+ LLM-udbydere gennem",
"temp.feature.models.afterLink": ", inklusive lokale modeller",
"temp.screenshot.caption": "opencode TUI med tokyonight-temaet",
"temp.screenshot.alt": "opencode TUI med tokyonight-temaet",
"temp.logoLightAlt": "opencode logo light",
"temp.logoDarkAlt": "opencode logo dark",
"home.banner.badge": "Ny",
"home.banner.text": "Desktop-app tilgængelig i beta",
"home.banner.platforms": "på macOS, Windows og Linux",
"home.banner.downloadNow": "Download nu",
"home.banner.downloadBetaNow": "Download desktop-betaen nu",
"home.hero.title": "Den open source AI-kodningsagent",
"home.hero.subtitle.a": "Gratis modeller inkluderet, eller forbind enhver model fra enhver udbyder,",
"home.hero.subtitle.b": "inklusive Claude, GPT, Gemini og mere.",
"home.install.ariaLabel": "Installationsmuligheder",
"home.what.title": "Hvad er OpenCode?",
"home.what.body":
"OpenCode er en open source agent, der hjælper dig med at skrive kode i din terminal, IDE eller desktop.",
"home.what.lsp.title": "LSP aktiveret",
"home.what.lsp.body": "Indlæser automatisk de rigtige LSP'er til LLM'en",
"home.what.multiSession.title": "Multi-session",
"home.what.multiSession.body": "Start flere agenter parallelt på det samme projekt",
"home.what.shareLinks.title": "Del links",
"home.what.shareLinks.body": "Del et link til enhver session til reference eller debugging",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Log ind med GitHub for at bruge din Copilot-konto",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Log ind med OpenAI for at bruge din ChatGPT Plus- eller Pro-konto",
"home.what.anyModel.title": "Enhver model",
"home.what.anyModel.body": "75+ LLM-udbydere via Models.dev, inklusive lokale modeller",
"home.what.anyEditor.title": "Enhver editor",
"home.what.anyEditor.body": "Tilgængelig som terminal-interface, desktop-app og IDE-udvidelse",
"home.what.readDocs": "Læs docs",
"home.growth.title": "Den open source AI-kodningsagent",
"home.growth.body":
"Med over <strong>{{stars}}</strong> GitHub-stjerner, <strong>{{contributors}}</strong> bidragsydere og over <strong>{{commits}}</strong> commits bruges OpenCode af over <strong>{{monthlyUsers}}</strong> udviklere hver måned.",
"home.growth.githubStars": "GitHub-stjerner",
"home.growth.contributors": "Bidragsydere",
"home.growth.monthlyDevs": "Månedlige udviklere",
"home.privacy.title": "Bygget med privatliv først",
"home.privacy.body":
"OpenCode gemmer ikke din kode eller kontekstdata, så den kan bruges i privatlivsfølsomme miljøer.",
"home.privacy.learnMore": "Læs mere om",
"home.privacy.link": "privatliv",
"home.faq.q1": "Hvad er OpenCode?",
"home.faq.a1":
"OpenCode er en open source agent, der hjælper dig med at skrive og køre kode med enhver AI-model. Den er tilgængelig som terminal-interface, desktop-app eller IDE-udvidelse.",
"home.faq.q2": "Hvordan bruger jeg OpenCode?",
"home.faq.a2.before": "Den nemmeste måde at komme i gang på er at læse",
"home.faq.a2.link": "introen",
"home.faq.q3": "Skal jeg have ekstra AI-abonnementer for at bruge OpenCode?",
"home.faq.a3.p1":
"Ikke nødvendigvis. OpenCode kommer med gratis modeller, som du kan bruge uden at oprette en konto.",
"home.faq.a3.p2.beforeZen": "Derudover kan du bruge populære kodningsmodeller ved at oprette en",
"home.faq.a3.p2.afterZen": " konto.",
"home.faq.a3.p3":
"Vi opfordrer til at bruge Zen, men OpenCode virker også med populære udbydere som OpenAI, Anthropic, xAI osv.",
"home.faq.a3.p4.beforeLocal": "Du kan endda forbinde dine",
"home.faq.a3.p4.localLink": "lokale modeller",
"home.faq.q4": "Kan jeg bruge mine eksisterende AI-abonnementer med OpenCode?",
"home.faq.a4.p1":
"Ja. OpenCode understøtter abonnementer fra alle store udbydere. Du kan bruge Claude Pro/Max, ChatGPT Plus/Pro eller GitHub Copilot.",
"home.faq.q5": "Kan jeg kun bruge OpenCode i terminalen?",
"home.faq.a5.beforeDesktop": "Ikke længere! OpenCode er nu tilgængelig som en app til",
"home.faq.a5.desktop": "desktop",
"home.faq.a5.and": "og",
"home.faq.a5.web": "web",
"home.faq.q6": "Hvad koster OpenCode?",
"home.faq.a6":
"OpenCode er 100% gratis at bruge. Det kommer også med et sæt gratis modeller. Der kan være ekstra omkostninger, hvis du forbinder en anden udbyder.",
"home.faq.q7": "Hvad med data og privatliv?",
"home.faq.a7.p1": "Dine data gemmes kun, når du bruger vores gratis modeller eller opretter delbare links.",
"home.faq.a7.p2.beforeModels": "Læs mere om",
"home.faq.a7.p2.modelsLink": "vores modeller",
"home.faq.a7.p2.and": "og",
"home.faq.a7.p2.shareLink": "delingssider",
"home.faq.q8": "Er OpenCode open source?",
"home.faq.a8.p1": "Ja, OpenCode er fuldt open source. Kildekoden er offentlig på",
"home.faq.a8.p2": "under",
"home.faq.a8.mitLicense": "MIT-licensen",
"home.faq.a8.p3":
", hvilket betyder at alle kan bruge, ændre eller bidrage til udviklingen. Alle i communityet kan oprette issues, indsende pull requests og udvide funktionalitet.",
"home.zenCta.title": "Få adgang til pålidelige, optimerede modeller til kodningsagenter",
"home.zenCta.body":
"Zen giver dig adgang til et håndplukket sæt AI-modeller, som OpenCode har testet og benchmarked specifikt til kodningsagenter. Du behøver ikke bekymre dig om svingende performance og kvalitet på tværs af udbydere: brug validerede modeller, der virker.",
"home.zenCta.link": "Læs om Zen",
"zen.title": "OpenCode Zen | Et kurateret sæt af pålidelige, optimerede modeller til kodningsagenter",
"zen.hero.title": "Pålidelige optimerede modeller til kodningsagenter",
"zen.hero.body":
"Zen giver dig adgang til et kurateret sæt AI-modeller, som OpenCode har testet og benchmarked specifikt til kodningsagenter. Du behøver ikke bekymre dig om svingende performance og kvalitet: brug validerede modeller, der virker.",
"zen.faq.q1": "Hvad er OpenCode Zen?",
"zen.faq.a1":
"Zen er et kurateret sæt AI-modeller testet og benchmarked til kodningsagenter, skabt af teamet bag OpenCode.",
"zen.faq.q2": "Hvad gør Zen mere præcis?",
"zen.faq.a2":
"Zen tilbyder kun modeller, der er testet og benchmarked specifikt til kodningsagenter. Du ville ikke bruge en smørkniv til at skære steak; brug ikke dårlige modeller til kodning.",
"zen.faq.q3": "Er Zen billigere?",
"zen.faq.a3":
"Zen er ikke for profit. Zen videregiver omkostningerne fra modeludbyderne til dig. Jo mere Zen bruges, desto mere kan OpenCode forhandle bedre priser og give dem videre til dig.",
"zen.faq.q4": "Hvad koster Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "opkræver per request",
"zen.faq.a4.p1.afterPricing": "uden markups, så du betaler præcis det, som modeludbyderen opkræver.",
"zen.faq.a4.p2.beforeAccount": "Din samlede pris afhænger af brug, og du kan sætte månedlige udgiftsgrænser i din",
"zen.faq.a4.p2.accountLink": "konto",
"zen.faq.a4.p3":
"For at dække omkostninger tilføjer OpenCode kun et lille betalingsgebyr på $1.23 per $20 saldo-opfyldning.",
"zen.faq.q5": "Hvad med data og privatliv?",
"zen.faq.a5.beforeExceptions":
"Alle Zen-modeller hostes i USA. Udbydere følger en zero-retention-policy og bruger ikke dine data til modeltræning, med de",
"zen.faq.a5.exceptionsLink": "følgende undtagelser",
"zen.faq.q6": "Kan jeg sætte udgiftsgrænser?",
"zen.faq.a6": "Ja, du kan sætte månedlige udgiftsgrænser i din konto.",
"zen.faq.q7": "Kan jeg afmelde?",
"zen.faq.a7": "Ja, du kan deaktivere betaling når som helst og bruge din resterende saldo.",
"zen.faq.q8": "Kan jeg bruge Zen med andre kodningsagenter?",
"zen.faq.a8":
"Selvom Zen fungerer godt med OpenCode, kan du bruge Zen med enhver agent. Følg opsætningsinstruktionerne i din foretrukne kodningsagent.",
"zen.cta.start": "Kom godt i gang med Zen",
"zen.pricing.title": "Tilføj $20 Pay as you go-saldo",
"zen.pricing.fee": "(+$1.23 kortbehandlingsgebyr)",
"zen.pricing.body": "Brug med enhver agent. Indstil månedlige forbrugsgrænser. Annuller til enhver tid.",
"zen.problem.title": "Hvilket problem løser Zen?",
"zen.problem.body":
"Der er så mange modeller tilgængelige, men kun få fungerer godt med kodningsagenter. De fleste udbydere konfigurerer dem anderledes med forskellige resultater.",
"zen.problem.subtitle": "Vi løser dette for alle, ikke kun OpenCode-brugere.",
"zen.problem.item1": "Test af udvalgte modeller og høring af deres teams",
"zen.problem.item2": "Samarbejde med udbydere for at sikre, at de bliver leveret korrekt",
"zen.problem.item3": "Benchmarking af alle model-udbyder kombinationer, vi anbefaler",
"zen.how.title": "Hvordan Zen virker",
"zen.how.body": "Selvom vi foreslår, at du bruger Zen med OpenCode, kan du bruge Zen med enhver agent.",
"zen.how.step1.title": "Tilmeld dig og tilføj saldo på $20",
"zen.how.step1.beforeLink": "følg",
"zen.how.step1.link": "opsætningsinstruktioner",
"zen.how.step2.title": "Brug Zen med gennemsigtige priser",
"zen.how.step2.link": "betal per request",
"zen.how.step2.afterLink": "med nul markups",
"zen.how.step3.title": "Auto-top op",
"zen.how.step3.body": "når din saldo når $5, tilføjer vi automatisk $20",
"zen.privacy.title": "Dit privatliv er vigtigt for os",
"zen.privacy.beforeExceptions":
"Alle Zen-modeller er hostet i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning med",
"zen.privacy.exceptionsLink": "følgende undtagelser",
"go.title": "OpenCode Go | Kodningsmodeller til lav pris for alle",
"go.meta.description":
"Go starter ved $5 for den første måned, derefter $10/måned, med generøse 5-timers anmodningsgrænser for GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash.",
"go.hero.title": "Kodningsmodeller til lav pris for alle",
"go.hero.body":
"Go bringer agentisk kodning til programmører over hele verden. Med generøse grænser og pålidelig adgang til de mest kapable open source-modeller, så du kan bygge med kraftfulde agenter uden at bekymre dig om omkostninger eller tilgængelighed.",
"go.cta.start": "Abonner på Go",
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Abonner på Go",
"go.cta.price": "$10/måned",
"go.cta.promo": "$5 første måned",
"go.pricing.body":
"Brug med enhver agent. $5 første måned, derefter $10/måned. Tank op med kredit efter behov. Afmeld når som helst.",
"go.graph.free": "Gratis",
"go.graph.freePill": "Big Pickle og gratis modeller",
"go.graph.go": "Go",
"go.graph.label": "Forespørgsler pr. 5 timer",
"go.graph.usageLimits": "Brugsgrænser",
"go.graph.tick": "{{n}}x",
"go.graph.aria": "Forespørgsler pr. 5t: {{free}} vs {{go}}",
"go.testimonials.brand.zen": "Zen",
"go.testimonials.brand.go": "Go",
"go.testimonials.handle": "@OpenCode",
"go.testimonials.dax.name": "Dax Raad",
"go.testimonials.dax.title": "ex-CEO, Terminal Products",
"go.testimonials.dax.quoteAfter": "har været livsændrende, det er virkelig en no-brainer.",
"go.testimonials.jay.name": "Jay V",
"go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, og ViewPoint",
"go.testimonials.jay.quoteBefore": "4 ud af 5 personer på vores team elsker at bruge",
"go.testimonials.jay.quoteAfter": ".",
"go.testimonials.adam.name": "Adam Elmore",
"go.testimonials.adam.title": "ex-Hero, AWS",
"go.testimonials.adam.quoteBefore": "Jeg kan ikke anbefale",
"go.testimonials.adam.quoteAfter": "nok. Seriøst, det er virkelig godt.",
"go.testimonials.david.name": "David Hill",
"go.testimonials.david.title": "ex-Head of Design, Laravel",
"go.testimonials.david.quoteBefore": "Med",
"go.testimonials.david.quoteAfter": "ved jeg, at alle modellerne er testede og perfekte til kodningsagenter.",
"go.testimonials.frank.name": "Frank Wang",
"go.testimonials.frank.title": "ex-Intern, Nvidia (4 gange)",
"go.testimonials.frank.quote": "Jeg ville ønske, jeg stadig var hos Nvidia.",
"go.problem.title": "Hvilket problem løser Go?",
"go.problem.body":
"Vi fokuserer på at bringe OpenCode-oplevelsen ud til så mange som muligt. OpenCode Go er et lavprisabonnement: $5 for den første måned, derefter $10/måned. Det giver generøse grænser og pålidelig adgang til de mest kapable open source-modeller.",
"go.problem.subtitle": " ",
"go.problem.item1": "Lavpris abonnementspriser",
"go.problem.item2": "Generøse grænser og pålidelig adgang",
"go.problem.item3": "Bygget til så mange programmører som muligt",
"go.problem.item4":
"Inkluderer GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash",
"go.how.title": "Hvordan Go virker",
"go.how.body":
"Go starter ved $5 for den første måned, derefter $10/måned. Du kan bruge det med OpenCode eller enhver agent.",
"go.how.step1.title": "Opret en konto",
"go.how.step1.beforeLink": "følg",
"go.how.step1.link": "opsætningsinstruktionerne",
"go.how.step2.title": "Abonner på Go",
"go.how.step2.link": "$5 første måned",
"go.how.step2.afterLink": "derefter $10/måned med generøse grænser",
"go.how.step3.title": "Start kodning",
"go.how.step3.body": "med pålidelig adgang til open source-modeller",
"go.privacy.title": "Dit privatliv er vigtigt for os",
"go.privacy.body":
"Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang.",
"go.privacy.contactAfter": "hvis du har spørgsmål.",
"go.privacy.beforeExceptions":
"Go-modeller hostes i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning, med de",
"go.privacy.exceptionsLink": "følgende undtagelser",
"go.faq.q1": "Hvad er OpenCode Go?",
"go.faq.a1":
"Go er et lavprisabonnement, der giver dig pålidelig adgang til kapable open source-modeller til agentisk kodning.",
"go.faq.q2": "Hvilke modeller inkluderer Go?",
"go.faq.a2": "Go inkluderer modellerne nedenfor med generøse grænser og pålidelig adgang.",
"go.faq.q3": "Er Go det samme som Zen?",
"go.faq.a3":
"Nej. Zen er pay-as-you-go, mens Go starter ved $5 for den første måned, derefter $10/måned, med generøse grænser og pålidelig adgang til open source-modellerne GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash.",
"go.faq.q4": "Hvad koster Go?",
"go.faq.a4.p1.beforePricing": "Go koster",
"go.faq.a4.p1.pricingLink": "$5 første måned",
"go.faq.a4.p1.afterPricing": "derefter $10/måned med generøse grænser.",
"go.faq.a4.p2.beforeAccount": "Du kan administrere dit abonnement i din",
"go.faq.a4.p2.accountLink": "konto",
"go.faq.a4.p3": "Annuller til enhver tid.",
"go.faq.q5": "Hvad med data og privatliv?",
"go.faq.a5.body":
"Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang. Vores udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning.",
"go.faq.a5.beforeExceptions":
"Go-modeller hostes i USA. Udbydere følger en nulopbevaringspolitik og bruger ikke dine data til modeltræning, med de",
"go.faq.a5.exceptionsLink": "følgende undtagelser",
"go.faq.q6": "Kan jeg tanke kredit op?",
"go.faq.a6": "Hvis du har brug for mere forbrug, kan du tanke kredit op på din konto.",
"go.faq.q7": "Kan jeg annullere?",
"go.faq.a7": "Ja, du kan annullere til enhver tid.",
"go.faq.q8": "Kan jeg bruge Go med andre kodningsagenter?",
"go.faq.a8": "Ja, du kan bruge Go med enhver agent. Følg opsætningsinstruktionerne i din foretrukne kodningsagent.",
"go.faq.q9": "Hvad er forskellen på gratis modeller og Go?",
"go.faq.a9":
"Gratis modeller inkluderer Big Pickle plus salgsfremmende modeller tilgængelige på det tidspunkt, med en kvote på 200 forespørgsler/dag. Go inkluderer GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro og DeepSeek V4 Flash med højere anmodningskvoter håndhævet over rullende vinduer (5-timers, ugentlig og månedlig), nogenlunde svarende til $12 pr. 5 timer, $30 pr. uge og $60 pr. måned (faktiske anmodningstal varierer efter model og brug).",
"zen.api.error.rateLimitExceeded": "Hastighedsgrænse overskredet. Prøv venligst igen senere.",
"zen.api.error.modelNotSupported": "Model {{model}} understøttes ikke",
"zen.api.error.modelFormatNotSupported": "Model {{model}} understøttes ikke for format {{format}}",
"zen.api.error.noProviderAvailable": "Ingen udbyder tilgængelig",
"zen.api.error.providerNotSupported": "Udbyder {{provider}} understøttes ikke",
"zen.api.error.missingApiKey": "Manglende API-nøgle.",
"zen.api.error.invalidApiKey": "Ugyldig API-nøgle.",
"zen.api.error.subscriptionQuotaExceeded": "Abonnementskvote overskredet. Prøv igen om {{retryIn}}.",
"zen.api.error.goSubscriptionRollingLimitExceeded":
"Forbrugsgrænsen for 5 timer er nået. Nulstilles om {{retryIn}}. For at fortsætte med at bruge denne model nu, aktivér forbrug fra din tilgængelige saldo: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionWeeklyLimitExceeded":
"Ugentlig forbrugsgrænse er nået. Nulstilles om {{retryIn}}. For at fortsætte med at bruge denne model nu, aktivér forbrug fra din tilgængelige saldo: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionMonthlyLimitExceeded":
"Månedlig forbrugsgrænse er nået. Nulstilles om {{retryIn}}. For at fortsætte med at bruge denne model nu, aktivér forbrug fra din tilgængelige saldo: {{consoleGoUrl}}",
"zen.api.error.noPaymentMethod": "Ingen betalingsmetode. Tilføj en betalingsmetode her: {{billingUrl}}",
"zen.api.error.insufficientBalance": "Utilstrækkelig saldo. Administrer din fakturering her: {{billingUrl}}",
"zen.api.error.workspaceMonthlyLimitReached":
"Dit workspace har nået sin månedlige forbrugsgrænse på ${{amount}}. Administrer dine grænser her: {{billingUrl}}",
"zen.api.error.userMonthlyLimitReached":
"Du har nået din månedlige forbrugsgrænse på ${{amount}}. Administrer dine grænser her: {{membersUrl}}",
"zen.api.error.modelDisabled": "Modellen er deaktiveret",
"zen.api.error.trialEnded":
"Den gratis kampagne for {{model}} er afsluttet. Du kan fortsætte med at bruge modellen ved at abonnere på OpenCode Go - {{link}}",
"black.meta.title": "OpenCode Black | Få adgang til verdens bedste kodningsmodeller",
"black.meta.description": "Få adgang til Claude, GPT, Gemini og mere med OpenCode Black-abonnementer.",
"black.hero.title": "Få adgang til verdens bedste kodningsmodeller",
"black.hero.subtitle": "Inklusive Claude, GPT, Gemini og mere",
"black.title": "OpenCode Black | Priser",
"black.paused": "Black-plantilmelding er midlertidigt sat på pause.",
"black.plan.icon20": "Black 20-plan",
"black.plan.icon100": "Black 100-plan",
"black.plan.icon200": "Black 200-plan",
"black.plan.multiplier100": "5x mere brug end Black 20",
"black.plan.multiplier200": "20x mere brug end Black 20",
"black.price.perMonth": "pr. måned",
"black.price.perPersonBilledMonthly": "pr. person faktureret månedligt",
"black.terms.1": "Dit abonnement starter ikke med det samme",
"black.terms.2": "Du bliver sat på ventelisten og aktiveret snart",
"black.terms.3": "Dit kort debiteres først, når dit abonnement er aktiveret",
"black.terms.4": "Forbrugsgrænser gælder, tung automatiseret brug kan nå grænserne hurtigere",
"black.terms.5": "Abonnementer er for enkeltpersoner, kontakt Enterprise for teams",
"black.terms.6": "Grænser kan justeres, og planer kan blive udfaset i fremtiden",
"black.terms.7": "Opsig dit abonnement når som helst",
"black.action.continue": "Fortsæt",
"black.finePrint.beforeTerms": "Viste priser inkluderer ikke gældende skat",
"black.finePrint.terms": "Servicevilkår",
"black.workspace.title": "OpenCode Black | Vælg workspace",
"black.workspace.selectPlan": "Vælg et workspace til denne plan",
"black.workspace.name": "Workspace {{n}}",
"black.subscribe.title": "Abonner på OpenCode Black",
"black.subscribe.paymentMethod": "Betalingsmetode",
"black.subscribe.loadingPaymentForm": "Indlæser betalingsformular...",
"black.subscribe.selectWorkspaceToContinue": "Vælg et workspace for at fortsætte",
"black.subscribe.failurePrefix": "Åh nej!",
"black.subscribe.error.generic": "Der opstod en fejl",
"black.subscribe.error.invalidPlan": "Ugyldig plan",
"black.subscribe.error.workspaceRequired": "Workspace-ID er påkrævet",
"black.subscribe.error.alreadySubscribed": "Dette workspace har allerede et abonnement",
"black.subscribe.processing": "Behandler...",
"black.subscribe.submit": "Abonner ${{plan}}",
"black.subscribe.form.chargeNotice": "Du bliver først debiteret, når dit abonnement er aktiveret",
"black.subscribe.success.title": "Du er på OpenCode Black-ventelisten",
"black.subscribe.success.subscriptionPlan": "Abonnementsplan",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Beløb",
"black.subscribe.success.amountValue": "${{plan}} pr. måned",
"black.subscribe.success.paymentMethod": "Betalingsmetode",
"black.subscribe.success.dateJoined": "Dato tilmeldt",
"black.subscribe.success.chargeNotice": "Dit kort vil blive debiteret, når dit abonnement er aktiveret",
"workspace.nav.zen": "Zen",
"workspace.nav.go": "Go",
"workspace.nav.usage": "Brug",
"workspace.nav.apiKeys": "API-nøgler",
"workspace.nav.members": "Medlemmer",
"workspace.nav.billing": "Fakturering",
"workspace.nav.settings": "Indstillinger",
"workspace.home.banner.beforeLink": "Pålidelige optimerede modeller til kodningsagenter.",
"workspace.lite.banner.beforeLink": "Lavpris kodemodeller for alle.",
"workspace.home.billing.loading": "Indlæser...",
"workspace.home.billing.enable": "Aktiver fakturering",
"workspace.home.billing.currentBalance": "Nuværende saldo",
"workspace.newUser.feature.tested.title": "Testede og verificerede modeller",
"workspace.newUser.feature.tested.body":
"Vi har benchmarket og testet modeller specifikt til kodningsagenter for at sikre den bedste ydeevne.",
"workspace.newUser.feature.quality.title": "Højeste kvalitet",
"workspace.newUser.feature.quality.body":
"Få adgang til modeller konfigureret til optimal ydeevne - ingen nedgraderinger eller routing til billigere udbydere.",
"workspace.newUser.feature.lockin.title": "Ingen indlåsning",
"workspace.newUser.feature.lockin.body":
"Brug Zen med en hvilken som helst kodningsagent, og fortsæt med at bruge andre udbydere med opencode, når du vil.",
"workspace.newUser.copyApiKey": "Kopiér API-nøgle",
"workspace.newUser.copyKey": "Kopier nøgle",
"workspace.newUser.copied": "Kopieret!",
"workspace.newUser.step.enableBilling": "Aktiver fakturering",
"workspace.newUser.step.login.before": "Kør",
"workspace.newUser.step.login.after": "og vælg opencode",
"workspace.newUser.step.pasteKey": "Indsæt din API-nøgle",
"workspace.newUser.step.models.before": "Start opencode og kør",
"workspace.newUser.step.models.after": "for at vælge en model",
"workspace.models.title": "Modeller",
"workspace.models.subtitle.beforeLink": "Administrer, hvilke modeller workspace-medlemmer kan få adgang til.",
"workspace.models.table.model": "Model",
"workspace.models.table.enabled": "Aktiveret",
"workspace.providers.title": "Medbring din egen nøgle",
"workspace.providers.subtitle": "Konfigurer dine egne API-nøgler fra AI-udbydere.",
"workspace.providers.placeholder": "Indtast {{provider}} API-nøgle ({{prefix}}...)",
"workspace.providers.configure": "Konfigurer",
"workspace.providers.edit": "Rediger",
"workspace.providers.delete": "Slet",
"workspace.providers.saving": "Gemmer...",
"workspace.providers.save": "Gem",
"workspace.providers.table.provider": "Udbyder",
"workspace.providers.table.apiKey": "API-nøgle",
"workspace.usage.title": "Brugshistorik",
"workspace.usage.subtitle": "Seneste API-brug og omkostninger.",
"workspace.usage.empty": "Foretag dit første API-opkald for at komme i gang.",
"workspace.usage.table.date": "Dato",
"workspace.usage.table.model": "Model",
"workspace.usage.table.input": "Input",
"workspace.usage.table.output": "Output",
"workspace.usage.table.cost": "Omkostning",
"workspace.usage.table.session": "Session",
"workspace.usage.breakdown.input": "Input",
"workspace.usage.breakdown.cacheRead": "Cache læst",
"workspace.usage.breakdown.cacheWrite": "Cache skriv",
"workspace.usage.breakdown.output": "Output",
"workspace.usage.breakdown.reasoning": "Ræsonnement",
"workspace.usage.subscription": "Black (${{amount}})",
"workspace.usage.lite": "Go (${{amount}})",
"workspace.usage.byok": "BYOK (${{amount}})",
"workspace.cost.title": "Omkostninger",
"workspace.cost.subtitle": "Brugsomkostninger opdelt efter model.",
"workspace.cost.allModels": "Alle modeller",
"workspace.cost.allKeys": "Alle nøgler",
"workspace.cost.deletedSuffix": "(slettet)",
"workspace.cost.empty": "Ingen brugsdata tilgængelige for den valgte periode.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "API-nøgler",
"workspace.keys.subtitle": "Administrer dine API-nøgler for at få adgang til opencode-tjenester.",
"workspace.keys.create": "Opret API-nøgle",
"workspace.keys.placeholder": "Indtast nøglenavn",
"workspace.keys.empty": "Opret en opencode Gateway API-nøgle",
"workspace.keys.table.name": "Navn",
"workspace.keys.table.key": "Nøgle",
"workspace.keys.table.createdBy": "Oprettet af",
"workspace.keys.table.lastUsed": "Sidst brugt",
"workspace.keys.copyApiKey": "Kopiér API-nøgle",
"workspace.keys.delete": "Slet",
"workspace.members.title": "Medlemmer",
"workspace.members.subtitle": "Administrer workspace-medlemmer og deres tilladelser.",
"workspace.members.invite": "Inviter medlem",
"workspace.members.inviting": "Inviterer...",
"workspace.members.beta.beforeLink": "Workspaces er gratis for teams under betaversionen.",
"workspace.members.form.invitee": "Inviteret",
"workspace.members.form.emailPlaceholder": "Indtast e-mail",
"workspace.members.form.role": "Rolle",
"workspace.members.form.monthlyLimit": "Månedlig forbrugsgrænse",
"workspace.members.noLimit": "Ingen grænse",
"workspace.members.noLimitLowercase": "ingen grænse",
"workspace.members.invited": "inviteret",
"workspace.members.edit": "Rediger",
"workspace.members.delete": "Slet",
"workspace.members.saving": "Gemmer...",
"workspace.members.save": "Gem",
"workspace.members.table.email": "E-mail",
"workspace.members.table.role": "Rolle",
"workspace.members.table.monthLimit": "Månedsgrænse",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Kan administrere modeller, medlemmer og fakturering",
"workspace.members.role.member": "Medlem",
"workspace.members.role.memberDescription": "Kan kun generere API-nøgler til sig selv",
"workspace.settings.title": "Indstillinger",
"workspace.settings.subtitle": "Opdater dit workspace-navn og præferencer.",
"workspace.settings.workspaceName": "Workspace-navn",
"workspace.settings.defaultName": "Standard",
"workspace.settings.updating": "Opdaterer...",
"workspace.settings.save": "Gem",
"workspace.settings.edit": "Rediger",
"workspace.billing.title": "Fakturering",
"workspace.billing.subtitle.beforeLink": "Administrer betalingsmetoder.",
"workspace.billing.contactUs": "Kontakt os",
"workspace.billing.subtitle.afterLink": "hvis du har spørgsmål.",
"workspace.billing.currentBalance": "Nuværende saldo",
"workspace.billing.add": "Tilføj $",
"workspace.billing.enterAmount": "Indtast beløb",
"workspace.billing.loading": "Indlæser...",
"workspace.billing.addAction": "Tilføj",
"workspace.billing.addBalance": "Tilføj saldo",
"workspace.billing.alipay": "Alipay",
"workspace.billing.wechat": "WeChat Pay",
"workspace.billing.linkedToStripe": "Forbundet til Stripe",
"workspace.billing.manage": "Administrer",
"workspace.billing.enable": "Aktiver fakturering",
"workspace.monthlyLimit.title": "Månedlig grænse",
"workspace.monthlyLimit.subtitle": "Indstil en månedlig forbrugsgrænse for din konto.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Indstiller...",
"workspace.monthlyLimit.set": "Sæt",
"workspace.monthlyLimit.edit": "Rediger grænse",
"workspace.monthlyLimit.noLimit": "Ingen forbrugsgrænse angivet.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Nuværende brug for",
"workspace.monthlyLimit.currentUsage.beforeAmount": "er $",
"workspace.redeem.title": "Indløs kupon",
"workspace.redeem.subtitle": "Indløs en kuponkode for at få kreditter eller fordele.",
"workspace.redeem.placeholder": "Indtast kuponkode",
"workspace.redeem.redeem": "Indløs",
"workspace.redeem.redeeming": "Indløser...",
"workspace.redeem.success": "Kuponen blev indløst.",
"workspace.reload.title": "Automatisk genopfyldning",
"workspace.reload.disabled.before": "Automatisk genopfyldning er",
"workspace.reload.disabled.state": "deaktiveret",
"workspace.reload.disabled.after": "Aktiver for automatisk at genopfylde, når saldoen er lav.",
"workspace.reload.enabled.before": "Automatisk genopfyldning er",
"workspace.reload.enabled.state": "aktiveret",
"workspace.reload.enabled.middle": "Vi genopfylder",
"workspace.reload.processingFee": "ekspeditionsgebyr",
"workspace.reload.enabled.after": "når saldoen når",
"workspace.reload.edit": "Rediger",
"workspace.reload.enable": "Aktiver",
"workspace.reload.enableAutoReload": "Aktiver automatisk genopfyldning",
"workspace.reload.reloadAmount": "Genopfyld $",
"workspace.reload.whenBalanceReaches": "Når saldoen når $",
"workspace.reload.saving": "Gemmer...",
"workspace.reload.save": "Gem",
"workspace.reload.failedAt": "Genopfyldning mislykkedes kl",
"workspace.reload.reason": "Årsag:",
"workspace.reload.updatePaymentMethod": "Opdater din betalingsmetode, og prøv igen.",
"workspace.reload.retrying": "Prøver igen...",
"workspace.reload.retry": "Prøv igen",
"workspace.reload.error.paymentFailed": "Betaling mislykkedes.",
"workspace.payments.title": "Betalingshistorik",
"workspace.payments.subtitle": "Seneste betalingstransaktioner.",
"workspace.payments.table.date": "Dato",
"workspace.payments.table.paymentId": "Betalings-ID",
"workspace.payments.table.amount": "Beløb",
"workspace.payments.table.receipt": "Kvittering",
"workspace.payments.type.credit": "kredit",
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Vis",
"workspace.black.loading": "Indlæser...",
"workspace.black.time.day": "dag",
"workspace.black.time.days": "dage",
"workspace.black.time.hour": "time",
"workspace.black.time.hours": "timer",
"workspace.black.time.minute": "minut",
"workspace.black.time.minutes": "minutter",
"workspace.black.time.fewSeconds": "et par sekunder",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du abonnerer på OpenCode Black for ${{plan}} om måneden.",
"workspace.black.subscription.manage": "Administrer abonnement",
"workspace.black.subscription.rollingUsage": "5-timers brug",
"workspace.black.subscription.weeklyUsage": "Ugentlig brug",
"workspace.black.subscription.resetsIn": "Nulstiller i",
"workspace.black.subscription.useBalance": "Brug din tilgængelige saldo, når du har nået forbrugsgrænserne",
"workspace.black.waitlist.title": "Venteliste",
"workspace.black.waitlist.joined": "Du er på ventelisten for ${{plan}} per måned OpenCode Black plan.",
"workspace.black.waitlist.ready": "Vi er klar til at tilmelde dig ${{plan}} per måned OpenCode Black plan.",
"workspace.black.waitlist.leave": "Forlad venteliste",
"workspace.black.waitlist.leaving": "Forlader...",
"workspace.black.waitlist.left": "Forladt",
"workspace.black.waitlist.enroll": "Tilmeld",
"workspace.black.waitlist.enrolling": "Tilmelder...",
"workspace.black.waitlist.enrolled": "Tilmeldt",
"workspace.black.waitlist.enrollNote":
"Når du klikker på Tilmeld, starter dit abonnement med det samme, og dit kort vil blive debiteret.",
"workspace.lite.loading": "Indlæser...",
"workspace.lite.time.day": "dag",
"workspace.lite.time.days": "dage",
"workspace.lite.time.hour": "time",
"workspace.lite.time.hours": "timer",
"workspace.lite.time.minute": "minut",
"workspace.lite.time.minutes": "minutter",
"workspace.lite.time.fewSeconds": "et par sekunder",
"workspace.lite.subscription.message": "Du abonnerer på OpenCode Go.",
"workspace.lite.subscription.manage": "Administrer abonnement",
"workspace.lite.subscription.rollingUsage": "Løbende forbrug",
"workspace.lite.subscription.weeklyUsage": "Ugentligt forbrug",
"workspace.lite.subscription.monthlyUsage": "Månedligt forbrug",
"workspace.lite.subscription.resetsIn": "Nulstiller i",
"workspace.lite.subscription.useBalance": "Brug din tilgængelige saldo, når du har nået forbrugsgrænserne",
"workspace.lite.subscription.selectProvider":
'Vælg "OpenCode Go" som udbyder i din opencode-konfiguration for at bruge Go-modeller.',
"workspace.lite.black.message":
"Du abonnerer i øjeblikket på OpenCode Black eller er på venteliste. Afmeld venligst først, hvis du vil skifte til Go.",
"workspace.lite.other.message":
"Et andet medlem i dette workspace abonnerer allerede på OpenCode Go. Kun ét medlem pr. workspace kan abonnere.",
"workspace.lite.promo.description":
"OpenCode Go starter ved {{price}}, derefter $10/måned, og giver pålidelig adgang til populære åbne kodningsmodeller med generøse brugsgrænser.",
"workspace.lite.promo.price": "$5 for den første måned",
"workspace.lite.promo.modelsTitle": "Hvad er inkluderet",
"workspace.lite.promo.footer":
"Planen er primært designet til internationale brugere, med modeller hostet i USA, EU og Singapore for stabil global adgang. Priser og forbrugsgrænser kan ændre sig, efterhånden som vi lærer af tidlig brug og feedback.",
"workspace.lite.promo.subscribe": "Abonner på Go",
"workspace.lite.promo.subscribing": "Omdirigerer...",
"workspace.lite.promo.otherMethods": "Andre betalingsmetoder",
"workspace.lite.promo.selectMethod": "Vælg betalingsmetode",
"workspace.referral.copyLink": "Kopiér link",
"workspace.referral.copied": "Kopieret",
"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": "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 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",
"download.meta.description": "Download OpenCode til macOS, Windows og Linux",
"download.hero.title": "Download OpenCode",
"download.hero.subtitle": "Tilgængelig i beta til macOS, Windows og Linux",
"download.hero.button": "Download til {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "OpenCode Extensions",
"download.section.integrations": "OpenCode Integrations",
"download.action.download": "Download",
"download.action.install": "Installer",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Ikke nødvendigvis, men sandsynligvis. Du skal bruge et AI-abonnement hvis du vil forbinde OpenCode til en betalt udbyder, men du kan arbejde med",
"download.faq.a3.localLink": "lokale modeller",
"download.faq.a3.afterLocal.beforeZen": "gratis. Selvom vi opfordrer brugere til at bruge",
"download.faq.a3.afterZen": ", fungerer OpenCode med alle populære udbydere som OpenAI, Anthropic, xAI osv.",
"download.faq.a5.p1": "OpenCode er 100% gratis at bruge.",
"download.faq.a5.p2.beforeZen":
"Eventuelle ekstra omkostninger kommer fra dit abonnement hos en modeludbyder. Selvom OpenCode fungerer med enhver modeludbyder, anbefaler vi at bruge",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1": "Dine data og oplysninger gemmes kun når du opretter delbare links i OpenCode.",
"download.faq.a6.p2.beforeShare": "Læs mere om",
"download.faq.a6.shareLink": "delingssider",
"enterprise.title": "OpenCode | Enterprise-løsninger til din organisation",
"enterprise.meta.description": "Kontakt OpenCode for enterprise-løsninger",
"enterprise.hero.title": "Din kode er din egen",
"enterprise.hero.body1":
"OpenCode fungerer sikkert inde i din organisation uden at lagre data eller kontekst og uden licensbegrænsninger eller ejerskabskrav. Start en prøveperiode med dit team, og udrul det derefter i hele din organisation ved at integrere det med dit SSO og din interne AI-gateway.",
"enterprise.hero.body2": "Fortæl os, hvordan vi kan hjælpe.",
"enterprise.form.name.label": "Fulde navn",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Rolle",
"enterprise.form.role.placeholder": "Bestyrelsesformand",
"enterprise.form.company.label": "Virksomhed",
"enterprise.form.company.placeholder": "Acme Inc",
"enterprise.form.email.label": "Firma-e-mail",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Telefonnummer",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.message.label": "Hvilket problem prøver du at løse?",
"enterprise.form.message.placeholder": "Vi har brug for hjælp med...",
"enterprise.form.send": "Send",
"enterprise.form.sending": "Sender...",
"enterprise.form.success": "Besked sendt, vi vender tilbage snart.",
"enterprise.form.success.submitted": "Formular indsendt med succes.",
"enterprise.form.error.allFieldsRequired": "Alle felter er påkrævet.",
"enterprise.form.error.invalidEmailFormat": "Ugyldigt e-mailformat.",
"enterprise.form.error.internalServer": "Intern serverfejl.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Hvad er OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise er til organisationer, der vil sikre, at deres kode og data aldrig forlader deres infrastruktur. Det kan gøres med en central konfiguration, der integrerer med dit SSO og din interne AI-gateway.",
"enterprise.faq.q2": "Hvordan kommer jeg i gang med OpenCode Enterprise?",
"enterprise.faq.a2":
"Start blot med en intern prøveperiode med dit team. OpenCode gemmer som standard ikke din kode eller kontekstdata, hvilket gør det nemt at komme i gang. Kontakt os derefter for at tale om priser og implementeringsmuligheder.",
"enterprise.faq.q3": "Hvordan fungerer enterprise-priser?",
"enterprise.faq.a3":
"Vi tilbyder enterprise-priser pr. bruger. Hvis du har din egen LLM-gateway, opkræver vi ikke for brugte tokens. Kontakt os for flere detaljer og et tilbud tilpasset din organisations behov.",
"enterprise.faq.q4": "Er mine data sikre med OpenCode Enterprise?",
"enterprise.faq.a4":
"Ja. OpenCode gemmer ikke din kode eller kontekstdata. Al behandling sker lokalt eller via direkte API-kald til din AI-udbyder. Med central konfiguration og SSO-integration forbliver dine data sikre inden for din organisations infrastruktur.",
"brand.title": "OpenCode | Brand",
"brand.meta.description": "OpenCode brandretningslinjer",
"brand.heading": "Brandretningslinjer",
"brand.subtitle": "Ressourcer og assets, der hjælper dig med at arbejde med OpenCode-brandet.",
"brand.downloadAll": "Download alle assets",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "OpenCode versionsnoter og changelog",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Nye opdateringer og forbedringer til OpenCode",
"changelog.empty": "Ingen changelog-indlæg fundet.",
"changelog.viewJson": "Se JSON",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agent",
"bench.list.table.model": "Model",
"bench.list.table.score": "Score",
"bench.submission.error.allFieldsRequired": "Alle felter er påkrævet.",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Opgave ikke fundet",
"bench.detail.na": "Ikke tilgængelig",
"bench.detail.labels.agent": "Agent",
"bench.detail.labels.model": "Model",
"bench.detail.labels.task": "Opgave",
"bench.detail.labels.repo": "Repo",
"bench.detail.labels.from": "Fra",
"bench.detail.labels.to": "Til",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Gennemsnitlig varighed",
"bench.detail.labels.averageScore": "Gennemsnitlig score",
"bench.detail.labels.averageCost": "Gennemsnitlig omkostning",
"bench.detail.labels.summary": "Resumé",
"bench.detail.labels.runs": "Kørsler",
"bench.detail.labels.score": "Score",
"bench.detail.labels.base": "Basis",
"bench.detail.labels.penalty": "Straf",
"bench.detail.labels.weight": "vægt",
"bench.detail.table.run": "Kørsel",
"bench.detail.table.score": "Score (Basis - Straf)",
"bench.detail.table.cost": "Omkostning",
"bench.detail.table.duration": "Varighed",
"bench.detail.run.title": "Kørsel {{n}}",
"bench.detail.rawJson": "Rå JSON",
} satisfies Dict

View File

@@ -0,0 +1,827 @@
import type { Dict } from "./en"
import { dict as en } from "./en"
export const dict = {
...en,
"nav.github": "GitHub",
"nav.docs": "Dokumentation",
"nav.changelog": "Changelog",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "Enterprise",
"nav.zen": "Zen",
"nav.login": "Anmelden",
"nav.free": "Download",
"nav.home": "Startseite",
"nav.openMenu": "Menü öffnen",
"nav.getStartedFree": "Kostenlos starten",
"nav.logoAlt": "OpenCode",
"nav.context.copyLogo": "Logo als SVG kopieren",
"nav.context.copyWordmark": "Wortmarke als SVG kopieren",
"nav.context.brandAssets": "Marken-Assets",
"footer.github": "GitHub",
"footer.docs": "Dokumentation",
"footer.changelog": "Changelog",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "Marke",
"legal.privacy": "Datenschutz",
"legal.terms": "AGB",
"email.title": "Erfahre als Erste:r, wenn wir neue Produkte veröffentlichen",
"email.subtitle": "Trage dich in die Warteliste für frühen Zugang ein.",
"email.placeholder": "E-Mail-Adresse",
"email.subscribe": "Anmelden",
"email.success": "Fast geschafft, überprüfe deinen Posteingang und bestätige deine E-Mail-Adresse",
"notFound.title": "Nicht gefunden | OpenCode",
"notFound.heading": "404 - Seite nicht gefunden",
"notFound.home": "Startseite",
"notFound.docs": "Dokumentation",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"notFound.logoLightAlt": "OpenCode Logo hell",
"notFound.logoDarkAlt": "OpenCode Logo dunkel",
"user.logout": "Abmelden",
"auth.callback.error.codeMissing": "Kein Autorisierungscode gefunden.",
"workspace.select": "Workspace auswählen",
"workspace.createNew": "+ Neuen Workspace erstellen",
"workspace.modal.title": "Neuen Workspace erstellen",
"workspace.modal.placeholder": "Workspace-Namen eingeben",
"common.cancel": "Abbrechen",
"common.creating": "Erstelle...",
"common.create": "Erstellen",
"common.videoUnsupported": "Dein Browser unterstützt das Video-Tag nicht.",
"common.figure": "Abb. {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Mehr erfahren",
"error.invalidPlan": "Ungültiger Plan",
"error.workspaceRequired": "Workspace-ID ist erforderlich",
"error.alreadySubscribed": "Dieser Workspace hat bereits ein Abonnement",
"error.limitRequired": "Limit ist erforderlich.",
"error.monthlyLimitInvalid": "Bitte gib ein gültiges monatliches Limit ein.",
"error.workspaceNameRequired": "Workspace-Name ist erforderlich.",
"error.nameTooLong": "Der Name darf höchstens 255 Zeichen lang sein.",
"error.emailRequired": "E-Mail ist erforderlich",
"error.roleRequired": "Rolle ist erforderlich",
"error.idRequired": "ID ist erforderlich",
"error.nameRequired": "Name ist erforderlich",
"error.providerRequired": "Anbieter ist erforderlich",
"error.apiKeyRequired": "API-Key ist erforderlich",
"error.modelRequired": "Modell ist erforderlich",
"error.reloadAmountMin": "Aufladebetrag muss mindestens ${{amount}} betragen",
"error.reloadTriggerMin": "Guthaben-Auslöser muss mindestens ${{amount}} betragen",
"app.meta.description": "OpenCode - Der Open-Source Coding-Agent.",
"home.title": "OpenCode | Der Open-Source AI-Coding-Agent",
"temp.title": "OpenCode | Für das Terminal gebauter AI-Coding-Agent",
"temp.hero.title": "Der für das Terminal gebaute AI-Coding-Agent",
"temp.zen": "OpenCode Zen",
"temp.getStarted": "Loslegen",
"temp.feature.native.title": "Native TUI",
"temp.feature.native.body": "Eine reaktionsschnelle, native, thematisierbare Terminal-UI",
"temp.feature.zen.beforeLink": "Eine",
"temp.feature.zen.link": "kuratierte Liste von Modellen",
"temp.feature.zen.afterLink": "bereitgestellt von OpenCode",
"temp.feature.models.beforeLink": "Unterstützt 75+ LLM-Anbieter durch",
"temp.feature.models.afterLink": ", einschließlich lokaler Modelle",
"temp.screenshot.caption": "OpenCode TUI mit dem Tokyonight-Theme",
"temp.screenshot.alt": "OpenCode TUI mit Tokyonight-Theme",
"temp.logoLightAlt": "OpenCode Logo hell",
"temp.logoDarkAlt": "OpenCode Logo dunkel",
"home.banner.badge": "Neu",
"home.banner.text": "Desktop-App in der Beta verfügbar",
"home.banner.platforms": "auf macOS, Windows und Linux",
"home.banner.downloadNow": "Jetzt herunterladen",
"home.banner.downloadBetaNow": "Desktop-Beta jetzt herunterladen",
"home.hero.title": "Der Open-Source AI-Coding-Agent",
"home.hero.subtitle.a": "Kostenlose Modelle inklusive oder verbinde jedes Modell eines beliebigen Anbieters,",
"home.hero.subtitle.b": "einschließlich Claude, GPT, Gemini und mehr.",
"home.install.ariaLabel": "Installationsoptionen",
"home.what.title": "Was ist OpenCode?",
"home.what.body":
"OpenCode ist ein Open-Source-Agent, der dir hilft, Code in deinem Terminal, deiner IDE oder auf dem Desktop zu schreiben.",
"home.what.lsp.title": "LSP-fähig",
"home.what.lsp.body": "Lädt automatisch die richtigen LSPs für das LLM",
"home.what.multiSession.title": "Multi-Session",
"home.what.multiSession.body": "Starte mehrere Agenten parallel im selben Projekt",
"home.what.shareLinks.title": "Links teilen",
"home.what.shareLinks.body": "Teile einen Link zu jeder Sitzung als Referenz oder zum Debuggen",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Melde dich mit GitHub an, um deinen Copilot-Account zu nutzen",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Melde dich mit OpenAI an, um deinen ChatGPT Plus- oder Pro-Account zu nutzen",
"home.what.anyModel.title": "Jedes Modell",
"home.what.anyModel.body": "75+ LLM-Anbieter durch Models.dev, einschließlich lokaler Modelle",
"home.what.anyEditor.title": "Jeder Editor",
"home.what.anyEditor.body": "Verfügbar als Terminal-Interface, Desktop-App und IDE-Extension",
"home.what.readDocs": "Doku lesen",
"home.growth.title": "Der Open-Source AI-Coding-Agent",
"home.growth.body":
"Mit über <strong>{{stars}}</strong> GitHub-Stars, <strong>{{contributors}}</strong> Contributors und über <strong>{{commits}}</strong> Commits wird OpenCode von über <strong>{{monthlyUsers}}</strong> Entwickler:innen jeden Monat genutzt und geschätzt.",
"home.growth.githubStars": "GitHub Stars",
"home.growth.contributors": "Contributors",
"home.growth.monthlyDevs": "Monatliche Devs",
"home.privacy.title": "Built for privacy first",
"home.privacy.body":
"OpenCode speichert keinen deiner Codes oder Kontextdaten, sodass es in datenschutzsensiblen Umgebungen arbeiten kann.",
"home.privacy.learnMore": "Erfahre mehr über",
"home.privacy.link": "Datenschutz",
"home.faq.q1": "Was ist OpenCode?",
"home.faq.a1":
"OpenCode ist ein Open-Source-Agent, der dir hilft, Code mit jedem KI-Modell zu schreiben und auszuführen. Er ist als Terminal-Interface, Desktop-App oder IDE-Erweiterung verfügbar.",
"home.faq.q2": "Wie nutze ich OpenCode?",
"home.faq.a2.before": "Der einfachste Weg zu starten ist, die",
"home.faq.a2.link": "Einführung zu lesen",
"home.faq.q3": "Brauche ich zusätzliche AI-Abos, um OpenCode zu nutzen?",
"home.faq.a3.p1":
"Nicht unbedingt, OpenCode kommt mit einer Reihe kostenloser Modelle, die du ohne Account nutzen kannst.",
"home.faq.a3.p2.beforeZen": "Abgesehen davon kannst du jedes beliebige Coding-Modell nutzen, indem du einen",
"home.faq.a3.p2.afterZen": " Account erstellst.",
"home.faq.a3.p3":
"Während wir dazu raten, Zen zu nutzen, funktioniert OpenCode auch mit allen beliebten Anbietern wie OpenAI, Anthropic, xAI etc.",
"home.faq.a3.p4.beforeLocal": "Du kannst sogar deine",
"home.faq.a3.p4.localLink": "lokalen Modelle verbinden",
"home.faq.q4": "Kann ich meine bestehenden AI-Abos mit OpenCode nutzen?",
"home.faq.a4.p1":
"Ja, OpenCode unterstützt Abos von allen großen Anbietern. Du kannst deine Claude Pro/Max, ChatGPT Plus/Pro oder GitHub Copilot Abos nutzen.",
"home.faq.q5": "Kann ich OpenCode nur im Terminal nutzen?",
"home.faq.a5.beforeDesktop": "Nicht mehr! OpenCode ist jetzt als App für",
"home.faq.a5.desktop": "Desktop",
"home.faq.a5.and": "und",
"home.faq.a5.web": "Web verfügbar",
"home.faq.q6": "Wie viel kostet OpenCode?",
"home.faq.a6":
"OpenCode ist zu 100% kostenlos. Es enthält auch eine Reihe kostenloser Modelle. Zusätzliche Kosten können entstehen, wenn du andere Anbieter verbindest.",
"home.faq.q7": "Was ist mit Daten und Privatsphäre?",
"home.faq.a7.p1":
"Deine Daten und Informationen werden nur gespeichert, wenn du unsere kostenlosen Modelle nutzt oder teilbare Links erstellst.",
"home.faq.a7.p2.beforeModels": "Erfahre mehr über",
"home.faq.a7.p2.modelsLink": "unsere Modelle",
"home.faq.a7.p2.and": "und",
"home.faq.a7.p2.shareLink": "Share-Pages",
"home.faq.q8": "Ist OpenCode Open Source?",
"home.faq.a8.p1": "Ja, OpenCode ist vollständig Open Source. Der Quellcode ist öffentlich auf",
"home.faq.a8.p2": "unter der",
"home.faq.a8.mitLicense": "MIT Lizenz",
"home.faq.a8.p3":
", was bedeutet, dass jeder ihn nutzen, modifizieren oder zu seiner Entwicklung beitragen kann. Jeder aus der Community kann Issues melden, Pull Requests einreichen und die Funktionalität erweitern.",
"home.zenCta.title": "Zugriff auf zuverlässige, optimierte Modelle für Coding-Agents",
"home.zenCta.body":
"Zen gibt dir Zugriff auf ein handverlesenes Set an AI-Modellen, die OpenCode speziell für Coding-Agents getestet und bewertet hat. Keine Sorge wegen inkonsistenter Leistung und Qualität bei verschiedenen Anbietern nutze validierte Modelle, die funktionieren.",
"home.zenCta.link": "Erfahre mehr über Zen",
"zen.title": "OpenCode Zen | Ein kuratiertes Set zuverlässiger, optimierter Modelle für Coding-Agents",
"zen.hero.title": "Zuverlässige, optimierte Modelle für Coding-Agents",
"zen.hero.body":
"Zen gibt dir Zugriff auf ein kuratiertes Set an AI-Modellen, die OpenCode speziell für Coding-Agents getestet und bewertet hat. Keine Sorge wegen inkonsistenter Leistung und Qualität nutze validierte Modelle, die funktionieren.",
"zen.faq.q1": "Was ist OpenCode Zen?",
"zen.faq.a1":
"Zen ist ein kuratiertes Set an AI-Modellen, getestet und bewertet für Coding-Agents, erstellt vom Team hinter OpenCode.",
"zen.faq.q2": "Was macht Zen genauer?",
"zen.faq.a2":
"Zen bietet nur Modelle, die speziell für Coding-Agents getestet und bewertet wurden. Du würdest kein Buttermesser nehmen, um ein Steak zu schneiden nutze keine schlechten Modelle zum Coden.",
"zen.faq.q3": "Ist Zen günstiger?",
"zen.faq.a3":
"Zen ist nicht gewinnorientiert. Zen gibt die Kosten der Modellanbieter an dich weiter. Je höher die Nutzung von Zen, desto besser kann OpenCode Preise verhandeln und diese an dich weitergeben.",
"zen.faq.q4": "Wie viel kostet Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "berechnet pro Anfrage",
"zen.faq.a4.p1.afterPricing": "ohne Aufschläge, also zahlst du genau das, was der Modellanbieter berechnet.",
"zen.faq.a4.p2.beforeAccount":
"Deine Gesamtkosten hängen von der Nutzung ab, und du kannst monatliche Ausgabenlimits in deinem",
"zen.faq.a4.p2.accountLink": "Account festlegen",
"zen.faq.a4.p3":
"Um die Kosten zu decken, fügt OpenCode nur eine kleine Bearbeitungsgebühr von $1.23 pro $20 Guthabenaufladung hinzu.",
"zen.faq.q5": "Was ist mit Daten und Privatsphäre?",
"zen.faq.a5.beforeExceptions":
"Alle Zen-Modelle werden in den USA gehostet. Anbieter folgen einer Zero-Retention-Policy und nutzen deine Daten nicht zum Trainieren von Modellen, mit den",
"zen.faq.a5.exceptionsLink": "folgenden Ausnahmen",
"zen.faq.q6": "Kann ich Ausgabenlimits setzen?",
"zen.faq.a6": "Ja, du kannst monatliche Ausgabenlimits in deinem Account setzen.",
"zen.faq.q7": "Kann ich kündigen?",
"zen.faq.a7": "Ja, du kannst die Abrechnung jederzeit deaktivieren und dein verbleibendes Guthaben nutzen.",
"zen.faq.q8": "Kann ich Zen mit anderen Coding-Agents nutzen?",
"zen.faq.a8":
"Während Zen großartig mit OpenCode funktioniert, kannst du Zen mit jedem Agent nutzen. Folge den Einrichtungsanweisungen in deinem bevorzugten Coding-Agent.",
"zen.cta.start": "Starte mit Zen",
"zen.pricing.title": "Füge $20 Pay-as-you-go Guthaben hinzu",
"zen.pricing.fee": "(+$1.23 Bearbeitungsgebühr)",
"zen.pricing.body": "Nutze es mit jedem Agent. Setze monatliche Ausgabenlimits. Jederzeit kündbar.",
"zen.problem.title": "Welches Problem löst Zen?",
"zen.problem.body":
"Es gibt so viele Modelle, aber nur wenige funktionieren gut mit Coding-Agents. Die meisten Anbieter konfigurieren sie unterschiedlich, was zu variierenden Ergebnissen führt.",
"zen.problem.subtitle": "Wir beheben das für alle, nicht nur für OpenCode-Nutzer.",
"zen.problem.item1": "Testen ausgewählter Modelle und Beratung mit deren Teams",
"zen.problem.item2": "Zusammenarbeit mit Anbietern, um korrekte Bereitstellung zu sichern",
"zen.problem.item3": "Benchmarking aller Modell-Anbieter-Kombinationen, die wir empfehlen",
"zen.how.title": "Wie Zen funktioniert",
"zen.how.body": "Während wir dir raten, Zen mit OpenCode zu nutzen, kannst du Zen mit jedem Agent nutzen.",
"zen.how.step1.title": "Melde dich an und füge $20 Guthaben hinzu",
"zen.how.step1.beforeLink": "folge den",
"zen.how.step1.link": "Einrichtungsanweisungen",
"zen.how.step2.title": "Nutze Zen mit transparenter Preisgestaltung",
"zen.how.step2.link": "zahle pro Anfrage",
"zen.how.step2.afterLink": "ohne Aufschläge",
"zen.how.step3.title": "Auto-Top-up",
"zen.how.step3.body": "wenn dein Guthaben $5 erreicht, fügen wir automatisch $20 hinzu",
"zen.privacy.title": "Deine Privatsphäre ist uns wichtig",
"zen.privacy.beforeExceptions":
"Alle Zen-Modelle werden in den USA gehostet. Anbieter folgen einer Zero-Retention-Policy und nutzen deine Daten nicht für Modelltraining, mit den",
"zen.privacy.exceptionsLink": "folgenden Ausnahmen",
"go.title": "OpenCode Go | Kostengünstige Coding-Modelle für alle",
"go.meta.description":
"Go beginnt bei $5 für den ersten Monat, danach $10/Monat, mit großzügigen 5-Stunden-Anfragelimits für GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro und DeepSeek V4 Flash.",
"go.hero.title": "Kostengünstige Coding-Modelle für alle",
"go.hero.body":
"Go bringt Agentic Coding zu Programmierern auf der ganzen Welt. Mit großzügigen Limits und zuverlässigem Zugang zu den leistungsfähigsten Open-Source-Modellen, damit du mit leistungsstarken Agenten entwickeln kannst, ohne dir Gedanken über Kosten oder Verfügbarkeit zu machen.",
"go.cta.start": "Go abonnieren",
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Go abonnieren",
"go.cta.price": "$10/Monat",
"go.cta.promo": "$5 im ersten Monat",
"go.pricing.body":
"Mit jedem Agenten nutzbar. $5 im ersten Monat, danach $10/Monat. Guthaben bei Bedarf aufladen. Jederzeit kündbar.",
"go.graph.free": "Kostenlos",
"go.graph.freePill": "Big Pickle und kostenlose Modelle",
"go.graph.go": "Go",
"go.graph.label": "Anfragen pro 5 Stunden",
"go.graph.usageLimits": "Nutzungslimits",
"go.graph.tick": "{{n}}x",
"go.graph.aria": "Anfragen pro 5h: {{free}} vs {{go}}",
"go.testimonials.brand.zen": "Zen",
"go.testimonials.brand.go": "Go",
"go.testimonials.handle": "@OpenCode",
"go.testimonials.dax.name": "Dax Raad",
"go.testimonials.dax.title": "ex-CEO, Terminal Products",
"go.testimonials.dax.quoteAfter": "hat mein Leben verändert, es ist wirklich ein No-Brainer.",
"go.testimonials.jay.name": "Jay V",
"go.testimonials.jay.title": "ex-Gründer, SEED, PM, Melt, Pop, Dapt, Cadmus und ViewPoint",
"go.testimonials.jay.quoteBefore": "4 von 5 Leuten in unserem Team lieben die Nutzung von",
"go.testimonials.jay.quoteAfter": ".",
"go.testimonials.adam.name": "Adam Elmore",
"go.testimonials.adam.title": "ex-Hero, AWS",
"go.testimonials.adam.quoteBefore": "Ich kann",
"go.testimonials.adam.quoteAfter": "nicht genug empfehlen. Ernsthaft, es ist wirklich gut.",
"go.testimonials.david.name": "David Hill",
"go.testimonials.david.title": "ex-Head of Design, Laravel",
"go.testimonials.david.quoteBefore": "Mit",
"go.testimonials.david.quoteAfter": "weiß ich, dass alle Modelle getestet und perfekt für Coding-Agenten sind.",
"go.testimonials.frank.name": "Frank Wang",
"go.testimonials.frank.title": "ex-Praktikant, Nvidia (4 mal)",
"go.testimonials.frank.quote": "Ich wünschte, ich wäre noch bei Nvidia.",
"go.problem.title": "Welches Problem löst Go?",
"go.problem.body":
"Wir konzentrieren uns darauf, die OpenCode-Erfahrung so vielen Menschen wie möglich zugänglich zu machen. OpenCode Go ist ein kostengünstiges Abonnement: $5 im ersten Monat, danach $10/Monat. Es bietet großzügige Limits und zuverlässigen Zugang zu den leistungsfähigsten Open-Source-Modellen.",
"go.problem.subtitle": " ",
"go.problem.item1": "Kostengünstiges Abonnement",
"go.problem.item2": "Großzügige Limits und zuverlässiger Zugang",
"go.problem.item3": "Für so viele Programmierer wie möglich gebaut",
"go.problem.item4":
"Beinhaltet GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro und DeepSeek V4 Flash",
"go.how.title": "Wie Go funktioniert",
"go.how.body":
"Go beginnt bei $5 für den ersten Monat, danach $10/Monat. Du kannst es mit OpenCode oder jedem Agenten nutzen.",
"go.how.step1.title": "Konto erstellen",
"go.how.step1.beforeLink": "folge den",
"go.how.step1.link": "Einrichtungsanweisungen",
"go.how.step2.title": "Go abonnieren",
"go.how.step2.link": "$5 im ersten Monat",
"go.how.step2.afterLink": "danach $10/Monat mit großzügigen Limits",
"go.how.step3.title": "Loslegen mit Coding",
"go.how.step3.body": "mit zuverlässigem Zugang zu Open-Source-Modellen",
"go.privacy.title": "Deine Privatsphäre ist uns wichtig",
"go.privacy.body":
"Der Plan ist primär für internationale Nutzer konzipiert, mit Modellen gehostet in den USA, der EU und Singapur für stabilen globalen Zugang.",
"go.privacy.contactAfter": "wenn du Fragen hast.",
"go.privacy.beforeExceptions":
"Go-Modelle werden in den USA gehostet. Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen, mit den",
"go.privacy.exceptionsLink": "folgenden Ausnahmen",
"go.faq.q1": "Was ist OpenCode Go?",
"go.faq.a1":
"Go ist ein kostengünstiges Abonnement, das dir zuverlässigen Zugang zu leistungsfähigen Open-Source-Modellen für Agentic Coding bietet.",
"go.faq.q2": "Welche Modelle beinhaltet Go?",
"go.faq.a2": "Go umfasst die unten aufgeführten Modelle mit großzügigen Limits und zuverlässigem Zugriff.",
"go.faq.q3": "Ist Go dasselbe wie Zen?",
"go.faq.a3":
"Nein. Zen ist Pay-as-you-go, während Go bei $5 für den ersten Monat beginnt, danach $10/Monat, mit großzügigen Limits und zuverlässigem Zugang zu den Open-Source-Modellen GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro und DeepSeek V4 Flash.",
"go.faq.q4": "Wie viel kostet Go?",
"go.faq.a4.p1.beforePricing": "Go kostet",
"go.faq.a4.p1.pricingLink": "$5 im ersten Monat",
"go.faq.a4.p1.afterPricing": "danach $10/Monat mit großzügigen Limits.",
"go.faq.a4.p2.beforeAccount": "Du kannst dein Abonnement in deinem",
"go.faq.a4.p2.accountLink": "Konto verwalten",
"go.faq.a4.p3": "Jederzeit kündbar.",
"go.faq.q5": "Was ist mit Daten und Privatsphäre?",
"go.faq.a5.body":
"Der Plan ist primär für internationale Nutzer konzipiert, mit Modellen gehostet in den USA, der EU und Singapur für stabilen globalen Zugang. Unsere Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen.",
"go.faq.a5.beforeExceptions":
"Go-Modelle werden in den USA gehostet. Anbieter verfolgen eine Zero-Retention-Politik und nutzen deine Daten nicht für das Training von Modellen, mit den",
"go.faq.a5.exceptionsLink": "folgenden Ausnahmen",
"go.faq.q6": "Kann ich Guthaben aufladen?",
"go.faq.a6": "Wenn du mehr Nutzung benötigst, kannst du Guthaben in deinem Konto aufladen.",
"go.faq.q7": "Kann ich kündigen?",
"go.faq.a7": "Ja, du kannst jederzeit kündigen.",
"go.faq.q8": "Kann ich Go mit anderen Coding-Agenten nutzen?",
"go.faq.a8":
"Ja, du kannst Go mit jedem Agenten nutzen. Folge den Einrichtungsanweisungen in deinem bevorzugten Coding-Agenten.",
"go.faq.q9": "Was ist der Unterschied zwischen kostenlosen Modellen und Go?",
"go.faq.a9":
"Kostenlose Modelle beinhalten Big Pickle sowie Werbemodelle, die zum jeweiligen Zeitpunkt verfügbar sind, mit einem Kontingent von 200 Anfragen/Tag. Go beinhaltet GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro und DeepSeek V4 Flash mit höheren Anfragekontingenten, die über rollierende Zeitfenster (5 Stunden, wöchentlich und monatlich) durchgesetzt werden, grob äquivalent zu $12 pro 5 Stunden, $30 pro Woche und $60 pro Monat (tatsächliche Anfragezahlen variieren je nach Modell und Nutzung).",
"zen.api.error.rateLimitExceeded": "Ratenlimit überschritten. Bitte versuche es später erneut.",
"zen.api.error.modelNotSupported": "Modell {{model}} wird nicht unterstützt",
"zen.api.error.modelFormatNotSupported": "Modell {{model}} wird für das Format {{format}} nicht unterstützt",
"zen.api.error.noProviderAvailable": "Kein Anbieter verfügbar",
"zen.api.error.providerNotSupported": "Anbieter {{provider}} wird nicht unterstützt",
"zen.api.error.missingApiKey": "Fehlender API-Key.",
"zen.api.error.invalidApiKey": "Ungültiger API-Key.",
"zen.api.error.subscriptionQuotaExceeded": "Abonnement-Quote überschritten. Erneuter Versuch in {{retryIn}}.",
"zen.api.error.goSubscriptionRollingLimitExceeded":
"5-Stunden-Nutzungslimit erreicht. Wird in {{retryIn}} zurückgesetzt. Um dieses Modell jetzt weiter zu nutzen, aktiviere die Nutzung über dein verfügbares Guthaben: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionWeeklyLimitExceeded":
"Wöchentliches Nutzungslimit erreicht. Wird in {{retryIn}} zurückgesetzt. Um dieses Modell jetzt weiter zu nutzen, aktiviere die Nutzung über dein verfügbares Guthaben: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionMonthlyLimitExceeded":
"Monatliches Nutzungslimit erreicht. Wird in {{retryIn}} zurückgesetzt. Um dieses Modell jetzt weiter zu nutzen, aktiviere die Nutzung über dein verfügbares Guthaben: {{consoleGoUrl}}",
"zen.api.error.noPaymentMethod": "Keine Zahlungsmethode. Füge hier eine Zahlungsmethode hinzu: {{billingUrl}}",
"zen.api.error.insufficientBalance": "Unzureichendes Guthaben. Verwalte deine Abrechnung hier: {{billingUrl}}",
"zen.api.error.workspaceMonthlyLimitReached":
"Dein Workspace hat sein monatliches Ausgabenlimit von ${{amount}} erreicht. Verwalte deine Limits hier: {{billingUrl}}",
"zen.api.error.userMonthlyLimitReached":
"Du hast dein monatliches Ausgabenlimit von ${{amount}} erreicht. Verwalte deine Limits hier: {{membersUrl}}",
"zen.api.error.modelDisabled": "Modell ist deaktiviert",
"zen.api.error.trialEnded":
"Die kostenlose Aktion für {{model}} ist beendet. Du kannst das Modell weiterhin nutzen, indem du OpenCode Go abonnierst - {{link}}",
"black.meta.title": "OpenCode Black | Zugriff auf die weltweit besten Coding-Modelle",
"black.meta.description": "Erhalte Zugriff auf Claude, GPT, Gemini und mehr mit OpenCode Black Abos.",
"black.hero.title": "Zugriff auf die weltweit besten Coding-Modelle",
"black.hero.subtitle": "Einschließlich Claude, GPT, Gemini und mehr",
"black.title": "OpenCode Black | Preise",
"black.paused": "Die Anmeldung zum Black-Plan ist vorübergehend pausiert.",
"black.plan.icon20": "Black 20 Plan",
"black.plan.icon100": "Black 100 Plan",
"black.plan.icon200": "Black 200 Plan",
"black.plan.multiplier100": "5x mehr Nutzung als Black 20",
"black.plan.multiplier200": "20x mehr Nutzung als Black 20",
"black.price.perMonth": "pro Monat",
"black.price.perPersonBilledMonthly": "pro Person, monatlich abgerechnet",
"black.terms.1": "Dein Abonnement startet nicht sofort",
"black.terms.2": "Du wirst auf die Warteliste gesetzt und bald freigeschaltet",
"black.terms.3": "Deine Karte wird erst belastet, wenn dein Abonnement aktiviert ist",
"black.terms.4": "Nutzungslimits gelten, stark automatisierte Nutzung kann Limits schneller erreichen",
"black.terms.5": "Abonnements sind für Einzelpersonen, kontaktiere Enterprise für Teams",
"black.terms.6": "Limits können angepasst werden und Pläne können in Zukunft eingestellt werden",
"black.terms.7": "Kündige dein Abonnement jederzeit",
"black.action.continue": "Weiter",
"black.finePrint.beforeTerms": "Angezeigte Preise enthalten keine anfallenden Steuern",
"black.finePrint.terms": "Nutzungsbedingungen",
"black.workspace.title": "OpenCode Black | Workspace wählen",
"black.workspace.selectPlan": "Wähle einen Workspace für diesen Plan",
"black.workspace.name": "Workspace {{n}}",
"black.subscribe.title": "OpenCode Black abonnieren",
"black.subscribe.paymentMethod": "Zahlungsmethode",
"black.subscribe.loadingPaymentForm": "Lade Zahlungsformular...",
"black.subscribe.selectWorkspaceToContinue": "Wähle einen Workspace um fortzufahren",
"black.subscribe.failurePrefix": "Oh nein!",
"black.subscribe.error.generic": "Ein Fehler ist aufgetreten",
"black.subscribe.error.invalidPlan": "Ungültiger Plan",
"black.subscribe.error.workspaceRequired": "Workspace-ID ist erforderlich",
"black.subscribe.error.alreadySubscribed": "Dieser Workspace hat bereits ein Abonnement",
"black.subscribe.processing": "Verarbeitung...",
"black.subscribe.submit": "Abonnieren ${{plan}}",
"black.subscribe.form.chargeNotice": "Du wirst erst belastet, wenn dein Abonnement aktiviert ist",
"black.subscribe.success.title": "Du bist auf der OpenCode Black Warteliste",
"black.subscribe.success.subscriptionPlan": "Abo-Plan",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Betrag",
"black.subscribe.success.amountValue": "${{plan}} pro Monat",
"black.subscribe.success.paymentMethod": "Zahlungsmethode",
"black.subscribe.success.dateJoined": "Beitrittsdatum",
"black.subscribe.success.chargeNotice": "Deine Karte wird belastet, sobald dein Abonnement aktiviert ist",
"workspace.nav.zen": "Zen",
"workspace.nav.go": "Go",
"workspace.nav.usage": "Nutzung",
"workspace.nav.apiKeys": "API Keys",
"workspace.nav.members": "Mitglieder",
"workspace.nav.billing": "Abrechnung",
"workspace.nav.settings": "Einstellungen",
"workspace.home.banner.beforeLink": "Zuverlässige, optimierte Modelle für Coding-Agents.",
"workspace.lite.banner.beforeLink": "Kostengünstige Coding-Modelle für alle.",
"workspace.home.billing.loading": "Laden...",
"workspace.home.billing.enable": "Abrechnung aktivieren",
"workspace.home.billing.currentBalance": "Aktuelles Guthaben",
"workspace.newUser.feature.tested.title": "Getestete & Verifizierte Modelle",
"workspace.newUser.feature.tested.body":
"Wir haben Modelle speziell für Coding-Agents getestet und bewertet, um beste Leistung zu garantieren.",
"workspace.newUser.feature.quality.title": "Höchste Qualität",
"workspace.newUser.feature.quality.body":
"Zugriff auf Modelle, die für optimale Leistung konfiguriert sind keine Downgrades oder Routing zu billigeren Anbietern.",
"workspace.newUser.feature.lockin.title": "Kein Lock-in",
"workspace.newUser.feature.lockin.body":
"Nutze Zen mit jedem Coding-Agent und nutze weiterhin andere Anbieter mit OpenCode, wann immer du willst.",
"workspace.newUser.copyApiKey": "API Key kopieren",
"workspace.newUser.copyKey": "Key kopieren",
"workspace.newUser.copied": "Kopiert!",
"workspace.newUser.step.enableBilling": "Abrechnung aktivieren",
"workspace.newUser.step.login.before": "Führe",
"workspace.newUser.step.login.after": "aus und wähle OpenCode",
"workspace.newUser.step.pasteKey": "Füge deinen API Key ein",
"workspace.newUser.step.models.before": "Starte OpenCode und führe",
"workspace.newUser.step.models.after": "aus, um ein Modell zu wählen",
"workspace.models.title": "Modelle",
"workspace.models.subtitle.beforeLink": "Verwalte, auf welche Modelle Workspace-Mitglieder zugreifen können.",
"workspace.models.table.model": "Modell",
"workspace.models.table.enabled": "Aktiviert",
"workspace.providers.title": "Bring Your Own Key",
"workspace.providers.subtitle": "Konfiguriere deine eigenen API Keys von AI-Anbietern.",
"workspace.providers.placeholder": "Gib {{provider}} API Key ein ({{prefix}}...)",
"workspace.providers.configure": "Konfigurieren",
"workspace.providers.edit": "Bearbeiten",
"workspace.providers.delete": "Löschen",
"workspace.providers.saving": "Speichere...",
"workspace.providers.save": "Speichern",
"workspace.providers.table.provider": "Anbieter",
"workspace.providers.table.apiKey": "API Key",
"workspace.usage.title": "Nutzungsverlauf",
"workspace.usage.subtitle": "Kürzliche API-Nutzung und Kosten.",
"workspace.usage.empty": "Mache deinen ersten API-Aufruf, um loszulegen.",
"workspace.usage.table.date": "Datum",
"workspace.usage.table.model": "Modell",
"workspace.usage.table.input": "Input",
"workspace.usage.table.output": "Output",
"workspace.usage.table.cost": "Kosten",
"workspace.usage.table.session": "Sitzung",
"workspace.usage.breakdown.input": "Input",
"workspace.usage.breakdown.cacheRead": "Cache Read",
"workspace.usage.breakdown.cacheWrite": "Cache Write",
"workspace.usage.breakdown.output": "Output",
"workspace.usage.breakdown.reasoning": "Reasoning",
"workspace.usage.subscription": "Black (${{amount}})",
"workspace.usage.lite": "Go (${{amount}})",
"workspace.usage.byok": "BYOK (${{amount}})",
"workspace.cost.title": "Kosten",
"workspace.cost.subtitle": "Nutzungskosten aufgeschlüsselt nach Modell.",
"workspace.cost.allModels": "Alle Modelle",
"workspace.cost.allKeys": "Alle Keys",
"workspace.cost.deletedSuffix": "(gelöscht)",
"workspace.cost.empty": "Keine Nutzungsdaten für den gewählten Zeitraum verfügbar.",
"workspace.cost.subscriptionShort": "Abo",
"workspace.keys.title": "API Keys",
"workspace.keys.subtitle": "Verwalte deine API Keys für den Zugriff auf OpenCode-Dienste.",
"workspace.keys.create": "API Key erstellen",
"workspace.keys.placeholder": "Key-Namen eingeben",
"workspace.keys.empty": "Erstelle einen OpenCode Gateway API Key",
"workspace.keys.table.name": "Name",
"workspace.keys.table.key": "Key",
"workspace.keys.table.createdBy": "Erstellt von",
"workspace.keys.table.lastUsed": "Zuletzt genutzt",
"workspace.keys.copyApiKey": "API Key kopieren",
"workspace.keys.delete": "Löschen",
"workspace.members.title": "Mitglieder",
"workspace.members.subtitle": "Verwalte Workspace-Mitglieder und deren Berechtigungen.",
"workspace.members.invite": "Mitglied einladen",
"workspace.members.inviting": "Lade ein...",
"workspace.members.beta.beforeLink": "Workspaces sind für Teams während der Beta kostenlos.",
"workspace.members.form.invitee": "Eingeladene Person",
"workspace.members.form.emailPlaceholder": "E-Mail eingeben",
"workspace.members.form.role": "Rolle",
"workspace.members.form.monthlyLimit": "Monatliches Ausgabenlimit",
"workspace.members.noLimit": "Kein Limit",
"workspace.members.noLimitLowercase": "kein Limit",
"workspace.members.invited": "eingeladen",
"workspace.members.edit": "Bearbeiten",
"workspace.members.delete": "Löschen",
"workspace.members.saving": "Speichere...",
"workspace.members.save": "Speichern",
"workspace.members.table.email": "E-Mail",
"workspace.members.table.role": "Rolle",
"workspace.members.table.monthLimit": "Monatslimit",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Kann Modelle, Mitglieder und Abrechnung verwalten",
"workspace.members.role.member": "Mitglied",
"workspace.members.role.memberDescription": "Kann nur API Keys für sich selbst generieren",
"workspace.settings.title": "Einstellungen",
"workspace.settings.subtitle": "Aktualisiere deinen Workspace-Namen und Präferenzen.",
"workspace.settings.workspaceName": "Workspace-Name",
"workspace.settings.defaultName": "Standard",
"workspace.settings.updating": "Aktualisiere...",
"workspace.settings.save": "Speichern",
"workspace.settings.edit": "Bearbeiten",
"workspace.billing.title": "Abrechnung",
"workspace.billing.subtitle.beforeLink": "Zahlungsmethoden verwalten.",
"workspace.billing.contactUs": "Kontaktiere uns",
"workspace.billing.subtitle.afterLink": "wenn du Fragen hast.",
"workspace.billing.currentBalance": "Aktuelles Guthaben",
"workspace.billing.add": "$ hinzufügen",
"workspace.billing.enterAmount": "Betrag eingeben",
"workspace.billing.loading": "Lade...",
"workspace.billing.addAction": "Hinzufügen",
"workspace.billing.addBalance": "Guthaben aufladen",
"workspace.billing.alipay": "Alipay",
"workspace.billing.wechat": "WeChat Pay",
"workspace.billing.linkedToStripe": "Mit Stripe verbunden",
"workspace.billing.manage": "Verwalten",
"workspace.billing.enable": "Abrechnung aktivieren",
"workspace.monthlyLimit.title": "Monatliches Limit",
"workspace.monthlyLimit.subtitle": "Setze ein monatliches Nutzungslimit für deinen Account.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Setze...",
"workspace.monthlyLimit.set": "Setzen",
"workspace.monthlyLimit.edit": "Limit bearbeiten",
"workspace.monthlyLimit.noLimit": "Kein Nutzungslimit gesetzt.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Aktuelle Nutzung für",
"workspace.monthlyLimit.currentUsage.beforeAmount": "ist $",
"workspace.redeem.title": "Gutschein einlösen",
"workspace.redeem.subtitle": "Löse einen Gutscheincode ein, um Guthaben oder Vorteile zu erhalten.",
"workspace.redeem.placeholder": "Gutscheincode eingeben",
"workspace.redeem.redeem": "Einlösen",
"workspace.redeem.redeeming": "Wird eingelöst...",
"workspace.redeem.success": "Gutschein erfolgreich eingelöst.",
"workspace.reload.title": "Auto-Reload",
"workspace.reload.disabled.before": "Auto-Reload ist",
"workspace.reload.disabled.state": "deaktiviert",
"workspace.reload.disabled.after": "Aktivieren, um automatisch aufzuladen, wenn das Guthaben niedrig ist.",
"workspace.reload.enabled.before": "Auto-Reload ist",
"workspace.reload.enabled.state": "aktiviert",
"workspace.reload.enabled.middle": "Wir laden auf",
"workspace.reload.processingFee": "Bearbeitungsgebühr",
"workspace.reload.enabled.after": "wenn das Guthaben erreicht:",
"workspace.reload.edit": "Bearbeiten",
"workspace.reload.enable": "Aktivieren",
"workspace.reload.enableAutoReload": "Auto-Reload aktivieren",
"workspace.reload.reloadAmount": "Aufladebetrag $",
"workspace.reload.whenBalanceReaches": "Wenn Guthaben $ erreicht",
"workspace.reload.saving": "Speichere...",
"workspace.reload.save": "Speichern",
"workspace.reload.failedAt": "Aufladung fehlgeschlagen am",
"workspace.reload.reason": "Grund:",
"workspace.reload.updatePaymentMethod": "Bitte aktualisiere deine Zahlungsmethode und versuche es erneut.",
"workspace.reload.retrying": "Versuche erneut...",
"workspace.reload.retry": "Erneut versuchen",
"workspace.reload.error.paymentFailed": "Zahlung fehlgeschlagen.",
"workspace.payments.title": "Zahlungshistorie",
"workspace.payments.subtitle": "Kürzliche Zahlungstransaktionen.",
"workspace.payments.table.date": "Datum",
"workspace.payments.table.paymentId": "Zahlungs-ID",
"workspace.payments.table.amount": "Betrag",
"workspace.payments.table.receipt": "Beleg",
"workspace.payments.type.credit": "Guthaben",
"workspace.payments.type.subscription": "Abonnement",
"workspace.payments.view": "Ansehen",
"workspace.black.loading": "Lade...",
"workspace.black.time.day": "Tag",
"workspace.black.time.days": "Tage",
"workspace.black.time.hour": "Stunde",
"workspace.black.time.hours": "Stunden",
"workspace.black.time.minute": "Minute",
"workspace.black.time.minutes": "Minuten",
"workspace.black.time.fewSeconds": "einige Sekunden",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Du hast OpenCode Black für ${{plan}} pro Monat abonniert.",
"workspace.black.subscription.manage": "Abo verwalten",
"workspace.black.subscription.rollingUsage": "5-Stunden-Nutzung",
"workspace.black.subscription.weeklyUsage": "Wöchentliche Nutzung",
"workspace.black.subscription.resetsIn": "Setzt zurück in",
"workspace.black.subscription.useBalance": "Nutze dein verfügbares Guthaben, nachdem die Limits erreicht sind",
"workspace.black.waitlist.title": "Warteliste",
"workspace.black.waitlist.joined": "Du bist auf der Warteliste für den ${{plan}} pro Monat OpenCode Black Plan.",
"workspace.black.waitlist.ready": "Wir sind bereit, dich in den ${{plan}} pro Monat OpenCode Black Plan aufzunehmen.",
"workspace.black.waitlist.leave": "Warteliste verlassen",
"workspace.black.waitlist.leaving": "Verlasse...",
"workspace.black.waitlist.left": "Verlassen",
"workspace.black.waitlist.enroll": "Einschreiben",
"workspace.black.waitlist.enrolling": "Schreibe ein...",
"workspace.black.waitlist.enrolled": "Eingeschrieben",
"workspace.black.waitlist.enrollNote":
"Wenn du auf Einschreiben klickst, startet dein Abo sofort und deine Karte wird belastet.",
"workspace.lite.loading": "Lade...",
"workspace.lite.time.day": "Tag",
"workspace.lite.time.days": "Tage",
"workspace.lite.time.hour": "Stunde",
"workspace.lite.time.hours": "Stunden",
"workspace.lite.time.minute": "Minute",
"workspace.lite.time.minutes": "Minuten",
"workspace.lite.time.fewSeconds": "einige Sekunden",
"workspace.lite.subscription.message": "Du hast OpenCode Go abonniert.",
"workspace.lite.subscription.manage": "Abo verwalten",
"workspace.lite.subscription.rollingUsage": "Fortlaufende Nutzung",
"workspace.lite.subscription.weeklyUsage": "Wöchentliche Nutzung",
"workspace.lite.subscription.monthlyUsage": "Monatliche Nutzung",
"workspace.lite.subscription.resetsIn": "Setzt zurück in",
"workspace.lite.subscription.useBalance": "Nutze dein verfügbares Guthaben, nachdem die Nutzungslimits erreicht sind",
"workspace.lite.subscription.selectProvider":
'Wähle "OpenCode Go" als Anbieter in deiner opencode-Konfiguration, um Go-Modelle zu verwenden.',
"workspace.lite.black.message":
"Du hast derzeit OpenCode Black abonniert oder stehst auf der Warteliste. Bitte kündige zuerst, wenn du zu Go wechseln möchtest.",
"workspace.lite.other.message":
"Ein anderes Mitglied in diesem Workspace hat OpenCode Go bereits abonniert. Nur ein Mitglied pro Workspace kann abonnieren.",
"workspace.lite.promo.description":
"OpenCode Go startet bei {{price}}, danach $10/Monat, und bietet zuverlässigen Zugang zu beliebten offenen Coding-Modellen mit großzügigen Nutzungslimits.",
"workspace.lite.promo.price": "$5 im ersten Monat",
"workspace.lite.promo.modelsTitle": "Was enthalten ist",
"workspace.lite.promo.footer":
"Der Plan wurde hauptsächlich für internationale Nutzer entwickelt, wobei die Modelle in den USA, der EU und Singapur gehostet werden, um einen stabilen weltweiten Zugriff zu gewährleisten. Preise und Nutzungslimits können sich ändern, während wir aus der frühen Nutzung und dem Feedback lernen.",
"workspace.lite.promo.subscribe": "Go abonnieren",
"workspace.lite.promo.subscribing": "Leite weiter...",
"workspace.lite.promo.otherMethods": "Andere Zahlungsmethoden",
"workspace.lite.promo.selectMethod": "Zahlungsmethode auswählen",
"workspace.referral.copyLink": "Link kopieren",
"workspace.referral.copied": "Kopiert",
"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": "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": "Belohnung einlösen",
"workspace.referral.apply.confirmBody":
"Löse {{amount}} ein, um die aktuelle Nutzung dieses Workspace zu reduzieren.",
"workspace.referral.apply.confirmAction": "Einlösen",
"download.title": "OpenCode | Download",
"download.meta.description": "Lade OpenCode für macOS, Windows und Linux herunter",
"download.hero.title": "OpenCode herunterladen",
"download.hero.subtitle": "In Beta verfügbar für macOS, Windows und Linux",
"download.hero.button": "Download für {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "OpenCode Extensions",
"download.section.integrations": "OpenCode Integrationen",
"download.action.download": "Download",
"download.action.install": "Installieren",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Nicht unbedingt, aber wahrscheinlich. Du brauchst ein AI-Abo, wenn du OpenCode mit einem bezahlten Anbieter verbinden willst, obwohl du mit",
"download.faq.a3.localLink": "lokalen Modellen",
"download.faq.a3.afterLocal.beforeZen": "kostenlos arbeiten kannst. Während wir Nutzern raten,",
"download.faq.a3.afterZen":
" zu nutzen, funktioniert OpenCode mit allen populären Anbietern wie OpenAI, Anthropic, xAI etc.",
"download.faq.a5.p1": "OpenCode ist 100% kostenlos.",
"download.faq.a5.p2.beforeZen":
"Zusätzliche Kosten entstehen durch dein Abo bei einem Modellanbieter. Während OpenCode mit jedem Modellanbieter funktioniert, empfehlen wir",
"download.faq.a5.p2.afterZen": " zu nutzen.",
"download.faq.a6.p1":
"Deine Daten und Informationen werden nur gespeichert, wenn du teilbare Links in OpenCode erstellst.",
"download.faq.a6.p2.beforeShare": "Erfahre mehr über",
"download.faq.a6.shareLink": "Share-Pages",
"enterprise.title": "OpenCode | Enterprise-Lösungen für Ihre Organisation",
"enterprise.meta.description": "Kontaktieren Sie OpenCode für Enterprise-Lösungen",
"enterprise.hero.title": "Ihr Code gehört Ihnen",
"enterprise.hero.body1":
"OpenCode arbeitet sicher innerhalb Ihrer Organisation, ohne dass Daten oder Kontext gespeichert werden und ohne Lizenzbeschränkungen oder Eigentumsansprüche. Starten Sie einen Testlauf mit Ihrem Team, dann rollen Sie es in Ihrer Organisation aus, indem Sie es in Ihr SSO und internes AI-Gateway integrieren.",
"enterprise.hero.body2": "Lassen Sie uns wissen, wie wir helfen können.",
"enterprise.form.name.label": "Vollständiger Name",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Rolle",
"enterprise.form.role.placeholder": "Executive Chairman",
"enterprise.form.company.label": "Unternehmen",
"enterprise.form.company.placeholder": "Acme Inc",
"enterprise.form.email.label": "Firmen-E-Mail",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Telefonnummer",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.message.label": "Welches Problem versuchen Sie zu lösen?",
"enterprise.form.message.placeholder": "Wir brauchen Hilfe bei...",
"enterprise.form.send": "Senden",
"enterprise.form.sending": "Sende...",
"enterprise.form.success": "Nachricht gesendet, wir melden uns bald.",
"enterprise.form.success.submitted": "Formular erfolgreich gesendet.",
"enterprise.form.error.allFieldsRequired": "Alle Felder sind erforderlich.",
"enterprise.form.error.invalidEmailFormat": "Ungültiges E-Mail-Format.",
"enterprise.form.error.internalServer": "Interner Serverfehler.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Was ist OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise ist für Organisationen, die sicherstellen wollen, dass Code und Daten niemals ihre Infrastruktur verlassen. Dies geschieht durch eine zentrale Konfiguration, die in Ihr SSO und internes AI-Gateway integriert wird.",
"enterprise.faq.q2": "Wie starte ich mit OpenCode Enterprise?",
"enterprise.faq.a2":
"Starten Sie einfach mit einem internen Testlauf mit Ihrem Team. OpenCode speichert standardmäßig weder Code noch Kontextdaten, was den Einstieg erleichtert. Kontaktieren Sie uns dann, um Preise und Implementierungsoptionen zu besprechen.",
"enterprise.faq.q3": "Wie funktioniert das Enterprise-Pricing?",
"enterprise.faq.a3":
"Wir bieten eine Preisgestaltung pro Arbeitsplatz (Seat) an. Wenn Sie Ihr eigenes LLM-Gateway haben, berechnen wir keine Gebühren für genutzte Token. Für weitere Details kontaktieren Sie uns für ein individuelles Angebot basierend auf den Anforderungen Ihrer Organisation.",
"enterprise.faq.q4": "Sind meine Daten mit OpenCode Enterprise sicher?",
"enterprise.faq.a4":
"Ja. OpenCode speichert weder Ihren Code noch Kontextdaten. Alle Verarbeitungen finden lokal oder über direkte API-Aufrufe an Ihren AI-Anbieter statt. Mit zentraler Konfiguration und SSO-Integration bleiben Ihre Daten sicher innerhalb der Infrastruktur Ihrer Organisation.",
"brand.title": "OpenCode | Marke",
"brand.meta.description": "OpenCode Markenrichtlinien",
"brand.heading": "Markenrichtlinien",
"brand.subtitle": "Ressourcen und Assets, die dir helfen, mit der OpenCode-Marke zu arbeiten.",
"brand.downloadAll": "Alle Assets herunterladen",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "OpenCode Release Notes und Changelog",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Neue Updates und Verbesserungen für OpenCode",
"changelog.empty": "Keine Changelog-Einträge gefunden.",
"changelog.viewJson": "JSON ansehen",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agent",
"bench.list.table.model": "Modell",
"bench.list.table.score": "Score",
"bench.submission.error.allFieldsRequired": "Alle Felder sind erforderlich.",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Task nicht gefunden",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "Agent",
"bench.detail.labels.model": "Modell",
"bench.detail.labels.task": "Task",
"bench.detail.labels.repo": "Repo",
"bench.detail.labels.from": "Von",
"bench.detail.labels.to": "Bis",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Durchschnittliche Dauer",
"bench.detail.labels.averageScore": "Durchschnittlicher Score",
"bench.detail.labels.averageCost": "Durchschnittliche Kosten",
"bench.detail.labels.summary": "Zusammenfassung",
"bench.detail.labels.runs": "Durchläufe",
"bench.detail.labels.score": "Score",
"bench.detail.labels.base": "Basis",
"bench.detail.labels.penalty": "Strafe",
"bench.detail.labels.weight": "Gewichtung",
"bench.detail.table.run": "Durchlauf",
"bench.detail.table.score": "Score (Basis - Strafe)",
"bench.detail.table.cost": "Kosten",
"bench.detail.table.duration": "Dauer",
"bench.detail.run.title": "Durchlauf {{n}}",
"bench.detail.rawJson": "Raw JSON",
} satisfies Dict

View File

@@ -0,0 +1,820 @@
export const dict = {
"nav.github": "GitHub",
"nav.docs": "Docs",
"nav.data": "Data",
"nav.changelog": "Changelog",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "Enterprise",
"nav.zen": "Zen",
"nav.go": "Go",
"nav.login": "Login",
"nav.free": "Download",
"nav.home": "Home",
"nav.openMenu": "Open menu",
"nav.getStartedFree": "Get started for free",
"nav.logoAlt": "OpenCode",
"nav.context.copyLogo": "Copy logo as SVG",
"nav.context.copyWordmark": "Copy wordmark as SVG",
"nav.context.brandAssets": "Brand assets",
"footer.github": "GitHub",
"footer.docs": "Docs",
"footer.changelog": "Changelog",
"footer.feishu": "Feishu",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "Brand",
"legal.privacy": "Privacy",
"legal.terms": "Terms",
"email.title": "Be the first to know when we release new products",
"email.subtitle": "Join the waitlist for early access.",
"email.placeholder": "Email address",
"email.subscribe": "Subscribe",
"email.success": "Almost done, check your inbox and confirm your email address",
"notFound.title": "Not Found | opencode",
"notFound.heading": "404 - Page Not Found",
"notFound.home": "Home",
"notFound.docs": "Docs",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"notFound.logoLightAlt": "opencode logo light",
"notFound.logoDarkAlt": "opencode logo dark",
"user.logout": "Logout",
"auth.callback.error.codeMissing": "No authorization code found.",
"workspace.select": "Select workspace",
"workspace.createNew": "+ Create New Workspace",
"workspace.modal.title": "Create New Workspace",
"workspace.modal.placeholder": "Enter workspace name",
"common.cancel": "Cancel",
"common.creating": "Creating...",
"common.create": "Create",
"common.contactUs": "Contact us",
"common.videoUnsupported": "Your browser does not support the video tag.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Learn more",
"error.invalidPlan": "Invalid plan",
"error.workspaceRequired": "Workspace ID is required",
"error.alreadySubscribed": "This workspace already has a subscription",
"error.limitRequired": "Limit is required.",
"error.monthlyLimitInvalid": "Set a valid monthly limit.",
"error.workspaceNameRequired": "Workspace name is required.",
"error.nameTooLong": "Name must be 255 characters or less.",
"error.emailRequired": "Email is required",
"error.roleRequired": "Role is required",
"error.idRequired": "ID is required",
"error.nameRequired": "Name is required",
"error.providerRequired": "Provider is required",
"error.apiKeyRequired": "API key is required",
"error.modelRequired": "Model is required",
"error.reloadAmountMin": "Reload amount must be at least ${{amount}}",
"error.reloadTriggerMin": "Balance trigger must be at least ${{amount}}",
"app.meta.description": "OpenCode - The open source coding agent.",
"home.title": "OpenCode | The open source AI coding agent",
"temp.title": "opencode | AI coding agent built for the terminal",
"temp.hero.title": "The AI coding agent built for the terminal",
"temp.zen": "opencode zen",
"temp.getStarted": "Get Started",
"temp.feature.native.title": "Native TUI",
"temp.feature.native.body": "A responsive, native, themeable terminal UI",
"temp.feature.zen.beforeLink": "A",
"temp.feature.zen.link": "curated list of models",
"temp.feature.zen.afterLink": "provided by opencode",
"temp.feature.models.beforeLink": "Supports 75+ LLM providers through",
"temp.feature.models.afterLink": ", including local models",
"temp.screenshot.caption": "opencode TUI with the tokyonight theme",
"temp.screenshot.alt": "opencode TUI with tokyonight theme",
"temp.logoLightAlt": "opencode logo light",
"temp.logoDarkAlt": "opencode logo dark",
"home.banner.badge": "New",
"home.banner.text": "Desktop app available in beta",
"home.banner.platforms": "on macOS, Windows, and Linux",
"home.banner.downloadNow": "Download now",
"home.banner.downloadBetaNow": "Download the desktop beta now",
"home.hero.title": "The open source AI coding agent",
"home.hero.subtitle.a": "Free models included or connect any model from any provider,",
"home.hero.subtitle.b": "including Claude, GPT, Gemini and more.",
"home.install.ariaLabel": "Install options",
"home.what.title": "What is OpenCode?",
"home.what.body": "OpenCode is an open source agent that helps you write code in your terminal, IDE, or desktop.",
"home.what.lsp.title": "LSP enabled",
"home.what.lsp.body": "Automatically loads the right LSPs for the LLM",
"home.what.multiSession.title": "Multi-session",
"home.what.multiSession.body": "Start multiple agents in parallel on the same project",
"home.what.shareLinks.title": "Share links",
"home.what.shareLinks.body": "Share a link to any session for reference or to debug",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Log in with GitHub to use your Copilot account",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Log in with OpenAI to use your ChatGPT Plus or Pro account",
"home.what.anyModel.title": "Any model",
"home.what.anyModel.body": "75+ LLM providers through Models.dev, including local models",
"home.what.anyEditor.title": "Any editor",
"home.what.anyEditor.body": "Available as a terminal interface, desktop app, and IDE extension",
"home.what.readDocs": "Read docs",
"home.growth.title": "The open source AI coding agent",
"home.growth.body":
"With over <strong>{{stars}}</strong> GitHub stars, <strong>{{contributors}}</strong> contributors, and over <strong>{{commits}}</strong> commits, OpenCode is used and trusted by over <strong>{{monthlyUsers}}</strong> developers every month.",
"home.growth.githubStars": "GitHub Stars",
"home.growth.contributors": "Contributors",
"home.growth.monthlyDevs": "Monthly Devs",
"home.privacy.title": "Built for privacy first",
"home.privacy.body":
"OpenCode does not store any of your code or context data, so that it can operate in privacy sensitive environments.",
"home.privacy.learnMore": "Learn more about",
"home.privacy.link": "privacy",
"home.faq.q1": "What is OpenCode?",
"home.faq.a1":
"OpenCode is an open source agent that helps you write and run code with any AI model. It's available as a terminal-based interface, desktop app, or IDE extension.",
"home.faq.q2": "How do I use OpenCode?",
"home.faq.a2.before": "The easiest way to get started is to read the",
"home.faq.a2.link": "intro",
"home.faq.q3": "Do I need extra AI subscriptions to use OpenCode?",
"home.faq.a3.p1":
"Not necessarily, OpenCode comes with a set of free models that you can use without creating an account.",
"home.faq.a3.p2.beforeZen": "Aside from these, you can use any of the popular coding models by creating a",
"home.faq.a3.p2.afterZen": " account.",
"home.faq.a3.p3":
"While we encourage users to use Zen, OpenCode also works with all popular providers such as OpenAI, Anthropic, xAI etc.",
"home.faq.a3.p4.beforeLocal": "You can even connect your",
"home.faq.a3.p4.localLink": "local models",
"home.faq.q4": "Can I use my existing AI subscriptions with OpenCode?",
"home.faq.a4.p1":
"Yes, OpenCode supports subscription plans from all major providers. You can use your Claude Pro/Max, ChatGPT Plus/Pro, or GitHub Copilot subscriptions.",
"home.faq.q5": "Can I only use OpenCode in the terminal?",
"home.faq.a5.beforeDesktop": "Not anymore! OpenCode is now available as an app for your",
"home.faq.a5.desktop": "desktop",
"home.faq.a5.and": "and",
"home.faq.a5.web": "web",
"home.faq.q6": "How much does OpenCode cost?",
"home.faq.a6":
"OpenCode is 100% free to use. It also comes with a set of free models. There might be additional costs if you connect any other provider.",
"home.faq.q7": "What about data and privacy?",
"home.faq.a7.p1": "Your data and information is only stored when you use our free models or create sharable links.",
"home.faq.a7.p2.beforeModels": "Learn more about",
"home.faq.a7.p2.modelsLink": "our models",
"home.faq.a7.p2.and": "and",
"home.faq.a7.p2.shareLink": "share pages",
"home.faq.q8": "Is OpenCode open source?",
"home.faq.a8.p1": "Yes, OpenCode is fully open source. The source code is public on",
"home.faq.a8.p2": "under the",
"home.faq.a8.mitLicense": "MIT License",
"home.faq.a8.p3":
", meaning anyone can use, modify, or contribute to its development. Anyone from the community can file issues, submit pull requests, and extend functionality.",
"home.zenCta.title": "Access reliable optimized models for coding agents",
"home.zenCta.body":
"Zen gives you access to a handpicked set of AI models that OpenCode has tested and benchmarked specifically for coding agents. No need to worry about inconsistent performance and quality across providers, use validated models that work.",
"home.zenCta.link": "Learn about Zen",
"zen.title": "OpenCode Zen | A curated set of reliable optimized models for coding agents",
"zen.hero.title": "Reliable optimized models for coding agents",
"zen.hero.body":
"Zen gives you access to a curated set of AI models that OpenCode has tested and benchmarked specifically for coding agents. No need to worry about inconsistent performance and quality, use validated models that work.",
"zen.faq.q1": "What is OpenCode Zen?",
"zen.faq.a1":
"Zen is a curated set of AI models tested and benchmarked for coding agents created by the team behind OpenCode.",
"zen.faq.q2": "What makes Zen more accurate?",
"zen.faq.a2":
"Zen only provides models that have been specifically tested and benchmarked for coding agents. You wouldn't use a butter knife to cut steak, don't use poor models for coding.",
"zen.faq.q3": "Is Zen cheaper?",
"zen.faq.a3":
"Zen is not for profit. Zen passes through the costs from the model providers to you. The higher Zen's usage the more OpenCode can negotiate better rates and pass those to you.",
"zen.faq.q4": "How much does Zen cost?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "charges per request",
"zen.faq.a4.p1.afterPricing": "with zero markups, so you pay exactly what the model provider charges.",
"zen.faq.a4.p2.beforeAccount": "Your total cost depends on usage, and you can set monthly spend limits in your",
"zen.faq.a4.p2.accountLink": "account",
"zen.faq.a4.p3": "To cover costs, OpenCode adds only a small payment processing fee of $1.23 per $20 balance top-up.",
"zen.faq.q5": "What about data and privacy?",
"zen.faq.a5.beforeExceptions":
"All Zen models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the",
"zen.faq.a5.exceptionsLink": "following exceptions",
"zen.faq.q6": "Can I set spend limits?",
"zen.faq.a6": "Yes, you can set monthly spending limits in your account.",
"zen.faq.q7": "Can I cancel?",
"zen.faq.a7": "Yes, you can disable billing at any time and use your remaining balance.",
"zen.faq.q8": "Can I use Zen with other coding agents?",
"zen.faq.a8":
"While Zen works great with OpenCode, you can use Zen with any agent. Follow the setup instructions in your preferred coding agent.",
"zen.cta.start": "Get started with Zen",
"zen.pricing.title": "Add $20 Pay as you go balance",
"zen.pricing.fee": "(+$1.23 card processing fee)",
"zen.pricing.body": "Use with any agent. Set monthly spend limits. Cancel any time.",
"zen.problem.title": "What problem is Zen solving?",
"zen.problem.body":
"There are so many models available, but only a few work well with coding agents. Most providers configure them differently with varying results.",
"zen.problem.subtitle": "We're fixing this for everyone, not just OpenCode users.",
"zen.problem.item1": "Testing select models and consulting their teams",
"zen.problem.item2": "Working with providers to ensure they're delivered properly",
"zen.problem.item3": "Benchmarking all model-provider combinations we recommend",
"zen.how.title": "How Zen works",
"zen.how.body": "While we suggest you use Zen with OpenCode, you can use Zen with any agent.",
"zen.how.step1.title": "Sign up and add $20 balance",
"zen.how.step1.beforeLink": "follow the",
"zen.how.step1.link": "setup instructions",
"zen.how.step2.title": "Use Zen with transparent pricing",
"zen.how.step2.link": "pay per request",
"zen.how.step2.afterLink": "with zero markups",
"zen.how.step3.title": "Auto-top up",
"zen.how.step3.body": "when your balance reaches $5 we'll automatically add $20",
"zen.privacy.title": "Your privacy is important to us",
"zen.privacy.beforeExceptions":
"All Zen models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the",
"zen.privacy.exceptionsLink": "following exceptions",
"go.title": "OpenCode Go | Low cost coding models for everyone",
"go.meta.description":
"Go starts at $5 for your first month, then $10/month, with generous 5-hour request limits for GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, and DeepSeek V4 Flash.",
"go.hero.title": "Low cost coding models for everyone",
"go.hero.body":
"Go brings agentic coding to programmers around the world. Offering generous limits and reliable access to the most capable open-source models, so you can build with powerful agents without worrying about cost or availability.",
"go.cta.start": "Subscribe to Go",
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Subscribe to Go",
"go.cta.price": "$10/month",
"go.cta.promo": "$5 first month",
"go.pricing.body": "Use with any agent. $5 first month, then $10/month. Top up credit if needed. Cancel any time.",
"go.graph.free": "Free",
"go.graph.freePill": "Big Pickle and free models",
"go.graph.go": "Go",
"go.graph.label": "Requests per 5 hour",
"go.graph.usageLimits": "Usage limits",
"go.graph.tick": "{{n}}x",
"go.graph.aria": "Requests per 5h: {{free}} vs {{go}}",
"go.testimonials.brand.zen": "Zen",
"go.testimonials.brand.go": "Go",
"go.testimonials.handle": "@OpenCode",
"go.testimonials.dax.name": "Dax Raad",
"go.testimonials.dax.title": "ex-CEO, Terminal Products",
"go.testimonials.dax.quoteAfter": "has been life changing, it's truly a no-brainer.",
"go.testimonials.jay.name": "Jay V",
"go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint",
"go.testimonials.jay.quoteBefore": "4 out of 5 people on our team love using",
"go.testimonials.jay.quoteAfter": ".",
"go.testimonials.adam.name": "Adam Elmore",
"go.testimonials.adam.title": "ex-Hero, AWS",
"go.testimonials.adam.quoteBefore": "I can't recommend",
"go.testimonials.adam.quoteAfter": "enough. Seriously, it's really good.",
"go.testimonials.david.name": "David Hill",
"go.testimonials.david.title": "ex-Head of Design, Laravel",
"go.testimonials.david.quoteBefore": "With",
"go.testimonials.david.quoteAfter": "I know all the models are tested and perfect for coding agents.",
"go.testimonials.frank.name": "Frank Wang",
"go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)",
"go.testimonials.frank.quote": "I wish I was still at Nvidia.",
"go.problem.title": "What problem is Go solving?",
"go.problem.body":
"We're focused on bringing the OpenCode experience to as many people as possible. OpenCode Go is a low cost subscription: $5 for your first month, then $10/month. It provides generous limits and reliable access to the most capable open source models.",
"go.problem.subtitle": " ",
"go.problem.item1": "Low cost subscription pricing",
"go.problem.item2": "Generous limits and reliable access",
"go.problem.item3": "Built for as many programmers as possible",
"go.problem.item4":
"Includes GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, and DeepSeek V4 Flash",
"go.how.title": "How Go works",
"go.how.body": "Go starts at $5 for your first month, then $10/month. You can use it with OpenCode or any agent.",
"go.how.step1.title": "Create an account",
"go.how.step1.beforeLink": "follow the",
"go.how.step1.link": "setup instructions",
"go.how.step2.title": "Subscribe to Go",
"go.how.step2.link": "$5 first month",
"go.how.step2.afterLink": "then $10/month with generous limits",
"go.how.step3.title": "Start coding",
"go.how.step3.body": "with reliable access to open-source models",
"go.privacy.title": "Your privacy is important to us",
"go.privacy.body":
"The plan is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access.",
"go.privacy.contactAfter": "if you have any questions.",
"go.privacy.beforeExceptions":
"Go models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the",
"go.privacy.exceptionsLink": "following exceptions",
"go.faq.q1": "What is OpenCode Go?",
"go.faq.a1":
"Go is a low-cost subscription that gives you reliable access to capable open-source models for agentic coding.",
"go.faq.q2": "What models does Go include?",
"go.faq.a2": "Go includes the models listed below, with generous limits and reliable access.",
"go.faq.q3": "Is Go the same as Zen?",
"go.faq.a3":
"No. Zen is pay-as-you-go, while Go starts at $5 for your first month, then $10/month, with generous limits and reliable access to open-source models GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, and DeepSeek V4 Flash.",
"go.faq.q4": "How much does Go cost?",
"go.faq.a4.p1.beforePricing": "Go costs",
"go.faq.a4.p1.pricingLink": "$5 first month",
"go.faq.a4.p1.afterPricing": "then $10/month with generous limits.",
"go.faq.a4.p2.beforeAccount": "You can manage your subscription in your",
"go.faq.a4.p2.accountLink": "account",
"go.faq.a4.p3": "Cancel any time.",
"go.faq.q5": "What about data and privacy?",
"go.faq.a5.body":
"The plan is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access. Our providers follow a zero-retention policy and do not use your data for model training.",
"go.faq.a5.beforeExceptions":
"Go models are hosted in the US. Providers follow a zero-retention policy and do not use your data for model training, with the",
"go.faq.a5.exceptionsLink": "following exceptions",
"go.faq.q6": "Can I top up credit?",
"go.faq.a6": "If you need more usage, you can top up credit in your account.",
"go.faq.q7": "Can I cancel?",
"go.faq.a7": "Yes, you can cancel any time.",
"go.faq.q8": "Can I use Go with other coding agents?",
"go.faq.a8": "Yes, you can use Go with any agent. Follow the setup instructions in your preferred coding agent.",
"go.faq.q9": "What is the difference between free models and Go?",
"go.faq.a9":
"Free models include Big Pickle plus promotional models available at the time, with a quota of 200 requests/day. Go includes GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro, and DeepSeek V4 Flash with higher request quotas enforced across rolling windows (5-hour, weekly, and monthly), roughly equivalent to $12 per 5 hours, $30 per week, and $60 per month (actual request counts vary by model and usage).",
"zen.api.error.rateLimitExceeded": "Rate limit exceeded. Please try again later.",
"zen.api.error.modelNotSupported": "Model {{model}} is not supported",
"zen.api.error.modelFormatNotSupported": "Model {{model}} is not supported for format {{format}}",
"zen.api.error.noProviderAvailable": "No provider available",
"zen.api.error.providerNotSupported": "Provider {{provider}} not supported",
"zen.api.error.missingApiKey": "Missing API key.",
"zen.api.error.invalidApiKey": "Invalid API key.",
"zen.api.error.subscriptionQuotaExceeded": "Subscription quota exceeded. Retry in {{retryIn}}.",
"zen.api.error.goSubscriptionRollingLimitExceeded":
"5-hour usage limit reached. Resets in {{retryIn}}. To continue using this model now, enable usage from your available balance: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionWeeklyLimitExceeded":
"Weekly usage limit reached. Resets in {{retryIn}}. To continue using this model now, enable usage from your available balance: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionMonthlyLimitExceeded":
"Monthly usage limit reached. Resets in {{retryIn}}. To continue using this model now, enable usage from your available balance: {{consoleGoUrl}}",
"zen.api.error.noPaymentMethod": "No payment method. Add a payment method here: {{billingUrl}}",
"zen.api.error.insufficientBalance": "Insufficient balance. Manage your billing here: {{billingUrl}}",
"zen.api.error.workspaceMonthlyLimitReached":
"Your workspace has reached its monthly spending limit of ${{amount}}. Manage your limits here: {{billingUrl}}",
"zen.api.error.userMonthlyLimitReached":
"You have reached your monthly spending limit of ${{amount}}. Manage your limits here: {{membersUrl}}",
"zen.api.error.modelDisabled": "Model is disabled",
"zen.api.error.trialEnded":
"Free promotion has ended for {{model}}. You can continue using the model by subscribing to OpenCode Go - {{link}}",
"black.meta.title": "OpenCode Black | Access all the world's best coding models",
"black.meta.description": "Get access to Claude, GPT, Gemini and more with OpenCode Black subscription plans.",
"black.hero.title": "Access all the world's best coding models",
"black.hero.subtitle": "Including Claude, GPT, Gemini and more",
"black.title": "OpenCode Black | Pricing",
"black.paused": "Black plan enrollment is temporarily paused.",
"black.plan.icon20": "Black 20 plan",
"black.plan.icon100": "Black 100 plan",
"black.plan.icon200": "Black 200 plan",
"black.plan.multiplier100": "5x more usage than Black 20",
"black.plan.multiplier200": "20x more usage than Black 20",
"black.price.perMonth": "per month",
"black.price.perPersonBilledMonthly": "per person billed monthly",
"black.terms.1": "Your subscription will not start immediately",
"black.terms.2": "You will be added to the waitlist and activated soon",
"black.terms.3": "Your card will only be charged when your subscription is activated",
"black.terms.4": "Usage limits apply, heavily automated use may reach limits sooner",
"black.terms.5": "Subscriptions are for individuals, contact Enterprise for teams",
"black.terms.6": "Limits may be adjusted and plans may be discontinued in the future",
"black.terms.7": "Cancel your subscription at any time",
"black.action.continue": "Continue",
"black.finePrint.beforeTerms": "Prices shown don't include applicable tax",
"black.finePrint.terms": "Terms of Service",
"black.workspace.title": "OpenCode Black | Select Workspace",
"black.workspace.selectPlan": "Select a workspace for this plan",
"black.workspace.name": "Workspace {{n}}",
"black.subscribe.title": "Subscribe to OpenCode Black",
"black.subscribe.paymentMethod": "Payment method",
"black.subscribe.loadingPaymentForm": "Loading payment form...",
"black.subscribe.selectWorkspaceToContinue": "Select a workspace to continue",
"black.subscribe.failurePrefix": "Uh oh!",
"black.subscribe.error.generic": "An error occurred",
"black.subscribe.error.invalidPlan": "Invalid plan",
"black.subscribe.error.workspaceRequired": "Workspace ID is required",
"black.subscribe.error.alreadySubscribed": "This workspace already has a subscription",
"black.subscribe.processing": "Processing...",
"black.subscribe.submit": "Subscribe ${{plan}}",
"black.subscribe.form.chargeNotice": "You will only be charged when your subscription is activated",
"black.subscribe.success.title": "You're on the OpenCode Black waitlist",
"black.subscribe.success.subscriptionPlan": "Subscription plan",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Amount",
"black.subscribe.success.amountValue": "${{plan}} per month",
"black.subscribe.success.paymentMethod": "Payment method",
"black.subscribe.success.dateJoined": "Date joined",
"black.subscribe.success.chargeNotice": "Your card will be charged when your subscription is activated",
"workspace.nav.zen": "Zen",
"workspace.nav.go": "Go",
"workspace.nav.usage": "Usage",
"workspace.nav.apiKeys": "API Keys",
"workspace.nav.members": "Members",
"workspace.nav.billing": "Billing",
"workspace.nav.settings": "Settings",
"workspace.home.banner.beforeLink": "Reliable optimized models for coding agents.",
"workspace.lite.banner.beforeLink": "Low cost coding models for everyone.",
"workspace.home.billing.loading": "Loading...",
"workspace.home.billing.enable": "Enable billing",
"workspace.home.billing.currentBalance": "Current balance",
"workspace.newUser.feature.tested.title": "Tested & Verified Models",
"workspace.newUser.feature.tested.body":
"We've benchmarked and tested models specifically for coding agents to ensure the best performance.",
"workspace.newUser.feature.quality.title": "Highest Quality",
"workspace.newUser.feature.quality.body":
"Access models configured for optimal performance - no downgrades or routing to cheaper providers.",
"workspace.newUser.feature.lockin.title": "No Lock-in",
"workspace.newUser.feature.lockin.body":
"Use Zen with any coding agent, and continue using other providers with opencode whenever you want.",
"workspace.newUser.copyApiKey": "Copy API key",
"workspace.newUser.copyKey": "Copy Key",
"workspace.newUser.copied": "Copied!",
"workspace.newUser.step.enableBilling": "Enable billing",
"workspace.newUser.step.login.before": "Run",
"workspace.newUser.step.login.after": "and select opencode",
"workspace.newUser.step.pasteKey": "Paste your API key",
"workspace.newUser.step.models.before": "Start opencode and run",
"workspace.newUser.step.models.after": "to select a model",
"workspace.models.title": "Models",
"workspace.models.subtitle.beforeLink": "Manage which models workspace members can access.",
"workspace.models.table.model": "Model",
"workspace.models.table.enabled": "Enabled",
"workspace.providers.title": "Bring Your Own Key",
"workspace.providers.subtitle": "Configure your own API keys from AI providers.",
"workspace.providers.placeholder": "Enter {{provider}} API key ({{prefix}}...)",
"workspace.providers.configure": "Configure",
"workspace.providers.edit": "Edit",
"workspace.providers.delete": "Delete",
"workspace.providers.saving": "Saving...",
"workspace.providers.save": "Save",
"workspace.providers.table.provider": "Provider",
"workspace.providers.table.apiKey": "API Key",
"workspace.usage.title": "Usage History",
"workspace.usage.subtitle": "Recent API usage and costs.",
"workspace.usage.empty": "Make your first API call to get started.",
"workspace.usage.table.date": "Date",
"workspace.usage.table.model": "Model",
"workspace.usage.table.input": "Input",
"workspace.usage.table.output": "Output",
"workspace.usage.table.cost": "Cost",
"workspace.usage.table.session": "Session",
"workspace.usage.breakdown.input": "Input",
"workspace.usage.breakdown.cacheRead": "Cache Read",
"workspace.usage.breakdown.cacheWrite": "Cache Write",
"workspace.usage.breakdown.output": "Output",
"workspace.usage.breakdown.reasoning": "Reasoning",
"workspace.usage.subscription": "Black (${{amount}})",
"workspace.usage.lite": "Go (${{amount}})",
"workspace.usage.byok": "BYOK (${{amount}})",
"workspace.cost.title": "Cost",
"workspace.cost.subtitle": "Usage costs broken down by model.",
"workspace.cost.allModels": "All Models",
"workspace.cost.allKeys": "All Keys",
"workspace.cost.deletedSuffix": "(deleted)",
"workspace.cost.empty": "No usage data available for the selected period.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "API Keys",
"workspace.keys.subtitle": "Manage your API keys for accessing opencode services.",
"workspace.keys.create": "Create API Key",
"workspace.keys.placeholder": "Enter key name",
"workspace.keys.empty": "Create an opencode Gateway API key",
"workspace.keys.table.name": "Name",
"workspace.keys.table.key": "Key",
"workspace.keys.table.createdBy": "Created By",
"workspace.keys.table.lastUsed": "Last Used",
"workspace.keys.copyApiKey": "Copy API key",
"workspace.keys.delete": "Delete",
"workspace.members.title": "Members",
"workspace.members.subtitle": "Manage workspace members and their permissions.",
"workspace.members.invite": "Invite Member",
"workspace.members.inviting": "Inviting...",
"workspace.members.beta.beforeLink": "Workspaces are free for teams during the beta.",
"workspace.members.form.invitee": "Invitee",
"workspace.members.form.emailPlaceholder": "Enter email",
"workspace.members.form.role": "Role",
"workspace.members.form.monthlyLimit": "Monthly spending limit",
"workspace.members.noLimit": "No limit",
"workspace.members.noLimitLowercase": "no limit",
"workspace.members.invited": "invited",
"workspace.members.edit": "Edit",
"workspace.members.delete": "Delete",
"workspace.members.saving": "Saving...",
"workspace.members.save": "Save",
"workspace.members.table.email": "Email",
"workspace.members.table.role": "Role",
"workspace.members.table.monthLimit": "Month limit",
"workspace.members.role.admin": "Admin",
"workspace.members.role.adminDescription": "Can manage models, members, and billing",
"workspace.members.role.member": "Member",
"workspace.members.role.memberDescription": "Can only generate API keys for themselves",
"workspace.settings.title": "Settings",
"workspace.settings.subtitle": "Update your workspace name and preferences.",
"workspace.settings.workspaceName": "Workspace name",
"workspace.settings.defaultName": "Default",
"workspace.settings.updating": "Updating...",
"workspace.settings.save": "Save",
"workspace.settings.edit": "Edit",
"workspace.billing.title": "Billing",
"workspace.billing.subtitle.beforeLink": "Manage payment methods.",
"workspace.billing.contactUs": "Contact us",
"workspace.billing.subtitle.afterLink": "if you have any questions.",
"workspace.billing.currentBalance": "Current Balance",
"workspace.billing.add": "Add $",
"workspace.billing.enterAmount": "Enter amount",
"workspace.billing.loading": "Loading...",
"workspace.billing.addAction": "Add",
"workspace.billing.addBalance": "Add Balance",
"workspace.billing.alipay": "Alipay",
"workspace.billing.wechat": "WeChat Pay",
"workspace.billing.linkedToStripe": "Linked to Stripe",
"workspace.billing.manage": "Manage",
"workspace.billing.enable": "Enable Billing",
"workspace.monthlyLimit.title": "Monthly Limit",
"workspace.monthlyLimit.subtitle": "Set a monthly usage limit for your account.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Setting...",
"workspace.monthlyLimit.set": "Set",
"workspace.monthlyLimit.edit": "Edit Limit",
"workspace.monthlyLimit.noLimit": "No usage limit set.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Current usage for",
"workspace.monthlyLimit.currentUsage.beforeAmount": "is $",
"workspace.redeem.title": "Redeem Coupon",
"workspace.redeem.subtitle": "Redeem a coupon code to claim credits or perks.",
"workspace.redeem.placeholder": "Enter coupon code",
"workspace.redeem.redeem": "Redeem",
"workspace.redeem.redeeming": "Redeeming...",
"workspace.redeem.success": "Coupon redeemed successfully.",
"workspace.reload.title": "Auto Reload",
"workspace.reload.disabled.before": "Auto reload is",
"workspace.reload.disabled.state": "disabled",
"workspace.reload.disabled.after": "Enable to automatically reload when balance is low.",
"workspace.reload.enabled.before": "Auto reload is",
"workspace.reload.enabled.state": "enabled",
"workspace.reload.enabled.middle": "We'll reload",
"workspace.reload.processingFee": "processing fee",
"workspace.reload.enabled.after": "when balance reaches",
"workspace.reload.edit": "Edit",
"workspace.reload.enable": "Enable",
"workspace.reload.enableAutoReload": "Enable Auto Reload",
"workspace.reload.reloadAmount": "Reload $",
"workspace.reload.whenBalanceReaches": "When balance reaches $",
"workspace.reload.saving": "Saving...",
"workspace.reload.save": "Save",
"workspace.reload.failedAt": "Reload failed at",
"workspace.reload.reason": "Reason:",
"workspace.reload.updatePaymentMethod": "Please update your payment method and try again.",
"workspace.reload.retrying": "Retrying...",
"workspace.reload.retry": "Retry",
"workspace.reload.error.paymentFailed": "Payment failed.",
"workspace.payments.title": "Payments History",
"workspace.payments.subtitle": "Recent payment transactions.",
"workspace.payments.table.date": "Date",
"workspace.payments.table.paymentId": "Payment ID",
"workspace.payments.table.amount": "Amount",
"workspace.payments.table.receipt": "Receipt",
"workspace.payments.type.credit": "credit",
"workspace.payments.type.subscription": "subscription",
"workspace.payments.view": "View",
"workspace.black.loading": "Loading...",
"workspace.black.time.day": "day",
"workspace.black.time.days": "days",
"workspace.black.time.hour": "hour",
"workspace.black.time.hours": "hours",
"workspace.black.time.minute": "minute",
"workspace.black.time.minutes": "minutes",
"workspace.black.time.fewSeconds": "a few seconds",
"workspace.black.subscription.title": "Subscription",
"workspace.black.subscription.message": "You are subscribed to OpenCode Black for ${{plan}} per month.",
"workspace.black.subscription.manage": "Manage Subscription",
"workspace.black.subscription.rollingUsage": "5-hour Usage",
"workspace.black.subscription.weeklyUsage": "Weekly Usage",
"workspace.black.subscription.resetsIn": "Resets in",
"workspace.black.subscription.useBalance": "Use your available balance after reaching the usage limits",
"workspace.black.waitlist.title": "Waitlist",
"workspace.black.waitlist.joined": "You are on the waitlist for the ${{plan}} per month OpenCode Black plan.",
"workspace.black.waitlist.ready": "We're ready to enroll you into the ${{plan}} per month OpenCode Black plan.",
"workspace.black.waitlist.leave": "Leave Waitlist",
"workspace.black.waitlist.leaving": "Leaving...",
"workspace.black.waitlist.left": "Left",
"workspace.black.waitlist.enroll": "Enroll",
"workspace.black.waitlist.enrolling": "Enrolling...",
"workspace.black.waitlist.enrolled": "Enrolled",
"workspace.black.waitlist.enrollNote":
"When you click Enroll, your subscription starts immediately and your card will be charged.",
"workspace.lite.loading": "Loading...",
"workspace.lite.time.day": "day",
"workspace.lite.time.days": "days",
"workspace.lite.time.hour": "hour",
"workspace.lite.time.hours": "hours",
"workspace.lite.time.minute": "minute",
"workspace.lite.time.minutes": "minutes",
"workspace.lite.time.fewSeconds": "a few seconds",
"workspace.lite.subscription.message": "You are subscribed to OpenCode Go.",
"workspace.lite.subscription.manage": "Manage Subscription",
"workspace.lite.subscription.rollingUsage": "Rolling Usage",
"workspace.lite.subscription.weeklyUsage": "Weekly Usage",
"workspace.lite.subscription.monthlyUsage": "Monthly Usage",
"workspace.lite.subscription.resetsIn": "Resets in",
"workspace.lite.subscription.useBalance": "Use your available balance after reaching the usage limits",
"workspace.lite.subscription.selectProvider":
'Select "OpenCode Go" as the provider in your opencode configuration to use Go models.',
"workspace.lite.black.message":
"You're currently subscribed to OpenCode Black or on the waitlist. Please unsubscribe first if you'd like to switch to Go.",
"workspace.lite.other.message":
"Another member in this workspace is already subscribed to OpenCode Go. Only one member per workspace can subscribe.",
"workspace.lite.promo.description":
"OpenCode Go starts at {{price}}, then $10/month, and provides reliable access to popular open coding models with generous usage limits.",
"workspace.lite.promo.price": "$5 for your first month",
"workspace.lite.promo.modelsTitle": "What's Included",
"workspace.lite.promo.footer":
"The plan is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access. Pricing and usage limits may change as we learn from early usage and feedback.",
"workspace.lite.promo.subscribe": "Subscribe to Go",
"workspace.lite.promo.subscribing": "Redirecting...",
"workspace.lite.promo.otherMethods": "Other payment methods",
"workspace.lite.promo.selectMethod": "Select payment method",
"workspace.referral.copyLink": "Copy Link",
"workspace.referral.copied": "Copied",
"workspace.referral.overview.title": "Invite friends",
"workspace.referral.overview.subtitle": "Earn $5 when a friend subscribes. Theyll 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": "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 reward",
"workspace.referral.apply.confirmBody": "Apply {{amount}} to reduce this workspace's current usage.",
"workspace.referral.apply.confirmAction": "Apply",
"download.title": "OpenCode | Download",
"download.meta.description": "Download OpenCode for macOS, Windows, and Linux",
"download.hero.title": "Download OpenCode",
"download.hero.subtitle": "Available in Beta for macOS, Windows, and Linux",
"download.hero.button": "Download for {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "OpenCode Extensions",
"download.section.integrations": "OpenCode Integrations",
"download.action.download": "Download",
"download.action.install": "Install",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Not necessarily, but probably. You'll need an AI subscription if you want to connect OpenCode to a paid provider, although you can work with",
"download.faq.a3.localLink": "local models",
"download.faq.a3.afterLocal.beforeZen": "for free. While we encourage users to use",
"download.faq.a3.afterZen": ", OpenCode works with all popular providers such as OpenAI, Anthropic, xAI etc.",
"download.faq.a5.p1": "OpenCode is 100% free to use.",
"download.faq.a5.p2.beforeZen":
"Any additional costs will come from your subscription to a model provider. While OpenCode works with any model provider, we recommend using",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1": "Your data and information is only stored when you create sharable links in OpenCode.",
"download.faq.a6.p2.beforeShare": "Learn more about",
"download.faq.a6.shareLink": "share pages",
"enterprise.title": "OpenCode | Enterprise solutions for your organisation",
"enterprise.meta.description": "Contact OpenCode for enterprise solutions",
"enterprise.hero.title": "Your code is yours",
"enterprise.hero.body1":
"OpenCode operates securely inside your organization with no data or context stored and no licensing restrictions or ownership claims. Start a trial with your team, then deploy it across your organization by integrating it with your SSO and internal AI gateway.",
"enterprise.hero.body2": "Let us know how we can help.",
"enterprise.form.name.label": "Full name",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Role",
"enterprise.form.role.placeholder": "Executive Chairman",
"enterprise.form.company.label": "Company",
"enterprise.form.company.placeholder": "Acme Inc",
"enterprise.form.email.label": "Company email",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Phone number",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.message.label": "What problem are you trying to solve?",
"enterprise.form.message.placeholder": "We need help with...",
"enterprise.form.send": "Send",
"enterprise.form.sending": "Sending...",
"enterprise.form.success": "Message sent, we'll be in touch soon.",
"enterprise.form.success.submitted": "Form submitted successfully.",
"enterprise.form.error.allFieldsRequired": "All fields are required.",
"enterprise.form.error.invalidEmailFormat": "Invalid email format.",
"enterprise.form.error.internalServer": "Internal server error.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "What is OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise is for organizations that want to ensure that their code and data never leaves their infrastructure. It can do this by using a centralized config that integrates with your SSO and internal AI gateway.",
"enterprise.faq.q2": "How do I get started with OpenCode Enterprise?",
"enterprise.faq.a2":
"Simply start with an internal trial with your team. OpenCode by default does not store your code or context data, making it easy to get started. Then contact us to discuss pricing and implementation options.",
"enterprise.faq.q3": "How does enterprise pricing work?",
"enterprise.faq.a3":
"We offer per-seat enterprise pricing. If you have your own LLM gateway, we do not charge for tokens used. For further details, contact us for a custom quote based on your organization's needs.",
"enterprise.faq.q4": "Is my data secure with OpenCode Enterprise?",
"enterprise.faq.a4":
"Yes. OpenCode does not store your code or context data. All processing happens locally or through direct API calls to your AI provider. With central config and SSO integration, your data remains secure within your organization's infrastructure.",
"brand.title": "OpenCode | Brand",
"brand.meta.description": "OpenCode brand guidelines",
"brand.heading": "Brand guidelines",
"brand.subtitle": "Resources and assets to help you work with the OpenCode brand.",
"brand.downloadAll": "Download all assets",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "OpenCode release notes and changelog",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "New updates and improvements to OpenCode",
"changelog.empty": "No changelog entries found.",
"changelog.viewJson": "View JSON",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agent",
"bench.list.table.model": "Model",
"bench.list.table.score": "Score",
"bench.submission.error.allFieldsRequired": "All fields are required.",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Task not found",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "Agent",
"bench.detail.labels.model": "Model",
"bench.detail.labels.task": "Task",
"bench.detail.labels.repo": "Repo",
"bench.detail.labels.from": "From",
"bench.detail.labels.to": "To",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Average Duration",
"bench.detail.labels.averageScore": "Average Score",
"bench.detail.labels.averageCost": "Average Cost",
"bench.detail.labels.summary": "Summary",
"bench.detail.labels.runs": "Runs",
"bench.detail.labels.score": "Score",
"bench.detail.labels.base": "Base",
"bench.detail.labels.penalty": "Penalty",
"bench.detail.labels.weight": "weight",
"bench.detail.table.run": "Run",
"bench.detail.table.score": "Score (Base - Penalty)",
"bench.detail.table.cost": "Cost",
"bench.detail.table.duration": "Duration",
"bench.detail.run.title": "Run {{n}}",
"bench.detail.rawJson": "Raw JSON",
} as const
export type Key = keyof typeof dict
export type Dict = Record<Key, string>

View File

@@ -0,0 +1,826 @@
import type { Dict } from "./en"
import { dict as en } from "./en"
export const dict = {
...en,
"nav.github": "GitHub",
"nav.docs": "Documentación",
"nav.changelog": "Registro de cambios",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "Enterprise",
"nav.zen": "Zen",
"nav.login": "Iniciar sesión",
"nav.free": "Descargar",
"nav.home": "Inicio",
"nav.openMenu": "Abrir menú",
"nav.getStartedFree": "Empezar gratis",
"nav.logoAlt": "OpenCode",
"nav.context.copyLogo": "Copiar logo como SVG",
"nav.context.copyWordmark": "Copiar marca como SVG",
"nav.context.brandAssets": "Activos de marca",
"footer.github": "GitHub",
"footer.docs": "Documentación",
"footer.changelog": "Registro de cambios",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "Marca",
"legal.privacy": "Privacidad",
"legal.terms": "Términos",
"email.title": "Sé el primero en enterarte cuando lancemos nuevos productos",
"email.subtitle": "Únete a la lista de espera para acceso anticipado.",
"email.placeholder": "Dirección de correo",
"email.subscribe": "Suscribirse",
"email.success": "Casi listo, revisa tu bandeja de entrada y confirma tu correo",
"notFound.title": "No encontrado | opencode",
"notFound.heading": "404 - Página no encontrada",
"notFound.home": "Inicio",
"notFound.docs": "Documentación",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"notFound.logoLightAlt": "opencode logo claro",
"notFound.logoDarkAlt": "opencode logo oscuro",
"user.logout": "Cerrar sesión",
"auth.callback.error.codeMissing": "No se encontró código de autorización.",
"workspace.select": "Seleccionar espacio de trabajo",
"workspace.createNew": "+ Crear nuevo espacio de trabajo",
"workspace.modal.title": "Crear nuevo espacio de trabajo",
"workspace.modal.placeholder": "Introduce nombre del espacio de trabajo",
"common.cancel": "Cancelar",
"common.creating": "Creando...",
"common.create": "Crear",
"common.videoUnsupported": "Tu navegador no soporta la etiqueta de video.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "Más información",
"error.invalidPlan": "Plan inválido",
"error.workspaceRequired": "Se requiere ID del espacio de trabajo",
"error.alreadySubscribed": "Este espacio de trabajo ya tiene una suscripción",
"error.limitRequired": "El límite es obligatorio.",
"error.monthlyLimitInvalid": "Establece un límite mensual válido.",
"error.workspaceNameRequired": "El nombre del espacio de trabajo es obligatorio.",
"error.nameTooLong": "El nombre debe tener 255 caracteres o menos.",
"error.emailRequired": "El correo es obligatorio",
"error.roleRequired": "El rol es obligatorio",
"error.idRequired": "El ID es obligatorio",
"error.nameRequired": "El nombre es obligatorio",
"error.providerRequired": "El proveedor es obligatorio",
"error.apiKeyRequired": "La clave de API es obligatoria",
"error.modelRequired": "El modelo es obligatorio",
"error.reloadAmountMin": "La cantidad de recarga debe ser al menos ${{amount}}",
"error.reloadTriggerMin": "El disparador de saldo debe ser al menos ${{amount}}",
"app.meta.description": "OpenCode - El agente de codificación de código abierto.",
"home.title": "OpenCode | El agente de codificación IA de código abierto",
"temp.title": "opencode | Agente de codificación IA creado para la terminal",
"temp.hero.title": "El agente de codificación IA creado para la terminal",
"temp.zen": "opencode zen",
"temp.getStarted": "Empezar",
"temp.feature.native.title": "TUI Nativa",
"temp.feature.native.body": "Una interfaz de terminal responsiva, nativa y personalizable",
"temp.feature.zen.beforeLink": "Una lista",
"temp.feature.zen.link": "seleccionada de modelos",
"temp.feature.zen.afterLink": "proporcionada por opencode",
"temp.feature.models.beforeLink": "Soporta más de 75 proveedores de LLM a través de",
"temp.feature.models.afterLink": ", incluyendo modelos locales",
"temp.screenshot.caption": "opencode TUI con el tema tokyonight",
"temp.screenshot.alt": "opencode TUI con tema tokyonight",
"temp.logoLightAlt": "logo de opencode claro",
"temp.logoDarkAlt": "logo de opencode oscuro",
"home.banner.badge": "Nuevo",
"home.banner.text": "Aplicación de escritorio disponible en beta",
"home.banner.platforms": "en macOS, Windows y Linux",
"home.banner.downloadNow": "Descargar ahora",
"home.banner.downloadBetaNow": "Descargar la beta de escritorio ahora",
"home.hero.title": "El agente de codificación IA de código abierto",
"home.hero.subtitle.a": "Modelos gratuitos incluidos o conecta cualquier modelo de cualquier proveedor,",
"home.hero.subtitle.b": "incluyendo Claude, GPT, Gemini y más.",
"home.install.ariaLabel": "Opciones de instalación",
"home.what.title": "¿Qué es OpenCode?",
"home.what.body":
"OpenCode es un agente de código abierto que te ayuda a escribir código en tu terminal, IDE o escritorio.",
"home.what.lsp.title": "LSP habilitado",
"home.what.lsp.body": "Carga automáticamente los LSPs correctos para el LLM",
"home.what.multiSession.title": "Multi-sesión",
"home.what.multiSession.body": "Inicia múltiples agentes en paralelo en el mismo proyecto",
"home.what.shareLinks.title": "Compartir enlaces",
"home.what.shareLinks.body": "Comparte un enlace a cualquier sesión para referencia o depuración",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Inicia sesión con GitHub para usar tu cuenta de Copilot",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Inicia sesión con OpenAI para usar tu cuenta de ChatGPT Plus o Pro",
"home.what.anyModel.title": "Cualquier modelo",
"home.what.anyModel.body": "Más de 75 proveedores de LLM a través de Models.dev, incluyendo modelos locales",
"home.what.anyEditor.title": "Cualquier editor",
"home.what.anyEditor.body": "Disponible como interfaz de terminal, aplicación de escritorio y extensión de IDE",
"home.what.readDocs": "Leer documentación",
"home.growth.title": "El agente de codificación IA de código abierto",
"home.growth.body":
"Con más de <strong>{{stars}}</strong> estrellas en GitHub, <strong>{{contributors}}</strong> colaboradores y más de <strong>{{commits}}</strong> commits, OpenCode es usado y confiado por más de <strong>{{monthlyUsers}}</strong> desarrolladores cada mes.",
"home.growth.githubStars": "Estrellas en GitHub",
"home.growth.contributors": "Colaboradores",
"home.growth.monthlyDevs": "Desarrolladores Mensuales",
"home.privacy.title": "Creado pensando en la privacidad",
"home.privacy.body":
"OpenCode no almacena tu código ni datos de contexto, para que pueda operar en entornos sensibles a la privacidad.",
"home.privacy.learnMore": "Más información sobre",
"home.privacy.link": "privacidad",
"home.faq.q1": "¿Qué es OpenCode?",
"home.faq.a1":
"OpenCode es un agente de código abierto que te ayuda a escribir y ejecutar código con cualquier modelo de IA. Está disponible como interfaz de terminal, aplicación de escritorio o extensión de IDE.",
"home.faq.q2": "¿Cómo uso OpenCode?",
"home.faq.a2.before": "La forma más fácil de empezar es leer la",
"home.faq.a2.link": "introducción",
"home.faq.q3": "¿Necesito suscripciones extra de IA para usar OpenCode?",
"home.faq.a3.p1":
"No necesariamente, OpenCode viene con un conjunto de modelos gratuitos que puedes usar sin crear una cuenta.",
"home.faq.a3.p2.beforeZen":
"Aparte de estos, puedes usar cualquiera de los modelos de codificación populares creando una cuenta de",
"home.faq.a3.p2.afterZen": ".",
"home.faq.a3.p3":
"Aunque animamos a los usuarios a usar Zen, OpenCode también funciona con todos los proveedores populares como OpenAI, Anthropic, xAI, etc.",
"home.faq.a3.p4.beforeLocal": "Incluso puedes conectar tus",
"home.faq.a3.p4.localLink": "modelos locales",
"home.faq.q4": "¿Puedo usar mis suscripciones de IA existentes con OpenCode?",
"home.faq.a4.p1":
"Sí, OpenCode soporta planes de suscripción de los principales proveedores. Puedes usar tus suscripciones de Claude Pro/Max, ChatGPT Plus/Pro o GitHub Copilot.",
"home.faq.q5": "¿Solo puedo usar OpenCode en la terminal?",
"home.faq.a5.beforeDesktop": "¡Ya no! OpenCode ahora está disponible como una aplicación para tu",
"home.faq.a5.desktop": "escritorio",
"home.faq.a5.and": "y",
"home.faq.a5.web": "web",
"home.faq.q6": "¿Cuánto cuesta OpenCode?",
"home.faq.a6":
"OpenCode es 100% gratuito de usar. También viene con un conjunto de modelos gratuitos. Puede haber costos adicionales si conectas cualquier otro proveedor.",
"home.faq.q7": "¿Qué hay sobre datos y privacidad?",
"home.faq.a7.p1":
"Tus datos e información solo se almacenan cuando usas nuestros modelos gratuitos o creas enlaces compartibles.",
"home.faq.a7.p2.beforeModels": "Más información sobre",
"home.faq.a7.p2.modelsLink": "nuestros modelos",
"home.faq.a7.p2.and": "y",
"home.faq.a7.p2.shareLink": "páginas compartidas",
"home.faq.q8": "¿Es OpenCode de código abierto?",
"home.faq.a8.p1": "Sí, OpenCode es totalmente de código abierto. El código fuente es público en",
"home.faq.a8.p2": "bajo la",
"home.faq.a8.mitLicense": "Licencia MIT",
"home.faq.a8.p3":
", lo que significa que cualquiera puede usar, modificar o contribuir a su desarrollo. Cualquiera de la comunidad puede abrir problemas, enviar solicitudes de extracción y extender la funcionalidad.",
"home.zenCta.title": "Accede a modelos optimizados y confiables para agentes de codificación",
"home.zenCta.body":
"Zen te da acceso a un conjunto seleccionado de modelos de IA que OpenCode ha probado y evaluado específicamente para agentes de codificación. No necesitas preocuparte por el rendimiento y la calidad inconsistentes entre proveedores, usa modelos validados que funcionan.",
"home.zenCta.link": "Aprende sobre Zen",
"zen.title":
"OpenCode Zen | Un conjunto seleccionado de modelos optimizados y confiables para agentes de codificación",
"zen.hero.title": "Modelos optimizados y confiables para agentes de codificación",
"zen.hero.body":
"Zen te da acceso a un conjunto seleccionado de modelos de IA que OpenCode ha probado y evaluado específicamente para agentes de codificación. No necesitas preocuparte por el rendimiento y la calidad inconsistentes, usa modelos validados que funcionan.",
"zen.faq.q1": "¿Qué es OpenCode Zen?",
"zen.faq.a1":
"Zen es un conjunto seleccionado de modelos de IA probados y evaluados para agentes de codificación, creado por el equipo detrás de OpenCode.",
"zen.faq.q2": "¿Qué hace a Zen más preciso?",
"zen.faq.a2":
"Zen solo proporciona modelos que han sido específicamente probados y evaluados para agentes de codificación. No usarías un cuchillo de mantequilla para cortar carne, no uses modelos pobres para codificar.",
"zen.faq.q3": "¿Es Zen más barato?",
"zen.faq.a3":
"Zen no tiene fines de lucro. Zen te transfiere los costos de los proveedores de modelos. Cuanto mayor sea el uso de Zen, más podrá OpenCode negociar mejores tarifas y transferírtelas.",
"zen.faq.q4": "¿Cuánto cuesta Zen?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "cobra por solicitud",
"zen.faq.a4.p1.afterPricing": "sin recargos, así que pagas exactamente lo que cobra el proveedor del modelo.",
"zen.faq.a4.p2.beforeAccount": "Tu costo total depende del uso, y puedes establecer límites de gasto mensuales en tu",
"zen.faq.a4.p2.accountLink": "cuenta",
"zen.faq.a4.p3":
"Para cubrir costos, OpenCode añade solo una pequeña tarifa de procesamiento de pagos de $1.23 por cada recarga de saldo de $20.",
"zen.faq.q5": "¿Qué hay sobre datos y privacidad?",
"zen.faq.a5.beforeExceptions":
"Todos los modelos Zen están alojados en EE. UU. Los proveedores siguen una política de cero retención y no usan tus datos para entrenamiento de modelos, con las",
"zen.faq.a5.exceptionsLink": "siguientes excepciones",
"zen.faq.q6": "¿Puedo establecer límites de gasto?",
"zen.faq.a6": "Sí, puedes establecer límites de gasto mensuales en tu cuenta.",
"zen.faq.q7": "¿Puedo cancelar?",
"zen.faq.a7": "Sí, puedes deshabilitar la facturación en cualquier momento y usar tu saldo restante.",
"zen.faq.q8": "¿Puedo usar Zen con otros agentes de codificación?",
"zen.faq.a8":
"Aunque Zen funciona genial con OpenCode, puedes usar Zen con cualquier agente. Sigue las instrucciones de configuración en tu agente de codificación preferido.",
"zen.cta.start": "Empieza con Zen",
"zen.pricing.title": "Añade $20 de saldo prepago",
"zen.pricing.fee": "(+$1.23 tarifa de procesamiento de tarjeta)",
"zen.pricing.body": "Úsalo con cualquier agente. Establece límites de gasto mensual. Cancela en cualquier momento.",
"zen.problem.title": "¿Qué problema está resolviendo Zen?",
"zen.problem.body":
"Hay muchos modelos disponibles, pero solo unos pocos funcionan bien con agentes de codificación. La mayoría de los proveedores los configuran de manera diferente con resultados variables.",
"zen.problem.subtitle": "Estamos arreglando esto para todos, no solo para usuarios de OpenCode.",
"zen.problem.item1": "Probando modelos seleccionados y consultando a sus equipos",
"zen.problem.item2": "Trabajando con proveedores para asegurar que se entreguen correctamente",
"zen.problem.item3": "Evaluando todas las combinaciones modelo-proveedor que recomendamos",
"zen.how.title": "Cómo funciona Zen",
"zen.how.body": "Aunque sugerimos usar Zen con OpenCode, puedes usar Zen con cualquier agente.",
"zen.how.step1.title": "Regístrate y añade $20 de saldo",
"zen.how.step1.beforeLink": "sigue las",
"zen.how.step1.link": "instrucciones de configuración",
"zen.how.step2.title": "Usa Zen con precios transparentes",
"zen.how.step2.link": "paga por solicitud",
"zen.how.step2.afterLink": "con cero recargos",
"zen.how.step3.title": "Auto-recarga",
"zen.how.step3.body": "cuando tu saldo alcance $5 añadiremos automáticamente $20",
"zen.privacy.title": "Tu privacidad es importante para nosotros",
"zen.privacy.beforeExceptions":
"Todos los modelos Zen están alojados en EE. UU. Los proveedores siguen una política de cero retención y no usan tus datos para entrenamiento de modelos, con las",
"zen.privacy.exceptionsLink": "siguientes excepciones",
"go.title": "OpenCode Go | Modelos de programación de bajo coste para todos",
"go.meta.description":
"Go comienza en $5 el primer mes, luego 10 $/mes, con generosos límites de solicitudes de 5 horas para GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro y DeepSeek V4 Flash.",
"go.hero.title": "Modelos de programación de bajo coste para todos",
"go.hero.body":
"Go lleva la programación agéntica a programadores de todo el mundo. Ofrece límites generosos y acceso fiable a los modelos de código abierto más capaces, para que puedas crear con agentes potentes sin preocuparte por el coste o la disponibilidad.",
"go.cta.start": "Suscribirse a Go",
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "Suscribirse a Go",
"go.cta.price": "10 $/mes",
"go.cta.promo": "$5 el primer mes",
"go.pricing.body":
"Úsalo con cualquier agente. $5 el primer mes, luego 10 $/mes. Recarga crédito si es necesario. Cancela en cualquier momento.",
"go.graph.free": "Gratis",
"go.graph.freePill": "Big Pickle y modelos gratuitos",
"go.graph.go": "Go",
"go.graph.label": "Solicitudes por 5 horas",
"go.graph.usageLimits": "Límites de uso",
"go.graph.tick": "{{n}}x",
"go.graph.aria": "Solicitudes por 5h: {{free}} vs {{go}}",
"go.testimonials.brand.zen": "Zen",
"go.testimonials.brand.go": "Go",
"go.testimonials.handle": "@OpenCode",
"go.testimonials.dax.name": "Dax Raad",
"go.testimonials.dax.title": "ex-CEO, Terminal Products",
"go.testimonials.dax.quoteAfter": "ha cambiado mi vida, es realmente una obviedad.",
"go.testimonials.jay.name": "Jay V",
"go.testimonials.jay.title": "ex-Founder, SEED, PM, Melt, Pop, Dapt, Cadmus, and ViewPoint",
"go.testimonials.jay.quoteBefore": "A 4 de cada 5 personas en nuestro equipo les encanta usar",
"go.testimonials.jay.quoteAfter": ".",
"go.testimonials.adam.name": "Adam Elmore",
"go.testimonials.adam.title": "ex-Hero, AWS",
"go.testimonials.adam.quoteBefore": "No puedo recomendar",
"go.testimonials.adam.quoteAfter": "lo suficiente. En serio, es realmente bueno.",
"go.testimonials.david.name": "David Hill",
"go.testimonials.david.title": "ex-Head of Design, Laravel",
"go.testimonials.david.quoteBefore": "Con",
"go.testimonials.david.quoteAfter":
"sé que todos los modelos están probados y son perfectos para agentes de programación.",
"go.testimonials.frank.name": "Frank Wang",
"go.testimonials.frank.title": "ex-Intern, Nvidia (4 times)",
"go.testimonials.frank.quote": "Ojalá siguiera en Nvidia.",
"go.problem.title": "¿Qué problema resuelve Go?",
"go.problem.body":
"Nos enfocamos en llevar la experiencia de OpenCode a tantas personas como sea posible. OpenCode Go es una suscripción de bajo coste: $5 el primer mes, luego 10 $/mes. Proporciona límites generosos y acceso fiable a los modelos de código abierto más capaces.",
"go.problem.subtitle": " ",
"go.problem.item1": "Precios de suscripción de bajo coste",
"go.problem.item2": "Límites generosos y acceso fiable",
"go.problem.item3": "Creado para tantos programadores como sea posible",
"go.problem.item4":
"Incluye GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro y DeepSeek V4 Flash",
"go.how.title": "Cómo funciona Go",
"go.how.body": "Go comienza en $5 el primer mes, luego 10 $/mes. Puedes usarlo con OpenCode o cualquier agente.",
"go.how.step1.title": "Crear una cuenta",
"go.how.step1.beforeLink": "sigue las",
"go.how.step1.link": "instrucciones de configuración",
"go.how.step2.title": "Suscribirse a Go",
"go.how.step2.link": "$5 el primer mes",
"go.how.step2.afterLink": "luego 10 $/mes con límites generosos",
"go.how.step3.title": "Empezar a programar",
"go.how.step3.body": "con acceso fiable a modelos de código abierto",
"go.privacy.title": "Tu privacidad es importante para nosotros",
"go.privacy.body":
"El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., UE y Singapur para un acceso global estable.",
"go.privacy.contactAfter": "si tienes alguna pregunta.",
"go.privacy.beforeExceptions":
"Los modelos de Go están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos, con las",
"go.privacy.exceptionsLink": "siguientes excepciones",
"go.faq.q1": "¿Qué es OpenCode Go?",
"go.faq.a1":
"Go es una suscripción de bajo coste que te da acceso fiable a modelos de código abierto capaces para programación agéntica.",
"go.faq.q2": "¿Qué modelos incluye Go?",
"go.faq.a2": "Go incluye los modelos que se indican abajo, con límites generosos y acceso confiable.",
"go.faq.q3": "¿Es Go lo mismo que Zen?",
"go.faq.a3":
"No. Zen es pago por uso, mientras que Go comienza en $5 el primer mes, luego 10 $/mes, con límites generosos y acceso fiable a los modelos de código abierto GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro y DeepSeek V4 Flash.",
"go.faq.q4": "¿Cuánto cuesta Go?",
"go.faq.a4.p1.beforePricing": "Go cuesta",
"go.faq.a4.p1.pricingLink": "$5 el primer mes",
"go.faq.a4.p1.afterPricing": "luego 10 $/mes con límites generosos.",
"go.faq.a4.p2.beforeAccount": "Puedes gestionar tu suscripción en tu",
"go.faq.a4.p2.accountLink": "cuenta",
"go.faq.a4.p3": "Cancela en cualquier momento.",
"go.faq.q5": "¿Qué pasa con los datos y la privacidad?",
"go.faq.a5.body":
"El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., UE y Singapur para un acceso global estable. Nuestros proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos.",
"go.faq.a5.beforeExceptions":
"Los modelos de Go están alojados en EE. UU. Los proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos, con las",
"go.faq.a5.exceptionsLink": "siguientes excepciones",
"go.faq.q6": "¿Puedo recargar crédito?",
"go.faq.a6": "Si necesitas más uso, puedes recargar crédito en tu cuenta.",
"go.faq.q7": "¿Puedo cancelar?",
"go.faq.a7": "Sí, puedes cancelar en cualquier momento.",
"go.faq.q8": "¿Puedo usar Go con otros agentes de programación?",
"go.faq.a8":
"Sí, puedes usar Go con cualquier agente. Sigue las instrucciones de configuración en tu agente de programación preferido.",
"go.faq.q9": "¿Cuál es la diferencia entre los modelos gratuitos y Go?",
"go.faq.a9":
"Los modelos gratuitos incluyen Big Pickle más modelos promocionales disponibles en el momento, con una cuota de 200 solicitudes/día. Go incluye GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro y DeepSeek V4 Flash con cuotas de solicitud más altas aplicadas a través de ventanas móviles (5 horas, semanal y mensual), aproximadamente equivalente a 12 $ por 5 horas, 30 $ por semana y 60 $ por mes (los recuentos reales de solicitudes varían según el modelo y el uso).",
"zen.api.error.rateLimitExceeded": "Límite de tasa excedido. Por favor, inténtalo de nuevo más tarde.",
"zen.api.error.modelNotSupported": "Modelo {{model}} no soportado",
"zen.api.error.modelFormatNotSupported": "Modelo {{model}} no soportado para el formato {{format}}",
"zen.api.error.noProviderAvailable": "Ningún proveedor disponible",
"zen.api.error.providerNotSupported": "Proveedor {{provider}} no soportado",
"zen.api.error.missingApiKey": "Falta la clave API.",
"zen.api.error.invalidApiKey": "Clave API inválida.",
"zen.api.error.subscriptionQuotaExceeded": "Cuota de suscripción excedida. Reintenta en {{retryIn}}.",
"zen.api.error.goSubscriptionRollingLimitExceeded":
"Límite de uso de 5 horas alcanzado. Se restablece en {{retryIn}}. Para seguir usando este modelo ahora, habilita el uso desde tu saldo disponible: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionWeeklyLimitExceeded":
"Límite de uso semanal alcanzado. Se restablece en {{retryIn}}. Para seguir usando este modelo ahora, habilita el uso desde tu saldo disponible: {{consoleGoUrl}}",
"zen.api.error.goSubscriptionMonthlyLimitExceeded":
"Límite de uso mensual alcanzado. Se restablece en {{retryIn}}. Para seguir usando este modelo ahora, habilita el uso desde tu saldo disponible: {{consoleGoUrl}}",
"zen.api.error.noPaymentMethod": "Sin método de pago. Añade un método de pago aquí: {{billingUrl}}",
"zen.api.error.insufficientBalance": "Saldo insuficiente. Gestiona tu facturación aquí: {{billingUrl}}",
"zen.api.error.workspaceMonthlyLimitReached":
"Tu espacio de trabajo ha alcanzado su límite de gasto mensual de ${{amount}}. Gestiona tus límites aquí: {{billingUrl}}",
"zen.api.error.userMonthlyLimitReached":
"Has alcanzado tu límite de gasto mensual de ${{amount}}. Gestiona tus límites aquí: {{membersUrl}}",
"zen.api.error.modelDisabled": "El modelo está deshabilitado",
"zen.api.error.trialEnded":
"La promoción gratuita de {{model}} ha finalizado. Puedes seguir usando el modelo suscribiéndote a OpenCode Go - {{link}}",
"black.meta.title": "OpenCode Black | Accede a los mejores modelos de codificación del mundo",
"black.meta.description": "Obtén acceso a Claude, GPT, Gemini y más con los planes de suscripción de OpenCode Black.",
"black.hero.title": "Accede a los mejores modelos de codificación del mundo",
"black.hero.subtitle": "Incluyendo Claude, GPT, Gemini y más",
"black.title": "OpenCode Black | Precios",
"black.paused": "La inscripción al plan Black está temporalmente pausada.",
"black.plan.icon20": "Plan Black 20",
"black.plan.icon100": "Plan Black 100",
"black.plan.icon200": "Plan Black 200",
"black.plan.multiplier100": "5x más uso que Black 20",
"black.plan.multiplier200": "20x más uso que Black 20",
"black.price.perMonth": "al mes",
"black.price.perPersonBilledMonthly": "por persona facturado mensualmente",
"black.terms.1": "Tu suscripción no comenzará inmediatamente",
"black.terms.2": "Serás añadido a la lista de espera y activado pronto",
"black.terms.3": "Tu tarjeta solo se cargará cuando tu suscripción se active",
"black.terms.4": "Aplican límites de uso, el uso fuertemente automatizado puede alcanzar los límites antes",
"black.terms.5": "Las suscripciones son para individuos, contacta a Enterprise para equipos",
"black.terms.6": "Los límites pueden ajustarse y los planes pueden discontinuarse en el futuro",
"black.terms.7": "Cancela tu suscripción en cualquier momento",
"black.action.continue": "Continuar",
"black.finePrint.beforeTerms": "Los precios mostrados no incluyen impuestos aplicables",
"black.finePrint.terms": "Términos de Servicio",
"black.workspace.title": "OpenCode Black | Seleccionar Espacio de Trabajo",
"black.workspace.selectPlan": "Selecciona un espacio de trabajo para este plan",
"black.workspace.name": "Espacio de trabajo {{n}}",
"black.subscribe.title": "Suscribirse a OpenCode Black",
"black.subscribe.paymentMethod": "Método de pago",
"black.subscribe.loadingPaymentForm": "Cargando formulario de pago...",
"black.subscribe.selectWorkspaceToContinue": "Selecciona un espacio de trabajo para continuar",
"black.subscribe.failurePrefix": "¡Oh no!",
"black.subscribe.error.generic": "Ocurrió un error",
"black.subscribe.error.invalidPlan": "Plan inválido",
"black.subscribe.error.workspaceRequired": "Se requiere ID del espacio de trabajo",
"black.subscribe.error.alreadySubscribed": "Este espacio de trabajo ya tiene una suscripción",
"black.subscribe.processing": "Procesando...",
"black.subscribe.submit": "Suscribirse ${{plan}}",
"black.subscribe.form.chargeNotice": "Solo se te cobrará cuando tu suscripción se active",
"black.subscribe.success.title": "Estás en la lista de espera de OpenCode Black",
"black.subscribe.success.subscriptionPlan": "Plan de suscripción",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Cantidad",
"black.subscribe.success.amountValue": "${{plan}} al mes",
"black.subscribe.success.paymentMethod": "Método de pago",
"black.subscribe.success.dateJoined": "Fecha de unión",
"black.subscribe.success.chargeNotice": "Tu tarjeta se cargará cuando tu suscripción se active",
"workspace.nav.zen": "Zen",
"workspace.nav.go": "Go",
"workspace.nav.usage": "Uso",
"workspace.nav.apiKeys": "Claves API",
"workspace.nav.members": "Miembros",
"workspace.nav.billing": "Facturación",
"workspace.nav.settings": "Configuración",
"workspace.home.banner.beforeLink": "Modelos optimizados y confiables para agentes de codificación.",
"workspace.lite.banner.beforeLink": "Modelos de codificación de bajo costo para todos.",
"workspace.home.billing.loading": "Cargando...",
"workspace.home.billing.enable": "Habilitar facturación",
"workspace.home.billing.currentBalance": "Saldo actual",
"workspace.newUser.feature.tested.title": "Modelos Probados y Verificados",
"workspace.newUser.feature.tested.body":
"Hemos evaluado y probado modelos específicamente para agentes de codificación para asegurar el mejor rendimiento.",
"workspace.newUser.feature.quality.title": "Máxima Calidad",
"workspace.newUser.feature.quality.body":
"Accede a modelos configurados para un rendimiento óptimo - sin degradaciones ni enrutamiento a proveedores más baratos.",
"workspace.newUser.feature.lockin.title": "Sin Bloqueo",
"workspace.newUser.feature.lockin.body":
"Usa Zen con cualquier agente de codificación, y continúa usando otros proveedores con opencode cuando quieras.",
"workspace.newUser.copyApiKey": "Copiar clave API",
"workspace.newUser.copyKey": "Copiar Clave",
"workspace.newUser.copied": "¡Copiada!",
"workspace.newUser.step.enableBilling": "Habilitar facturación",
"workspace.newUser.step.login.before": "Ejecuta",
"workspace.newUser.step.login.after": "y selecciona opencode",
"workspace.newUser.step.pasteKey": "Pega tu clave API",
"workspace.newUser.step.models.before": "Inicia opencode y ejecuta",
"workspace.newUser.step.models.after": "para seleccionar un modelo",
"workspace.models.title": "Modelos",
"workspace.models.subtitle.beforeLink": "Gestiona qué modelos pueden acceder los miembros del espacio de trabajo.",
"workspace.models.table.model": "Modelo",
"workspace.models.table.enabled": "Habilitado",
"workspace.providers.title": "Trae Tu Propia Clave",
"workspace.providers.subtitle": "Configura tus propias claves API de proveedores de IA.",
"workspace.providers.placeholder": "Introduce clave API de {{provider}} ({{prefix}}...)",
"workspace.providers.configure": "Configurar",
"workspace.providers.edit": "Editar",
"workspace.providers.delete": "Eliminar",
"workspace.providers.saving": "Guardando...",
"workspace.providers.save": "Guardar",
"workspace.providers.table.provider": "Proveedor",
"workspace.providers.table.apiKey": "Clave API",
"workspace.usage.title": "Historial de Uso",
"workspace.usage.subtitle": "Uso reciente de API y costos.",
"workspace.usage.empty": "Haz tu primera llamada a la API para empezar.",
"workspace.usage.table.date": "Fecha",
"workspace.usage.table.model": "Modelo",
"workspace.usage.table.input": "Entrada",
"workspace.usage.table.output": "Salida",
"workspace.usage.table.cost": "Costo",
"workspace.usage.table.session": "Sesión",
"workspace.usage.breakdown.input": "Entrada",
"workspace.usage.breakdown.cacheRead": "Lectura de Caché",
"workspace.usage.breakdown.cacheWrite": "Escritura de Caché",
"workspace.usage.breakdown.output": "Salida",
"workspace.usage.breakdown.reasoning": "Razonamiento",
"workspace.usage.subscription": "Black (${{amount}})",
"workspace.usage.lite": "Go (${{amount}})",
"workspace.usage.byok": "BYOK (${{amount}})",
"workspace.cost.title": "Costo",
"workspace.cost.subtitle": "Costos de uso desglosados por modelo.",
"workspace.cost.allModels": "Todos los Modelos",
"workspace.cost.allKeys": "Todas las Claves",
"workspace.cost.deletedSuffix": "(eliminado)",
"workspace.cost.empty": "No hay datos de uso disponibles para el periodo seleccionado.",
"workspace.cost.subscriptionShort": "sub",
"workspace.keys.title": "Claves API",
"workspace.keys.subtitle": "Gestiona tus claves API para acceder a los servicios de opencode.",
"workspace.keys.create": "Crear Clave API",
"workspace.keys.placeholder": "Introduce nombre de la clave",
"workspace.keys.empty": "Crea una clave API de opencode Gateway",
"workspace.keys.table.name": "Nombre",
"workspace.keys.table.key": "Clave",
"workspace.keys.table.createdBy": "Creado Por",
"workspace.keys.table.lastUsed": "Último Uso",
"workspace.keys.copyApiKey": "Copiar clave API",
"workspace.keys.delete": "Eliminar",
"workspace.members.title": "Miembros",
"workspace.members.subtitle": "Gestiona miembros del espacio de trabajo y sus permisos.",
"workspace.members.invite": "Invitar Miembro",
"workspace.members.inviting": "Invitando...",
"workspace.members.beta.beforeLink": "Los espacios de trabajo son gratuitos para equipos durante la beta.",
"workspace.members.form.invitee": "Invitado",
"workspace.members.form.emailPlaceholder": "Introduce correo",
"workspace.members.form.role": "Rol",
"workspace.members.form.monthlyLimit": "Límite de gasto mensual",
"workspace.members.noLimit": "Sin límite",
"workspace.members.noLimitLowercase": "sin límite",
"workspace.members.invited": "invitado",
"workspace.members.edit": "Editar",
"workspace.members.delete": "Eliminar",
"workspace.members.saving": "Guardando...",
"workspace.members.save": "Guardar",
"workspace.members.table.email": "Correo",
"workspace.members.table.role": "Rol",
"workspace.members.table.monthLimit": "Límite mensual",
"workspace.members.role.admin": "Administrador",
"workspace.members.role.adminDescription": "Puede gestionar modelos, miembros y facturación",
"workspace.members.role.member": "Miembro",
"workspace.members.role.memberDescription": "Solo puede generar claves API para sí mismo",
"workspace.settings.title": "Configuración",
"workspace.settings.subtitle": "Actualiza el nombre de tu espacio de trabajo y preferencias.",
"workspace.settings.workspaceName": "Nombre del espacio de trabajo",
"workspace.settings.defaultName": "Por defecto",
"workspace.settings.updating": "Actualizando...",
"workspace.settings.save": "Guardar",
"workspace.settings.edit": "Editar",
"workspace.billing.title": "Facturación",
"workspace.billing.subtitle.beforeLink": "Gestionar métodos de pago.",
"workspace.billing.contactUs": "Contáctanos",
"workspace.billing.subtitle.afterLink": "si tienes alguna pregunta.",
"workspace.billing.currentBalance": "Saldo Actual",
"workspace.billing.add": "Añadir $",
"workspace.billing.enterAmount": "Introduce cantidad",
"workspace.billing.loading": "Cargando...",
"workspace.billing.addAction": "Añadir",
"workspace.billing.addBalance": "Añadir Saldo",
"workspace.billing.alipay": "Alipay",
"workspace.billing.wechat": "WeChat Pay",
"workspace.billing.linkedToStripe": "Vinculado con Stripe",
"workspace.billing.manage": "Gestionar",
"workspace.billing.enable": "Habilitar Facturación",
"workspace.monthlyLimit.title": "Límite Mensual",
"workspace.monthlyLimit.subtitle": "Establece un límite de uso mensual para tu cuenta.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Estableciendo...",
"workspace.monthlyLimit.set": "Establecer",
"workspace.monthlyLimit.edit": "Editar Límite",
"workspace.monthlyLimit.noLimit": "Sin límite de uso establecido.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "Uso actual para",
"workspace.monthlyLimit.currentUsage.beforeAmount": "es $",
"workspace.redeem.title": "Canjear cupón",
"workspace.redeem.subtitle": "Canjea un código de cupón para obtener crédito o beneficios.",
"workspace.redeem.placeholder": "Introduce el código del cupón",
"workspace.redeem.redeem": "Canjear",
"workspace.redeem.redeeming": "Canjeando...",
"workspace.redeem.success": "Cupón canjeado correctamente.",
"workspace.reload.title": "Auto Recarga",
"workspace.reload.disabled.before": "La auto recarga está",
"workspace.reload.disabled.state": "deshabilitada",
"workspace.reload.disabled.after": "Habilita para recargar automáticamente cuando el saldo sea bajo.",
"workspace.reload.enabled.before": "La auto recarga está",
"workspace.reload.enabled.state": "habilitada",
"workspace.reload.enabled.middle": "Recargaremos",
"workspace.reload.processingFee": "tarifa de procesamiento",
"workspace.reload.enabled.after": "cuando el saldo alcance",
"workspace.reload.edit": "Editar",
"workspace.reload.enable": "Habilitar",
"workspace.reload.enableAutoReload": "Habilitar Auto Recarga",
"workspace.reload.reloadAmount": "Recargar $",
"workspace.reload.whenBalanceReaches": "Cuando el saldo alcance $",
"workspace.reload.saving": "Guardando...",
"workspace.reload.save": "Guardar",
"workspace.reload.failedAt": "La recarga falló en",
"workspace.reload.reason": "Razón:",
"workspace.reload.updatePaymentMethod": "Por favor actualiza tu método de pago e intenta de nuevo.",
"workspace.reload.retrying": "Reintentando...",
"workspace.reload.retry": "Reintentar",
"workspace.reload.error.paymentFailed": "El pago falló.",
"workspace.payments.title": "Historial de Pagos",
"workspace.payments.subtitle": "Transacciones de pago recientes.",
"workspace.payments.table.date": "Fecha",
"workspace.payments.table.paymentId": "ID de Pago",
"workspace.payments.table.amount": "Cantidad",
"workspace.payments.table.receipt": "Recibo",
"workspace.payments.type.credit": "crédito",
"workspace.payments.type.subscription": "suscripción",
"workspace.payments.view": "Ver",
"workspace.black.loading": "Cargando...",
"workspace.black.time.day": "día",
"workspace.black.time.days": "días",
"workspace.black.time.hour": "hora",
"workspace.black.time.hours": "horas",
"workspace.black.time.minute": "minuto",
"workspace.black.time.minutes": "minutos",
"workspace.black.time.fewSeconds": "unos pocos segundos",
"workspace.black.subscription.title": "Suscripción",
"workspace.black.subscription.message": "Estás suscrito a OpenCode Black por ${{plan}} al mes.",
"workspace.black.subscription.manage": "Gestionar Suscripción",
"workspace.black.subscription.rollingUsage": "Uso de 5 horas",
"workspace.black.subscription.weeklyUsage": "Uso Semanal",
"workspace.black.subscription.resetsIn": "Se reinicia en",
"workspace.black.subscription.useBalance": "Usa tu saldo disponible después de alcanzar los límites de uso",
"workspace.black.waitlist.title": "Lista de Espera",
"workspace.black.waitlist.joined": "Estás en la lista de espera para el plan OpenCode Black de ${{plan}} al mes.",
"workspace.black.waitlist.ready": "Estamos listos para inscribirte en el plan OpenCode Black de ${{plan}} al mes.",
"workspace.black.waitlist.leave": "Abandonar Lista de Espera",
"workspace.black.waitlist.leaving": "Abandonando...",
"workspace.black.waitlist.left": "Abandonada",
"workspace.black.waitlist.enroll": "Inscribirse",
"workspace.black.waitlist.enrolling": "Inscribiéndose...",
"workspace.black.waitlist.enrolled": "Inscrito",
"workspace.black.waitlist.enrollNote":
"Cuando haces clic en Inscribirse, tu suscripción comienza inmediatamente y se cargará a tu tarjeta.",
"workspace.lite.loading": "Cargando...",
"workspace.lite.time.day": "día",
"workspace.lite.time.days": "días",
"workspace.lite.time.hour": "hora",
"workspace.lite.time.hours": "horas",
"workspace.lite.time.minute": "minuto",
"workspace.lite.time.minutes": "minutos",
"workspace.lite.time.fewSeconds": "unos pocos segundos",
"workspace.lite.subscription.message": "Estás suscrito a OpenCode Go.",
"workspace.lite.subscription.manage": "Gestionar Suscripción",
"workspace.lite.subscription.rollingUsage": "Uso Continuo",
"workspace.lite.subscription.weeklyUsage": "Uso Semanal",
"workspace.lite.subscription.monthlyUsage": "Uso Mensual",
"workspace.lite.subscription.resetsIn": "Se reinicia en",
"workspace.lite.subscription.useBalance": "Usa tu saldo disponible después de alcanzar los límites de uso",
"workspace.lite.subscription.selectProvider":
'Selecciona "OpenCode Go" como proveedor en tu configuración de opencode para usar los modelos Go.',
"workspace.lite.black.message":
"Actualmente estás suscrito a OpenCode Black o estás en la lista de espera. Por favor, cancela la suscripción primero si deseas cambiar a Go.",
"workspace.lite.other.message":
"Otro miembro de este espacio de trabajo ya está suscrito a OpenCode Go. Solo un miembro por espacio de trabajo puede suscribirse.",
"workspace.lite.promo.description":
"OpenCode Go comienza en {{price}}, luego $10/mes, y ofrece acceso confiable a modelos de codificación abiertos populares con límites de uso generosos.",
"workspace.lite.promo.price": "$5 el primer mes",
"workspace.lite.promo.modelsTitle": "Qué incluye",
"workspace.lite.promo.footer":
"El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., la UE y Singapur para un acceso global estable. Los precios y los límites de uso pueden cambiar a medida que aprendemos del uso inicial y los comentarios.",
"workspace.lite.promo.subscribe": "Suscribirse a Go",
"workspace.lite.promo.subscribing": "Redirigiendo...",
"workspace.lite.promo.otherMethods": "Otros métodos de pago",
"workspace.lite.promo.selectMethod": "Seleccionar método de pago",
"workspace.referral.copyLink": "Copiar enlace",
"workspace.referral.copied": "Copiado",
"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": "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",
"workspace.referral.apply.confirmBody": "Aplica {{amount}} para reducir el uso actual de este workspace.",
"workspace.referral.apply.confirmAction": "Aplicar",
"download.title": "OpenCode | Descargar",
"download.meta.description": "Descarga OpenCode para macOS, Windows y Linux",
"download.hero.title": "Descargar OpenCode",
"download.hero.subtitle": "Disponible en Beta para macOS, Windows y Linux",
"download.hero.button": "Descargar para {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Beta)",
"download.section.extensions": "Extensiones OpenCode",
"download.section.integrations": "Integraciones OpenCode",
"download.action.download": "Descargar",
"download.action.install": "Instalar",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"No necesariamente, pero probablemente. Necesitarás una suscripción de IA si quieres conectar OpenCode a un proveedor de pago, aunque puedes trabajar con",
"download.faq.a3.localLink": "modelos locales",
"download.faq.a3.afterLocal.beforeZen": "gratis. Aunque animamos a los usuarios a usar",
"download.faq.a3.afterZen":
", OpenCode funciona con todos los proveedores populares como OpenAI, Anthropic, xAI, etc.",
"download.faq.a5.p1": "OpenCode es 100% gratuito de usar.",
"download.faq.a5.p2.beforeZen":
"Cualquier costo adicional vendrá de tu suscripción a un proveedor de modelos. Aunque OpenCode funciona con cualquier proveedor de modelos, recomendamos usar",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1": "Tus datos e información solo se almacenan cuando creas enlaces compartibles en OpenCode.",
"download.faq.a6.p2.beforeShare": "Más información sobre",
"download.faq.a6.shareLink": "páginas compartidas",
"enterprise.title": "OpenCode | Soluciones empresariales para tu organización",
"enterprise.meta.description": "Contacta a OpenCode para soluciones empresariales",
"enterprise.hero.title": "Tu código es tuyo",
"enterprise.hero.body1":
"OpenCode opera de forma segura dentro de tu organización sin almacenar datos ni contexto, y sin restricciones de licencia ni reclamaciones de propiedad. Inicia una prueba con tu equipo, luego despliégalo en toda tu organización integrándolo con tu SSO y pasarela de IA interna.",
"enterprise.hero.body2": "Déjanos saber cómo podemos ayudar.",
"enterprise.form.name.label": "Nombre completo",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Rol",
"enterprise.form.role.placeholder": "Presidente Ejecutivo",
"enterprise.form.company.label": "Empresa",
"enterprise.form.company.placeholder": "Acme Inc",
"enterprise.form.email.label": "Correo de empresa",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Teléfono",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.message.label": "¿Qué problema estás intentando resolver?",
"enterprise.form.message.placeholder": "Necesitamos ayuda con...",
"enterprise.form.send": "Enviar",
"enterprise.form.sending": "Enviando...",
"enterprise.form.success": "Mensaje enviado, estaremos en contacto pronto.",
"enterprise.form.success.submitted": "Formulario enviado con éxito.",
"enterprise.form.error.allFieldsRequired": "Todos los campos son obligatorios.",
"enterprise.form.error.invalidEmailFormat": "Formato de correo inválido.",
"enterprise.form.error.internalServer": "Error interno del servidor.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "¿Qué es OpenCode Enterprise?",
"enterprise.faq.a1":
"OpenCode Enterprise es para organizaciones que quieren asegurar que su código y datos nunca salgan de su infraestructura. Puede hacer esto usando una configuración centralizada que se integra con tu SSO y pasarela de IA interna.",
"enterprise.faq.q2": "¿Cómo empiezo con OpenCode Enterprise?",
"enterprise.faq.a2":
"Simplemente empieza con una prueba interna con tu equipo. OpenCode por defecto no almacena tu código ni datos de contexto, haciendo fácil empezar. Luego contáctanos para discutir precios y opciones de implementación.",
"enterprise.faq.q3": "¿Cómo funciona el precio para empresas?",
"enterprise.faq.a3":
"Ofrecemos precios empresariales por asiento. Si tienes tu propia pasarela de LLM, no cobramos por los tokens usados. Para más detalles, contáctanos para una cotización personalizada basada en las necesidades de tu organización.",
"enterprise.faq.q4": "¿Están mis datos seguros con OpenCode Enterprise?",
"enterprise.faq.a4":
"Sí. OpenCode no almacena tu código ni datos de contexto. Todo el procesamiento ocurre localmente o a través de llamadas directas a la API de tu proveedor de IA. Con configuración central y integración SSO, tus datos permanecen seguros dentro de la infraestructura de tu organización.",
"brand.title": "OpenCode | Marca",
"brand.meta.description": "Guías de marca de OpenCode",
"brand.heading": "Guías de marca",
"brand.subtitle": "Recursos y activos para ayudarte a trabajar con la marca OpenCode.",
"brand.downloadAll": "Descargar todos los activos",
"changelog.title": "OpenCode | Registro de cambios",
"changelog.meta.description": "Notas de versión y registro de cambios de OpenCode",
"changelog.hero.title": "Registro de cambios",
"changelog.hero.subtitle": "Nuevas actualizaciones y mejoras para OpenCode",
"changelog.empty": "No se encontraron entradas en el registro de cambios.",
"changelog.viewJson": "Ver JSON",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agente",
"bench.list.table.model": "Modelo",
"bench.list.table.score": "Puntuación",
"bench.submission.error.allFieldsRequired": "Todos los campos son obligatorios.",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Tarea no encontrada",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "Agente",
"bench.detail.labels.model": "Modelo",
"bench.detail.labels.task": "Tarea",
"bench.detail.labels.repo": "Repo",
"bench.detail.labels.from": "De",
"bench.detail.labels.to": "A",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Duración Promedio",
"bench.detail.labels.averageScore": "Puntuación Promedio",
"bench.detail.labels.averageCost": "Costo Promedio",
"bench.detail.labels.summary": "Resumen",
"bench.detail.labels.runs": "Ejecuciones",
"bench.detail.labels.score": "Puntuación",
"bench.detail.labels.base": "Base",
"bench.detail.labels.penalty": "Penalización",
"bench.detail.labels.weight": "peso",
"bench.detail.table.run": "Ejecución",
"bench.detail.table.score": "Puntuación (Base - Penalización)",
"bench.detail.table.cost": "Costo",
"bench.detail.table.duration": "Duración",
"bench.detail.run.title": "Ejecución {{n}}",
"bench.detail.rawJson": "JSON Crudo",
} as const satisfies Dict

View File

@@ -0,0 +1,834 @@
import type { Dict } from "./en"
import { dict as en } from "./en"
export const dict = {
...en,
"app.meta.description": "OpenCode - L'agent de code open source.",
"nav.github": "GitHub",
"nav.docs": "Documentation",
"nav.changelog": "Changelog",
"nav.discord": "Discord",
"nav.x": "X",
"nav.enterprise": "Entreprise",
"nav.zen": "Zen",
"nav.login": "Se connecter",
"nav.free": "Télécharger",
"nav.home": "Accueil",
"nav.openMenu": "Ouvrir le menu",
"nav.getStartedFree": "Commencer gratuitement",
"nav.logoAlt": "OpenCode",
"nav.context.copyLogo": "Copier le logo en SVG",
"nav.context.copyWordmark": "Copier le logotype en SVG",
"nav.context.brandAssets": "Ressources de marque",
"footer.github": "GitHub",
"footer.docs": "Documentation",
"footer.changelog": "Changelog",
"footer.discord": "Discord",
"footer.x": "X",
"legal.brand": "Marque",
"legal.privacy": "Confidentialité",
"legal.terms": "Conditions",
"email.title": "Soyez le premier à être informé de nos nouveaux produits",
"email.subtitle": "Inscrivez-vous à la liste d'attente pour un accès anticipé.",
"email.placeholder": "Adresse e-mail",
"email.subscribe": "S'abonner",
"email.success": "Presque terminé - vérifiez votre boîte de réception et confirmez votre adresse e-mail",
"notFound.title": "Introuvable | OpenCode",
"notFound.heading": "404 - Page introuvable",
"notFound.home": "Accueil",
"notFound.docs": "Documentation",
"notFound.github": "GitHub",
"notFound.discord": "Discord",
"notFound.logoLightAlt": "opencode logo light",
"notFound.logoDarkAlt": "opencode logo dark",
"user.logout": "Se déconnecter",
"workspace.select": "Sélectionner un espace de travail",
"workspace.createNew": "+ Créer un nouvel espace",
"workspace.modal.title": "Créer un nouvel espace",
"workspace.modal.placeholder": "Saisir le nom de l'espace",
"common.cancel": "Annuler",
"common.creating": "Création...",
"common.create": "Créer",
"common.videoUnsupported": "Votre navigateur ne prend pas en charge la balise vidéo.",
"common.figure": "Fig {{n}}.",
"common.faq": "FAQ",
"common.learnMore": "En savoir plus",
"error.invalidPlan": "Forfait invalide",
"error.workspaceRequired": "L'ID de l'espace de travail est requis",
"error.alreadySubscribed": "Cet espace de travail a déjà un abonnement",
"error.limitRequired": "La limite est requise.",
"error.monthlyLimitInvalid": "Définissez une limite mensuelle valide.",
"error.workspaceNameRequired": "Le nom de l'espace de travail est requis.",
"error.nameTooLong": "Le nom doit comporter 255 caractères ou moins.",
"error.emailRequired": "L'e-mail est requis",
"error.roleRequired": "Le rôle est requis",
"error.idRequired": "L'ID est requis",
"error.nameRequired": "Le nom est requis",
"error.providerRequired": "Le fournisseur est requis",
"error.apiKeyRequired": "La clé API est requise",
"error.modelRequired": "Le modèle est requis",
"error.reloadAmountMin": "Le montant de recharge doit être d'au moins {{amount}} $",
"error.reloadTriggerMin": "Le seuil de déclenchement doit être d'au moins {{amount}} $",
"auth.callback.error.codeMissing": "Aucun code d'autorisation trouvé.",
"home.title": "OpenCode | L'agent de code IA open source",
"temp.title": "OpenCode | Agent de code IA conçu pour le terminal",
"temp.hero.title": "L'agent de code IA conçu pour le terminal",
"temp.zen": "OpenCode Zen",
"temp.getStarted": "Commencer",
"temp.feature.native.title": "TUI Native",
"temp.feature.native.body": "Une interface terminal native, réactive et thémable",
"temp.feature.zen.beforeLink": "Une",
"temp.feature.zen.link": "liste organisée de modèles",
"temp.feature.zen.afterLink": "fournie par OpenCode",
"temp.feature.models.beforeLink": "Prend en charge plus de 75 fournisseurs LLM via",
"temp.feature.models.afterLink": ", y compris les modèles locaux",
"temp.screenshot.caption": "OpenCode TUI avec le thème tokyonight",
"temp.screenshot.alt": "OpenCode TUI avec le thème tokyonight",
"temp.logoLightAlt": "opencode logo light",
"temp.logoDarkAlt": "opencode logo dark",
"home.banner.badge": "Nouveau",
"home.banner.text": "Application desktop disponible en bêta",
"home.banner.platforms": "sur macOS, Windows et Linux",
"home.banner.downloadNow": "Télécharger maintenant",
"home.banner.downloadBetaNow": "Télécharger la bêta desktop maintenant",
"home.hero.title": "L'agent de code IA open source",
"home.hero.subtitle.a":
"Modèles gratuits inclus ou connectez n'importe quel modèle depuis n'importe quel fournisseur,",
"home.hero.subtitle.b": "dont Claude, GPT, Gemini et plus.",
"home.install.ariaLabel": "Options d'installation",
"home.what.title": "Qu'est-ce que OpenCode ?",
"home.what.body":
"OpenCode est un agent open source qui vous aide à écrire du code dans votre terminal, IDE ou desktop.",
"home.what.lsp.title": "LSP activé",
"home.what.lsp.body": "Charge automatiquement les bons LSP pour le LLM",
"home.what.multiSession.title": "Multi-session",
"home.what.multiSession.body": "Lancez plusieurs agents en parallèle sur le même projet",
"home.what.shareLinks.title": "Liens de partage",
"home.what.shareLinks.body": "Partagez un lien vers n'importe quelle session pour référence ou debug",
"home.what.copilot.title": "GitHub Copilot",
"home.what.copilot.body": "Connectez-vous avec GitHub pour utiliser votre compte Copilot",
"home.what.chatgptPlus.title": "ChatGPT Plus/Pro",
"home.what.chatgptPlus.body": "Connectez-vous avec OpenAI pour utiliser votre compte ChatGPT Plus ou Pro",
"home.what.anyModel.title": "N'importe quel modèle",
"home.what.anyModel.body": "75+ fournisseurs de LLM via Models.dev, y compris des modèles locaux",
"home.what.anyEditor.title": "N'importe quel éditeur",
"home.what.anyEditor.body": "Disponible en interface terminal, application desktop et extension IDE",
"home.what.readDocs": "Lire la doc",
"home.growth.title": "L'agent de code IA open source",
"home.growth.body":
"Avec plus de <strong>{{stars}}</strong> étoiles sur GitHub, <strong>{{contributors}}</strong> contributeurs et plus de <strong>{{commits}}</strong> commits, OpenCode est utilisé et approuvé par plus de <strong>{{monthlyUsers}}</strong> développeurs chaque mois.",
"home.growth.githubStars": "Étoiles GitHub",
"home.growth.contributors": "Contributeurs",
"home.growth.monthlyDevs": "Devs mensuels",
"home.privacy.title": "Conçu pour la confidentialité",
"home.privacy.body":
"OpenCode ne stocke ni votre code ni vos données de contexte, afin de pouvoir fonctionner dans des environnements sensibles à la confidentialité.",
"home.privacy.learnMore": "En savoir plus sur",
"home.privacy.link": "la confidentialité",
"home.faq.q1": "Qu'est-ce que OpenCode ?",
"home.faq.a1":
"OpenCode est un agent open source qui vous aide à écrire et exécuter du code avec n'importe quel modèle d'IA. Il est disponible en interface terminal, application desktop ou extension IDE.",
"home.faq.q2": "Comment utiliser OpenCode ?",
"home.faq.a2.before": "Le moyen le plus simple de commencer est de lire l'",
"home.faq.a2.link": "intro",
"home.faq.q3": "Ai-je besoin d'abonnements IA supplémentaires pour utiliser OpenCode ?",
"home.faq.a3.p1":
"Pas forcément : OpenCode propose des modèles gratuits que vous pouvez utiliser sans créer de compte.",
"home.faq.a3.p2.beforeZen": "En plus, vous pouvez utiliser des modèles populaires pour le code en créant un compte",
"home.faq.a3.p2.afterZen": ".",
"home.faq.a3.p3":
"Nous encourageons l'utilisation de Zen, mais OpenCode fonctionne aussi avec les fournisseurs populaires comme OpenAI, Anthropic, xAI, etc.",
"home.faq.a3.p4.beforeLocal": "Vous pouvez même connecter vos",
"home.faq.a3.p4.localLink": "modèles locaux",
"home.faq.q4": "Puis-je utiliser mes abonnements IA existants avec OpenCode ?",
"home.faq.a4.p1":
"Oui, OpenCode prend en charge les abonnements des principaux fournisseurs. Vous pouvez utiliser Claude Pro/Max, ChatGPT Plus/Pro ou GitHub Copilot.",
"home.faq.q5": "Puis-je utiliser OpenCode uniquement dans le terminal ?",
"home.faq.a5.beforeDesktop": "Plus maintenant ! OpenCode est désormais disponible en application pour",
"home.faq.a5.desktop": "desktop",
"home.faq.a5.and": "et",
"home.faq.a5.web": "web",
"home.faq.q6": "Combien coûte OpenCode ?",
"home.faq.a6":
"OpenCode est 100% gratuit. Il inclut aussi des modèles gratuits. Des coûts supplémentaires peuvent s'appliquer si vous connectez un autre fournisseur.",
"home.faq.q7": "Qu'en est-il des données et de la confidentialité ?",
"home.faq.a7.p1":
"Vos données ne sont stockées que lorsque vous utilisez nos modèles gratuits ou créez des liens partageables.",
"home.faq.a7.p2.beforeModels": "En savoir plus sur",
"home.faq.a7.p2.modelsLink": "nos modèles",
"home.faq.a7.p2.and": "et",
"home.faq.a7.p2.shareLink": "les pages de partage",
"home.faq.q8": "OpenCode est-il open source ?",
"home.faq.a8.p1": "Oui, OpenCode est entièrement open source. Le code source est public sur",
"home.faq.a8.p2": "sous la",
"home.faq.a8.mitLicense": "Licence MIT",
"home.faq.a8.p3":
", ce qui signifie que tout le monde peut l'utiliser, le modifier ou contribuer à son développement. Toute personne de la communauté peut ouvrir des tickets, soumettre des pull requests et étendre les fonctionnalités.",
"home.zenCta.title": "Accédez à des modèles fiables et optimisés pour les agents de code",
"home.zenCta.body":
"Zen vous donne accès à un ensemble sélectionné de modèles d'IA que OpenCode a testés et benchmarkés spécifiquement pour les agents de code. Plus besoin de vous soucier des variations de performance et de qualité selon les fournisseurs : utilisez des modèles validés qui fonctionnent.",
"home.zenCta.link": "En savoir plus sur Zen",
"zen.title": "OpenCode Zen | Un ensemble sélectionné de modèles fiables et optimisés pour les agents de code",
"zen.hero.title": "Modèles fiables et optimisés pour les agents de code",
"zen.hero.body":
"Zen vous donne accès à un ensemble sélectionné de modèles d'IA que OpenCode a testés et benchmarkés spécifiquement pour les agents de code. Plus besoin de vous soucier des variations de performance et de qualité selon les fournisseurs : utilisez des modèles validés qui fonctionnent.",
"zen.faq.q1": "Qu'est-ce que OpenCode Zen ?",
"zen.faq.a1":
"Zen est un ensemble sélectionné de modèles d'IA testés et benchmarkés pour les agents de code, créé par l'équipe derrière OpenCode.",
"zen.faq.q2": "Qu'est-ce qui rend Zen plus précis ?",
"zen.faq.a2":
"Zen ne propose que des modèles testés et benchmarkés spécifiquement pour les agents de code. Vous n'utiliseriez pas un couteau à beurre pour couper un steak ; n'utilisez pas de mauvais modèles pour coder.",
"zen.faq.q3": "Zen est-il moins cher ?",
"zen.faq.a3":
"Zen n'est pas à but lucratif. Zen vous facture au prix coûtant des fournisseurs de modèles. Plus Zen est utilisé, plus OpenCode peut négocier de meilleurs tarifs et vous les répercuter.",
"zen.faq.q4": "Combien coûte Zen ?",
"zen.faq.a4.p1.beforePricing": "Zen",
"zen.faq.a4.p1.pricingLink": "facture par requête",
"zen.faq.a4.p1.afterPricing": "sans marge, vous payez donc exactement ce que facture le fournisseur du modèle.",
"zen.faq.a4.p2.beforeAccount":
"Votre coût total dépend de l'usage, et vous pouvez définir des limites de dépense mensuelles dans votre",
"zen.faq.a4.p2.accountLink": "compte",
"zen.faq.a4.p3":
"Pour couvrir les coûts, OpenCode ajoute uniquement de petits frais de traitement de paiement de 1,23 $ par recharge de 20 $.",
"zen.faq.q5": "Et pour les données et la confidentialité ?",
"zen.faq.a5.beforeExceptions":
"Tous les modèles Zen sont hébergés aux États-Unis. Les fournisseurs appliquent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
"zen.faq.a5.exceptionsLink": "exceptions suivantes",
"zen.faq.q6": "Puis-je définir des limites de dépense ?",
"zen.faq.a6": "Oui, vous pouvez définir des limites de dépense mensuelles dans votre compte.",
"zen.faq.q7": "Puis-je annuler ?",
"zen.faq.a7": "Oui, vous pouvez désactiver la facturation à tout moment et utiliser votre solde restant.",
"zen.faq.q8": "Puis-je utiliser Zen avec d'autres agents de code ?",
"zen.faq.a8":
"Zen fonctionne très bien avec OpenCode, mais vous pouvez utiliser Zen avec n'importe quel agent. Suivez les instructions de configuration dans votre agent préféré.",
"zen.cta.start": "Commencez avec Zen",
"zen.pricing.title": "Ajoutez 20 $ de solde Pay as you go",
"zen.pricing.fee": "(+1,23 $ de frais de traitement de carte)",
"zen.pricing.body":
"Utilisez avec n'importe quel agent. Fixez des limites de dépenses mensuelles. Annulez à tout moment.",
"zen.problem.title": "Quel problème Zen résout-il ?",
"zen.problem.body":
"Il existe de nombreux modèles disponibles, mais seuls quelques-uns fonctionnent bien avec les agents de code. La plupart des fournisseurs les configurent différemment avec des résultats variables.",
"zen.problem.subtitle":
"Nous résolvons ce problème pour tout le monde, pas seulement pour les utilisateurs de OpenCode.",
"zen.problem.item1": "Test des modèles sélectionnés et consultation de leurs équipes",
"zen.problem.item2": "Collaboration avec les fournisseurs pour garantir une livraison correcte",
"zen.problem.item3": "Benchmark de toutes les combinaisons modèle-fournisseur que nous recommandons",
"zen.how.title": "Comment fonctionne Zen",
"zen.how.body":
"Bien que nous vous suggérions d'utiliser Zen avec OpenCode, vous pouvez utiliser Zen avec n'importe quel agent.",
"zen.how.step1.title": "Inscrivez-vous et ajoutez un solde de 20 $",
"zen.how.step1.beforeLink": "suivez les",
"zen.how.step1.link": "instructions de configuration",
"zen.how.step2.title": "Utilisez Zen avec une tarification transparente",
"zen.how.step2.link": "payez par requête",
"zen.how.step2.afterLink": "sans marge",
"zen.how.step3.title": "Recharge automatique",
"zen.how.step3.body": "lorsque votre solde atteint 5 $, nous ajouterons automatiquement 20 $",
"zen.privacy.title": "Votre vie privée est importante pour nous",
"zen.privacy.beforeExceptions":
"Tous les modèles Zen sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
"zen.privacy.exceptionsLink": "exceptions suivantes",
"go.title": "OpenCode Go | Modèles de code à faible coût pour tous",
"go.meta.description":
"Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites de requêtes généreuses sur 5 heures pour GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro et DeepSeek V4 Flash.",
"go.hero.title": "Modèles de code à faible coût pour tous",
"go.hero.body":
"Go apporte le codage agentique aux programmeurs du monde entier. Offrant des limites généreuses et un accès fiable aux modèles open source les plus capables, pour que vous puissiez construire avec des agents puissants sans vous soucier du coût ou de la disponibilité.",
"go.cta.start": "S'abonner à Go",
"go.cta.template": "{{text}} {{price}}",
"go.cta.text": "S'abonner à Go",
"go.cta.price": "10 $/mois",
"go.cta.promo": "$5 le premier mois",
"go.pricing.body":
"Utilisez-le avec n'importe quel agent. $5 le premier mois, puis 10 $/mois. Rechargez du crédit si nécessaire. Annulez à tout moment.",
"go.graph.free": "Gratuit",
"go.graph.freePill": "Big Pickle et modèles gratuits",
"go.graph.go": "Go",
"go.graph.label": "Requêtes par tranche de 5 heures",
"go.graph.usageLimits": "Limites d'utilisation",
"go.graph.tick": "{{n}}x",
"go.graph.aria": "Requêtes par 5h : {{free}} vs {{go}}",
"go.testimonials.brand.zen": "Zen",
"go.testimonials.brand.go": "Go",
"go.testimonials.handle": "@OpenCode",
"go.testimonials.dax.name": "Dax Raad",
"go.testimonials.dax.title": "ex-PDG, Terminal Products",
"go.testimonials.dax.quoteAfter": "a changé ma vie, c'est vraiment une évidence.",
"go.testimonials.jay.name": "Jay V",
"go.testimonials.jay.title": "ex-Fondateur, SEED, PM, Melt, Pop, Dapt, Cadmus, et ViewPoint",
"go.testimonials.jay.quoteBefore": "4 personnes sur 5 dans notre équipe adorent utiliser",
"go.testimonials.jay.quoteAfter": ".",
"go.testimonials.adam.name": "Adam Elmore",
"go.testimonials.adam.title": "ex-Hero, AWS",
"go.testimonials.adam.quoteBefore": "Je ne peux pas recommander",
"go.testimonials.adam.quoteAfter": "assez. Sérieusement, c'est vraiment bien.",
"go.testimonials.david.name": "David Hill",
"go.testimonials.david.title": "ex-Directeur du Design, Laravel",
"go.testimonials.david.quoteBefore": "Avec",
"go.testimonials.david.quoteAfter": "je sais que tous les modèles sont testés et parfaits pour les agents de code.",
"go.testimonials.frank.name": "Frank Wang",
"go.testimonials.frank.title": "ex-Stagiaire, Nvidia (4 fois)",
"go.testimonials.frank.quote": "J'aimerais être encore chez Nvidia.",
"go.problem.title": "Quel problème Go résout-il ?",
"go.problem.body":
"Nous nous efforçons d'apporter l'expérience OpenCode au plus grand nombre. OpenCode Go est un abonnement à faible coût : $5 pour le premier mois, puis 10 $/mois. Il offre des limites généreuses et un accès fiable aux modèles open source les plus performants.",
"go.problem.subtitle": " ",
"go.problem.item1": "Prix d'abonnement bas",
"go.problem.item2": "Limites généreuses et accès fiable",
"go.problem.item3": "Conçu pour autant de programmeurs que possible",
"go.problem.item4":
"Inclut GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro et DeepSeek V4 Flash",
"go.how.title": "Comment fonctionne Go",
"go.how.body":
"Go commence à $5 pour le premier mois, puis 10 $/mois. Vous pouvez l'utiliser avec OpenCode ou n'importe quel agent.",
"go.how.step1.title": "Créez un compte",
"go.how.step1.beforeLink": "suivez les",
"go.how.step1.link": "instructions de configuration",
"go.how.step2.title": "Abonnez-vous à Go",
"go.how.step2.link": "$5 le premier mois",
"go.how.step2.afterLink": "puis 10 $/mois avec des limites généreuses",
"go.how.step3.title": "Commencez à coder",
"go.how.step3.body": "avec un accès fiable aux modèles open source",
"go.privacy.title": "Votre vie privée est importante pour nous",
"go.privacy.body":
"Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable.",
"go.privacy.contactAfter": "si vous avez des questions.",
"go.privacy.beforeExceptions":
"Les modèles Go sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
"go.privacy.exceptionsLink": "exceptions suivantes",
"go.faq.q1": "Qu'est-ce que OpenCode Go ?",
"go.faq.a1":
"Go est un abonnement à faible coût qui vous donne un accès fiable à des modèles open source performants pour le codage agentique.",
"go.faq.q2": "Quels modèles Go inclut-il ?",
"go.faq.a2": "Go inclut les modèles ci-dessous, avec des limites généreuses et un accès fiable.",
"go.faq.q3": "Est-ce que Go est la même chose que Zen ?",
"go.faq.a3":
"Non. Zen est un paiement à l'utilisation, tandis que Go commence à $5 pour le premier mois, puis 10 $/mois, avec des limites généreuses et un accès fiable aux modèles open source GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro et DeepSeek V4 Flash.",
"go.faq.q4": "Combien coûte Go ?",
"go.faq.a4.p1.beforePricing": "Go coûte",
"go.faq.a4.p1.pricingLink": "$5 le premier mois",
"go.faq.a4.p1.afterPricing": "puis 10 $/mois avec des limites généreuses.",
"go.faq.a4.p2.beforeAccount": "Vous pouvez gérer votre abonnement dans votre",
"go.faq.a4.p2.accountLink": "compte",
"go.faq.a4.p3": "Annulez à tout moment.",
"go.faq.q5": "Et pour les données et la confidentialité ?",
"go.faq.a5.body":
"Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable. Nos fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles.",
"go.faq.a5.beforeExceptions":
"Les modèles Go sont hébergés aux États-Unis. Les fournisseurs suivent une politique de rétention zéro et n'utilisent pas vos données pour l'entraînement des modèles, avec les",
"go.faq.a5.exceptionsLink": "exceptions suivantes",
"go.faq.q6": "Puis-je recharger mon crédit ?",
"go.faq.a6": "Si vous avez besoin de plus d'utilisation, vous pouvez recharger du crédit dans votre compte.",
"go.faq.q7": "Puis-je annuler ?",
"go.faq.a7": "Oui, vous pouvez annuler à tout moment.",
"go.faq.q8": "Puis-je utiliser Go avec d'autres agents de code ?",
"go.faq.a8":
"Oui, vous pouvez utiliser Go avec n'importe quel agent. Suivez les instructions de configuration dans votre agent de code préféré.",
"go.faq.q9": "Quelle est la différence entre les modèles gratuits et Go ?",
"go.faq.a9":
"Les modèles gratuits incluent Big Pickle ainsi que des modèles promotionnels disponibles à ce moment-là, avec un quota de 200 requêtes/jour. Go inclut GLM-5.1, GLM-5, Kimi K2.5, Kimi K2.6, MiMo-V2.5-Pro, MiMo-V2.5, Qwen3.7 Max, Qwen3.7 Plus, Qwen3.6 Plus, MiniMax M2.5, MiniMax M2.7, MiniMax M3, DeepSeek V4 Pro et DeepSeek V4 Flash avec des quotas de requêtes plus élevés appliqués sur des fenêtres glissantes (5 heures, hebdomadaire et mensuelle), à peu près équivalent à 12 $ par 5 heures, 30 $ par semaine et 60 $ par mois (le nombre réel de requêtes varie selon le modèle et l'utilisation).",
"zen.api.error.rateLimitExceeded": "Limite de débit dépassée. Veuillez réessayer plus tard.",
"zen.api.error.modelNotSupported": "Modèle {{model}} non pris en charge",
"zen.api.error.modelFormatNotSupported": "Modèle {{model}} non pris en charge pour le format {{format}}",
"zen.api.error.noProviderAvailable": "Aucun fournisseur disponible",
"zen.api.error.providerNotSupported": "Fournisseur {{provider}} non pris en charge",
"zen.api.error.missingApiKey": "Clé API manquante.",
"zen.api.error.invalidApiKey": "Clé API invalide.",
"zen.api.error.subscriptionQuotaExceeded": "Quota d'abonnement dépassé. Réessayez dans {{retryIn}}.",
"zen.api.error.goSubscriptionRollingLimitExceeded":
"Limite d'utilisation sur 5 heures atteinte. Réinitialisation dans {{retryIn}}. Pour continuer à utiliser ce modèle dès maintenant, activez l'utilisation depuis votre solde disponible : {{consoleGoUrl}}",
"zen.api.error.goSubscriptionWeeklyLimitExceeded":
"Limite d'utilisation hebdomadaire atteinte. Réinitialisation dans {{retryIn}}. Pour continuer à utiliser ce modèle dès maintenant, activez l'utilisation depuis votre solde disponible : {{consoleGoUrl}}",
"zen.api.error.goSubscriptionMonthlyLimitExceeded":
"Limite d'utilisation mensuelle atteinte. Réinitialisation dans {{retryIn}}. Pour continuer à utiliser ce modèle dès maintenant, activez l'utilisation depuis votre solde disponible : {{consoleGoUrl}}",
"zen.api.error.noPaymentMethod": "Aucune méthode de paiement. Ajoutez une méthode de paiement ici : {{billingUrl}}",
"zen.api.error.insufficientBalance": "Solde insuffisant. Gérez votre facturation ici : {{billingUrl}}",
"zen.api.error.workspaceMonthlyLimitReached":
"Votre espace de travail a atteint sa limite de dépense mensuelle de {{amount}} $. Gérez vos limites ici : {{billingUrl}}",
"zen.api.error.userMonthlyLimitReached":
"Vous avez atteint votre limite de dépense mensuelle de {{amount}} $. Gérez vos limites ici : {{membersUrl}}",
"zen.api.error.modelDisabled": "Le modèle est désactivé",
"zen.api.error.trialEnded":
"La promotion gratuite de {{model}} est terminée. Vous pouvez continuer à utiliser le modèle en vous abonnant à OpenCode Go - {{link}}",
"black.meta.title": "OpenCode Black | Accédez aux meilleurs modèles de code au monde",
"black.meta.description": "Accédez à Claude, GPT, Gemini et plus avec les forfaits d'abonnement OpenCode Black.",
"black.hero.title": "Accédez aux meilleurs modèles de code au monde",
"black.hero.subtitle": "Y compris Claude, GPT, Gemini et plus",
"black.title": "OpenCode Black | Tarification",
"black.paused": "L'inscription au plan Black est temporairement suspendue.",
"black.plan.icon20": "Forfait Black 20",
"black.plan.icon100": "Forfait Black 100",
"black.plan.icon200": "Forfait Black 200",
"black.plan.multiplier100": "5x plus d'utilisation que Black 20",
"black.plan.multiplier200": "20x plus d'utilisation que Black 20",
"black.price.perMonth": "par mois",
"black.price.perPersonBilledMonthly": "par personne facturé mensuellement",
"black.terms.1": "Votre abonnement ne commencera pas immédiatement",
"black.terms.2": "Vous serez ajouté à la liste d'attente et activé bientôt",
"black.terms.3": "Votre carte ne sera débitée que lorsque votre abonnement sera activé",
"black.terms.4":
"Des limites d'utilisation s'appliquent, une utilisation fortement automatisée peut atteindre les limites plus tôt",
"black.terms.5": "Les abonnements sont pour les individus, contactez Enterprise pour les équipes",
"black.terms.6": "Les limites peuvent être ajustées et les forfaits peuvent être interrompus à l'avenir",
"black.terms.7": "Annulez votre abonnement à tout moment",
"black.action.continue": "Continuer",
"black.finePrint.beforeTerms": "Les prix affichés n'incluent pas les taxes applicables",
"black.finePrint.terms": "Conditions d'utilisation",
"black.workspace.title": "OpenCode Black | Sélectionner un espace de travail",
"black.workspace.selectPlan": "Sélectionnez un espace de travail pour ce forfait",
"black.workspace.name": "Espace de travail {{n}}",
"black.subscribe.title": "S'abonner à OpenCode Black",
"black.subscribe.paymentMethod": "Méthode de paiement",
"black.subscribe.loadingPaymentForm": "Chargement du formulaire de paiement...",
"black.subscribe.selectWorkspaceToContinue": "Sélectionnez un espace de travail pour continuer",
"black.subscribe.failurePrefix": "Oh oh !",
"black.subscribe.error.generic": "Une erreur est survenue",
"black.subscribe.error.invalidPlan": "Forfait invalide",
"black.subscribe.error.workspaceRequired": "L'ID de l'espace de travail est requis",
"black.subscribe.error.alreadySubscribed": "Cet espace de travail a déjà un abonnement",
"black.subscribe.processing": "Traitement...",
"black.subscribe.submit": "S'abonner ${{plan}}",
"black.subscribe.form.chargeNotice": "Vous ne serez débité que lorsque votre abonnement sera activé",
"black.subscribe.success.title": "Vous êtes sur la liste d'attente OpenCode Black",
"black.subscribe.success.subscriptionPlan": "Forfait d'abonnement",
"black.subscribe.success.planName": "OpenCode Black {{plan}}",
"black.subscribe.success.amount": "Montant",
"black.subscribe.success.amountValue": "{{plan}} $ par mois",
"black.subscribe.success.paymentMethod": "Méthode de paiement",
"black.subscribe.success.dateJoined": "Date d'inscription",
"black.subscribe.success.chargeNotice": "Votre carte sera débitée lorsque votre abonnement sera activé",
"workspace.nav.zen": "Zen",
"workspace.nav.go": "Go",
"workspace.nav.usage": "Utilisation",
"workspace.nav.apiKeys": "Clés API",
"workspace.nav.members": "Membres",
"workspace.nav.billing": "Facturation",
"workspace.nav.settings": "Paramètres",
"workspace.home.banner.beforeLink": "Modèles optimisés fiables pour les agents de code.",
"workspace.lite.banner.beforeLink": "Modèles de code à faible coût pour tous.",
"workspace.home.billing.loading": "Chargement...",
"workspace.home.billing.enable": "Activer la facturation",
"workspace.home.billing.currentBalance": "Solde actuel",
"workspace.newUser.feature.tested.title": "Modèles testés et vérifiés",
"workspace.newUser.feature.tested.body":
"Nous avons benchmarké et testé des modèles spécifiquement pour les agents de code afin de garantir les meilleures performances.",
"workspace.newUser.feature.quality.title": "La plus haute qualité",
"workspace.newUser.feature.quality.body":
"Accédez à des modèles configurés pour des performances optimales - pas de rétrogradation ni de routage vers des fournisseurs moins chers.",
"workspace.newUser.feature.lockin.title": "Pas de verrouillage",
"workspace.newUser.feature.lockin.body":
"Utilisez Zen avec n'importe quel agent de code et continuez à utiliser d'autres fournisseurs avec OpenCode quand vous le souhaitez.",
"workspace.newUser.copyApiKey": "Copier la clé API",
"workspace.newUser.copyKey": "Copier la clé",
"workspace.newUser.copied": "Copié !",
"workspace.newUser.step.enableBilling": "Activer la facturation",
"workspace.newUser.step.login.before": "Exécuter",
"workspace.newUser.step.login.after": "et sélectionnez OpenCode",
"workspace.newUser.step.pasteKey": "Collez votre clé API",
"workspace.newUser.step.models.before": "Démarrez OpenCode et exécutez",
"workspace.newUser.step.models.after": "pour sélectionner un modèle",
"workspace.models.title": "Modèles",
"workspace.models.subtitle.beforeLink":
"Gérez les modèles auxquels les membres de l'espace de travail peuvent accéder.",
"workspace.models.table.model": "Modèle",
"workspace.models.table.enabled": "Activé",
"workspace.providers.title": "Apportez votre propre clé",
"workspace.providers.subtitle": "Configurez vos propres clés API auprès des fournisseurs d'IA.",
"workspace.providers.placeholder": "Entrez la clé API {{provider}} ({{prefix}}...)",
"workspace.providers.configure": "Configurer",
"workspace.providers.edit": "Modifier",
"workspace.providers.delete": "Supprimer",
"workspace.providers.saving": "Enregistrement...",
"workspace.providers.save": "Enregistrer",
"workspace.providers.table.provider": "Fournisseur",
"workspace.providers.table.apiKey": "Clé API",
"workspace.usage.title": "Historique d'utilisation",
"workspace.usage.subtitle": "Utilisation récente de l'API et coûts.",
"workspace.usage.empty": "Faites votre premier appel API pour commencer.",
"workspace.usage.table.date": "Date",
"workspace.usage.table.model": "Modèle",
"workspace.usage.table.input": "Entrée",
"workspace.usage.table.output": "Sortie",
"workspace.usage.table.cost": "Coût",
"workspace.usage.table.session": "Session",
"workspace.usage.breakdown.input": "Entrée",
"workspace.usage.breakdown.cacheRead": "Lecture cache",
"workspace.usage.breakdown.cacheWrite": "Écriture cache",
"workspace.usage.breakdown.output": "Sortie",
"workspace.usage.breakdown.reasoning": "Raisonnement",
"workspace.usage.subscription": "Black ({{amount}} $)",
"workspace.usage.lite": "Go ({{amount}} $)",
"workspace.usage.byok": "BYOK ({{amount}} $)",
"workspace.cost.title": "Coût",
"workspace.cost.subtitle": "Coûts d'utilisation répartis par modèle.",
"workspace.cost.allModels": "Tous les modèles",
"workspace.cost.allKeys": "Toutes les clés",
"workspace.cost.deletedSuffix": "(supprimé)",
"workspace.cost.empty": "Aucune donnée d'utilisation disponible pour la période sélectionnée.",
"workspace.cost.subscriptionShort": "abo",
"workspace.keys.title": "Clés API",
"workspace.keys.subtitle": "Gérez vos clés API pour accéder aux services OpenCode.",
"workspace.keys.create": "Créer une clé API",
"workspace.keys.placeholder": "Entrez le nom de la clé",
"workspace.keys.empty": "Créer une clé API OpenCode Gateway",
"workspace.keys.table.name": "Nom",
"workspace.keys.table.key": "Clé",
"workspace.keys.table.createdBy": "Créé par",
"workspace.keys.table.lastUsed": "Dernière utilisation",
"workspace.keys.copyApiKey": "Copier la clé API",
"workspace.keys.delete": "Supprimer",
"workspace.members.title": "Membres",
"workspace.members.subtitle": "Gérez les membres de l'espace de travail et leurs autorisations.",
"workspace.members.invite": "Inviter un membre",
"workspace.members.inviting": "Invitation en cours...",
"workspace.members.beta.beforeLink": "Les espaces de travail sont gratuits pour les équipes pendant la version bêta.",
"workspace.members.form.invitee": "Invité",
"workspace.members.form.emailPlaceholder": "Entrez l'e-mail",
"workspace.members.form.role": "Rôle",
"workspace.members.form.monthlyLimit": "Limite de dépense mensuelle",
"workspace.members.noLimit": "Aucune limite",
"workspace.members.noLimitLowercase": "pas de limite",
"workspace.members.invited": "invité",
"workspace.members.edit": "Modifier",
"workspace.members.delete": "Supprimer",
"workspace.members.saving": "Enregistrement...",
"workspace.members.save": "Enregistrer",
"workspace.members.table.email": "E-mail",
"workspace.members.table.role": "Rôle",
"workspace.members.table.monthLimit": "Limite mensuelle",
"workspace.members.role.admin": "Administrateur",
"workspace.members.role.adminDescription": "Peut gérer les modèles, les membres et la facturation",
"workspace.members.role.member": "Membre",
"workspace.members.role.memberDescription": "Ne peut générer que des clés API pour lui-même",
"workspace.settings.title": "Paramètres",
"workspace.settings.subtitle": "Mettez à jour le nom et les préférences de votre espace de travail.",
"workspace.settings.workspaceName": "Nom de l'espace de travail",
"workspace.settings.defaultName": "Défaut",
"workspace.settings.updating": "Mise à jour...",
"workspace.settings.save": "Enregistrer",
"workspace.settings.edit": "Modifier",
"workspace.billing.title": "Facturation",
"workspace.billing.subtitle.beforeLink": "Gérer les méthodes de paiement.",
"workspace.billing.contactUs": "Contactez-nous",
"workspace.billing.subtitle.afterLink": "si vous avez des questions.",
"workspace.billing.currentBalance": "Solde actuel",
"workspace.billing.add": "Ajouter $",
"workspace.billing.enterAmount": "Saisir le montant",
"workspace.billing.loading": "Chargement...",
"workspace.billing.addAction": "Ajouter",
"workspace.billing.addBalance": "Ajouter un solde",
"workspace.billing.alipay": "Alipay",
"workspace.billing.wechat": "WeChat Pay",
"workspace.billing.linkedToStripe": "Lié à Stripe",
"workspace.billing.manage": "Gérer",
"workspace.billing.enable": "Activer la facturation",
"workspace.monthlyLimit.title": "Limite mensuelle",
"workspace.monthlyLimit.subtitle": "Définissez une limite d'utilisation mensuelle pour votre compte.",
"workspace.monthlyLimit.placeholder": "50",
"workspace.monthlyLimit.setting": "Définition...",
"workspace.monthlyLimit.set": "Défini",
"workspace.monthlyLimit.edit": "Modifier la limite",
"workspace.monthlyLimit.noLimit": "Aucune limite d'utilisation définie.",
"workspace.monthlyLimit.currentUsage.beforeMonth": "L'utilisation actuelle pour",
"workspace.monthlyLimit.currentUsage.beforeAmount": "est de",
"workspace.redeem.title": "Utiliser un coupon",
"workspace.redeem.subtitle": "Utilisez un code promo pour obtenir du crédit ou des avantages.",
"workspace.redeem.placeholder": "Saisissez le code promo",
"workspace.redeem.redeem": "Utiliser",
"workspace.redeem.redeeming": "Utilisation...",
"workspace.redeem.success": "Coupon utilisé avec succès.",
"workspace.reload.title": "Rechargement automatique",
"workspace.reload.disabled.before": "Le rechargement automatique est",
"workspace.reload.disabled.state": "désactivé",
"workspace.reload.disabled.after": "Activer le rechargement automatique lorsque le solde est faible.",
"workspace.reload.enabled.before": "Le rechargement automatique est",
"workspace.reload.enabled.state": "activé",
"workspace.reload.enabled.middle": "Nous rechargerons",
"workspace.reload.processingFee": "frais de traitement",
"workspace.reload.enabled.after": "quand le solde atteint",
"workspace.reload.edit": "Modifier",
"workspace.reload.enable": "Activer",
"workspace.reload.enableAutoReload": "Activer le rechargement automatique",
"workspace.reload.reloadAmount": "Recharger $",
"workspace.reload.whenBalanceReaches": "Lorsque le solde atteint $",
"workspace.reload.saving": "Enregistrement...",
"workspace.reload.save": "Enregistrer",
"workspace.reload.failedAt": "Le rechargement a échoué à",
"workspace.reload.reason": "Raison :",
"workspace.reload.updatePaymentMethod": "Veuillez mettre à jour votre méthode de paiement et réessayer.",
"workspace.reload.retrying": "Nouvelle tentative...",
"workspace.reload.retry": "Réessayer",
"workspace.reload.error.paymentFailed": "Échec du paiement.",
"workspace.payments.title": "Historique des paiements",
"workspace.payments.subtitle": "Transactions de paiement récentes.",
"workspace.payments.table.date": "Date",
"workspace.payments.table.paymentId": "ID de paiement",
"workspace.payments.table.amount": "Montant",
"workspace.payments.table.receipt": "Reçu",
"workspace.payments.type.credit": "crédit",
"workspace.payments.type.subscription": "abonnement",
"workspace.payments.view": "Voir",
"workspace.black.loading": "Chargement...",
"workspace.black.time.day": "jour",
"workspace.black.time.days": "jours",
"workspace.black.time.hour": "heure",
"workspace.black.time.hours": "heures",
"workspace.black.time.minute": "minute",
"workspace.black.time.minutes": "minutes",
"workspace.black.time.fewSeconds": "quelques secondes",
"workspace.black.subscription.title": "Abonnement",
"workspace.black.subscription.message": "Vous êtes abonné à OpenCode Black pour {{plan}} $ par mois.",
"workspace.black.subscription.manage": "Gérer l'abonnement",
"workspace.black.subscription.rollingUsage": "Utilisation 5 heures",
"workspace.black.subscription.weeklyUsage": "Utilisation hebdomadaire",
"workspace.black.subscription.resetsIn": "Réinitialisation dans",
"workspace.black.subscription.useBalance":
"Utilisez votre solde disponible après avoir atteint les limites d'utilisation",
"workspace.black.waitlist.title": "Liste d'attente",
"workspace.black.waitlist.joined":
"Vous êtes sur la liste d'attente pour le forfait OpenCode Black à {{plan}} $ par mois.",
"workspace.black.waitlist.ready":
"Nous sommes prêts à vous inscrire au forfait OpenCode Black à {{plan}} $ par mois.",
"workspace.black.waitlist.leave": "Quitter la liste d'attente",
"workspace.black.waitlist.leaving": "Sortie...",
"workspace.black.waitlist.left": "Quitté",
"workspace.black.waitlist.enroll": "S'inscrire",
"workspace.black.waitlist.enrolling": "Inscription...",
"workspace.black.waitlist.enrolled": "Inscrit",
"workspace.black.waitlist.enrollNote":
"Lorsque vous cliquez sur S'inscrire, votre abonnement démarre immédiatement et votre carte sera débitée.",
"workspace.lite.loading": "Chargement...",
"workspace.lite.time.day": "jour",
"workspace.lite.time.days": "jours",
"workspace.lite.time.hour": "heure",
"workspace.lite.time.hours": "heures",
"workspace.lite.time.minute": "minute",
"workspace.lite.time.minutes": "minutes",
"workspace.lite.time.fewSeconds": "quelques secondes",
"workspace.lite.subscription.message": "Vous êtes abonné à OpenCode Go.",
"workspace.lite.subscription.manage": "Gérer l'abonnement",
"workspace.lite.subscription.rollingUsage": "Utilisation glissante",
"workspace.lite.subscription.weeklyUsage": "Utilisation hebdomadaire",
"workspace.lite.subscription.monthlyUsage": "Utilisation mensuelle",
"workspace.lite.subscription.resetsIn": "Réinitialisation dans",
"workspace.lite.subscription.useBalance":
"Utilisez votre solde disponible après avoir atteint les limites d'utilisation",
"workspace.lite.subscription.selectProvider":
'Sélectionnez "OpenCode Go" comme fournisseur dans votre configuration opencode pour utiliser les modèles Go.',
"workspace.lite.black.message":
"Vous êtes actuellement abonné à OpenCode Black ou sur liste d'attente. Veuillez d'abord vous désabonner si vous souhaitez passer à Go.",
"workspace.lite.other.message":
"Un autre membre de cet espace de travail est déjà abonné à OpenCode Go. Un seul membre par espace de travail peut s'abonner.",
"workspace.lite.promo.description":
"OpenCode Go commence à {{price}}, puis 10 $/mois, et offre un accès fiable aux modèles de code ouverts populaires avec des limites d'utilisation généreuses.",
"workspace.lite.promo.price": "$5 le premier mois",
"workspace.lite.promo.modelsTitle": "Ce qui est inclus",
"workspace.lite.promo.footer":
"Le plan est conçu principalement pour les utilisateurs internationaux, avec des modèles hébergés aux États-Unis, dans l'UE et à Singapour pour un accès mondial stable. Les tarifs et les limites d'utilisation peuvent changer à mesure que nous apprenons des premières utilisations et des commentaires.",
"workspace.lite.promo.subscribe": "S'abonner à Go",
"workspace.lite.promo.subscribing": "Redirection...",
"workspace.lite.promo.otherMethods": "Autres méthodes de paiement",
"workspace.lite.promo.selectMethod": "Sélectionner la méthode de paiement",
"workspace.referral.copyLink": "Copier le lien",
"workspace.referral.copied": "Copié",
"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": "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",
"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",
"download.meta.description": "Téléchargez OpenCode pour macOS, Windows et Linux",
"download.hero.title": "Télécharger OpenCode",
"download.hero.subtitle": "Disponible en bêta pour macOS, Windows et Linux",
"download.hero.button": "Télécharger pour {{os}}",
"download.section.terminal": "OpenCode Terminal",
"download.section.desktop": "OpenCode Desktop (Bêta)",
"download.section.extensions": "Extensions OpenCode",
"download.section.integrations": "Intégrations OpenCode",
"download.action.download": "Télécharger",
"download.action.install": "Installer",
"download.platform.macosAppleSilicon": "macOS (Apple Silicon)",
"download.platform.macosIntel": "macOS (Intel)",
"download.platform.windowsX64": "Windows (x64)",
"download.platform.linuxDeb": "Linux (.deb)",
"download.platform.linuxRpm": "Linux (.rpm)",
"download.faq.a3.beforeLocal":
"Pas forcément, mais probablement. Vous aurez besoin d'un abonnement IA si vous voulez connecter OpenCode à un fournisseur payant, mais vous pouvez travailler avec des",
"download.faq.a3.localLink": "modèles locaux",
"download.faq.a3.afterLocal.beforeZen": "gratuitement. Même si nous encourageons les utilisateurs à utiliser",
"download.faq.a3.afterZen":
", OpenCode fonctionne avec tous les fournisseurs populaires comme OpenAI, Anthropic, xAI, etc.",
"download.faq.a5.p1": "OpenCode est 100% gratuit à utiliser.",
"download.faq.a5.p2.beforeZen":
"Les coûts supplémentaires viendront de votre abonnement à un fournisseur de modèle. Même si OpenCode fonctionne avec n'importe quel fournisseur, nous recommandons d'utiliser",
"download.faq.a5.p2.afterZen": ".",
"download.faq.a6.p1":
"Vos données et informations ne sont stockées que lorsque vous créez des liens partageables dans OpenCode.",
"download.faq.a6.p2.beforeShare": "En savoir plus sur",
"download.faq.a6.shareLink": "les pages de partage",
"enterprise.title": "OpenCode | Solutions entreprise pour votre organisation",
"enterprise.meta.description": "Contactez OpenCode pour des solutions entreprise",
"enterprise.hero.title": "Votre code vous appartient",
"enterprise.hero.body1":
"OpenCode fonctionne de manière sécurisée au sein de votre organisation, sans stocker de données ni de contexte, et sans restrictions de licence ni revendications de propriété. Démarrez un essai avec votre équipe, puis déployez-le dans votre organisation en l'intégrant à votre SSO et à votre passerelle IA interne.",
"enterprise.hero.body2": "Dites-nous comment nous pouvons vous aider.",
"enterprise.form.name.label": "Nom complet",
"enterprise.form.name.placeholder": "Jeff Bezos",
"enterprise.form.role.label": "Poste",
"enterprise.form.role.placeholder": "Président exécutif",
"enterprise.form.company.label": "Entreprise",
"enterprise.form.company.placeholder": "Acme Inc",
"enterprise.form.email.label": "E-mail professionnel",
"enterprise.form.email.placeholder": "jeff@amazon.com",
"enterprise.form.phone.label": "Téléphone",
"enterprise.form.phone.placeholder": "+1 234 567 8900",
"enterprise.form.message.label": "Quel problème essayez-vous de résoudre ?",
"enterprise.form.message.placeholder": "Nous avons besoin d'aide pour...",
"enterprise.form.send": "Envoyer",
"enterprise.form.sending": "Envoi...",
"enterprise.form.success": "Message envoyé, nous vous contacterons bientôt.",
"enterprise.form.success.submitted": "Formulaire soumis avec succès.",
"enterprise.form.error.allFieldsRequired": "Tous les champs sont requis.",
"enterprise.form.error.invalidEmailFormat": "Format d'e-mail invalide.",
"enterprise.form.error.internalServer": "Erreur interne du serveur.",
"enterprise.faq.title": "FAQ",
"enterprise.faq.q1": "Qu'est-ce que OpenCode Enterprise ?",
"enterprise.faq.a1":
"OpenCode Enterprise s'adresse aux organisations qui veulent s'assurer que leur code et leurs données ne quittent jamais leur infrastructure. Cela est possible grâce à une configuration centralisée qui s'intègre à votre SSO et à votre passerelle IA interne.",
"enterprise.faq.q2": "Comment démarrer avec OpenCode Enterprise ?",
"enterprise.faq.a2":
"Commencez simplement par un essai interne avec votre équipe. Par défaut, OpenCode ne stocke pas votre code ni vos données de contexte, ce qui facilite la prise en main. Ensuite, contactez-nous pour discuter des tarifs et des options de mise en œuvre.",
"enterprise.faq.q3": "Comment fonctionne la tarification entreprise ?",
"enterprise.faq.a3":
"Nous proposons une tarification entreprise par siège. Si vous avez votre propre passerelle LLM, nous ne facturons pas les tokens utilisés. Pour plus de détails, contactez-nous pour un devis sur mesure en fonction des besoins de votre organisation.",
"enterprise.faq.q4": "Mes données sont-elles sécurisées avec OpenCode Enterprise ?",
"enterprise.faq.a4":
"Oui. OpenCode ne stocke pas votre code ni vos données de contexte. Tout le traitement se fait localement ou via des appels API directs vers votre fournisseur d'IA. Avec une configuration centralisée et une intégration SSO, vos données restent sécurisées au sein de l'infrastructure de votre organisation.",
"brand.title": "OpenCode | Marque",
"brand.meta.description": "Guide de marque OpenCode",
"brand.heading": "Guide de marque",
"brand.subtitle": "Ressources et éléments pour vous aider à travailler avec la marque OpenCode.",
"brand.downloadAll": "Télécharger tous les assets",
"changelog.title": "OpenCode | Changelog",
"changelog.meta.description": "Notes de version et changelog d'OpenCode",
"changelog.hero.title": "Changelog",
"changelog.hero.subtitle": "Nouvelles mises à jour et améliorations pour OpenCode",
"changelog.empty": "Aucune entrée de changelog trouvée.",
"changelog.viewJson": "Voir le JSON",
"bench.list.title": "Benchmark",
"bench.list.heading": "Benchmarks",
"bench.list.table.agent": "Agent",
"bench.list.table.model": "Modèle",
"bench.list.table.score": "Score",
"bench.detail.title": "Benchmark - {{task}}",
"bench.detail.notFound": "Tâche introuvable",
"bench.detail.na": "N/A",
"bench.detail.labels.agent": "Agent",
"bench.detail.labels.model": "Modèle",
"bench.detail.labels.task": "Tâche",
"bench.detail.labels.repo": "Dépôt",
"bench.detail.labels.from": "De",
"bench.detail.labels.to": "À",
"bench.detail.labels.prompt": "Prompt",
"bench.detail.labels.commit": "Commit",
"bench.detail.labels.averageDuration": "Durée moyenne",
"bench.detail.labels.averageScore": "Score moyen",
"bench.detail.labels.averageCost": "Coût moyen",
"bench.detail.labels.summary": "Résumé",
"bench.detail.labels.runs": "Exécutions",
"bench.detail.labels.score": "Score",
"bench.detail.labels.base": "Base",
"bench.detail.labels.penalty": "Pénalité",
"bench.detail.labels.weight": "poids",
"bench.detail.table.run": "Exécution",
"bench.detail.table.score": "Score (Base - Pénalité)",
"bench.detail.table.cost": "Coût",
"bench.detail.table.duration": "Durée",
"bench.detail.run.title": "Exécution {{n}}",
"bench.detail.rawJson": "JSON brut",
"bench.submission.error.allFieldsRequired": "Tous les champs sont requis.",
} satisfies Dict

View File

@@ -0,0 +1,45 @@
import type { Locale } from "~/lib/language"
import { dict as en } from "~/i18n/en"
import { dict as zh } from "~/i18n/zh"
import { dict as zht } from "~/i18n/zht"
import { dict as ko } from "~/i18n/ko"
import { dict as de } from "~/i18n/de"
import { dict as es } from "~/i18n/es"
import { dict as fr } from "~/i18n/fr"
import { dict as it } from "~/i18n/it"
import { dict as da } from "~/i18n/da"
import { dict as ja } from "~/i18n/ja"
import { dict as pl } from "~/i18n/pl"
import { dict as ru } from "~/i18n/ru"
import { dict as uk } from "~/i18n/uk"
import { dict as ar } from "~/i18n/ar"
import { dict as no } from "~/i18n/no"
import { dict as br } from "~/i18n/br"
import { dict as th } from "~/i18n/th"
import { dict as tr } from "~/i18n/tr"
export type Key = keyof typeof en
export type Dict = Record<Key, string>
const base = en satisfies Dict
export function i18n(locale: Locale): Dict {
if (locale === "en") return base
if (locale === "zh") return { ...base, ...zh }
if (locale === "zht") return { ...base, ...zht }
if (locale === "ko") return { ...base, ...ko }
if (locale === "de") return { ...base, ...de }
if (locale === "es") return { ...base, ...es }
if (locale === "fr") return { ...base, ...fr }
if (locale === "it") return { ...base, ...it }
if (locale === "da") return { ...base, ...da }
if (locale === "ja") return { ...base, ...ja }
if (locale === "pl") return { ...base, ...pl }
if (locale === "ru") return { ...base, ...ru }
if (locale === "uk") return { ...base, ...uk }
if (locale === "ar") return { ...base, ...ar }
if (locale === "no") return { ...base, ...no }
if (locale === "br") return { ...base, ...br }
if (locale === "th") return { ...base, ...th }
return { ...base, ...tr }
}

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