import"./jsx-runtime-CgWCn3gT.js";import{b as je,_ as Xe,R as et,s as tt,e as ot}from"./i18nInstance-C_7vXBXC.js";import{_ as L}from"./preload-helper-BXl3LOEh.js";function Ke(n,e){this.v=n,this.k=e}function O(n,e,t,o){var s=Object.defineProperty;try{s({},"",{})}catch{s=0}O=function(a,i,l,u){function d(p,c){O(a,p,function(h){return this._invoke(p,c,h)})}i?s?s(a,i,{value:l,enumerable:!u,configurable:!u,writable:!u}):a[i]=l:(d("next",0),d("throw",1),d("return",2))},O(n,e,t,o)}function we(){var n,e,t=typeof Symbol=="function"?Symbol:{},o=t.iterator||"@@iterator",s=t.toStringTag||"@@toStringTag";function r(h,g,w,y){var M=g&&g.prototype instanceof i?g:i,A=Object.create(M.prototype);return O(A,"_invoke",(function(H,v,R){var k,f,S,F=0,G=R||[],T=!1,_={p:0,n:0,v:n,a:U,f:U.bind(n,4),d:function(x,$){return k=x,f=0,S=n,_.n=$,a}};function U(I,x){for(f=I,S=x,e=0;!T&&F&&!$&&e<G.length;e++){var $,P=G[e],C=_.p,N=P[2];I>3?($=N===x)&&(S=P[(f=P[4])?5:(f=3,3)],P[4]=P[5]=n):P[0]<=C&&(($=I<2&&C<P[1])?(f=0,_.v=x,_.n=P[1]):C<N&&($=I<3||P[0]>x||x>N)&&(P[4]=I,P[5]=x,_.n=N,f=0))}if($||I>1)return a;throw T=!0,x}return function(I,x,$){if(F>1)throw TypeError("Generator is already running");for(T&&x===1&&U(x,$),f=x,S=$;(e=f<2?n:S)||!T;){k||(f?f<3?(f>1&&(_.n=-1),U(f,S)):_.n=S:_.v=S);try{if(F=2,k){if(f||(I="next"),e=k[I]){if(!(e=e.call(k,S)))throw TypeError("iterator result is not an object");if(!e.done)return e;S=e.value,f<2&&(f=0)}else f===1&&(e=k.return)&&e.call(k),f<2&&(S=TypeError("The iterator does not provide a '"+I+"' method"),f=1);k=n}else if((e=(T=_.n<0)?S:H.call(v,_))!==a)break}catch(P){k=n,f=1,S=P}finally{F=1}}return{value:e,done:T}}})(h,w,y),!0),A}var a={};function i(){}function l(){}function u(){}e=Object.getPrototypeOf;var d=[][o]?e(e([][o]())):(O(e={},o,function(){return this}),e),p=u.prototype=i.prototype=Object.create(d);function c(h){return Object.setPrototypeOf?Object.setPrototypeOf(h,u):(h.__proto__=u,O(h,s,"GeneratorFunction")),h.prototype=Object.create(p),h}return l.prototype=u,O(p,"constructor",u),O(u,"constructor",l),l.displayName="GeneratorFunction",O(u,s,"GeneratorFunction"),O(p),O(p,s,"Generator"),O(p,o,function(){return this}),O(p,"toString",function(){return"[object Generator]"}),(we=function(){return{w:r,m:c}})()}function se(n,e){function t(s,r,a,i){try{var l=n[s](r),u=l.value;return u instanceof Ke?e.resolve(u.v).then(function(d){t("next",d,a,i)},function(d){t("throw",d,a,i)}):e.resolve(u).then(function(d){l.value=d,a(l)},function(d){return t("throw",d,a,i)})}catch(d){i(d)}}var o;this.next||(O(se.prototype),O(se.prototype,typeof Symbol=="function"&&Symbol.asyncIterator||"@asyncIterator",function(){return this})),O(this,"_invoke",function(s,r,a){function i(){return new e(function(l,u){t(s,a,l,u)})}return o=o?o.then(i,i):i()},!0)}function Be(n,e,t,o,s){return new se(we().w(n,e,t,o),s||Promise)}function nt(n,e,t,o,s){var r=Be(n,e,t,o,s);return r.next().then(function(a){return a.done?a.value:r.next()})}function st(n){var e=Object(n),t=[];for(var o in e)t.unshift(o);return function s(){for(;t.length;)if((o=t.pop())in e)return s.value=o,s.done=!1,s;return s.done=!0,s}}function xe(n){if(n!=null){var e=n[typeof Symbol=="function"&&Symbol.iterator||"@@iterator"],t=0;if(e)return e.call(n);if(typeof n.next=="function")return n;if(!isNaN(n.length))return{next:function(){return n&&t>=n.length&&(n=void 0),{value:n&&n[t++],done:!n}}}}throw new TypeError(je(n)+" is not iterable")}function z(){var n=we(),e=n.m(z),t=(Object.getPrototypeOf?Object.getPrototypeOf(e):e.__proto__).constructor;function o(a){var i=typeof a=="function"&&a.constructor;return!!i&&(i===t||(i.displayName||i.name)==="GeneratorFunction")}var s={throw:1,return:2,break:3,continue:3};function r(a){var i,l;return function(u){i||(i={stop:function(){return l(u.a,2)},catch:function(){return u.v},abrupt:function(p,c){return l(u.a,s[p],c)},delegateYield:function(p,c,h){return i.resultName=c,l(u.d,xe(p),h)},finish:function(p){return l(u.f,p)}},l=function(p,c,h){u.p=i.prev,u.n=i.next;try{return p(c,h)}finally{i.next=u.n}}),i.resultName&&(i[i.resultName]=u.v,i.resultName=void 0),i.sent=u.v,i.next=u.n;try{return a.call(this,i)}finally{u.p=i.prev,u.n=i.next}}}return(z=function(){return{wrap:function(l,u,d,p){return n.w(r(l),u,d,p&&p.reverse())},isGeneratorFunction:o,mark:n.m,awrap:function(l,u){return new Ke(l,u)},AsyncIterator:se,async:function(l,u,d,p,c){return(o(u)?Be:nt)(r(l),u,d,p,c)},keys:st,values:xe}})()}function Ae(n,e,t,o,s,r,a){try{var i=n[r](a),l=i.value}catch(u){return void t(u)}i.done?e(l):Promise.resolve(l).then(o,s)}function Ve(n){return function(){var e=this,t=arguments;return new Promise(function(o,s){var r=n.apply(e,t);function a(l){Ae(r,o,s,a,i,"next",l)}function i(l){Ae(r,o,s,a,i,"throw",l)}a(void 0)})}}var ee=Xe({},et),rt=ee.version,pe=ee.render,at=ee.unmountComponentAtNode,ce;try{var it=Number((rt||"").split(".")[0]);it>=18&&(ce=ee.createRoot)}catch{}function Se(n){var e=ee.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;e&&je(e)==="object"&&(e.usingClientEntryPoint=n)}var re="__rc_react_root__";function lt(n,e){Se(!0);var t=e[re]||ce(e);Se(!1),t.render(n),e[re]=t}function ut(n,e){pe?.(n,e)}function ct(n,e){if(ce){lt(n,e);return}ut(n,e)}function dt(n){return fe.apply(this,arguments)}function fe(){return fe=Ve(z().mark(function n(e){return z().wrap(function(o){for(;;)switch(o.prev=o.next){case 0:return o.abrupt("return",Promise.resolve().then(function(){var s;(s=e[re])===null||s===void 0||s.unmount(),delete e[re]}));case 1:case"end":return o.stop()}},n)})),fe.apply(this,arguments)}function pt(n){at(n)}function ht(n){return ye.apply(this,arguments)}function ye(){return ye=Ve(z().mark(function n(e){return z().wrap(function(o){for(;;)switch(o.prev=o.next){case 0:if(ce===void 0){o.next=2;break}return o.abrupt("return",dt(e));case 2:pt(e);case 3:case"end":return o.stop()}},n)})),ye.apply(this,arguments)}const mt=(n,e)=>(ct(n,e),()=>ht(e));let Ie=mt;function yi(n){return n&&(Ie=n),Ie}const gt={type:"3rdParty",init(n){tt(n.options.react),ot(n)}},m=n=>typeof n=="string",J=()=>{let n,e;const t=new Promise((o,s)=>{n=o,e=s});return t.resolve=n,t.reject=e,t},Ce=n=>n==null?"":""+n,ft=(n,e,t)=>{n.forEach(o=>{e[o]&&(t[o]=e[o])})},yt=/###/g,Pe=n=>n&&n.indexOf("###")>-1?n.replace(yt,"."):n,Le=n=>!n||m(n),Q=(n,e,t)=>{const o=m(e)?e.split("."):e;let s=0;for(;s<o.length-1;){if(Le(n))return{};const r=Pe(o[s]);!n[r]&&t&&(n[r]=new t),Object.prototype.hasOwnProperty.call(n,r)?n=n[r]:n={},++s}return Le(n)?{}:{obj:n,k:Pe(o[s])}},Oe=(n,e,t)=>{const{obj:o,k:s}=Q(n,e,Object);if(o!==void 0||e.length===1){o[s]=t;return}let r=e[e.length-1],a=e.slice(0,e.length-1),i=Q(n,a,Object);for(;i.obj===void 0&&a.length;)r=`${a[a.length-1]}.${r}`,a=a.slice(0,a.length-1),i=Q(n,a,Object),i&&i.obj&&typeof i.obj[`${i.k}.${r}`]<"u"&&(i.obj=void 0);i.obj[`${i.k}.${r}`]=t},bt=(n,e,t,o)=>{const{obj:s,k:r}=Q(n,e,Object);s[r]=s[r]||[],s[r].push(t)},ae=(n,e)=>{const{obj:t,k:o}=Q(n,e);if(t)return t[o]},wt=(n,e,t)=>{const o=ae(n,t);return o!==void 0?o:ae(e,t)},ze=(n,e,t)=>{for(const o in e)o!=="__proto__"&&o!=="constructor"&&(o in n?m(n[o])||n[o]instanceof String||m(e[o])||e[o]instanceof String?t&&(n[o]=e[o]):ze(n[o],e[o],t):n[o]=e[o]);return n},j=n=>n.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&");var vt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"};const kt=n=>m(n)?n.replace(/[&<>"'\/]/g,e=>vt[e]):n;class xt{constructor(e){this.capacity=e,this.regExpMap=new Map,this.regExpQueue=[]}getRegExp(e){const t=this.regExpMap.get(e);if(t!==void 0)return t;const o=new RegExp(e);return this.regExpQueue.length===this.capacity&&this.regExpMap.delete(this.regExpQueue.shift()),this.regExpMap.set(e,o),this.regExpQueue.push(e),o}}const At=[" ",",","?","!",";"],St=new xt(20),It=(n,e,t)=>{e=e||"",t=t||"";const o=At.filter(a=>e.indexOf(a)<0&&t.indexOf(a)<0);if(o.length===0)return!0;const s=St.getRegExp(`(${o.map(a=>a==="?"?"\\?":a).join("|")})`);let r=!s.test(n);if(!r){const a=n.indexOf(t);a>0&&!s.test(n.substring(0,a))&&(r=!0)}return r},be=function(n,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:".";if(!n)return;if(n[e])return n[e];const o=e.split(t);let s=n;for(let r=0;r<o.length;){if(!s||typeof s!="object")return;let a,i="";for(let l=r;l<o.length;++l)if(l!==r&&(i+=t),i+=o[l],a=s[i],a!==void 0){if(["string","number","boolean"].indexOf(typeof a)>-1&&l<o.length-1)continue;r+=l-r+1;break}s=a}return s},ie=n=>n&&n.replace("_","-"),Ct={type:"logger",log(n){this.output("log",n)},warn(n){this.output("warn",n)},error(n){this.output("error",n)},output(n,e){console&&console[n]&&console[n].apply(console,e)}};class le{constructor(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.init(e,t)}init(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.prefix=t.prefix||"i18next:",this.logger=e||Ct,this.options=t,this.debug=t.debug}log(){for(var e=arguments.length,t=new Array(e),o=0;o<e;o++)t[o]=arguments[o];return this.forward(t,"log","",!0)}warn(){for(var e=arguments.length,t=new Array(e),o=0;o<e;o++)t[o]=arguments[o];return this.forward(t,"warn","",!0)}error(){for(var e=arguments.length,t=new Array(e),o=0;o<e;o++)t[o]=arguments[o];return this.forward(t,"error","")}deprecate(){for(var e=arguments.length,t=new Array(e),o=0;o<e;o++)t[o]=arguments[o];return this.forward(t,"warn","WARNING DEPRECATED: ",!0)}forward(e,t,o,s){return s&&!this.debug?null:(m(e[0])&&(e[0]=`${o}${this.prefix} ${e[0]}`),this.logger[t](e))}create(e){return new le(this.logger,{prefix:`${this.prefix}:${e}:`,...this.options})}clone(e){return e=e||this.options,e.prefix=e.prefix||this.prefix,new le(this.logger,e)}}var E=new le;class de{constructor(){this.observers={}}on(e,t){return e.split(" ").forEach(o=>{this.observers[o]||(this.observers[o]=new Map);const s=this.observers[o].get(t)||0;this.observers[o].set(t,s+1)}),this}off(e,t){if(this.observers[e]){if(!t){delete this.observers[e];return}this.observers[e].delete(t)}}emit(e){for(var t=arguments.length,o=new Array(t>1?t-1:0),s=1;s<t;s++)o[s-1]=arguments[s];this.observers[e]&&Array.from(this.observers[e].entries()).forEach(a=>{let[i,l]=a;for(let u=0;u<l;u++)i(...o)}),this.observers["*"]&&Array.from(this.observers["*"].entries()).forEach(a=>{let[i,l]=a;for(let u=0;u<l;u++)i.apply(i,[e,...o])})}}class Me extends de{constructor(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{ns:["translation"],defaultNS:"translation"};super(),this.data=e||{},this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(e){this.options.ns.indexOf(e)<0&&this.options.ns.push(e)}removeNamespaces(e){const t=this.options.ns.indexOf(e);t>-1&&this.options.ns.splice(t,1)}getResource(e,t,o){let s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};const r=s.keySeparator!==void 0?s.keySeparator:this.options.keySeparator,a=s.ignoreJSONStructure!==void 0?s.ignoreJSONStructure:this.options.ignoreJSONStructure;let i;e.indexOf(".")>-1?i=e.split("."):(i=[e,t],o&&(Array.isArray(o)?i.push(...o):m(o)&&r?i.push(...o.split(r)):i.push(o)));const l=ae(this.data,i);return!l&&!t&&!o&&e.indexOf(".")>-1&&(e=i[0],t=i[1],o=i.slice(2).join(".")),l||!a||!m(o)?l:be(this.data&&this.data[e]&&this.data[e][t],o,r)}addResource(e,t,o,s){let r=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{silent:!1};const a=r.keySeparator!==void 0?r.keySeparator:this.options.keySeparator;let i=[e,t];o&&(i=i.concat(a?o.split(a):o)),e.indexOf(".")>-1&&(i=e.split("."),s=t,t=i[1]),this.addNamespaces(t),Oe(this.data,i,s),r.silent||this.emit("added",e,t,o,s)}addResources(e,t,o){let s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{silent:!1};for(const r in o)(m(o[r])||Array.isArray(o[r]))&&this.addResource(e,t,r,o[r],{silent:!0});s.silent||this.emit("added",e,t,o)}addResourceBundle(e,t,o,s,r){let a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{silent:!1,skipCopy:!1},i=[e,t];e.indexOf(".")>-1&&(i=e.split("."),s=o,o=t,t=i[1]),this.addNamespaces(t);let l=ae(this.data,i)||{};a.skipCopy||(o=JSON.parse(JSON.stringify(o))),s?ze(l,o,r):l={...l,...o},Oe(this.data,i,l),a.silent||this.emit("added",e,t,o)}removeResourceBundle(e,t){this.hasResourceBundle(e,t)&&delete this.data[e][t],this.removeNamespaces(t),this.emit("removed",e,t)}hasResourceBundle(e,t){return this.getResource(e,t)!==void 0}getResourceBundle(e,t){return t||(t=this.options.defaultNS),this.options.compatibilityAPI==="v1"?{...this.getResource(e,t)}:this.getResource(e,t)}getDataByLanguage(e){return this.data[e]}hasLanguageSomeTranslations(e){const t=this.getDataByLanguage(e);return!!(t&&Object.keys(t)||[]).find(s=>t[s]&&Object.keys(t[s]).length>0)}toJSON(){return this.data}}var Ge={processors:{},addPostProcessor(n){this.processors[n.name]=n},handle(n,e,t,o,s){return n.forEach(r=>{this.processors[r]&&(e=this.processors[r].process(e,t,o,s))}),e}};const Re={};class ue extends de{constructor(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(),ft(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],e,this),this.options=t,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=E.create("translator")}changeLanguage(e){e&&(this.language=e)}exists(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}};if(e==null)return!1;const o=this.resolve(e,t);return o&&o.res!==void 0}extractFromKey(e,t){let o=t.nsSeparator!==void 0?t.nsSeparator:this.options.nsSeparator;o===void 0&&(o=":");const s=t.keySeparator!==void 0?t.keySeparator:this.options.keySeparator;let r=t.ns||this.options.defaultNS||[];const a=o&&e.indexOf(o)>-1,i=!this.options.userDefinedKeySeparator&&!t.keySeparator&&!this.options.userDefinedNsSeparator&&!t.nsSeparator&&!It(e,o,s);if(a&&!i){const l=e.match(this.interpolator.nestingRegexp);if(l&&l.length>0)return{key:e,namespaces:m(r)?[r]:r};const u=e.split(o);(o!==s||o===s&&this.options.ns.indexOf(u[0])>-1)&&(r=u.shift()),e=u.join(s)}return{key:e,namespaces:m(r)?[r]:r}}translate(e,t,o){if(typeof t!="object"&&this.options.overloadTranslationOptionHandler&&(t=this.options.overloadTranslationOptionHandler(arguments)),typeof t=="object"&&(t={...t}),t||(t={}),e==null)return"";Array.isArray(e)||(e=[String(e)]);const s=t.returnDetails!==void 0?t.returnDetails:this.options.returnDetails,r=t.keySeparator!==void 0?t.keySeparator:this.options.keySeparator,{key:a,namespaces:i}=this.extractFromKey(e[e.length-1],t),l=i[i.length-1],u=t.lng||this.language,d=t.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(u&&u.toLowerCase()==="cimode"){if(d){const v=t.nsSeparator||this.options.nsSeparator;return s?{res:`${l}${v}${a}`,usedKey:a,exactUsedKey:a,usedLng:u,usedNS:l,usedParams:this.getUsedParamsDetails(t)}:`${l}${v}${a}`}return s?{res:a,usedKey:a,exactUsedKey:a,usedLng:u,usedNS:l,usedParams:this.getUsedParamsDetails(t)}:a}const p=this.resolve(e,t);let c=p&&p.res;const h=p&&p.usedKey||a,g=p&&p.exactUsedKey||a,w=Object.prototype.toString.apply(c),y=["[object Number]","[object Function]","[object RegExp]"],M=t.joinArrays!==void 0?t.joinArrays:this.options.joinArrays,A=!this.i18nFormat||this.i18nFormat.handleAsObject,H=!m(c)&&typeof c!="boolean"&&typeof c!="number";if(A&&c&&H&&y.indexOf(w)<0&&!(m(M)&&Array.isArray(c))){if(!t.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const v=this.options.returnedObjectHandler?this.options.returnedObjectHandler(h,c,{...t,ns:i}):`key '${a} (${this.language})' returned an object instead of string.`;return s?(p.res=v,p.usedParams=this.getUsedParamsDetails(t),p):v}if(r){const v=Array.isArray(c),R=v?[]:{},k=v?g:h;for(const f in c)if(Object.prototype.hasOwnProperty.call(c,f)){const S=`${k}${r}${f}`;R[f]=this.translate(S,{...t,joinArrays:!1,ns:i}),R[f]===S&&(R[f]=c[f])}c=R}}else if(A&&m(M)&&Array.isArray(c))c=c.join(M),c&&(c=this.extendTranslation(c,e,t,o));else{let v=!1,R=!1;const k=t.count!==void 0&&!m(t.count),f=ue.hasDefaultValue(t),S=k?this.pluralResolver.getSuffix(u,t.count,t):"",F=t.ordinal&&k?this.pluralResolver.getSuffix(u,t.count,{ordinal:!1}):"",G=k&&!t.ordinal&&t.count===0&&this.pluralResolver.shouldUseIntlApi(),T=G&&t[`defaultValue${this.options.pluralSeparator}zero`]||t[`defaultValue${S}`]||t[`defaultValue${F}`]||t.defaultValue;!this.isValidLookup(c)&&f&&(v=!0,c=T),this.isValidLookup(c)||(R=!0,c=a);const U=(t.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&R?void 0:c,I=f&&T!==c&&this.options.updateMissing;if(R||v||I){if(this.logger.log(I?"updateKey":"missingKey",u,l,a,I?T:c),r){const C=this.resolve(a,{...t,keySeparator:!1});C&&C.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let x=[];const $=this.languageUtils.getFallbackCodes(this.options.fallbackLng,t.lng||this.language);if(this.options.saveMissingTo==="fallback"&&$&&$[0])for(let C=0;C<$.length;C++)x.push($[C]);else this.options.saveMissingTo==="all"?x=this.languageUtils.toResolveHierarchy(t.lng||this.language):x.push(t.lng||this.language);const P=(C,N,W)=>{const ke=f&&W!==c?W:U;this.options.missingKeyHandler?this.options.missingKeyHandler(C,l,N,ke,I,t):this.backendConnector&&this.backendConnector.saveMissing&&this.backendConnector.saveMissing(C,l,N,ke,I,t),this.emit("missingKey",C,l,N,c)};this.options.saveMissing&&(this.options.saveMissingPlurals&&k?x.forEach(C=>{const N=this.pluralResolver.getSuffixes(C,t);G&&t[`defaultValue${this.options.pluralSeparator}zero`]&&N.indexOf(`${this.options.pluralSeparator}zero`)<0&&N.push(`${this.options.pluralSeparator}zero`),N.forEach(W=>{P([C],a+W,t[`defaultValue${W}`]||T)})}):P(x,a,T))}c=this.extendTranslation(c,e,t,p,o),R&&c===a&&this.options.appendNamespaceToMissingKey&&(c=`${l}:${a}`),(R||v)&&this.options.parseMissingKeyHandler&&(this.options.compatibilityAPI!=="v1"?c=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${l}:${a}`:a,v?c:void 0):c=this.options.parseMissingKeyHandler(c))}return s?(p.res=c,p.usedParams=this.getUsedParamsDetails(t),p):c}extendTranslation(e,t,o,s,r){var a=this;if(this.i18nFormat&&this.i18nFormat.parse)e=this.i18nFormat.parse(e,{...this.options.interpolation.defaultVariables,...o},o.lng||this.language||s.usedLng,s.usedNS,s.usedKey,{resolved:s});else if(!o.skipInterpolation){o.interpolation&&this.interpolator.init({...o,interpolation:{...this.options.interpolation,...o.interpolation}});const u=m(e)&&(o&&o.interpolation&&o.interpolation.skipOnVariables!==void 0?o.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let d;if(u){const c=e.match(this.interpolator.nestingRegexp);d=c&&c.length}let p=o.replace&&!m(o.replace)?o.replace:o;if(this.options.interpolation.defaultVariables&&(p={...this.options.interpolation.defaultVariables,...p}),e=this.interpolator.interpolate(e,p,o.lng||this.language||s.usedLng,o),u){const c=e.match(this.interpolator.nestingRegexp),h=c&&c.length;d<h&&(o.nest=!1)}!o.lng&&this.options.compatibilityAPI!=="v1"&&s&&s.res&&(o.lng=this.language||s.usedLng),o.nest!==!1&&(e=this.interpolator.nest(e,function(){for(var c=arguments.length,h=new Array(c),g=0;g<c;g++)h[g]=arguments[g];return r&&r[0]===h[0]&&!o.context?(a.logger.warn(`It seems you are nesting recursively key: ${h[0]} in key: ${t[0]}`),null):a.translate(...h,t)},o)),o.interpolation&&this.interpolator.reset()}const i=o.postProcess||this.options.postProcess,l=m(i)?[i]:i;return e!=null&&l&&l.length&&o.applyPostProcessor!==!1&&(e=Ge.handle(l,e,t,this.options&&this.options.postProcessPassResolved?{i18nResolved:{...s,usedParams:this.getUsedParamsDetails(o)},...o}:o,this)),e}resolve(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o,s,r,a,i;return m(e)&&(e=[e]),e.forEach(l=>{if(this.isValidLookup(o))return;const u=this.extractFromKey(l,t),d=u.key;s=d;let p=u.namespaces;this.options.fallbackNS&&(p=p.concat(this.options.fallbackNS));const c=t.count!==void 0&&!m(t.count),h=c&&!t.ordinal&&t.count===0&&this.pluralResolver.shouldUseIntlApi(),g=t.context!==void 0&&(m(t.context)||typeof t.context=="number")&&t.context!=="",w=t.lngs?t.lngs:this.languageUtils.toResolveHierarchy(t.lng||this.language,t.fallbackLng);p.forEach(y=>{this.isValidLookup(o)||(i=y,!Re[`${w[0]}-${y}`]&&this.utils&&this.utils.hasLoadedNamespace&&!this.utils.hasLoadedNamespace(i)&&(Re[`${w[0]}-${y}`]=!0,this.logger.warn(`key "${s}" for languages "${w.join(", ")}" won't get resolved as namespace "${i}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),w.forEach(M=>{if(this.isValidLookup(o))return;a=M;const A=[d];if(this.i18nFormat&&this.i18nFormat.addLookupKeys)this.i18nFormat.addLookupKeys(A,d,M,y,t);else{let v;c&&(v=this.pluralResolver.getSuffix(M,t.count,t));const R=`${this.options.pluralSeparator}zero`,k=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(c&&(A.push(d+v),t.ordinal&&v.indexOf(k)===0&&A.push(d+v.replace(k,this.options.pluralSeparator)),h&&A.push(d+R)),g){const f=`${d}${this.options.contextSeparator}${t.context}`;A.push(f),c&&(A.push(f+v),t.ordinal&&v.indexOf(k)===0&&A.push(f+v.replace(k,this.options.pluralSeparator)),h&&A.push(f+R))}}let H;for(;H=A.pop();)this.isValidLookup(o)||(r=H,o=this.getResource(M,y,H,t))}))})}),{res:o,usedKey:s,exactUsedKey:r,usedLng:a,usedNS:i}}isValidLookup(e){return e!==void 0&&!(!this.options.returnNull&&e===null)&&!(!this.options.returnEmptyString&&e==="")}getResource(e,t,o){let s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(e,t,o,s):this.resourceStore.getResource(e,t,o,s)}getUsedParamsDetails(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};const t=["defaultValue","ordinal","context","replace","lng","lngs","fallbackLng","ns","keySeparator","nsSeparator","returnObjects","returnDetails","joinArrays","postProcess","interpolation"],o=e.replace&&!m(e.replace);let s=o?e.replace:e;if(o&&typeof e.count<"u"&&(s.count=e.count),this.options.interpolation.defaultVariables&&(s={...this.options.interpolation.defaultVariables,...s}),!o){s={...s};for(const r of t)delete s[r]}return s}static hasDefaultValue(e){const t="defaultValue";for(const o in e)if(Object.prototype.hasOwnProperty.call(e,o)&&t===o.substring(0,t.length)&&e[o]!==void 0)return!0;return!1}}const he=n=>n.charAt(0).toUpperCase()+n.slice(1);class $e{constructor(e){this.options=e,this.supportedLngs=this.options.supportedLngs||!1,this.logger=E.create("languageUtils")}getScriptPartFromCode(e){if(e=ie(e),!e||e.indexOf("-")<0)return null;const t=e.split("-");return t.length===2||(t.pop(),t[t.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(t.join("-"))}getLanguagePartFromCode(e){if(e=ie(e),!e||e.indexOf("-")<0)return e;const t=e.split("-");return this.formatLanguageCode(t[0])}formatLanguageCode(e){if(m(e)&&e.indexOf("-")>-1){if(typeof Intl<"u"&&typeof Intl.getCanonicalLocales<"u")try{let s=Intl.getCanonicalLocales(e)[0];if(s&&this.options.lowerCaseLng&&(s=s.toLowerCase()),s)return s}catch{}const t=["hans","hant","latn","cyrl","cans","mong","arab"];let o=e.split("-");return this.options.lowerCaseLng?o=o.map(s=>s.toLowerCase()):o.length===2?(o[0]=o[0].toLowerCase(),o[1]=o[1].toUpperCase(),t.indexOf(o[1].toLowerCase())>-1&&(o[1]=he(o[1].toLowerCase()))):o.length===3&&(o[0]=o[0].toLowerCase(),o[1].length===2&&(o[1]=o[1].toUpperCase()),o[0]!=="sgn"&&o[2].length===2&&(o[2]=o[2].toUpperCase()),t.indexOf(o[1].toLowerCase())>-1&&(o[1]=he(o[1].toLowerCase())),t.indexOf(o[2].toLowerCase())>-1&&(o[2]=he(o[2].toLowerCase()))),o.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?e.toLowerCase():e}isSupportedCode(e){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(e=this.getLanguagePartFromCode(e)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(e)>-1}getBestMatchFromCodes(e){if(!e)return null;let t;return e.forEach(o=>{if(t)return;const s=this.formatLanguageCode(o);(!this.options.supportedLngs||this.isSupportedCode(s))&&(t=s)}),!t&&this.options.supportedLngs&&e.forEach(o=>{if(t)return;const s=this.getLanguagePartFromCode(o);if(this.isSupportedCode(s))return t=s;t=this.options.supportedLngs.find(r=>{if(r===s)return r;if(!(r.indexOf("-")<0&&s.indexOf("-")<0)&&(r.indexOf("-")>0&&s.indexOf("-")<0&&r.substring(0,r.indexOf("-"))===s||r.indexOf(s)===0&&s.length>1))return r})}),t||(t=this.getFallbackCodes(this.options.fallbackLng)[0]),t}getFallbackCodes(e,t){if(!e)return[];if(typeof e=="function"&&(e=e(t)),m(e)&&(e=[e]),Array.isArray(e))return e;if(!t)return e.default||[];let o=e[t];return o||(o=e[this.getScriptPartFromCode(t)]),o||(o=e[this.formatLanguageCode(t)]),o||(o=e[this.getLanguagePartFromCode(t)]),o||(o=e.default),o||[]}toResolveHierarchy(e,t){const o=this.getFallbackCodes(t||this.options.fallbackLng||[],e),s=[],r=a=>{a&&(this.isSupportedCode(a)?s.push(a):this.logger.warn(`rejecting language code not found in supportedLngs: ${a}`))};return m(e)&&(e.indexOf("-")>-1||e.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&r(this.formatLanguageCode(e)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&r(this.getScriptPartFromCode(e)),this.options.load!=="currentOnly"&&r(this.getLanguagePartFromCode(e))):m(e)&&r(this.formatLanguageCode(e)),o.forEach(a=>{s.indexOf(a)<0&&r(this.formatLanguageCode(a))}),s}}let Pt=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kk","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],Lt={1:n=>+(n>1),2:n=>+(n!=1),3:n=>0,4:n=>n%10==1&&n%100!=11?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2,5:n=>n==0?0:n==1?1:n==2?2:n%100>=3&&n%100<=10?3:n%100>=11?4:5,6:n=>n==1?0:n>=2&&n<=4?1:2,7:n=>n==1?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2,8:n=>n==1?0:n==2?1:n!=8&&n!=11?2:3,9:n=>+(n>=2),10:n=>n==1?0:n==2?1:n<7?2:n<11?3:4,11:n=>n==1||n==11?0:n==2||n==12?1:n>2&&n<20?2:3,12:n=>+(n%10!=1||n%100==11),13:n=>+(n!==0),14:n=>n==1?0:n==2?1:n==3?2:3,15:n=>n%10==1&&n%100!=11?0:n%10>=2&&(n%100<10||n%100>=20)?1:2,16:n=>n%10==1&&n%100!=11?0:n!==0?1:2,17:n=>n==1||n%10==1&&n%100!=11?0:1,18:n=>n==0?0:n==1?1:2,19:n=>n==1?0:n==0||n%100>1&&n%100<11?1:n%100>10&&n%100<20?2:3,20:n=>n==1?0:n==0||n%100>0&&n%100<20?1:2,21:n=>n%100==1?1:n%100==2?2:n%100==3||n%100==4?3:0,22:n=>n==1?0:n==2?1:(n<0||n>10)&&n%10==0?2:3};const Ot=["v1","v2","v3"],Mt=["v4"],Te={zero:0,one:1,two:2,few:3,many:4,other:5},Rt=()=>{const n={};return Pt.forEach(e=>{e.lngs.forEach(t=>{n[t]={numbers:e.nr,plurals:Lt[e.fc]}})}),n};class $t{constructor(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.languageUtils=e,this.options=t,this.logger=E.create("pluralResolver"),(!this.options.compatibilityJSON||Mt.includes(this.options.compatibilityJSON))&&(typeof Intl>"u"||!Intl.PluralRules)&&(this.options.compatibilityJSON="v3",this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.")),this.rules=Rt(),this.pluralRulesCache={}}addRule(e,t){this.rules[e]=t}clearCache(){this.pluralRulesCache={}}getRule(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(this.shouldUseIntlApi()){const o=ie(e==="dev"?"en":e),s=t.ordinal?"ordinal":"cardinal",r=JSON.stringify({cleanedCode:o,type:s});if(r in this.pluralRulesCache)return this.pluralRulesCache[r];let a;try{a=new Intl.PluralRules(o,{type:s})}catch{if(!e.match(/-|_/))return;const l=this.languageUtils.getLanguagePartFromCode(e);a=this.getRule(l,t)}return this.pluralRulesCache[r]=a,a}return this.rules[e]||this.rules[this.languageUtils.getLanguagePartFromCode(e)]}needsPlural(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const o=this.getRule(e,t);return this.shouldUseIntlApi()?o&&o.resolvedOptions().pluralCategories.length>1:o&&o.numbers.length>1}getPluralFormsOfKey(e,t){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return this.getSuffixes(e,o).map(s=>`${t}${s}`)}getSuffixes(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const o=this.getRule(e,t);return o?this.shouldUseIntlApi()?o.resolvedOptions().pluralCategories.sort((s,r)=>Te[s]-Te[r]).map(s=>`${this.options.prepend}${t.ordinal?`ordinal${this.options.prepend}`:""}${s}`):o.numbers.map(s=>this.getSuffix(e,s,t)):[]}getSuffix(e,t){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};const s=this.getRule(e,o);return s?this.shouldUseIntlApi()?`${this.options.prepend}${o.ordinal?`ordinal${this.options.prepend}`:""}${s.select(t)}`:this.getSuffixRetroCompatible(s,t):(this.logger.warn(`no plural rule found for: ${e}`),"")}getSuffixRetroCompatible(e,t){const o=e.noAbs?e.plurals(t):e.plurals(Math.abs(t));let s=e.numbers[o];this.options.simplifyPluralSuffix&&e.numbers.length===2&&e.numbers[0]===1&&(s===2?s="plural":s===1&&(s=""));const r=()=>this.options.prepend&&s.toString()?this.options.prepend+s.toString():s.toString();return this.options.compatibilityJSON==="v1"?s===1?"":typeof s=="number"?`_plural_${s.toString()}`:r():this.options.compatibilityJSON==="v2"||this.options.simplifyPluralSuffix&&e.numbers.length===2&&e.numbers[0]===1?r():this.options.prepend&&o.toString()?this.options.prepend+o.toString():o.toString()}shouldUseIntlApi(){return!Ot.includes(this.options.compatibilityJSON)}}const Ne=function(n,e,t){let o=arguments.length>3&&arguments[3]!==void 0?arguments[3]:".",s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,r=wt(n,e,t);return!r&&s&&m(t)&&(r=be(n,t,o),r===void 0&&(r=be(e,t,o))),r},me=n=>n.replace(/\$/g,"$$$$");class Tt{constructor(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=E.create("interpolator"),this.options=e,this.format=e.interpolation&&e.interpolation.format||(t=>t),this.init(e)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};e.interpolation||(e.interpolation={escapeValue:!0});const{escape:t,escapeValue:o,useRawValueToEscape:s,prefix:r,prefixEscaped:a,suffix:i,suffixEscaped:l,formatSeparator:u,unescapeSuffix:d,unescapePrefix:p,nestingPrefix:c,nestingPrefixEscaped:h,nestingSuffix:g,nestingSuffixEscaped:w,nestingOptionsSeparator:y,maxReplaces:M,alwaysFormat:A}=e.interpolation;this.escape=t!==void 0?t:kt,this.escapeValue=o!==void 0?o:!0,this.useRawValueToEscape=s!==void 0?s:!1,this.prefix=r?j(r):a||"{{",this.suffix=i?j(i):l||"}}",this.formatSeparator=u||",",this.unescapePrefix=d?"":p||"-",this.unescapeSuffix=this.unescapePrefix?"":d||"",this.nestingPrefix=c?j(c):h||j("$t("),this.nestingSuffix=g?j(g):w||j(")"),this.nestingOptionsSeparator=y||",",this.maxReplaces=M||1e3,this.alwaysFormat=A!==void 0?A:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const e=(t,o)=>t&&t.source===o?(t.lastIndex=0,t):new RegExp(o,"g");this.regexp=e(this.regexp,`${this.prefix}(.+?)${this.suffix}`),this.regexpUnescape=e(this.regexpUnescape,`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`),this.nestingRegexp=e(this.nestingRegexp,`${this.nestingPrefix}(.+?)${this.nestingSuffix}`)}interpolate(e,t,o,s){let r,a,i;const l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{},u=h=>{if(h.indexOf(this.formatSeparator)<0){const M=Ne(t,l,h,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(M,void 0,o,{...s,...t,interpolationkey:h}):M}const g=h.split(this.formatSeparator),w=g.shift().trim(),y=g.join(this.formatSeparator).trim();return this.format(Ne(t,l,w,this.options.keySeparator,this.options.ignoreJSONStructure),y,o,{...s,...t,interpolationkey:w})};this.resetRegExp();const d=s&&s.missingInterpolationHandler||this.options.missingInterpolationHandler,p=s&&s.interpolation&&s.interpolation.skipOnVariables!==void 0?s.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:h=>me(h)},{regex:this.regexp,safeValue:h=>this.escapeValue?me(this.escape(h)):me(h)}].forEach(h=>{for(i=0;r=h.regex.exec(e);){const g=r[1].trim();if(a=u(g),a===void 0)if(typeof d=="function"){const y=d(e,r,s);a=m(y)?y:""}else if(s&&Object.prototype.hasOwnProperty.call(s,g))a="";else if(p){a=r[0];continue}else this.logger.warn(`missed to pass in variable ${g} for interpolating ${e}`),a="";else!m(a)&&!this.useRawValueToEscape&&(a=Ce(a));const w=h.safeValue(a);if(e=e.replace(r[0],w),p?(h.regex.lastIndex+=a.length,h.regex.lastIndex-=r[0].length):h.regex.lastIndex=0,i++,i>=this.maxReplaces)break}}),e}nest(e,t){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},s,r,a;const i=(l,u)=>{const d=this.nestingOptionsSeparator;if(l.indexOf(d)<0)return l;const p=l.split(new RegExp(`${d}[ ]*{`));let c=`{${p[1]}`;l=p[0],c=this.interpolate(c,a);const h=c.match(/'/g),g=c.match(/"/g);(h&&h.length%2===0&&!g||g.length%2!==0)&&(c=c.replace(/'/g,'"'));try{a=JSON.parse(c),u&&(a={...u,...a})}catch(w){return this.logger.warn(`failed parsing options string in nesting for key ${l}`,w),`${l}${d}${c}`}return a.defaultValue&&a.defaultValue.indexOf(this.prefix)>-1&&delete a.defaultValue,l};for(;s=this.nestingRegexp.exec(e);){let l=[];a={...o},a=a.replace&&!m(a.replace)?a.replace:a,a.applyPostProcessor=!1,delete a.defaultValue;let u=!1;if(s[0].indexOf(this.formatSeparator)!==-1&&!/{.*}/.test(s[1])){const d=s[1].split(this.formatSeparator).map(p=>p.trim());s[1]=d.shift(),l=d,u=!0}if(r=t(i.call(this,s[1].trim(),a),a),r&&s[0]===e&&!m(r))return r;m(r)||(r=Ce(r)),r||(this.logger.warn(`missed to resolve ${s[1]} for nesting ${e}`),r=""),u&&(r=l.reduce((d,p)=>this.format(d,p,o.lng,{...o,interpolationkey:s[1].trim()}),r.trim())),e=e.replace(s[0],r),this.regexp.lastIndex=0}return e}}const Nt=n=>{let e=n.toLowerCase().trim();const t={};if(n.indexOf("(")>-1){const o=n.split("(");e=o[0].toLowerCase().trim();const s=o[1].substring(0,o[1].length-1);e==="currency"&&s.indexOf(":")<0?t.currency||(t.currency=s.trim()):e==="relativetime"&&s.indexOf(":")<0?t.range||(t.range=s.trim()):s.split(";").forEach(a=>{if(a){const[i,...l]=a.split(":"),u=l.join(":").trim().replace(/^'+|'+$/g,""),d=i.trim();t[d]||(t[d]=u),u==="false"&&(t[d]=!1),u==="true"&&(t[d]=!0),isNaN(u)||(t[d]=parseInt(u,10))}})}return{formatName:e,formatOptions:t}},K=n=>{const e={};return(t,o,s)=>{let r=s;s&&s.interpolationkey&&s.formatParams&&s.formatParams[s.interpolationkey]&&s[s.interpolationkey]&&(r={...r,[s.interpolationkey]:void 0});const a=o+JSON.stringify(r);let i=e[a];return i||(i=n(ie(o),s),e[a]=i),i(t)}};class _t{constructor(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=E.create("formatter"),this.options=e,this.formats={number:K((t,o)=>{const s=new Intl.NumberFormat(t,{...o});return r=>s.format(r)}),currency:K((t,o)=>{const s=new Intl.NumberFormat(t,{...o,style:"currency"});return r=>s.format(r)}),datetime:K((t,o)=>{const s=new Intl.DateTimeFormat(t,{...o});return r=>s.format(r)}),relativetime:K((t,o)=>{const s=new Intl.RelativeTimeFormat(t,{...o});return r=>s.format(r,o.range||"day")}),list:K((t,o)=>{const s=new Intl.ListFormat(t,{...o});return r=>s.format(r)})},this.init(e)}init(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}};this.formatSeparator=t.interpolation.formatSeparator||","}add(e,t){this.formats[e.toLowerCase().trim()]=t}addCached(e,t){this.formats[e.toLowerCase().trim()]=K(t)}format(e,t,o){let s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};const r=t.split(this.formatSeparator);if(r.length>1&&r[0].indexOf("(")>1&&r[0].indexOf(")")<0&&r.find(i=>i.indexOf(")")>-1)){const i=r.findIndex(l=>l.indexOf(")")>-1);r[0]=[r[0],...r.splice(1,i)].join(this.formatSeparator)}return r.reduce((i,l)=>{const{formatName:u,formatOptions:d}=Nt(l);if(this.formats[u]){let p=i;try{const c=s&&s.formatParams&&s.formatParams[s.interpolationkey]||{},h=c.locale||c.lng||s.locale||s.lng||o;p=this.formats[u](i,h,{...d,...s,...c})}catch(c){this.logger.warn(c)}return p}else this.logger.warn(`there was no format function for ${u}`);return i},e)}}const Et=(n,e)=>{n.pending[e]!==void 0&&(delete n.pending[e],n.pendingCount--)};class Dt extends de{constructor(e,t,o){let s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};super(),this.backend=e,this.store=t,this.services=o,this.languageUtils=o.languageUtils,this.options=s,this.logger=E.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=s.maxParallelReads||10,this.readingCalls=0,this.maxRetries=s.maxRetries>=0?s.maxRetries:5,this.retryTimeout=s.retryTimeout>=1?s.retryTimeout:350,this.state={},this.queue=[],this.backend&&this.backend.init&&this.backend.init(o,s.backend,s)}queueLoad(e,t,o,s){const r={},a={},i={},l={};return e.forEach(u=>{let d=!0;t.forEach(p=>{const c=`${u}|${p}`;!o.reload&&this.store.hasResourceBundle(u,p)?this.state[c]=2:this.state[c]<0||(this.state[c]===1?a[c]===void 0&&(a[c]=!0):(this.state[c]=1,d=!1,a[c]===void 0&&(a[c]=!0),r[c]===void 0&&(r[c]=!0),l[p]===void 0&&(l[p]=!0)))}),d||(i[u]=!0)}),(Object.keys(r).length||Object.keys(a).length)&&this.queue.push({pending:a,pendingCount:Object.keys(a).length,loaded:{},errors:[],callback:s}),{toLoad:Object.keys(r),pending:Object.keys(a),toLoadLanguages:Object.keys(i),toLoadNamespaces:Object.keys(l)}}loaded(e,t,o){const s=e.split("|"),r=s[0],a=s[1];t&&this.emit("failedLoading",r,a,t),!t&&o&&this.store.addResourceBundle(r,a,o,void 0,void 0,{skipCopy:!0}),this.state[e]=t?-1:2,t&&o&&(this.state[e]=0);const i={};this.queue.forEach(l=>{bt(l.loaded,[r],a),Et(l,e),t&&l.errors.push(t),l.pendingCount===0&&!l.done&&(Object.keys(l.loaded).forEach(u=>{i[u]||(i[u]={});const d=l.loaded[u];d.length&&d.forEach(p=>{i[u][p]===void 0&&(i[u][p]=!0)})}),l.done=!0,l.errors.length?l.callback(l.errors):l.callback())}),this.emit("loaded",i),this.queue=this.queue.filter(l=>!l.done)}read(e,t,o){let s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,r=arguments.length>4&&arguments[4]!==void 0?arguments[4]:this.retryTimeout,a=arguments.length>5?arguments[5]:void 0;if(!e.length)return a(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:e,ns:t,fcName:o,tried:s,wait:r,callback:a});return}this.readingCalls++;const i=(u,d)=>{if(this.readingCalls--,this.waitingReads.length>0){const p=this.waitingReads.shift();this.read(p.lng,p.ns,p.fcName,p.tried,p.wait,p.callback)}if(u&&d&&s<this.maxRetries){setTimeout(()=>{this.read.call(this,e,t,o,s+1,r*2,a)},r);return}a(u,d)},l=this.backend[o].bind(this.backend);if(l.length===2){try{const u=l(e,t);u&&typeof u.then=="function"?u.then(d=>i(null,d)).catch(i):i(null,u)}catch(u){i(u)}return}return l(e,t,i)}prepareLoading(e,t){let o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},s=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),s&&s();m(e)&&(e=this.languageUtils.toResolveHierarchy(e)),m(t)&&(t=[t]);const r=this.queueLoad(e,t,o,s);if(!r.toLoad.length)return r.pending.length||s(),null;r.toLoad.forEach(a=>{this.loadOne(a)})}load(e,t,o){this.prepareLoading(e,t,{},o)}reload(e,t,o){this.prepareLoading(e,t,{reload:!0},o)}loadOne(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";const o=e.split("|"),s=o[0],r=o[1];this.read(s,r,"read",void 0,void 0,(a,i)=>{a&&this.logger.warn(`${t}loading namespace ${r} for language ${s} failed`,a),!a&&i&&this.logger.log(`${t}loaded namespace ${r} for language ${s}`,i),this.loaded(e,a,i)})}saveMissing(e,t,o,s,r){let a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{},i=arguments.length>6&&arguments[6]!==void 0?arguments[6]:()=>{};if(this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(t)){this.logger.warn(`did not save key "${o}" as the namespace "${t}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(o==null||o==="")){if(this.backend&&this.backend.create){const l={...a,isUpdate:r},u=this.backend.create.bind(this.backend);if(u.length<6)try{let d;u.length===5?d=u(e,t,o,s,l):d=u(e,t,o,s),d&&typeof d.then=="function"?d.then(p=>i(null,p)).catch(i):i(null,d)}catch(d){i(d)}else u(e,t,o,s,i,l)}!e||!e[0]||this.store.addResource(e[0],t,o,s)}}}const _e=()=>({debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:n=>{let e={};if(typeof n[1]=="object"&&(e=n[1]),m(n[1])&&(e.defaultValue=n[1]),m(n[2])&&(e.tDescription=n[2]),typeof n[2]=="object"||typeof n[3]=="object"){const t=n[3]||n[2];Object.keys(t).forEach(o=>{e[o]=t[o]})}return e},interpolation:{escapeValue:!0,format:n=>n,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0}}),Ee=n=>(m(n.ns)&&(n.ns=[n.ns]),m(n.fallbackLng)&&(n.fallbackLng=[n.fallbackLng]),m(n.fallbackNS)&&(n.fallbackNS=[n.fallbackNS]),n.supportedLngs&&n.supportedLngs.indexOf("cimode")<0&&(n.supportedLngs=n.supportedLngs.concat(["cimode"])),n),oe=()=>{},Ht=n=>{Object.getOwnPropertyNames(Object.getPrototypeOf(n)).forEach(t=>{typeof n[t]=="function"&&(n[t]=n[t].bind(n))})};class X extends de{constructor(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;if(super(),this.options=Ee(e),this.services={},this.logger=E,this.modules={external:[]},Ht(this),t&&!this.isInitialized&&!e.isClone){if(!this.options.initImmediate)return this.init(e,t),this;setTimeout(()=>{this.init(e,t)},0)}}init(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},o=arguments.length>1?arguments[1]:void 0;this.isInitializing=!0,typeof t=="function"&&(o=t,t={}),!t.defaultNS&&t.defaultNS!==!1&&t.ns&&(m(t.ns)?t.defaultNS=t.ns:t.ns.indexOf("translation")<0&&(t.defaultNS=t.ns[0]));const s=_e();this.options={...s,...this.options,...Ee(t)},this.options.compatibilityAPI!=="v1"&&(this.options.interpolation={...s.interpolation,...this.options.interpolation}),t.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=t.keySeparator),t.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=t.nsSeparator);const r=d=>d?typeof d=="function"?new d:d:null;if(!this.options.isClone){this.modules.logger?E.init(r(this.modules.logger),this.options):E.init(null,this.options);let d;this.modules.formatter?d=this.modules.formatter:typeof Intl<"u"&&(d=_t);const p=new $e(this.options);this.store=new Me(this.options.resources,this.options);const c=this.services;c.logger=E,c.resourceStore=this.store,c.languageUtils=p,c.pluralResolver=new $t(p,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),d&&(!this.options.interpolation.format||this.options.interpolation.format===s.interpolation.format)&&(c.formatter=r(d),c.formatter.init(c,this.options),this.options.interpolation.format=c.formatter.format.bind(c.formatter)),c.interpolator=new Tt(this.options),c.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},c.backendConnector=new Dt(r(this.modules.backend),c.resourceStore,c,this.options),c.backendConnector.on("*",function(h){for(var g=arguments.length,w=new Array(g>1?g-1:0),y=1;y<g;y++)w[y-1]=arguments[y];e.emit(h,...w)}),this.modules.languageDetector&&(c.languageDetector=r(this.modules.languageDetector),c.languageDetector.init&&c.languageDetector.init(c,this.options.detection,this.options)),this.modules.i18nFormat&&(c.i18nFormat=r(this.modules.i18nFormat),c.i18nFormat.init&&c.i18nFormat.init(this)),this.translator=new ue(this.services,this.options),this.translator.on("*",function(h){for(var g=arguments.length,w=new Array(g>1?g-1:0),y=1;y<g;y++)w[y-1]=arguments[y];e.emit(h,...w)}),this.modules.external.forEach(h=>{h.init&&h.init(this)})}if(this.format=this.options.interpolation.format,o||(o=oe),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const d=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);d.length>0&&d[0]!=="dev"&&(this.options.lng=d[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(d=>{this[d]=function(){return e.store[d](...arguments)}}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(d=>{this[d]=function(){return e.store[d](...arguments),e}});const l=J(),u=()=>{const d=(p,c)=>{this.isInitializing=!1,this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),l.resolve(c),o(p,c)};if(this.languages&&this.options.compatibilityAPI!=="v1"&&!this.isInitialized)return d(null,this.t.bind(this));this.changeLanguage(this.options.lng,d)};return this.options.resources||!this.options.initImmediate?u():setTimeout(u,0),l}loadResources(e){let o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:oe;const s=m(e)?e:this.language;if(typeof e=="function"&&(o=e),!this.options.resources||this.options.partialBundledLanguages){if(s&&s.toLowerCase()==="cimode"&&(!this.options.preload||this.options.preload.length===0))return o();const r=[],a=i=>{if(!i||i==="cimode")return;this.services.languageUtils.toResolveHierarchy(i).forEach(u=>{u!=="cimode"&&r.indexOf(u)<0&&r.push(u)})};s?a(s):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(l=>a(l)),this.options.preload&&this.options.preload.forEach(i=>a(i)),this.services.backendConnector.load(r,this.options.ns,i=>{!i&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),o(i)})}else o(null)}reloadResources(e,t,o){const s=J();return typeof e=="function"&&(o=e,e=void 0),typeof t=="function"&&(o=t,t=void 0),e||(e=this.languages),t||(t=this.options.ns),o||(o=oe),this.services.backendConnector.reload(e,t,r=>{s.resolve(),o(r)}),s}use(e){if(!e)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!e.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return e.type==="backend"&&(this.modules.backend=e),(e.type==="logger"||e.log&&e.warn&&e.error)&&(this.modules.logger=e),e.type==="languageDetector"&&(this.modules.languageDetector=e),e.type==="i18nFormat"&&(this.modules.i18nFormat=e),e.type==="postProcessor"&&Ge.addPostProcessor(e),e.type==="formatter"&&(this.modules.formatter=e),e.type==="3rdParty"&&this.modules.external.push(e),this}setResolvedLanguage(e){if(!(!e||!this.languages)&&!(["cimode","dev"].indexOf(e)>-1))for(let t=0;t<this.languages.length;t++){const o=this.languages[t];if(!(["cimode","dev"].indexOf(o)>-1)&&this.store.hasLanguageSomeTranslations(o)){this.resolvedLanguage=o;break}}}changeLanguage(e,t){var o=this;this.isLanguageChangingTo=e;const s=J();this.emit("languageChanging",e);const r=l=>{this.language=l,this.languages=this.services.languageUtils.toResolveHierarchy(l),this.resolvedLanguage=void 0,this.setResolvedLanguage(l)},a=(l,u)=>{u?(r(u),this.translator.changeLanguage(u),this.isLanguageChangingTo=void 0,this.emit("languageChanged",u),this.logger.log("languageChanged",u)):this.isLanguageChangingTo=void 0,s.resolve(function(){return o.t(...arguments)}),t&&t(l,function(){return o.t(...arguments)})},i=l=>{!e&&!l&&this.services.languageDetector&&(l=[]);const u=m(l)?l:this.services.languageUtils.getBestMatchFromCodes(l);u&&(this.language||r(u),this.translator.language||this.translator.changeLanguage(u),this.services.languageDetector&&this.services.languageDetector.cacheUserLanguage&&this.services.languageDetector.cacheUserLanguage(u)),this.loadResources(u,d=>{a(d,u)})};return!e&&this.services.languageDetector&&!this.services.languageDetector.async?i(this.services.languageDetector.detect()):!e&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(i):this.services.languageDetector.detect(i):i(e),s}getFixedT(e,t,o){var s=this;const r=function(a,i){let l;if(typeof i!="object"){for(var u=arguments.length,d=new Array(u>2?u-2:0),p=2;p<u;p++)d[p-2]=arguments[p];l=s.options.overloadTranslationOptionHandler([a,i].concat(d))}else l={...i};l.lng=l.lng||r.lng,l.lngs=l.lngs||r.lngs,l.ns=l.ns||r.ns,l.keyPrefix!==""&&(l.keyPrefix=l.keyPrefix||o||r.keyPrefix);const c=s.options.keySeparator||".";let h;return l.keyPrefix&&Array.isArray(a)?h=a.map(g=>`${l.keyPrefix}${c}${g}`):h=l.keyPrefix?`${l.keyPrefix}${c}${a}`:a,s.t(h,l)};return m(e)?r.lng=e:r.lngs=e,r.ns=t,r.keyPrefix=o,r}t(){return this.translator&&this.translator.translate(...arguments)}exists(){return this.translator&&this.translator.exists(...arguments)}setDefaultNamespace(e){this.options.defaultNS=e}hasLoadedNamespace(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const o=t.lng||this.resolvedLanguage||this.languages[0],s=this.options?this.options.fallbackLng:!1,r=this.languages[this.languages.length-1];if(o.toLowerCase()==="cimode")return!0;const a=(i,l)=>{const u=this.services.backendConnector.state[`${i}|${l}`];return u===-1||u===0||u===2};if(t.precheck){const i=t.precheck(this,a);if(i!==void 0)return i}return!!(this.hasResourceBundle(o,e)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||a(o,e)&&(!s||a(r,e)))}loadNamespaces(e,t){const o=J();return this.options.ns?(m(e)&&(e=[e]),e.forEach(s=>{this.options.ns.indexOf(s)<0&&this.options.ns.push(s)}),this.loadResources(s=>{o.resolve(),t&&t(s)}),o):(t&&t(),Promise.resolve())}loadLanguages(e,t){const o=J();m(e)&&(e=[e]);const s=this.options.preload||[],r=e.filter(a=>s.indexOf(a)<0&&this.services.languageUtils.isSupportedCode(a));return r.length?(this.options.preload=s.concat(r),this.loadResources(a=>{o.resolve(),t&&t(a)}),o):(t&&t(),Promise.resolve())}dir(e){if(e||(e=this.resolvedLanguage||(this.languages&&this.languages.length>0?this.languages[0]:this.language)),!e)return"rtl";const t=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],o=this.services&&this.services.languageUtils||new $e(_e());return t.indexOf(o.getLanguagePartFromCode(e))>-1||e.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0;return new X(e,t)}cloneInstance(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:oe;const o=e.forkResourceStore;o&&delete e.forkResourceStore;const s={...this.options,...e,isClone:!0},r=new X(s);return(e.debug!==void 0||e.prefix!==void 0)&&(r.logger=r.logger.clone(e)),["store","services","language"].forEach(i=>{r[i]=this[i]}),r.services={...this.services},r.services.utils={hasLoadedNamespace:r.hasLoadedNamespace.bind(r)},o&&(r.store=new Me(this.store.data,s),r.services.resourceStore=r.store),r.translator=new ue(r.services,s),r.translator.on("*",function(i){for(var l=arguments.length,u=new Array(l>1?l-1:0),d=1;d<l;d++)u[d-1]=arguments[d];r.emit(i,...u)}),r.init(s,t),r.translator.options=s,r.translator.backendConnector.services.utils={hasLoadedNamespace:r.hasLoadedNamespace.bind(r)},r}toJSON(){return{options:this.options,store:this.store,language:this.language,languages:this.languages,resolvedLanguage:this.resolvedLanguage}}}const b=X.createInstance();b.createInstance=X.createInstance;b.createInstance;b.dir;b.init;b.loadResources;b.reloadResources;b.use;b.changeLanguage;b.getFixedT;b.t;b.exists;b.setDefaultNamespace;b.hasLoadedNamespace;b.loadNamespaces;b.loadLanguages;const{slice:qt,forEach:Ft}=[];function Ut(n){return Ft.call(qt.call(arguments,1),e=>{if(e)for(const t in e)n[t]===void 0&&(n[t]=e[t])}),n}function jt(n){return typeof n!="string"?!1:[/<\s*script.*?>/i,/<\s*\/\s*script\s*>/i,/<\s*img.*?on\w+\s*=/i,/<\s*\w+\s*on\w+\s*=.*?>/i,/javascript\s*:/i,/vbscript\s*:/i,/expression\s*\(/i,/eval\s*\(/i,/alert\s*\(/i,/document\.cookie/i,/document\.write\s*\(/i,/window\.location/i,/innerHTML/i].some(t=>t.test(n))}const De=/^[\u0009\u0020-\u007e\u0080-\u00ff]+$/,Kt=function(n,e){const o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{path:"/"},s=encodeURIComponent(e);let r=`${n}=${s}`;if(o.maxAge>0){const a=o.maxAge-0;if(Number.isNaN(a))throw new Error("maxAge should be a Number");r+=`; Max-Age=${Math.floor(a)}`}if(o.domain){if(!De.test(o.domain))throw new TypeError("option domain is invalid");r+=`; Domain=${o.domain}`}if(o.path){if(!De.test(o.path))throw new TypeError("option path is invalid");r+=`; Path=${o.path}`}if(o.expires){if(typeof o.expires.toUTCString!="function")throw new TypeError("option expires is invalid");r+=`; Expires=${o.expires.toUTCString()}`}if(o.httpOnly&&(r+="; HttpOnly"),o.secure&&(r+="; Secure"),o.sameSite)switch(typeof o.sameSite=="string"?o.sameSite.toLowerCase():o.sameSite){case!0:r+="; SameSite=Strict";break;case"lax":r+="; SameSite=Lax";break;case"strict":r+="; SameSite=Strict";break;case"none":r+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}return o.partitioned&&(r+="; Partitioned"),r},He={create(n,e,t,o){let s=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{path:"/",sameSite:"strict"};t&&(s.expires=new Date,s.expires.setTime(s.expires.getTime()+t*60*1e3)),o&&(s.domain=o),document.cookie=Kt(n,e,s)},read(n){const e=`${n}=`,t=document.cookie.split(";");for(let o=0;o<t.length;o++){let s=t[o];for(;s.charAt(0)===" ";)s=s.substring(1,s.length);if(s.indexOf(e)===0)return s.substring(e.length,s.length)}return null},remove(n,e){this.create(n,"",-1,e)}};var Bt={name:"cookie",lookup(n){let{lookupCookie:e}=n;if(e&&typeof document<"u")return He.read(e)||void 0},cacheUserLanguage(n,e){let{lookupCookie:t,cookieMinutes:o,cookieDomain:s,cookieOptions:r}=e;t&&typeof document<"u"&&He.create(t,n,o,s,r)}},Vt={name:"querystring",lookup(n){let{lookupQuerystring:e}=n,t;if(typeof window<"u"){let{search:o}=window.location;!window.location.search&&window.location.hash?.indexOf("?")>-1&&(o=window.location.hash.substring(window.location.hash.indexOf("?")));const r=o.substring(1).split("&");for(let a=0;a<r.length;a++){const i=r[a].indexOf("=");i>0&&r[a].substring(0,i)===e&&(t=r[a].substring(i+1))}}return t}},zt={name:"hash",lookup(n){let{lookupHash:e,lookupFromHashIndex:t}=n,o;if(typeof window<"u"){const{hash:s}=window.location;if(s&&s.length>2){const r=s.substring(1);if(e){const a=r.split("&");for(let i=0;i<a.length;i++){const l=a[i].indexOf("=");l>0&&a[i].substring(0,l)===e&&(o=a[i].substring(l+1))}}if(o)return o;if(!o&&t>-1){const a=s.match(/\/([a-zA-Z-]*)/g);return Array.isArray(a)?a[typeof t=="number"?t:0]?.replace("/",""):void 0}}}return o}};let B=null;const qe=()=>{if(B!==null)return B;try{if(B=typeof window<"u"&&window.localStorage!==null,!B)return!1;const n="i18next.translate.boo";window.localStorage.setItem(n,"foo"),window.localStorage.removeItem(n)}catch{B=!1}return B};var Gt={name:"localStorage",lookup(n){let{lookupLocalStorage:e}=n;if(e&&qe())return window.localStorage.getItem(e)||void 0},cacheUserLanguage(n,e){let{lookupLocalStorage:t}=e;t&&qe()&&window.localStorage.setItem(t,n)}};let V=null;const Fe=()=>{if(V!==null)return V;try{if(V=typeof window<"u"&&window.sessionStorage!==null,!V)return!1;const n="i18next.translate.boo";window.sessionStorage.setItem(n,"foo"),window.sessionStorage.removeItem(n)}catch{V=!1}return V};var Wt={name:"sessionStorage",lookup(n){let{lookupSessionStorage:e}=n;if(e&&Fe())return window.sessionStorage.getItem(e)||void 0},cacheUserLanguage(n,e){let{lookupSessionStorage:t}=e;t&&Fe()&&window.sessionStorage.setItem(t,n)}},Jt={name:"navigator",lookup(n){const e=[];if(typeof navigator<"u"){const{languages:t,userLanguage:o,language:s}=navigator;if(t)for(let r=0;r<t.length;r++)e.push(t[r]);o&&e.push(o),s&&e.push(s)}return e.length>0?e:void 0}},Yt={name:"htmlTag",lookup(n){let{htmlTag:e}=n,t;const o=e||(typeof document<"u"?document.documentElement:null);return o&&typeof o.getAttribute=="function"&&(t=o.getAttribute("lang")),t}},Qt={name:"path",lookup(n){let{lookupFromPathIndex:e}=n;if(typeof window>"u")return;const t=window.location.pathname.match(/\/([a-zA-Z-]*)/g);return Array.isArray(t)?t[typeof e=="number"?e:0]?.replace("/",""):void 0}},Zt={name:"subdomain",lookup(n){let{lookupFromSubdomainIndex:e}=n;const t=typeof e=="number"?e+1:1,o=typeof window<"u"&&window.location?.hostname?.match(/^(\w{2,5})\.(([a-z0-9-]{1,63}\.[a-z]{2,6})|localhost)/i);if(o)return o[t]}};let We=!1;try{document.cookie,We=!0}catch{}const Je=["querystring","cookie","localStorage","sessionStorage","navigator","htmlTag"];We||Je.splice(1,1);const Xt=()=>({order:Je,lookupQuerystring:"lng",lookupCookie:"i18next",lookupLocalStorage:"i18nextLng",lookupSessionStorage:"i18nextLng",caches:["localStorage"],excludeCacheFor:["cimode"],convertDetectedLanguage:n=>n});class Ye{constructor(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.type="languageDetector",this.detectors={},this.init(e,t)}init(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{languageUtils:{}},t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=e,this.options=Ut(t,this.options||{},Xt()),typeof this.options.convertDetectedLanguage=="string"&&this.options.convertDetectedLanguage.indexOf("15897")>-1&&(this.options.convertDetectedLanguage=s=>s.replace("-","_")),this.options.lookupFromUrlIndex&&(this.options.lookupFromPathIndex=this.options.lookupFromUrlIndex),this.i18nOptions=o,this.addDetector(Bt),this.addDetector(Vt),this.addDetector(Gt),this.addDetector(Wt),this.addDetector(Jt),this.addDetector(Yt),this.addDetector(Qt),this.addDetector(Zt),this.addDetector(zt)}addDetector(e){return this.detectors[e.name]=e,this}detect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.options.order,t=[];return e.forEach(o=>{if(this.detectors[o]){let s=this.detectors[o].lookup(this.options);s&&typeof s=="string"&&(s=[s]),s&&(t=t.concat(s))}}),t=t.filter(o=>o!=null&&!jt(o)).map(o=>this.options.convertDetectedLanguage(o)),this.services&&this.services.languageUtils&&this.services.languageUtils.getBestMatchFromCodes?t:t.length>0?t[0]:null}cacheUserLanguage(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.options.caches;t&&(this.options.excludeCacheFor&&this.options.excludeCacheFor.indexOf(e)>-1||t.forEach(o=>{this.detectors[o]&&this.detectors[o].cacheUserLanguage(e,this.options)}))}}Ye.type="languageDetector";const eo={tabs:{all:"All",notifications:"System",models:"Models",changelog:"Changelog"},title:"Inbox",titleNew:"Inbox, new updates",close:"Close",closeInbox:"Close inbox",viewDetails:"View details",viewModel:"View model",capabilityDetails:"Capability details",loadFailed:"Unable to load notifications",retry:"Retry",empty:"No notifications",allCaughtUp:"All caught up",kinds:{launch:"New model",price:"Price update",retirement:"Model retirement",capability:"Model capabilities",release:"Product update",account:"Balance alert",billing:"Payment overdue",security:"Key status",maintenance:"Maintenance"}},to="The Unified Gateway for AI Models",oo="Others",no="Apps Using AIHubMix",so="User",ro="Channel",ao="Redemption",io="Logs",lo="Settings",uo="Sign in",co="Sign up",po="Sign out",ho="Enterprise",mo="Dashboard",go="Unit",fo="Reset",yo="OR",bo="username",wo="Password",vo="yes",ko="no",xo="modify",Ao="Connect Customer",So="Model",Io="Input",Co="Output",Po="API Key",Lo="Status",Oo="enabled",Mo="enable",Ro="disabled",$o="disable",To="expired",No="exhausted",_o="uncertain",Eo="Actions",Do="edit",Ho="copy",qo="sort",Fo="from {{start}} to {{end}} items",Uo="submit",jo="cancel",Ko="Recharge",Bo="consume",Vo="manage",zo="system",Go="type",Wo="All",Jo="Email",Yo="Linked",Qo="Search",Zo="Reset",Xo="operation failed, redirecting to the login page...",en="An error occurred, retrying for the {{count}} time...",tn="unlimited",on="Spend",nn="usage trend",sn="distribution",rn="Date",an="start time-end time",ln="today",un="Trending",cn="Custom",dn="Total ",pn="Export XLSX",hn="available",mn="Init",gn="Alipay",fn="Stripe",yn="Exchange",bn="Model Authors",wn="rank",vn="Categories",kn="Price",xn="desc",An="Feedback",Sn="Privacy Policy",In="Terms",Cn="Capabilities",Pn="Supported Parameters",Ln="API Formats",On="Released",Mn="Categories",Rn="Output Modalities",$n="Docs",Tn="add",Nn="Notice",_n="Notes",En="Authorize",Dn="Deny",Hn="Allow",qn="Refresh",Fn="Providers",Un="Pricing",jn="Specifications",Kn="Performance",Bn="Peak",Vn="Compare",zn="Comparisons",Gn="Update",Wn="Copied",Jn="Capabilities",Yn="Context length",Qn="Not documented by the vendor",Zn="Model",Xn="Modalities",es="Throughput",ts="Latency",os="Input",ns="Output",ss="tokens",rs="requests",as="Total",is="Usage",ls="Tokens",us="Requests",cs="Models",ds="free",ps="Reasoning",hs="Tools",ms="Vision",gs="Clear",fs="Resets",ys="daily",bs="Apps",ws="Recommended",vs="Deprecating",ks="Retired",xs="Retirements",As="Active",Ss="Author",Is="All",Cs="Status",Ps="Announced",Ls="Replacement",Os={applications:{title:"My applications",new:"New application",back:"Back to applications",pending:"In review",approved:"Approved",rejected:"Not approved",retry:"Please wait {{seconds}}s before trying again.",retryReady:"You can try submitting again."},metaHero:{title:`Works in top AI tools.
Ready for yours.`,sub:"One key. {{total}}+ models. Set up in minutes.",subNoCount:"One key for every major model. Set up in minutes.",integrate:"Add to your app",find:"Find your tool",apply:"Join developer program",stat:{products:"Integrations",stars:"GitHub stars",installs:"Dify installs",more:"{{value}}+"},hubLabel:"Icons for code, terminals, chat, agents and workflows, drifting on a plane"},featured:{title:"Featured"},browse:{title:"Browse by category",filterLabel:"Category",subLabel:"Subcategory",all:"All",search:"Search apps",count:"{{count}} apps",count_one:"{{count}} app",showAll:"Show all {{count}} apps",emptyTitle:"No results for “{{query}}”",emptyBody:"Try another keyword or category, or apply to add your own app.",clear:"Clear filters",guide:"Setup guide",site:"Website",noGuide:"No guide yet",other:"Other",expand:"Show all",collapse:"Show less"},heat:{star:"GitHub stars",install:"Plugin installs",npm:"npm downloads / month"},community:{title:"Community apps"},apply:{eyebrow:"Developer program",title:"Build with {{brand}}",vModels:"{{total}}+ models",vModelsNoCount:"Top models",vReliable:"Failover",vPricing:"Partner rates"},form:{title:"Join the developer program",name:"App name",namePh:"Your app",url:"Website",urlPh:"example.com",type:"Category",typePh:"Select",desc:"One-line description",descPh:"Shown on your ecosystem card",logo:"App logo",logoHint:"PNG or WebP, up to 50 KB",usage:"Expected monthly spend",usageHint:"Model spend in USD, used to route your application",email:"Contact email",im:"Other contact",imPh:"WeChat / Telegram / Discord",public:"List my app on the ecosystem page once approved",terms:"I agree to the",termsLink:"listing and attribution terms",submit:"Submit application",submitGuest:"Sign in to submit",submitting:"Submitting…",restored:"We restored your answers. Review and submit.",loading:"Loading your application…",step1:"About your app",step2:"Contact & confirm",next:"Next",back:"Back",stepOf:"Step {{step}} of {{total}}",tier:{t1:"< $100",t2:"$100–1K",t3:"$1K–10K",t4:"> $10K"}},err:{required:"This field is required",select:"Choose an option",url:"Enter a valid URL, e.g. example.com",email:"Enter a valid email",logo:"Choose a PNG or WebP image under 50 KB",terms:"Please accept the terms",desc:"Up to {{max}} characters",summary:"A few fields need attention.",timeout:"We couldn't confirm your submission yet. Your answers are kept. Refresh in a moment to check its status.",refresh:"Refresh status",failed:"Couldn't submit: {{message}}",load:"Couldn't load your application. Try again in a moment.",retry:"Retry"},status:{pendingTitle:"Application submitted",pendingBody:"We'll review it soon and email the result to {{email}}. Thanks for your patience.",name:"App",url:"Website",type:"Category",usage:"Monthly spend",time:"Submitted",public:"Listed",yes:"Yes",no:"No",approvedTitle:"Approved, partnerships team in touch",approvedBody:"Our partnerships team will email {{email}} to work out terms.",listing:"Ecosystem listing",listingOn:"Live",listingOff:"Not listed",view:"View listing",editListing:"Edit listing",rejectedTitle:"This application wasn't approved",reason:"Reason",resubmit:"Edit and resubmit",legacyTitle:"Your App Code is active",legacyBody:"Keep sending the APP-Code header; your terms stay the same. Contact your partnerships manager to change them.",copy:"Copy",copied:"Copied",sunsetTitle:"Your App Code discount ends on {{date}}",sunsetBody:"Requests with this header will keep working, without the discount. If your app has significant usage, apply to partner and we'll review terms with you.",sunsetApply:"Apply to partner"},faq:{title:"FAQ",q1:"What happens after I apply?",a1:"Once approved, your app appears on this page if you chose to be listed, and our partnerships team emails you to discuss terms.",q2:"Is there a discount?",a2:"Approved applications automatically receive an App Code. Contact our partnerships team to discuss cooperation terms.",q3:"I already have an App Code. Do I need to apply?",a3:"No, it keeps working. App Codes with significant usage keep their current terms; inactive ones will gradually lose the discount, with email notice first. Requests that send the header are not affected.",q4:"What attribution is required?",a4:"Open-source apps show AIHubMix as one of their model providers. Closed-source apps name the model provider in their UI, terms or docs.",q5:"Can I partner without being listed?",a5:"Yes. Untick “List my app” when applying.",q6:"Where does the popularity data come from?",a6:"Public third-party data such as GitHub stars, plugin installs and npm downloads, refreshed regularly; it does not reflect usage on AIHubMix. Trademarks belong to their owners and are shown only to indicate compatibility."},dev:{label:"Preview state",live:"Live API",guest:"Signed out",empty:"Not applied",pending:"In review",approved:"Approved",rejected:"Not approved",legacy:"Legacy App Code · kept",sunset:"Legacy App Code · ending",timeout:"Simulate timeout",toggle:"Preview state",sampleReason:"We couldn't reach your website, so we couldn't verify the app."},preview:{name:"Your app"},stage:{draft:"Preview",pending:"In review",approved:"Live",unlisted:"Not listed",rejected:"Not approved",legacy:"Active",sunset:"Discount ending"},svc:{label:"Your app calls the major models through {{brand}}"},catalog:{categories:{coding:"Coding Agents",agents:"Agents & Workflows",clients:"Chat Clients",devtools:"Developer Tools",creative:"Creative"},subs:{cli:"CLI",ide:"IDE Extensions",app:"Desktop & Web",productivity:"Productivity"},integ:{builtin:{label:"Built-in",def:"Pick AIHubMix from the provider list"},plugin:{label:"Official plugin",def:"Install the official AIHubMix plugin"},package:{label:"Package",def:"Connect through an SDK package we maintain"},compatible:{label:"Compatible",def:"Works with a Base URL and API key"}},products:{"hermes-agent":"Open-source autonomous agent from Nous Research that lives in your terminal and chat apps.",opencode:"Open-source coding agent for the terminal; AIHubMix is listed via the models.dev catalog.",dify:"Open-source LLM app and workflow platform with official AIHubMix model and image plugins.",cline:"Autonomous coding agent in VS Code with AIHubMix built into its provider list.","cc-switch":"Provider switcher for Claude Code, Codex and more, with an AIHubMix preset.",pi:"Minimal, extensible terminal coding agent. Install the AIHubMix package to connect.","open-design":"Open-source AI design generator that accepts your own AIHubMix key.",lobehub:"Open-source chat and agent workspace with AIHubMix built in.",litellm:"Python SDK and proxy that calls 100+ LLMs through one interface.","cherry-studio":"Multi-model desktop AI client with AIHubMix in its provider list.",crush:"Terminal coding agent from Charm; AIHubMix is listed via models.dev.","kilo-code":"Open-source coding agent for VS Code and JetBrains with AIHubMix built in.",camel:"Open-source framework for multi-agent collaboration and simulation.","models-dev":"Open-source catalog of AI models. It lists AIHubMix models, pricing and capabilities, which OpenCode, Crush and others read to offer AIHubMix.","ai-sdk":"TypeScript AI toolkit; connect with the official AIHubMix provider package.","claude-code":"Anthropic's terminal coding agent. Point its Base URL at AIHubMix to use it.",codex:"OpenAI's coding agent CLI, configurable to run through AIHubMix.",cursor:"AI code editor; add your AIHubMix key in its model settings.",n8n:"Visual workflow automation; use AIHubMix in its AI nodes.","open-webui":"Self-hostable open-source AI chat interface.",librechat:"Open-source multi-model chat app with custom endpoints.",chatbox:"Cross-platform AI client for desktop and mobile.","immersive-translate":"Bilingual web and document translation extension that can use AIHubMix models.",obsidian:"Local-first notes app; connect AIHubMix through AI plugins.",langchain:"Open-source framework for building LLM apps and agents."}}},D={notificationCenter:eo,slogan:to,"site Name":"AI HUB MIX","slogan desc 1":"Access every major model through the SDKs you already use.","start to use":"Get API Key","home explore models":"Explore models","home hero proof models":"<strong>{{total}}+</strong> models","home hero proof clouds":"Official cloud routes","home hero proof billing":"Pay as you go","doc entrance":"View Docs","feature 1":"All major models, one key","feature 1 desc":"Connect to all major AI models including ChatGPT, Claude, Gemini, DeepSeek, Qwen. All available in consistent format.","price entrance":"All Models >","feature 2":"Drop-in for your SDK","feature 2 desc":"As an official partner of Azure, AWS, Google Cloud, we integrate official APIs and proprietary services for enterprise-grade reliability and unlimited throughput.","feature 3":"Auto-failover across clouds","home failover people":"Users","home failover teams":"Teams","home failover agents":"Agents","home desktop title":"Connect your agents in one click","home desktop for mac":"Download for macOS","home desktop for windows":"Download for Windows","home desktop all downloads":"All downloads","home desktop requirements":"For macOS 12 or later","home desktop lead":"No config files to edit, and every change can be undone.","home desktop available for":"Available for macOS and Windows","home desktop menu mac requirement":"12 or later","home desktop menu windows requirement":"10 or later","home desktop menu mac arm":"Apple silicon","home desktop menu mac intel":"Intel","home desktop menu windows x64":"x64","home desktop menu windows arm":"Arm","home desktop menu recommended":"Recommended","home desktop connect":"Connect","home desktop mock connecting":"Connecting","home desktop mock step write":"Writing config","home desktop mock step overrides":"Checking for overrides","home desktop mock step test":"Sending a test request","home desktop mock done title":"{{name}} connected","home desktop mock done body":"New sessions now go through AIHubMix","home desktop mock default model":"Default model","home desktop mock auto":"Auto","home desktop mock done button":"Done","home desktop requirements windows":"For Windows 10 or later","home desktop mock balance":"Balance","home desktop mock top up":"Top up","home desktop mock spent":"{{amount}} spent today","home desktop mock found":"Found on this Mac","home desktop mock installed":"Installed","home desktop mock verified":"Verified just now","home desktop mock normal":"Normal","feature 3 desc":"Automatically route across healthy providers and fall back when one is unavailable.","Model usage":"Model Rankings","home rankings lead":"What developers are using on {{brand}}.","home rankings explore":"Explore models & pricing","home rankings more":"+ {{count}} more",others:oo,"show less":"Show less","Featured Apps":"Featured Apps",Partner:no,"Partner desc":"Discover apps using AIHubMix. Eligible usage receives 10% off, excluding Claude models.","Partner off":"View All Apps","home ecosystem title":`Works with top AI tools
and powers what you build`,"home ecosystem model choice":"Flexible model choice","home ecosystem partner program":"Partner program","home ecosystem resilient access":"Resilient access","home ecosystem join":"Join the developer program","Earn with Your App":"Integrate AIHubMix and Get 10% Off",User:so,Channel:ro,Redemption:ao,"Usage statistics":"Dashboard","Balance/Top-up":"Credits","API keys":"API Keys",Log:io,Setting:lo,Login:uo,Register:co,"Signed in as":"Signed in as",Logout:po,"Model/Price":"Models","App Store":"Apps",Enterprise:ho,Console:mo,"Usage tutorial":"Docs",Unit:go,"call times":"Requests","Last week":"Last week","Last month":"Last month",Reset:fo,"forgot password?":"Forgot password?","no account?":"no account?","had account?":"already have an account?",OR:yo,"Sign in with Github":"Continue with Github","Sign in with Google":"Continue with Google",username:bo,"username placeholder":"Please enter your username，shortest 3 digits, longest 12 digits!",password:wo,"password placeholder":"Please enter your password! shortest 8 digits, longest 20 digits","sign in success notice":"Sign in success!","sign in failed notice":"Not logged in or login has expired, please log in again!","reset password notice":"Please change the default password immediately!","typeof amount error notice":"The credit only accepts positive integers!","pay failed notice":"Payment failed!","pay success notice":"Payment success!","order close notice":"Order closed!","account balance":"Available credits","balance remind":"Balance Alert","balance remind desc":"Set Up Low Balance Email Alerts to Ease Your Concerns","close remind":"Turn Off Balance Alerts",yes:vo,no:ko,modify:xo,"close remind notice":"are you sure you no longer receive balance reminder emails?","balance remind notice":"when the balance is less than ${{threshold}}, notify {{email}}","set balance remind":"set balance remind","remind threshold":"low balance threshold","remind threshold placeholder":"please enter the correct amount","remind email":"remind email","remind email placeholder":"please enter your email address","recharge online":"Pay as you go","recharge quota":"Add to credit balance","custom recharge":"Custom","custom recharge placeholder":"minimum $1, integers only","recharge amount placeholder":"please enter an integer amount","Payable amount":"Payable amount:","alipay pay":"Alipay Pay","alipay pay notice":"Alipay scan to complete payment","stripe pay":"Stripe Pay",invoice:Ao,"quota notice":"Invoice / Enterprise Customization","exchange quota":"Redeem Promo Code","exchange code":"Code","exchange success notice":"Success!","exchange code placeholder":"please enter the code","exchange code tooltip":"After successful payment, do not leave the current page, wait for about 10 seconds, the page will display the card password, which is the exchange code",model:So,input:Io,output:Co,"search model":"Search models...","model price table":"Supported Models","operation success":"operation success!","key name":"Key name",key:Po,status:Lo,enabled:Oo,enable:Mo,disabled:Ro,disable:$o,expired:To,exhausted:No,uncertain:_o,"used quota":"Usage","remain quota":"Remaining limit","created time":"Created","expired time":"Expires","expired time placeholder":"default no limit","invalid time format":"invalid time format!",operation:Eo,edit:Do,delete:"delete","add key":"Create API key","delete confirm":"delete data","delete noice":"Are you sure you want to delete the key named {{name}}?",copy:Ho,"copy success":"copy success!","my key":"My Key","go recharge":"Add credits","key name placeholder":"Search API keys...",sort:qo,"sort by remain quota":"sort by remain credit","sort by used quota":"sort by used credit",pagination:Fo,"create key":"Create API key","create key success":"create key success, copy key on the list!","update key":"Update key","update key success":"update key success!","never expired":"never expired","one month later expired":"one month later expired","one day later expired":"one day later expired","one hour later expired":"one hour later expired","one minute later expired":"one minute later expired","quota setting notice":"Note: Newbies are advised to choose unlimited credit. The credit of the key is only used to limit the maximum credit usage of the key itself, and the actual usage is subject to the remaining quota limit of the account.","quota limit":"quota limit","quota limit placeholder":"please enter the credit limit","cancel quote unlimited":"cancel credit unlimited","set quote unlimited":"set credit unlimited","higher option":"This is an advanced option, newbies do not operate","model range":"model range","model range placeholder":"default no limit","model range tooltip":"limit the model that the current key can use","IP limit":"IP limit","IP limit placeholder":"please enter the IP limit","IP limit tooltip":"used to limit the specific user IP, newbies are not recommended to set",submit:Uo,cancel:jo,"log detail":"log detail",recharge:Ko,consume:Bo,manage:Vo,system:zo,type:Go,all:Wo,"max nums":"Export XLSX (up to 10,000 rows)","model name":"Model","model price":"Pricing","cached tokens":"Cached prompt tokens","quota change":"Amount","start time":"Start time","end time":"End time","personal setting":"Personal Setting","user name":"User Name","display name":"display name",email:Jo,"bind email address":"Link Email Address","bind email address placeholder":"please enter the email address","go bind":"Bind Now",binded:Yo,"go update":"Update","send captcha":"send captcha","captcha placeholder":"please enter the captcha","log off account":"Log Off Account","go log off":"Log Off","log off notice":"Are you sure you want to log off?","log off confirm":"please enter your username to confirm log off!","account name placeholder":"please enter your username","token copied":"token has been copied to the clipboard","invite code copied":"invite code has been copied to clipboard","system token copied":"system token has been copied to clipboard","log off confirm notice":"You are deleting your account, all data will be cleared and cannot be recovered","log off success":"Logged out successfully!","bind wechat success":"bind wechat success!","captcha send success":"captcha send success, please check your email","bind email success":"bind email success!","common setting":"common setting","common setting desc":"This token is for system management purposes and is not used for LLM requests.","generate token":"generate system access token","copy invite code":"Invite Link","account setting":"account setting","avaliable models":"Avaliable Models","update user":"update user","user update success":"user update success!","new username":"username","new username placeholder":"please enter the new username，shortest 3 digits, longest 12 digits","display name placeholder":"please enter the display name","binded Github account":"Linked Github account","binded Google account":"Linked Google account","binded email account":"Linked email account","binded account placeholder":"read-only, users need to bind through the relevant binding button on the personal settings page, cannot be modified directly",search:Qo,reset:Zo,"page not exist":"Page not found","page not exist desc":"The page you’re looking for doesn’t exist or may have moved.","back to home":"Back to home","no permission":"no permission","no permission desc":"You do not have permission to access this page. Please contact the administrator to open the permission.","bind success":"Linked success","login success":"login success",redirecting:Xo,retrying:en,"params error":"params error","connect server error":"Unable to connect to the server normally!",unlimited:tn,"statistics title":"Activity",expense:on,"expense desc":"Total spend","usage token":"Token volume","usage token desc":"Total prompt and completion tokens","call times desc":"API requests",trend:nn,distribution:sn,hour:rn,"user id":"user id","user id placeholder":"please enter the user id",period:an,today:ln,"last 7 days":"last 7 days","last 30 days":"last 30 days","Past 30 Days":"Past 30 Days","week rank":"Past Week","month rank":"Past Month",trending:un,manual:cn,total:dn,"usage detail":"Activity",download:pn,"last half a year":"last half a year","recharge record":"Transactions","recharge time":"Date",available:hn,init:mn,alipay:gn,stripe:fn,exchange:yn,"data delay":"Data may be delayed by 1 minute","model filter":"Filter",developer:bn,"total models":"{{total}} models","entered passwords differ!":"the two passwords entered are inconsistent!","register success":"register success!","password reset":"password reset","password sub title":"Please enter your email address, we will send you a password reset email","send email text":"send email","send email retry":"s retry","reset password email":"email address","reset password email placeholder":"please enter the email address!","reset password email confirm":"please enter the correct email address!","reset password email success":"password reset email sent successfully!","reset password confirm":"password reset confirm","reset password confirm desc":"submit to complete password reset","new password":"new password","get new password":"get new password","new password success":"reset password complete","back login":"back to login","new password copied":"new password has been copied to the clipboard: ",rank:wn,feature:vn,"unlimit quota":"unlimit quota","limit quota":"limit quota","advanced settings":"advanced settings","model info":"model info",price:kn,"params count":"params count","context length":"Context length","model params":"model params","param name":"param name",desc:xn,"default value":"example value",Feedback:An,Privacy:Sn,Terms:In,"Input name":"Input","Output name":"Output","Context name":"Context","Latency name":"TTFT","Throughput name":"Throughput",features:Cn,Features:Pn,Endpoints:Ln,Released:On,"Throughput (TPS)":"Throughput (tok/s)",tags:Mn,types:Rn,"Model Details":"Model Details",usage:$n,"try in playground":"Try in Playground","media async tasks note":"These /ai/v1 media endpoints run as async tasks. Enable Async Tasks for your account first, or task creation returns 403 async_not_enabled.","async tasks guide":"Async Tasks guide",add:Tn,"remind off":"off","remind on":"on",notice:Nn,"surfing cost":"Web search","unuser title":"Let's Get You a Code","unuser desc":"Sign in or sign up to generate an App Code and unlock 10% off.","unuser btn":"Sign in","not now":"Not now","user title":"Your 10% off code is ready!","user desc":"Your App Code is now active—check the pre-filled code snippet below to get started right away.","user btn":"Got it","get code":"Generate App Code","get code desc":"Integrate AIHubMix as a model provider and include your App Code in each request. Open-source apps and apps where users bring their own API key can qualify by offering AIHubMix as a provider. Closed-source apps must clearly disclose that model requests are powered by AIHubMix. AIHubMix may revoke the discount or suspend accounts that do not meet these requirements or misuse the program.","get code notice":"Sign in or sign up to generate an App Code.","app name":"App name","app url":"App URL","app name placeholder":"Please enter the app name","app url placeholder":"Please enter the app domain","apps notice":"Apps that integrate AIHubMix as the model provider are eligible for","app url tooltip":"Ensure it is your valid product domain",remark:_n,"10% off":"10% off","learn more":"Learn More",authorize:En,"authorize app":"Authorize {{appName}}","authorize account login":"authorize to use your account info","permissions granted":"Permissions to be granted:","no special permissions":"No special permissions","user basic info":"User basic information (username, email)","user balance info":"User balance information",deny:Dn,allow:Hn,"contact developer":"For more information, please contact the app developer","missing parameters":"Missing required parameters","app info fetch failed":"Failed to fetch app information","authorization request failed":"Authorization request failed",refresh:qn,"column settings":"Column Settings","go generate":"Generate","Pricing Details":"Pricing","Image Generation":"Image Generation","Video Generation":"Video Generation","Input Modalities":"Input Modalities","Output Modalities":"Output Modalities",Providers:Fn,Pricing:Un,"Quick Start":"Try this model",Attributes:jn,"More Models":"More Models","API Usage Examples":"API Usage Examples","model data api":"Models API",Performance:Kn,"Performance for":"Performance for","No data available":"No results","Smart Routing":"LLM Router","router hero title":"Not every request needs the biggest, priciest model","router hero sub":"Smart routing selects the best model for every request in real time — cutting costs significantly without compromising task quality. Cache-friendly by design: each session automatically sticks to the same model, so prompt caches are never lost.","router hero session":"No extra setup required: session identifiers from popular agents like Claude Code, Codex, and OpenCode are recognized automatically. For precise control over session scope, add this to your request:","router hero note":"Scores span {{groups}} major categories and {{dims}} sub-dimensions, normalized from a blend of internal evaluations and public leaderboards.","router hero doc":"API reference","router copy":"Copy","router copied":"Copied","router code sync":"Routing strategy","router code comment default":"bare auto = auto:cost_optimized (default)","router code comment strategy":"{{name}} strategy","router strat eyebrow":"Routing strategies","router strat title":"Model coverage across the four routing strategies","router default tag":"Default","router weight quality":"Quality","router weight cost":"Cost","router weight latency":"Speed","router strat cost_optimized":"Cost first","router strat cost_optimized desc":"Meets the bar, costs the least.","router strat balanced":"Balanced","router strat balanced desc":"Capability, cost and latency in balance.","router strat quality_first":"Quality first","router strat quality_first desc":"Strongest model first.","router strat latency_critical":"Latency first","router strat latency_critical desc":"Fastest response first.","router col model":"Model","router col score":"Normalized score","router col price":"Input / Output","router col latency":"Time to First Token","router best tag":"Current pick","router sort route":'Weighted by "{{name}}"',"router sort score":"Sorted by score","router sort price":"Sorted by price","router sort latency":"Sorted by Time to First Token","router source note":"Sources: internal evals and public leaderboards, jointly normalized.","router group text":"Text","router group vision":"Vision","router group code_webdev":"Web Development","router group search":"Search","router group document":"Document Analysis","router dim text_overall":"Overall","router dim text_coding":"Coding","router dim text_math":"Math","router dim text_instruction_following":"Instruction Following","router dim text_longer_query":"Long Queries","router dim text_language_chinese":"Language › Chinese","router dim text_language_english":"Language › English","router dim text_occupational_software_it":"Occupational › Software & IT","router dim text_occupational_mathematical":"Occupational › Mathematics","router dim text_occupational_legal":"Occupational › Legal & Government","router dim text_occupational_medicine":"Occupational › Medicine & Healthcare","router dim vision_overall":"Overall","router dim vision_ocr":"Vision Text Understanding","router dim vision_diagram":"Diagrams","router dim vision_homework":"Homework Help","router dim vision_chinese":"Chinese","router dim vision_english":"English","router dim code_webdev_overall":"Overall","router dim code_webdev_html":"HTML","router dim code_webdev_react":"React","router dim code_image_to_webdev_overall":"Image to Web","router dim search_overall":"Overall","router dim document_overall":"Overall","router card sub":"AIHubMix LLM Router","router card desc":"AIHubMix's in-house automatic model router. Not every request needs the strongest, most expensive model — drawing on internal evals and public leaderboards, we bring together a range of today's mainstream models of varying capability and route each request automatically through a small model we trained. Set model to auto and requests are dispatched to the right model based on their content, lowering cost. Currently in beta; we keep updating and improving it.","router card fee":"Charged at the actual routed model's price — routing itself is free.","router card cta":"Learn about the LLM Router","up to {{off}}% off":"up to {{off}}% off","{{off}}% off":"{{off}}% off","Uptime is the percentage of requests that succeeded over the past 72 hours. AIHubMix continuously monitors every provider and automatically retries with the next-best provider when one returns an error or responds too slowly.":"Uptime is the percentage of requests that succeeded over the past 72 hours. AIHubMix continuously monitors every provider and automatically retries with the next-best provider when one returns an error or responds too slowly.","Throughput is how fast the model writes (tokens per second, higher is better).":"Throughput is how fast the model writes (tokens per second, higher is better).","Latency is total round-trip time (lower is better).":"Latency is total round-trip time (lower is better).",Peak:Bn,"Off-peak":"Off-peak","Active hours":"Active hours","Other hours":"Other hours",Compare:Vn,Comparisons:zn,"Add model":"Add model","Data snapshot":"Data snapshot",Update:Gn,Copied:Wn,"Copy link":"Copy link","requests this week":"requests this week","Pick a second model to start comparing.":"Pick a second model to start comparing.","Pick two models above, or start from one of the comparisons below.":"Select at least two models, or choose a popular comparison below.","What a comparison shows":"What a comparison shows","Every comparison puts 2 to 4 models side by side on the same objective metrics.":"Every comparison puts 2 to 4 models side by side on the same objective metrics.","Pricing per million input and output tokens, with any active discount applied.":"Pricing per million input and output tokens, with any active discount applied.","Context window and maximum output length.":"Context length and maximum output length.","Latency and throughput, as rolling averages measured on AIHubMix.":"Time to First Token and throughput, as rolling averages measured on AIHubMix.","Arena scores, where the model has been rated.":"LMArena benchmarks, where the model has been rated.","Real usage on AIHubMix: weekly requests and token trends.":"Real usage on AIHubMix: weekly requests and token trends.","A monthly cost estimate for your own request volume.":"A monthly cost estimate for your own request volume.","How it works":"How it works","Add models with the picker above. The URL holds your selection, so a comparison can be shared or bookmarked.":"Add models with the picker above. The URL holds your selection, so a comparison can be shared or bookmarked.","Figures are a cached snapshot; the page states when it was taken and refreshes on demand.":"Figures are a cached snapshot; the page states when it was taken and refreshes on demand.","Every model on AIHubMix is callable through one API key and one base URL, so a price you compare here is the price you actually pay.":"Every model on AIHubMix is callable through one API key and one base URL, so a price you compare here is the price you actually pay.","Specs & Pricing":"Pricing & Specifications","Input price":"Input /M","Output price":"Output /M","Cache read":"Cache read /M","Context window":"Context length","Max output":"Max output","Latency (first token)":"Time to First Token","Usage on AIHubMix":"Activity","last 3 days":"Past 3 Days","Requests / day":"Requests / day","Tokens / day":"Tokens / day","Live Performance":"Performance","Arena Scores":"LMArena Benchmarks","Cost Calculator":"Cost calculator","Estimate your monthly bill for the same workload on each model.":"Estimate your monthly bill for the same workload on each model.","Avg input tokens / request":"Avg input tokens / request","Avg output tokens / request":"Avg output tokens / request","Popular Comparisons":"Popular comparisons","Related model match-ups readers also look at.":"Related model match-ups readers also look at.","Which is cheaper":"Which is cheaper","Which responds faster?":"Which responds faster?","Compare pricing, specs, live performance and arena scores side by side. Up to 4 models.":"Compare pricing, specifications, performance, and benchmarks for up to four models.","Prices are per million tokens. Latency and throughput are rolling averages measured on AIHubMix.":"Prices are per million tokens. Time to First Token and throughput are rolling averages measured on AIHubMix.","Daily traffic served through AIHubMix — how demand for each model is trending.":"Daily traffic served through AIHubMix — how demand for each model is trending.","Measured on real AIHubMix traffic, hourly buckets. Gaps mean no traffic in that hour.":"Measured on real AIHubMix traffic, hourly buckets. Gaps mean no traffic in that hour.","LMArena ratings by capability (Bradley-Terry, commonly called Elo). Higher is better.":"LMArena ratings by capability (Bradley-Terry, commonly called Elo). Higher is better.","No published ratings for":"No published ratings for","Monthly = daily × 30. Discounted rates applied where a promotion is active.":"Monthly = daily × 30. Discounted rates applied where a promotion is active.","Promotional prices show the discounted rate; see each model page for promotion windows.":"Promotional prices show the discounted rate; see each model page for promotion windows.",Capabilities:Jn,Context:Yn,capabilityUndocumented:Qn,"Max Output":"Max output","Latency (s)":"TTFT (s)","mirror warning title":"You have been redirected to the official AIHubMix site","mirror warning desc":"{{host}} is not an official AIHubMix domain. Anything you type there — passwords, API keys, payment details — passes through whoever runs it. Our only official site is aihubmix.com.","mirror warning desc generic":"The site you came from is not an official AIHubMix domain. Anything you type there — passwords, API keys, payment details — passes through whoever runs it. Our only official site is aihubmix.com.","Not published in the catalog":"Not published in the catalog","mod text":"text","mod vision":"vision","mod audio":"audio","mod video":"video","mod file":"file","mod pdf":"PDF","Takes {{mods}}. Output modality not published.":"Takes {{mods}}. Output modality not published.","Takes {{in}}, returns {{out}}.":"Takes {{in}}, returns {{out}}.","Official spec, verified {{date}}. The gateway route is configured at {{ctx}}.":"Official spec, verified {{date}}. The gateway route is configured at {{ctx}}.","Copy model ID {{id}}":"Copy model ID {{id}}",Model:Zn,Modalities:Xn,"col context":"Context","col cache read":"Cache read","Cache write":"Cache write",Throughput:es,Latency:ts,Input:os,Output:ns,"{{count}} more models_one":"{{count}} more model","{{count}} more models_other":"{{count}} more models","Daily {{noun}} for {{dev}} models over the last {{days}} days, stacked by model, up to {{top}} per day.":"Daily {{noun}} for {{dev}} models over the last {{days}} days, stacked by model, up to {{top}} per day.",tokens:ss,requests:rs,"Chart legend":"Chart legend",Total:as,Usage:is,"Measure usage by":"Measure usage by","By tokens":"By tokens","By requests":"By requests","Last {{days}} days":"Last {{days}} days","date range to":"to",Tokens:ls,Requests:us,"Models in use":"Models in use","of {{total}}":"of {{total}}","Tokens per day, stacked by model":"Tokens per day, stacked by model","Requests per day, stacked by model":"Requests per day, stacked by model","Which models that traffic went to":"Which models that traffic went to","Share of {{total}} tokens.":"Share of {{total}} tokens.","Share of {{total}} requests.":"Share of {{total}} requests.","{{count}} models with traffic report no token counts and cannot be ranked here":"{{count}} models with traffic report no token counts and cannot be ranked here","tok missing including":", including ","tok missing and":" and ","tok missing tail":" — they are in the request view.","usage views disagree note":"The two views disagree on purpose: a model can take a large share of the calls and a small share of the tokens — many short requests — or the reverse. Which one matters depends on whether your cost is driven by call volume or by prompt length. Measured on AIHubMix over the last {{days}} days, counting the {{count}} model IDs listed on this page; traffic routed through upstream-specific IDs that are not in the public catalog is not included.",Models:cs,"Model Authors":"Model Authors","{{dev}} Models":"{{dev}} Models","models unit_one":"model","models unit_other":"models","authors unit_one":"model author","authors unit_other":"model authors","General models":"General models",free:ds,"to start":"to start","General models from":"General models from","input unit":"input","Up to":"Up to","context unit":"context","Official site":"Official site","All {{count}} {{dev}} Models":"All {{count}} {{dev}} Models","Open in model list":"Open in model list",Reasoning:ps,Tools:hs,"Structured output":"Structured output",Vision:ms,"1M+ context":"1M+ context","Cache discount":"Cache discount",Clear:gs,"{{shown}} of {{total}} models":"{{shown}} of {{total}} models","provider table caption":"{{dev}} models on AIHubMix with input and output modalities, context length, maximum output, price per million tokens including cache read and cache write rates, and measured throughput and latency.","Show first {{count}}":"Show first {{count}}","Show all {{count}} models":"Show all {{count}} models","provider table footnote":"Prices are USD per million tokens; cache read and cache write are the rates for prompt-cache hits and for writing a prompt into the cache. Throughput and latency are measured on AIHubMix — the same figures the model detail page shows — not vendor claims. A dash means the catalog does not publish that field for that model, which is not the same as the model not supporting it.","Common Comparisons":"Common Comparisons","{{dev}} on AIHubMix":"{{dev}} on AIHubMix","Other Model Authors":"Other Model Authors","Start calling {{dev}} in one line":"Start calling {{dev}} in one line","One key, one endpoint, {{models}} models across {{devs}} model authors.":"One key, one endpoint, {{models}} models across {{devs}} model authors.","Get API key":"Get API key","Read the docs":"Read the docs","Free models":"Free models","Free AI Models":"Free AI Models","fm lead base":"Free models are for experimenting, learning and shipping without a bill — AIHubMix covers the inference cost for all {{count}} models on this page, and every model answers all three protocols: Chat Completions, Messages and Responses","fm lead trial":". Every account starts with {{trial}} trial calls, no credit card","fm lead topup":", and a ${{usd}} top-up switches you to permanent daily quotas.","fm lead end":".","Every model":"Every model","/M input & output":"/M input & output","Updated {{date}}":"Updated {{date}}","Model authors with free models":"Model authors with free models","{{name}} models on AIHubMix":"{{name}} models on AIHubMix","Before your first top-up":"Before your first top-up","No credit card required, and trial calls never expire.":"No credit card required, and trial calls never expire.","Trial calls":"Trial calls","total, all free models":"total, all free models","After a one-time ${{usd}} top-up":"After a one-time ${{usd}} top-up","fm paid lane desc":"Top up once — any amount from ${{usd}} — and every free model switches to daily quotas with no expiry, reset every day.","/day unit":"/day","/min unit":"/min",Resets:fs,daily:ys,"fm tok missing":"{{count}} models with traffic report no token counts and are only in the request view.","All {{count}} Free Models":"All {{count}} Free Models","fm table caption":"All free models on AIHubMix, in catalog order, with developer, input and output modalities, context length and the rate limit each model allows on a topped-up account.","Rate limit":"Rate limit","Paid version":"Paid version","Compare {{a}} with {{b}}":"Compare {{a}} with {{b}}","vs paid":"vs paid","fm table note base":"Rate limit shows the daily and per-minute request caps for topped-up accounts. Some models carry a higher request weight — one call counts as several requests — which is why their caps are lower.","fm table note pool":" All free models share one pool of {{tokens}} tokens per day.","fm table note trial":" Before your first top-up, the {{trial}} trial calls apply instead.","fm table note tail":"Context “—” means the value is not published in the catalog. Modalities read input → output — the same fact the developer pages show; a missing output side means the catalog does not publish it, not that the model returns nothing.","How to Start":"How to Start","Create an account":"Create an account","Email or OAuth, no credit card required.":"Email or OAuth, no credit card required.","{{trial}} trial calls are available immediately.":"{{trial}} trial calls are available immediately.","Create an API key":"Create an API key","One key works for every model on the platform, free and paid alike.":"One key works for every model on the platform, free and paid alike.","Open the API keys page":"Open the API keys page","Call a free model":"Call a free model","fm step3 pre":"Point any OpenAI-compatible client — Cursor, Cline, Cherry Studio, LiteLLM — at the gateway and pick a ","fm step3 post":" model ID.","API protocol":"API protocol","Free Models on AIHubMix":"Free Models on AIHubMix","Keep Exploring":"Keep Exploring","All Models":"All Models","fm explore models desc":"The full catalog — {{count}} models across chat, image, video and audio, with per-token pricing.","Browse all models":"Browse all models","LLM Router":"LLM Router","fm router desc pre":"Fill in ","fm router desc post":" as the model ID and the gateway routes each request to the optimal model by cost and quality.","Try the router":"Try the router",Apps:bs,"fm apps desc":"Ready-to-use apps in the AIHubMix app store — and model discounts beyond the free catalog.","Browse the app store":"Browse the app store",Recommended:ws,"Switch version":"Switch version","Model versions":"Model versions","AI Model Authors":"AI Model Authors","authors index stats":"{{providers}} model authors, {{models}} models, one API key.","authors index desc":"Every model author page lists its full catalog with per-token pricing, context windows and measured throughput.","All model authors":"All model authors","calls 30d":"calls · 30d","See all model authors":"See all model authors","Retired models":"Retired models",Deprecating:vs,Retired:ks,"Coming soon":"Coming soon","Price TBD":"Price TBD",Retirements:xs,"Model Retirements":"Model Retirements","mr lead":"Models get retired when the upstream provider shuts them down or replaces them. Everything scheduled and everything already gone is listed here, with the date calls stop working and what to move to.","scheduled for retirement":"scheduled for retirement","already retired":"already retired","Browse all {{count}} models":"Browse all {{count}} models",Active:As,"Fully supported. No retirement date announced.":"Fully supported. No retirement date announced.","Still callable, but a retirement date is set. Migrate before that date.":"Still callable, but a retirement date is set. Migrate before that date.","No longer callable. Requests return":"No longer callable. Requests return","Filter by author":"Filter by author",Author:Ss,All:Is,"Upcoming retirements":"Upcoming retirements","Still callable — migrate before the retirement date":"Still callable — migrate before the retirement date","Detail pages stay online — requests return an error":"Detail pages stay online — requests return an error","mr dash note":"— means the replacement is not published in our catalog.","No retirements for this author.":"No retirements for this author.",Status:Cs,Announced:Ps,"Retirement date":"Retirement date",Replacement:Ls,"nav language":"Language","nav site":"Site","nav open menu":"Open menu","nav close menu":"Close menu","account personal":"Personal","account enterprise":"Enterprise","account profile":"Profile","account credits":"Credits","account activity":"Activity","account logs":"Logs","nav account":"Account","home rankings tokens":"Tokens","home desktop coming soon":"Coming soon to macOS and Windows",ecosystemPage:Os,"playground drawer load failed":"Playground couldn't be opened right now.","playground drawer retry":"Try again","playground drawer open new tab":"Open in new tab"},Ms={tabs:{all:"全部",notifications:"系统通知",models:"模型动态",changelog:"产品更新"},title:"消息中心",titleNew:"消息中心，有新通知",close:"关闭",closeInbox:"关闭消息中心",viewDetails:"查看详情",viewModel:"查看模型",capabilityDetails:"能力详情",loadFailed:"通知加载失败",retry:"重试",empty:"暂无通知",allCaughtUp:"已展示全部更新",kinds:{launch:"模型上线",price:"价格调整",retirement:"模型下线",capability:"模型能力",release:"产品更新",account:"余额提醒",billing:"欠费提醒",security:"密钥状态",maintenance:"维护通知"}},Rs="一个接口，无限模型",$s="其他",Ts="构建 AI 共赢生态",Ns="用户",_s="渠道",Es="兑换",Ds="日志",Hs="我的设置",qs="登录",Fs="注册",Us="退出登录",js="企业定制",Ks="控制台",Bs="模型体验",Vs="统计单位",zs="重置",Gs="或者",Ws="用户名",Js="密码",Ys="是",Qs="否",Zs="修改",Xs="联系客服",er="模型",tr="输入",or="输出",nr="Key",sr="状态",rr="已启用",ar="启用",ir="已禁用",lr="禁用",ur="已过期",cr="已耗尽",dr="未知",pr="操作",hr="编辑",mr="复制",gr="排序方式",fr="第 {{start}} - {{end}} 条",yr="提交",br="取消",wr="充值",vr="消费",kr="管理",xr="系统",Ar="类型",Sr="全部",Ir="邮箱",Cr="已绑定",Pr="查询",Lr="重置",Or="操作失败，重定向至登录界面中...",Mr="出现错误，第 {{count}} 次重试中...",Rr="无限制",$r="花费",Tr="使用趋势",Nr="分布占比",_r="时间",Er="起始时间",Dr="今天",Hr="趋势榜",qr="自定义",Fr="总",Ur="Excel",jr="可用",Kr="初始化",Br="支付宝",Vr="Stripe",zr="兑换",Gr="开发者",Wr="排名",Jr="标签",Yr="价格",Qr="描述",Zr="反馈",Xr="隐私",ea="条款",ta="特性",oa="标签",na="类型",sa="API 文档",ra="添加",aa="公告",ia="备注",la="授权",ua="拒绝",ca="授权",da="刷新",pa="提供商",ha="定价",ma="模型属性",ga="性能",fa="参数",ya="类型",ba="取值",wa="说明",va="已废弃",ka="未验证",xa="高峰时段",Aa="对比",Sa="模型对比",Ia="更新",Ca="已复制",Pa="能力",La="上下文",Oa="厂商未标注",Ma="模型",Ra="模态",$a="吞吐量",Ta="发布时间",Na="延迟",_a="输入",Ea="输出",Da="token",Ha="请求",qa="总计",Fa="用量",Ua="Token",ja="请求数",Ka="模型广场",Ba="免费",Va="推理",za="工具调用",Ga="视觉",Wa="清除",Ja="重置周期",Ya="每天",Qa="应用",Za="推荐",Xa="即将下线",ei="已下线",ti="下线公示",oi="在售",ni="厂商",si="全部",ri="状态",ai="公示日",ii="替代模型",li={applications:{title:"我的合作申请",new:"新增合作申请",back:"返回申请列表",pending:"审核中",approved:"已通过",rejected:"未通过",retry:"操作过于频繁，请在 {{seconds}} 秒后重试。",retryReady:"现在可以重新提交。"},metaHero:{title:`主流 AI 工具已支持
你的产品也能接入`,sub:"一个 Key，{{total}}+ 模型，几分钟完成接入。",subNoCount:"一个 Key 调用主流模型，几分钟完成接入。",integrate:"接入你的产品",find:"查找你的工具",apply:"加入开发者计划",stat:{products:"接入产品",stars:"GitHub 星标",installs:"Dify 安装",more:"{{value}}+"},hubLabel:"代码、终端、对话、智能体、工作流等图标在一个平面上缓缓流动"},featured:{title:"精选"},browse:{title:"按类型浏览",filterLabel:"分类",subLabel:"子分类",all:"全部",search:"搜索产品",count:"共 {{count}} 个产品",showAll:"显示全部 {{count}} 个产品",emptyTitle:"没有找到“{{query}}”",emptyBody:"试试其他关键词或切换分类。也可以提交合作申请，把你的产品加进来。",clear:"清除筛选",guide:"接入指南",site:"官网",noGuide:"暂无接入指南",other:"其他",expand:"展开全部",collapse:"收起"},heat:{star:"GitHub star",install:"插件安装",npm:"npm 月下载"},community:{title:"社区应用"},apply:{eyebrow:"开发者计划",title:"和{{brand}}一起构建",vModels:"{{total}}+ 模型",vModelsNoCount:"主流模型",vReliable:"高可用",vPricing:"合作优惠"},form:{title:"申请加入开发者计划",name:"产品名称",namePh:"你的产品",url:"产品网址",urlPh:"example.com",type:"产品类型",typePh:"请选择",desc:"一句话介绍",descPh:"会显示在生态页的产品卡片上",logo:"产品 Logo",logoHint:"PNG 或 WebP，最大 50 KB",usage:"预计月调用规模",usageHint:"按美元计的模型调用费用，用于安排商务跟进",email:"联系邮箱",im:"其他联系方式",imPh:"微信 / Telegram / Discord",public:"审核通过后在生态页公开展示我的产品",terms:"我已阅读并同意",termsLink:"展示与署名条款",submit:"提交申请",submitGuest:"登录后提交申请",submitting:"正在提交…",restored:"已恢复你填写的内容，确认无误后提交。",loading:"正在读取申请状态…",step1:"产品信息",step2:"联系与确认",next:"下一步",back:"上一步",stepOf:"第 {{step}} 步，共 {{total}} 步",tier:{t1:"< $100",t2:"$100–1K",t3:"$1K–10K",t4:"> $10K"}},err:{required:"请填写此项",select:"请选择一项",url:"请输入有效网址，例如 example.com",email:"请输入有效邮箱",logo:"请选择不超过 50 KB 的 PNG 或 WebP 图片",terms:"请先同意条款",desc:"最多 {{max}} 个字",summary:"还有几项需要补充，请检查标红的字段。",timeout:"暂未确认提交结果。你填写的内容已保留，请稍后刷新查看申请状态。",refresh:"刷新状态",failed:"提交失败：{{message}}",load:"申请状态读取失败，请稍后重试。",retry:"重试"},status:{pendingTitle:"申请已提交",pendingBody:"我们会尽快审核，结果将发送至 {{email}}，请耐心等待。",name:"产品",url:"网址",type:"类型",usage:"月调用规模",time:"提交时间",public:"公开展示",yes:"是",no:"否",approvedTitle:"审核已通过，商务对接中",approvedBody:"商务同事会通过 {{email}} 联系你，沟通合作方案。",listing:"生态页展示",listingOn:"展示中",listingOff:"未公开",view:"查看展示",editListing:"修改展示信息",rejectedTitle:"这次申请未通过",reason:"原因",resubmit:"修改后重新提交",legacyTitle:"你的 App Code 合作有效",legacyBody:"保持请求头中的 APP-Code 即可，合作条件不变。如需调整合作方案，请联系你的商务对接人。",copy:"复制",copied:"已复制",sunsetTitle:"你的 App Code 将于 {{date}} 停止优惠",sunsetBody:"停止后，带这个请求头的调用仍可正常使用，只是不再享受优惠。如果你的产品调用量较大，可以提交合作申请，由商务评估合作方案。",sunsetApply:"提交合作申请"},faq:{title:"常见问题",q1:"提交申请后会发生什么？",a1:"审核通过后，如果你选择了公开展示，产品会出现在生态页；商务同事会通过邮件联系你，沟通合作方案。",q2:"合作有价格优惠吗？",a2:"申请审核通过后会自动发放 App Code。合作条件可与商务同事沟通。",q3:"我已经有 App Code 了，还需要申请吗？",a3:"不需要重新申请就能继续使用。调用量较大的 App Code 会保留现有合作；长期没有调用量的会逐步停止优惠，停止前会邮件通知，带该请求头的调用不受影响。",q4:"署名有什么要求？",a4:"开源产品在产品功能中体现 AIHubMix 是模型供应商之一即可；闭源产品需要在产品界面、用户协议或相关说明中注明模型服务来源。",q5:"可以只合作、不公开展示吗？",a5:"可以。提交时取消勾选“公开展示”。",q6:"生态页的热度数据从哪里来？",a6:"来自 GitHub star、插件市场安装量和 npm 下载量等第三方公开数据，定期更新，不代表这些产品在{{brand}}的调用量。商标归各自所有者，展示仅说明兼容性。"},dev:{label:"预览状态",live:"真实接口",guest:"未登录",empty:"未申请",pending:"审核中",approved:"已通过",rejected:"未通过",legacy:"老 App Code · 保留",sunset:"老 App Code · 即将停用",timeout:"模拟提交超时",toggle:"预览状态",sampleReason:"产品网址目前无法访问，暂时无法核实产品信息。"},preview:{name:"你的产品"},stage:{draft:"预览",pending:"审核中",approved:"展示中",unlisted:"未公开",rejected:"未通过",legacy:"合作中",sunset:"优惠即将停止"},svc:{label:"你的产品通过{{brand}}调用主流模型"},catalog:{categories:{coding:"编程智能体",agents:"智能体与工作流",clients:"AI 客户端",devtools:"开发者工具",creative:"创作与设计"},subs:{cli:"命令行",ide:"IDE 插件",app:"桌面与网页",productivity:"效率插件"},integ:{builtin:{label:"官方内置",def:"在产品的供应商列表里直接选择 AIHubMix"},plugin:{label:"官方插件",def:"在插件市场安装 AIHubMix 官方插件"},package:{label:"扩展包",def:"通过 AIHubMix 维护的 SDK 或扩展包接入"},compatible:{label:"兼容接入",def:"填入 Base URL 与 API Key 即可使用"}},products:{"hermes-agent":"Nous Research 出品的开源自主智能体，在终端和聊天应用里长期运行、持续学习。",opencode:"开源终端编程智能体，经 models.dev 目录在供应商列表里直接选择 AIHubMix。",dify:"开源 LLM 应用与工作流平台，插件市场提供 AIHubMix 官方模型插件与生图插件。",cline:"VS Code 里的自主编程智能体，供应商列表内置 AIHubMix，模型清单实时同步。","cc-switch":"Claude Code、Codex 等工具的供应商切换器，内置 AIHubMix 预设。",pi:"极简、可扩展的终端编程智能体，安装 AIHubMix 扩展包即可使用。","open-design":"开源 AI 设计生成工具，支持自带 AIHubMix 密钥。",lobehub:"开源 AI 对话与智能体协作平台，内置 AIHubMix 供应商。",litellm:"用统一接口调用 100+ 模型的 Python SDK 与代理网关。","cherry-studio":"多模型桌面 AI 客户端，供应商列表内置 AIHubMix。",crush:"Charm 出品的终端编程智能体，经 models.dev 目录内置 AIHubMix。","kilo-code":"开源 VS Code / JetBrains 编程智能体，内置 AIHubMix 供应商。",camel:"面向多智能体协作与仿真的开源框架。","models-dev":"开源 AI 模型目录，收录 AIHubMix 的模型、价格与能力数据，OpenCode、Crush 等工具据此直接列出 AIHubMix。","ai-sdk":"TypeScript AI 工具包，使用 AIHubMix 官方 provider 包接入。","claude-code":"Anthropic 的终端编程智能体，配置 Base URL 后即可通过 AIHubMix 使用。",codex:"OpenAI 的编程智能体 CLI，配置后即可通过 AIHubMix 调用。",cursor:"AI 代码编辑器，可在模型设置中填入 AIHubMix 的 Key。",n8n:"可视化工作流自动化平台，在 AI 节点中使用 AIHubMix。","open-webui":"可自托管的开源 AI 对话界面。",librechat:"开源多模型对话应用，支持自定义端点。",chatbox:"跨平台 AI 桌面与移动客户端。","immersive-translate":"双语网页与文档翻译插件，可选用 AIHubMix 的模型。",obsidian:"本地笔记应用，通过 AI 插件接入 AIHubMix。",langchain:"构建 LLM 应用与智能体的开源框架。"}}},ne={notificationCenter:Ms,slogan:Rs,"site Name":"AI HUB MIX","slogan desc 1":"用你熟悉的 SDK，调用所有主流模型。","start to use":"立即体验","home explore models":"浏览模型","home hero proof models":"<strong>{{total}}+</strong> 模型","home hero proof clouds":"官方云渠道","home hero proof billing":"按量付费","doc entrance":"文档","feature 1":"主流模型，一个 Key","feature 1 desc":"连接包括 ChatGPT、Claude、Gemini、DeepSeek、Qwen 在内的所有主流 AI 模型。全部以统一格式提供。","price entrance":"全部模型 >","feature 2":"现有 SDK 直接接入","feature 2 desc":"作为 Azure、AWS、Google Cloud 的官方合作伙伴，我们集成官方 API 和专有服务，提供企业级可靠性和无限吞吐量。","feature 3":"多云自动切换","home failover people":"个人","home failover teams":"团队","home failover agents":"智能体","home desktop title":"一键接入你的 Agent 工具","home desktop for mac":"下载 macOS 版","home desktop for windows":"下载 Windows 版","home desktop all downloads":"全部下载","home desktop requirements":"适用于 macOS 12 及以上","home desktop lead":"不用手改配置文件，每次改动都可撤销。","home desktop available for":"适用于 macOS 与 Windows","home desktop menu mac requirement":"12 及以上","home desktop menu windows requirement":"10 及以上","home desktop menu mac arm":"Apple 芯片","home desktop menu mac intel":"Intel 芯片","home desktop menu windows x64":"x64","home desktop menu windows arm":"Arm","home desktop menu recommended":"推荐","home desktop connect":"连接","home desktop mock connecting":"连接中","home desktop mock step write":"写入配置","home desktop mock step overrides":"检查是否被其他设置覆盖","home desktop mock step test":"发送一次测试请求","home desktop mock done title":"{{name}} 已接入","home desktop mock done body":"新会话会通过 AIHubMix 发出","home desktop mock default model":"默认模型","home desktop mock auto":"自动","home desktop mock done button":"完成","home desktop requirements windows":"适用于 Windows 10 及以上","home desktop mock balance":"余额","home desktop mock top up":"充值","home desktop mock spent":"今日已用 {{amount}}","home desktop mock found":"本机找到","home desktop mock installed":"已安装","home desktop mock verified":"刚刚已验证","home desktop mock normal":"正常","feature 3 desc":"构建在跨行业验证稳定的高性能基础设施之上。","Model usage":"模型榜单","home rankings lead":"开发者在{{brand}}上都在用哪些模型。","home rankings explore":"浏览模型与价格","home rankings more":"+ 其余 {{count}} 项",others:$s,"show less":"收起",Partner:Ts,"Featured Apps":"构建 AI 共赢生态","Partner desc":"精选生态伙伴应用，立享所有模型（除 claude 系列模型外） 10% 优惠——持续接入中，欢迎成为下一个！","Partner off":"获取 10% 优惠","home ecosystem title":`适配主流 AI 工具
也驱动你的产品`,"home ecosystem model choice":"模型自由选择","home ecosystem partner program":"开发者合作计划","home ecosystem resilient access":"稳定可靠接入","home ecosystem join":"加入开发者计划","Earn with Your App":"集成 Aihubmix，立享 10% 优惠",User:Ns,Channel:_s,Redemption:Es,"Usage statistics":"用量","Balance/Top-up":"充值","API keys":"秘钥",Log:Ds,Setting:Hs,Login:qs,Register:Fs,"Signed in as":"当前登录账号",Logout:Us,"Model/Price":"模型广场","App Store":"应用市场",Enterprise:js,Console:Ks,"Usage tutorial":"文档",Playground:Bs,Unit:Vs,"call times":"请求次数","Last week":"过去一周","Last month":"过去一月",Reset:zs,"forgot password?":"忘记密码?","no account?":"没有账号?","had account?":"已有账户？",OR:Gs,"Sign in with Github":"使用 Github 登录","Sign in with Google":"使用 Google 登录",username:Ws,"username placeholder":"请输入用户名，最短3位，最长12位!",password:Js,"password placeholder":"请输入密码，最短8位，最长20位","sign in success notice":"登录成功！","sign in failed notice":"未登录或登录已过期，请重新登录！","reset password notice":"请立刻修改默认密码！","typeof amount error notice":"额度只接受正整数！","pay failed notice":"支付失败！","pay success notice":"支付成功！","order close notice":"订单已关闭！","account balance":"余额","balance remind":"余额提醒","balance remind desc":"开启邮箱监控，赶走额度焦虑","close remind":"关闭余额提醒",yes:Ys,no:Qs,modify:Zs,"close remind notice":"确认不再接收余额提醒邮件？","balance remind notice":"额度低于 ${{threshold}} 时，通知 {{email}}","set balance remind":"设置余额提醒","remind threshold":"低额阈值","remind threshold placeholder":"请输入正确的金额","remind email":"通知邮箱","remind email placeholder":"请输入邮箱地址","recharge online":"在线充值","recharge quota":"充值额度","custom recharge":"自定义","custom recharge placeholder":"最低1元，仅支持整数","recharge amount placeholder":"请输入整数金额","Payable amount":"结账：","alipay pay":"支付宝支付","alipay pay notice":"支付宝扫一扫完成付款","stripe pay":"Stripe支付",invoice:Xs,"quota notice":"需要发票 / 企业定制","exchange quota":"兑换额度","exchange code":"兑换码","exchange success notice":"兑换成功！","exchange code placeholder":"请输入充值兑换码","exchange code tooltip":"支付成功后，不要离开当前页面，等待10秒左右，页面就会展卡密即是兑换码",model:er,input:tr,output:or,"search model":"搜索模型","model price table":"后台扣费表","operation success":"操作成功!","key name":"Key 名称",key:nr,status:sr,enabled:rr,enable:ar,disabled:ir,disable:lr,expired:ur,exhausted:cr,uncertain:dr,"used quota":"已用","remain quota":"剩余额度","created time":"创建时间","expired time":"过期时间","expired time placeholder":"默认不限制","invalid time format":"过期时间格式错误！",operation:pr,edit:hr,delete:"删除","add key":"创建 Key","delete confirm":"删除数据","delete noice":"你确认删除名称为 {{name}} 的key?",copy:mr,"copy success":"复制成功!","my key":"我的 Key","go recharge":"去充值","key name placeholder":"请输入",sort:gr,"sort by remain quota":"按剩余额度","sort by used quota":"按已用额度",pagination:fr,"create key":"创建Key","create key success":"创建Key成功, 点击复制获取Key！","update key":"更新Key","update key success":"更新Key成功！","never expired":"永不","one month later expired":"一个月后过期","one day later expired":"一天后过期","one hour later expired":"一小时后过期","one minute later expired":"一分钟后过期","quota setting notice":"注意，新手建议选择无限额度，Key的额度仅用于限制Key本身的最大额度使用量，实际的使用受到账户的剩余额度限制。","quota limit":"额度限制","quota limit placeholder":"请输入限制额度","cancel quote unlimited":"取消无限额度","set quote unlimited":"设为无限额度","higher option":"此高级选项，新手勿操作","model range":"模型范围","model range placeholder":"默认不限制","model range tooltip":"限制当前Key可用的模型","IP limit":"IP限制","IP limit placeholder":"如：192.168.0.0/24","IP limit tooltip":"用于限制特定的用户IP，新手不建议设置",submit:yr,cancel:br,"log detail":"日志明细",recharge:wr,consume:vr,manage:kr,system:xr,type:Ar,all:Sr,"max nums":"Excel(上限 10000)","model name":"模型名称","model price":"单价","cached tokens":"缓存 Tokens","quota change":"额度变动","start time":"开始时间","end time":"结束时间","personal setting":"我的","user name":"用户名","display name":"显示名称",email:Ir,"bind email address":"绑定邮箱地址","bind email address placeholder":"请输入邮箱地址","go bind":"绑定",binded:Cr,"go update":"更新","send captcha":"获取验证码","captcha placeholder":"请输入验证码","log off account":"注销账号","go log off":"注销","log off notice":"您正在删除自己的帐户，将清空所有数据且不可恢复","log off confirm":"输入你的账户名 {{username}} 以确认删除","account name placeholder":"请输入账户名","token copied":"令牌已重置并已复制到剪贴板","invite code copied":"邀请链接已复制到剪切板","system token copied":"系统令牌已复制到剪贴板","log off confirm notice":"请输入你的账户名以确认删除！","log off success":"退出成功！","bind wechat success":"绑定微信成功！","captcha send success":"验证码发送成功，请检查邮箱","bind email success":"绑定邮箱成功！","common setting":"通用设置","common setting desc":"注意，此处生成的令牌用于系统管理，而非用于请求 OpenAI 相关的服务，请知悉。","generate token":"生成系统访问令牌","copy invite code":"邀请链接","account setting":"账户设置","avaliable models":"可用模型","update user":"更新用户信息","user update success":"用户信息更新成功！","new username":"新用户名","new username placeholder":"请输入新用户名，最短3位,最长12位","display name placeholder":"请输入显示名称","binded Github account":"已绑定的 Github 账号","binded Google account":"已绑定的 Google 账号","binded email account":"已绑定的邮箱账号","binded account placeholder":"此项只读，需要用户通过个人设置页面的相关绑定按钮进行绑定，不可直接修改",search:Pr,reset:Lr,"page not exist":"页面不存在","page not exist desc":"请检查你的浏览器地址是否正确","back to home":"返回首页","no permission":"没有权限访问此页面","no permission desc":"请联系管理员开通权限","bind success":"绑定成功","login success":"登录成功",redirecting:Or,retrying:Mr,"params error":"参数异常","connect server error":"无法正常连接至服务器！",unlimited:Rr,"statistics title":"API 使用统计",expense:$r,"expense desc":"累计消费金额","usage token":"Token 消耗","usage token desc":"输入+输出Tokens","call times desc":"API调用总次数",trend:Tr,distribution:Nr,hour:_r,"user id":"用户ID","user id placeholder":"请输入用户ID",period:Er,today:Dr,"last 7 days":"最近一周","last 30 days":"最近一月","week rank":"周排行","month rank":"月排行",trending:Hr,manual:qr,total:Fr,"usage detail":"调用记录",download:Ur,"last half a year":"最近半年","recharge record":"充值记录","recharge time":"充值时间",available:jr,init:Kr,alipay:Br,stripe:Vr,exchange:zr,"data delay":"数据可能有1分钟延迟","model filter":"筛选",developer:Gr,"total models":"全部：{{total}} 模型","entered passwords differ!":"两次输入的密码不一致！","register success":"注册成功！","password reset":"密码重置","password sub title":"请输入您的邮箱地址，我们将发送一封重置密码的邮件","send email text":"发送邮件","send email retry":"s 后重试","reset password email":"邮箱地址","reset password email placeholder":"请输入邮箱地址!","reset password email confirm":"请输入正确的邮箱地址!","reset password email success":"重置邮件发送成功，请检查邮箱！","reset password confirm":"密码重置确认","reset password confirm desc":"提交完成密码重置","new password":"新密码","get new password":"获取新密码","new password success":"密码重置完成","back login":"返回登录","new password copied":"新密码已复制到剪贴板：",rank:Wr,feature:Jr,"unlimit quota":"无限额度","limit quota":"限制额度","advanced settings":"高级设置","model info":"模型信息",price:Yr,"params count":"参数量","context length":"上下文长度","model params":"模型参数","param name":"参数名",desc:Qr,"default value":"示例值",Feedback:Zr,Privacy:Xr,Terms:ea,"Input name":"输入","Output name":"输出","Context name":"上下文","Latency name":"延迟","Throughput name":"吞吐率",features:ta,tags:oa,types:na,"Model Details":"模型详情",usage:sa,"try in playground":"在 Playground 试用","media async tasks note":"这些 /ai/v1 媒体接口按异步任务执行，请先为账号开通「异步任务」，否则创建任务会返回 403 async_not_enabled。","async tasks guide":"异步任务文档",add:ra,"remind off":"关闭","remind on":"开启",notice:aa,"surfing cost":"搜索费用","unuser title":"生成专属 Code","unuser desc":"请登录或注册，生成专属 Code 并解锁 10% 优惠","unuser btn":"去登录","not now":"暂不需要","user title":"你的 10% 优惠码已就绪！","user desc":"专属推荐码已激活，代码示例已自动填充。现在就用下方代码快速接入吧。","user btn":"知道了","get code":"获取 Code","get code desc":`1. 在你的应用中集成 AIhubmix 作为模型供应商，并在请求头中增加应用 Code；
2. 获得 10% 优惠条件：开源或者需要用户自行填写模型 key 的应用，只需要把 AIhubmix 作为模型供应商，用户直接填写 key 即可使用；
3. 闭源项目只需在应用中有说明模型提供来自 AIhubmix 即可；
4. AIhubmix 对优惠活动有最终解释权，有权对不符合条件的应用取消优惠或对恶意钻漏洞的账户进行封禁。`,"get code notice":"请登录或注册，生成专属 Code 并解锁 10% 优惠","app name":"应用名称","app url":"应用域名","app name placeholder":"请输入应用名称","app url placeholder":"请输入应用域名","apps notice":"已集成 AIHubmix 为模型供应商，所有模型（除 claude 系列模型外）请求计费","app url tooltip":"确保是您的有效产品域名",remark:ia,"10% off":"10% 优惠","learn more":"更多详情",authorize:la,"authorize app":"授权 {{appName}}","authorize account login":"授权使用你的帐号信息","permissions granted":"获得以下权限：","no special permissions":"无特殊权限","user basic info":"用户基本信息（用户名、邮箱）","user balance info":"用户余额信息",deny:ua,allow:ca,"contact developer":"更多信息请联系应用开发者","missing parameters":"缺少必要参数","app info fetch failed":"应用信息获取失败","authorization request failed":"授权请求失败",refresh:da,"column settings":"列设置","go generate":"生成","Pricing Details":"价格详情","Image Generation":"图像生成","Video Generation":"视频生成","Input Modalities":"输入模态","Output Modalities":"输出模态",Providers:pa,Pricing:ha,"Quick Start":"快速开始",Attributes:ma,"More Models":"更多模型","API Usage Examples":"接口调用示例","model data api":"模型数据接口",Performance:ga,"Performance for":"性能对比","No data available":"暂无数据","Smart Routing":"智能路由","router hero title":"并不是每一次请求，都需要最强最贵的模型","router hero sub":"智能路由为每个请求实时选出最佳模型，在不影响任务质量的前提下大幅降低成本；模型缓存支持，同一会话自动保持同一模型，避免缓存丢失。","router hero session":"无需额外改造：Claude Code、Codex、OpenCode 等主流 Agent 的会话标识会被自动识别。需要精确控制会话范围时，可在请求中添加：","router hero note":"评分覆盖 {{groups}} 大类、{{dims}} 个子维度，来自内部测评与外部公开榜单的综合归一化。","router hero doc":"接口文档","router copy":"复制","router copied":"已复制","router code sync":"路由策略","router code comment default":"不带后缀 = auto:cost_optimized（默认）","router code comment strategy":"策略：{{name}}","router strat eyebrow":"路由策略","router strat title":"四大路由策略对应的模型范围","router default tag":"默认","router weight quality":"能力","router weight cost":"成本","router weight latency":"延迟","router strat cost_optimized":"成本优先","router strat cost_optimized desc":"能力达标就选最便宜。","router strat balanced":"均衡","router strat balanced desc":"能力 / 成本 / 延迟兼顾。","router strat quality_first":"质量优先","router strat quality_first desc":"优先选能力最强。","router strat latency_critical":"速度优先","router strat latency_critical desc":"优先选响应最快。","router col model":"模型","router col score":"归一化分数","router col price":"输入 / 输出价格","router col latency":"首字延迟","router best tag":"当前首选","router sort route":"按「{{name}}」策略加权排序","router sort score":"按分数排序","router sort price":"按价格排序","router sort latency":"按延迟排序","router source note":"数据来源：内部测评与外部公开榜单，综合归一化。","router group text":"文本","router group vision":"视觉","router group code_webdev":"Web 开发","router group search":"联网搜索","router group document":"文档分析","router dim text_overall":"总体","router dim text_coding":"编程","router dim text_math":"数学","router dim text_instruction_following":"指令遵循","router dim text_longer_query":"长查询","router dim text_language_chinese":"语言 › 中文","router dim text_language_english":"语言 › 英文","router dim text_occupational_software_it":"职业 › 软件 / IT","router dim text_occupational_mathematical":"职业 › 数理","router dim text_occupational_legal":"职业 › 法律 / 政务","router dim text_occupational_medicine":"职业 › 医疗 / 健康","router dim vision_overall":"总体","router dim vision_ocr":"视觉文字理解","router dim vision_diagram":"图表","router dim vision_homework":"作业","router dim vision_chinese":"中文","router dim vision_english":"英文","router dim code_webdev_overall":"总体","router dim code_webdev_html":"HTML","router dim code_webdev_react":"React","router dim code_image_to_webdev_overall":"图像转 Web","router dim search_overall":"总体","router dim document_overall":"总体","router card sub":"AIHubMix 智能路由","router card desc":"AIHubmix 自研的模型自动路由器。我们认为不是所有请求都需要最强、最贵的模型——网关综合内部测评与公开榜单，覆盖当前一批主流、能力各异的模型，通过我们训练的小模型进行自动路由。请求时把 model 填为 auto，即可按请求内容自动分配合适的模型，降低请求成本。目前为 beta 版本，我们会持续更新优化。","router card fee":"按实际命中模型的原价计费，智能路由本身不额外收费。","router card cta":"了解智能路由","Request Parameters":"请求参数",Parameter:fa,Type:ya,Values:ba,Description:wa,Deprecated:va,"Not supported on this model":"该模型上不支持",Unverified:ka,"up to {{off}}% off":"最高立减 {{off}}%","{{off}}% off":"立减 {{off}}%","Uptime is the percentage of requests that succeeded over the past 72 hours. AIHubMix continuously monitors every provider and automatically retries with the next-best provider when one returns an error or responds too slowly.":"Uptime 指过去 72 小时内请求成功的百分比。AIHubMix 持续监控每个供应商，当某个供应商返回错误或响应过慢时，会自动切换到次优供应商重试。","Throughput is how fast the model writes (tokens per second, higher is better).":"Throughput 指模型的输出速度（每秒 token 数，越高越好）。","Latency is total round-trip time (lower is better).":"Latency 指请求的总往返耗时（越低越好）。",Peak:xa,"Off-peak":"空闲时段","Active hours":"生效时段","Other hours":"其余时段",Compare:Aa,Comparisons:Sa,"Add model":"添加模型","Data snapshot":"数据快照",Update:Ia,Copied:Ca,"Copy link":"复制链接","requests this week":"次本周调用","Pick a second model to start comparing.":"选择第二个模型开始对比。","Pick two models above, or start from one of the comparisons below.":"在上方选择两个模型，或从下面的热门对比开始。","What a comparison shows":"对比页展示什么","Every comparison puts 2 to 4 models side by side on the same objective metrics.":"每个对比把 2 到 4 个模型放在同一组客观指标下并排展示。","Pricing per million input and output tokens, with any active discount applied.":"每百万输入 / 输出 token 的价格，已计入正在生效的折扣。","Context window and maximum output length.":"上下文窗口与最大输出长度。","Latency and throughput, as rolling averages measured on AIHubMix.":"延迟与吞吐，取 AIHubMix 实测的滚动平均值。","Arena scores, where the model has been rated.":"Arena 榜单分（该模型已被评分时展示）。","Real usage on AIHubMix: weekly requests and token trends.":"AIHubMix 上的真实用量：周调用次数与 token 趋势。","A monthly cost estimate for your own request volume.":"按你自己的请求量估算的月度成本。","How it works":"怎么用","Add models with the picker above. The URL holds your selection, so a comparison can be shared or bookmarked.":"用上方选择器添加模型。URL 会记住你的选择，对比结果可以直接分享或收藏。","Figures are a cached snapshot; the page states when it was taken and refreshes on demand.":"页面数值是缓存快照，页内标注了快照时间，可随时手动刷新为最新数据。","Every model on AIHubMix is callable through one API key and one base URL, so a price you compare here is the price you actually pay.":"AIHubMix 上所有模型共用一个 API key 和一个 base URL，因此这里比出来的价格就是你实际支付的价格。","Specs & Pricing":"规格与价格","Input price":"输入价格","Output price":"输出价格","Cache read":"缓存读取","Context window":"上下文窗口","Max output":"最大输出","Latency (first token)":"首字延迟","Usage on AIHubMix":"AIHubMix 用量","last 3 days":"近 3 天","Requests / day":"每日调用次数","Tokens / day":"每日 Token 用量","Live Performance":"实时性能","Arena Scores":"Arena 评分","Cost Calculator":"成本估算","Estimate your monthly bill for the same workload on each model.":"估算同一工作负载在各模型上的每月费用。","Avg input tokens / request":"平均每次输入 Token","Avg output tokens / request":"平均每次输出 Token","Popular Comparisons":"热门对比","Related model match-ups readers also look at.":"大家也在看的模型对比组合。","Which is cheaper":"哪个更便宜","Which responds faster?":"哪个响应更快？","Compare pricing, specs, live performance and arena scores side by side. Up to 4 models.":"并排对比价格、规格、实时性能与 Arena 评分，最多 4 个模型。","Prices are per million tokens. Latency and throughput are rolling averages measured on AIHubMix.":"价格按每百万 Token 计。延迟与吞吐为 AIHubMix 实测滚动均值。","Daily traffic served through AIHubMix — how demand for each model is trending.":"AIHubMix 每日真实流量——各模型需求趋势。","Measured on real AIHubMix traffic, hourly buckets. Gaps mean no traffic in that hour.":"基于 AIHubMix 真实流量，小时粒度；断线表示该小时无流量。","LMArena ratings by capability (Bradley-Terry, commonly called Elo). Higher is better.":"按能力维度的 LMArena 评分（Bradley-Terry，俗称 Elo），分数越高越好。","No published ratings for":"暂无榜单数据：","Monthly = daily × 30. Discounted rates applied where a promotion is active.":"月费用 = 日用量 × 30；促销生效时按折后价计算。","Promotional prices show the discounted rate; see each model page for promotion windows.":"促销价为折后价，促销时段见各模型详情页。",Capabilities:Pa,Context:La,capabilityUndocumented:Oa,"Max Output":"最大输出","mirror warning title":"已为你跳转到 AIHubMix 官方站点","mirror warning desc":"{{host}} 不是 AIHubMix 的官方域名。在那里输入的任何内容——密码、API 密钥、支付信息——都会经过对方的服务器。我们唯一的官方站点是 aihubmix.com。","mirror warning desc generic":"你来自的站点不是 AIHubMix 的官方域名。在那里输入的任何内容——密码、API 密钥、支付信息——都会经过对方的服务器。我们唯一的官方站点是 aihubmix.com。","Not published in the catalog":"目录中未公布该值","mod text":"文本","mod vision":"视觉","mod audio":"音频","mod video":"视频","mod file":"文件","mod pdf":"PDF","Takes {{mods}}. Output modality not published.":"输入 {{mods}}。输出模态未公布。","Takes {{in}}, returns {{out}}.":"输入 {{in}}，输出 {{out}}。","Official spec, verified {{date}}. The gateway route is configured at {{ctx}}.":"官方规格，{{date}} 核验。网关路由配置为 {{ctx}}。","Copy model ID {{id}}":"复制模型 ID {{id}}",Model:Ma,Modalities:Ra,"col context":"上下文","col cache read":"缓存读","Cache write":"缓存写",Throughput:$a,Released:Ta,Latency:Na,Input:_a,Output:Ea,"{{count}} more models_other":"其余 {{count}} 个模型","Daily {{noun}} for {{dev}} models over the last {{days}} days, stacked by model, up to {{top}} per day.":"{{dev}} 模型近 {{days}} 天的每日{{noun}}（按模型堆叠），单日最高 {{top}}。",tokens:Da,requests:Ha,"Chart legend":"图例",Total:qa,Usage:Fa,"Measure usage by":"用量统计维度","By tokens":"按 token","By requests":"按请求数","Last {{days}} days":"近 {{days}} 天","date range to":"至",Tokens:Ua,Requests:ja,"Models in use":"在用模型","of {{total}}":"/ 共 {{total}} 个","Tokens per day, stacked by model":"每日 token（按模型堆叠）","Requests per day, stacked by model":"每日请求数（按模型堆叠）","Which models that traffic went to":"流量流向了哪些模型","Share of {{total}} tokens.":"占 {{total}} token 的份额。","Share of {{total}} requests.":"占 {{total}} 次请求的份额。","{{count}} models with traffic report no token counts and cannot be ranked here":"{{count}} 个有流量的模型未上报 token 数，无法进入此排名","tok missing including":"，包括 ","tok missing and":" 和 ","tok missing tail":"——它们在“按请求数”视图中。","usage views disagree note":"两个视图不一致是有意为之：一个模型可能占调用次数的大头、却只占 token 的一小部分——大量短请求——反之亦然。哪个视图更重要，取决于你的成本由调用量驱动还是由提示词长度驱动。以上为 AIHubMix 近 {{days}} 天实测，统计本页列出的 {{count}} 个模型 ID；经由公开目录之外的上游专用 ID 的流量不计入。",Models:Ka,"Model Authors":"模型开发商","{{dev}} Models":"{{dev}} 模型","models unit_other":"个模型","authors unit_other":"家开发商","General models":"通用模型",free:Ba,"to start":"起步","General models from":"通用模型低至","input unit":"输入","Up to":"最高","context unit":"上下文","Official site":"官网","All {{count}} {{dev}} Models":"{{dev}} 全部 {{count}} 个模型","Open in model list":"在模型列表中打开",Reasoning:Va,Tools:za,"Structured output":"结构化输出",Vision:Ga,"1M+ context":"1M+ 上下文","Cache discount":"缓存折扣",Clear:Wa,"{{shown}} of {{total}} models":"{{total}} 个模型中显示 {{shown}} 个","provider table caption":"{{dev}} 在 AIHubMix 上的模型：输入/输出模态、上下文长度、最大输出、每百万 token 价格（含缓存读/写费率），以及实测吞吐与延迟。","Show first {{count}}":"收起到前 {{count}} 个","Show all {{count}} models":"展开全部 {{count}} 个模型","provider table footnote":"价格为每百万 token 的美元价；缓存读/缓存写分别是提示词缓存命中与写入缓存的费率。吞吐与延迟为 AIHubMix 实测——与模型详情页展示的是同一组数字——并非厂商宣称值。“—”表示目录未公布该模型的这一字段，不等于模型不支持。","Common Comparisons":"常见对比","{{dev}} on AIHubMix":"AIHubMix 上的 {{dev}}","Other Model Authors":"其他开发商","Start calling {{dev}} in one line":"一行代码开始调用 {{dev}}","One key, one endpoint, {{models}} models across {{devs}} model authors.":"一个密钥、一个端点，{{devs}} 家开发商的 {{models}} 个模型。","Get API key":"获取 API 密钥","Read the docs":"查看文档","Free models":"免费模型","Free AI Models":"免费 AI 模型","fm lead base":"免费模型的意义，是让实验、学习和上线不必从账单开始——本页 {{count}} 个模型的推理成本由 AIHubMix 承担，且每个模型都同时支持 Chat Completions、Messages、Responses 三种协议","fm lead trial":"。注册即得 {{trial}} 次试用调用，无需信用卡","fm lead topup":"；充值 ${{usd}} 后转为永久每日配额。","fm lead end":"。","Every model":"每个模型都是","/M input & output":"/M 输入 & 输出","Updated {{date}}":"更新于 {{date}}","Model authors with free models":"提供免费模型的开发商","{{name}} models on AIHubMix":"AIHubMix 上的 {{name}} 模型","Before your first top-up":"首充之前","No credit card required, and trial calls never expire.":"无需信用卡，试用调用永不过期。","Trial calls":"试用调用","total, all free models":"总计，全部免费模型共享","After a one-time ${{usd}} top-up":"充值 ${{usd}} 之后","fm paid lane desc":"只需充值一次——金额 ${{usd}} 起——所有免费模型即切换为每日配额，永不过期、每天重置。","/day unit":"/天","/min unit":"/分钟",Resets:Ja,daily:Ya,"fm tok missing":"{{count}} 个有流量的模型未上报 token 数，仅出现在“按请求数”视图中。","All {{count}} Free Models":"全部 {{count}} 个免费模型","fm table caption":"AIHubMix 上的全部免费模型（按目录顺序）：开发商、输入/输出模态、上下文长度，以及充值后账户下各模型的速率上限。","Rate limit":"速率上限","Paid version":"付费版本","Compare {{a}} with {{b}}":"对比 {{a}} 与 {{b}}","vs paid":"对比付费版","fm table note base":"速率上限展示的是充值后账户的每日与每分钟请求上限。部分模型请求权重更高——一次调用计为多次请求——所以上限更低。","fm table note pool":" 全部免费模型共享每天 {{tokens}} token 的总池。","fm table note trial":" 首充之前按 {{trial}} 次试用调用计。","fm table note tail":"上下文为“—”表示目录未公布该值。模态按 输入 → 输出 读——与开发商页展示同一事实；缺少输出侧表示目录未公布，不代表模型没有输出。","How to Start":"如何开始","Create an account":"注册账号","Email or OAuth, no credit card required.":"邮箱或 OAuth 登录，无需信用卡。","{{trial}} trial calls are available immediately.":"{{trial}} 次试用调用即刻可用。","Create an API key":"创建 API 密钥","One key works for every model on the platform, free and paid alike.":"一个密钥即可调用平台上所有模型，免费与付费一视同仁。","Open the API keys page":"打开 API 密钥页","Call a free model":"调用免费模型","fm step3 pre":"把任意 OpenAI 兼容客户端——Cursor、Cline、Cherry Studio、LiteLLM——指向网关，选择一个 ","fm step3 post":" 模型 ID 即可。","API protocol":"API 协议","Free Models on AIHubMix":"AIHubMix 上的免费模型","Keep Exploring":"继续探索","All Models":"全部模型","fm explore models desc":"完整目录——{{count}} 个模型，覆盖对话、图像、视频与音频，按 token 计价。","Browse all models":"浏览全部模型","LLM Router":"LLM Router","fm router desc pre":"把模型 ID 填成 ","fm router desc post":"，网关会按成本与质量把每次请求路由到最优模型。","Try the router":"试试路由",Apps:Qa,"fm apps desc":"AIHubMix 应用商店里开箱即用的应用——以及免费目录之外的模型折扣。","Browse the app store":"逛逛应用商店",Recommended:Za,"Switch version":"切换版本","Model versions":"模型版本","AI Model Authors":"AI 模型开发商","authors index stats":"{{providers}} 家开发商、{{models}} 个模型,一个 API Key。","authors index desc":"每个开发商页都列出其全部模型:按 token 计价、上下文窗口与实测吞吐。","All model authors":"全部开发商","calls 30d":"次调用 · 30 天","See all model authors":"查看全部开发商","Retired models":"已下线模型",Deprecating:Xa,Retired:ei,"Coming soon":"即将上线","Price TBD":"价格待定",Retirements:ti,"Model Retirements":"模型下线公示","mr lead":"模型会因上游厂商停服或替换而下线。已排期和已下线的模型全部列在这里，附调用停止的日期和推荐的替代模型。","scheduled for retirement":"个模型已排期下线","already retired":"个模型已下线","Browse all {{count}} models":"浏览全部 {{count}} 个模型",Active:oi,"Fully supported. No retirement date announced.":"正常提供，未公布下线日期。","Still callable, but a retirement date is set. Migrate before that date.":"仍可调用，但已定下线日期，请在该日期前完成迁移。","No longer callable. Requests return":"不再可调用，请求返回","Filter by author":"按厂商筛选",Author:ni,All:si,"Upcoming retirements":"即将下线","Still callable — migrate before the retirement date":"仍可调用——请在下线日期前完成迁移","Detail pages stay online — requests return an error":"详情页保留，但调用会直接报错","mr dash note":"— 表示本站目录中没有对应的替代模型。","No retirements for this author.":"该厂商没有下线模型。",Status:ri,Announced:ai,"Retirement date":"下线日",Replacement:ii,"nav language":"语言","nav site":"站点导航","nav open menu":"打开菜单","nav close menu":"关闭菜单","account personal":"个人版","account enterprise":"企业版","account profile":"个人资料","account credits":"额度","account activity":"活动","account logs":"日志","nav account":"账号","home rankings tokens":"Tokens","home desktop coming soon":"macOS 与 Windows 版即将上线",ecosystemPage:li,"playground drawer load failed":"暂时无法打开 Playground。","playground drawer retry":"重试","playground drawer open new tab":"在新标签页打开"},Ue={zh:"zh","zh-CN":"zh","zh-hans":"zh","zh-hans-cn":"zh","zh-TW":"zh-TW","zh-HK":"zh-TW","zh-tw":"zh-TW","zh-hant":"zh-TW","zh-hant-tw":"zh-TW",en:"en","en-US":"en","en-GB":"en","en-AU":"en","en-CA":"en","en-NZ":"en","en-IE":"en","en-ZA":"en",ja:"ja",ko:"ko",de:"de",es:"es",fr:"fr",pt:"pt",ru:"ru",tr:"tr",pl:"pl",nl:"nl",it:"it",vi:"vi",uk:"uk",bg:"bg"},te=async n=>{const e=Ue[n]||Ue[String(n||"").split("-")[0]]||n;if(!b.hasResourceBundle(n,"translation"))try{let t;switch(e){case"zh-TW":t=await L(()=>import("./zh-TW-D5FcIxBJ.js"),[]);break;case"ja":t=await L(()=>import("./ja-DLBDVJgH.js"),[]);break;case"ko":t=await L(()=>import("./ko-BGl9JO20.js"),[]);break;case"de":t=await L(()=>import("./de-BwpmpMFl.js"),[]);break;case"es":t=await L(()=>import("./es-DHWUJGXv.js"),[]);break;case"fr":t=await L(()=>import("./fr-BHmZ-daK.js"),[]);break;case"pt":t=await L(()=>import("./pt-Fi9KOQ_u.js"),[]);break;case"ru":t=await L(()=>import("./ru-C9fMADhu.js"),[]);break;case"tr":t=await L(()=>import("./tr-ffXZfAdZ.js"),[]);break;case"pl":t=await L(()=>import("./pl-B2bibjvN.js"),[]);break;case"nl":t=await L(()=>import("./nl-Du4lM0bF.js"),[]);break;case"it":t=await L(()=>import("./it-DLLUpSHH.js"),[]);break;case"vi":t=await L(()=>import("./vi-DuKBP-Gr.js"),[]);break;case"uk":t=await L(()=>import("./uk-ki3YSQYB.js"),[]);break;case"bg":t=await L(()=>import("./bg-oUs58l-J.js"),[]);break;default:return}t&&b.addResourceBundle(n,"translation",t.default)}catch(t){console.warn(`Failed to load language: ${n}`,t)}},ui={name:"navigatorEnForZh",lookup(){if(typeof navigator>"u")return;const n=navigator.languages&&navigator.languages.length?navigator.languages:[navigator.language||navigator.userLanguage],e=(n[0]||"").toLowerCase();if(e)return e.startsWith("zh")?"en":n[0]},cacheUserLanguage(){}},Qe=new Ye;Qe.addDetector(ui);function ci(n){if(!n||n==="localhost"||/^[\d.]+$|[:[\]]/.test(n))return;const e=n.split(".");return e.length<2?void 0:"."+e.slice(-2).join(".")}const q=typeof window<"u"?ci(window.location.hostname):void 0,di=3600*24*365;function Ze(n){document.cookie=`i18nextLng=${n}; path=/; max-age=${di}`+(q?`; domain=${q}`:"")+"; SameSite=Lax"}function pi(){document.cookie="i18nextLng=; path=/; max-age=0",q&&(document.cookie=`i18nextLng=; path=/; max-age=0; domain=${q}`)}let Z=null;if(typeof document<"u"){const n=document.cookie.match(/(?:^|;\s*)i18nextLng=([^;]*)/);Z=n&&n[1]?n[1]:null,q&&(document.cookie="i18nextLng=; path=/; max-age=0",Z&&Ze(Z))}const ve=typeof window<"u"&&typeof document<"u"&&!!window.__reactRouterContext,hi=ve&&document.documentElement.lang||"en";let Y=()=>{};const bi=new Promise(n=>{let e=!1;Y=()=>{e||(e=!0,n())}});if(ve)if(document.readyState==="complete")Y();else{const n=setTimeout(Y,1e4);window.addEventListener("load",()=>{clearTimeout(n);let e;const t=()=>{clearTimeout(e),Y()};e=setTimeout(t,15e3),setTimeout(()=>{Z?Ze(Z):pi();const o=b.services.languageDetector?b.services.languageDetector.detect():void 0,s=Array.isArray(o)?o[0]:o;Promise.resolve(s?te(s):void 0).then(()=>{L(async()=>{const{startTransition:r}=await import("./jsx-runtime-CgWCn3gT.js").then(a=>a.R);return{startTransition:r}},[]).then(({startTransition:r})=>{let a;r(()=>{a=b.changeLanguage(s||void 0)}),Promise.resolve(a).then(()=>{setTimeout(t,0)},t)}).catch(t)}).catch(t)},0)},{once:!0})}else Y();b.use(Qe).use(gt).init({...ve?{lng:hi}:{},resources:{zh:{translation:ne},"zh-CN":{translation:ne},"zh-hans":{translation:ne},"zh-hans-cn":{translation:ne},en:{translation:D},"en-US":{translation:D},"en-GB":{translation:D},"en-AU":{translation:D},"en-CA":{translation:D},"en-NZ":{translation:D},"en-IE":{translation:D},"en-ZA":{translation:D}},detection:{lookupQuerystring:"lang",lookupLocalStorage:"i18nextLng",lookupCookie:"i18nextLng",caches:["cookie"],cookieMinutes:525600,...q?{cookieDomain:q}:{},order:["querystring","cookie","navigatorEnForZh","htmlTag"]},fallbackLng:"en",interpolation:{escapeValue:!1}});b.on("languageChanged",n=>{te(n)});const wi=n=>{te(n)},vi=async n=>{try{await te(n)}catch{}return b.changeLanguage(n)},ge=b.language;ge&&!["zh","zh-CN","zh-hans","zh-hans-cn","en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA"].includes(ge)&&te(ge);export{Ve as _,b as a,z as b,vi as c,bi as i,wi as p,yi as u};
