[{"data":1,"prerenderedAt":1291},["ShallowReactive",2],{"navigation":3,"\u002Fnest\u002Flocales":173,"\u002Fnest\u002Flocales-surround":1287},[4,9,14,19,46,96,109,127,148],{"title":5,"path":6,"stem":7,"icon":8},"Introduction","\u002Fintroduction","01.introduction","i-lucide-info",{"title":10,"path":11,"stem":12,"icon":13},"Installation","\u002Finstallation","02.installation","i-lucide-circle-arrow-down",{"title":15,"path":16,"stem":17,"icon":18},"First App","\u002Ffirst-app","03.first-app","i-lucide-play",{"title":20,"icon":21,"path":22,"stem":23,"children":24,"page":45},"Core","i-lucide-container","\u002Fcore","10.core",[25,30,35,40],{"title":26,"path":27,"stem":28,"icon":29},"Architecture","\u002Fcore\u002Farchitecture","10.core\u002F1.architecture","i-lucide-folder-tree",{"title":31,"path":32,"stem":33,"icon":34},"Concepts","\u002Fcore\u002Fconcepts","10.core\u002F2.concepts","i-lucide-lightbulb",{"title":36,"path":37,"stem":38,"icon":39},"Runtime","\u002Fcore\u002Fruntime","10.core\u002F3.runtime","i-lucide-cpu",{"title":41,"path":42,"stem":43,"icon":44},"Modules","\u002Fcore\u002Fmodules","10.core\u002F4.modules","i-lucide-puzzle",false,{"title":47,"icon":48,"path":49,"stem":50,"children":51,"page":45},"Server","i-simple-icons-nestjs","\u002Fnest","11.nest",[52,55,72,77,82,87,92],{"title":5,"path":53,"stem":54,"icon":8},"\u002Fnest\u002Fintroduction","11.nest\u002F1.introduction",{"title":56,"path":57,"stem":58,"children":59,"icon":71},"Database","\u002Fnest\u002Fdatabase","11.nest\u002F2.database\u002F1.index",[60,61,66],{"title":56,"path":57,"stem":58,"icon":8},{"title":62,"path":63,"stem":64,"icon":65},"Models","\u002Fnest\u002Fdatabase\u002Fmodels","11.nest\u002F2.database\u002F2.models","i-lucide-database-zap",{"title":67,"path":68,"stem":69,"icon":70},"Plugins","\u002Fnest\u002Fdatabase\u002Fplugins","11.nest\u002F2.database\u002F3.plugins","i-lucide-plug","i-lucide-database",{"title":73,"path":74,"stem":75,"icon":76},"Controllers","\u002Fnest\u002Fcontrollers","11.nest\u002F3.controllers","i-lucide-route",{"title":78,"path":79,"stem":80,"icon":81},"Guards","\u002Fnest\u002Fguards","11.nest\u002F4.guards","i-lucide-shield-check",{"title":83,"path":84,"stem":85,"icon":86},"Services","\u002Fnest\u002Fservices","11.nest\u002F5.services","i-lucide-layers",{"title":88,"path":89,"stem":90,"icon":91},"Locales","\u002Fnest\u002Flocales","11.nest\u002F6.locales","i-lucide-languages",{"title":93,"path":94,"stem":95},"Env","\u002Fnest\u002Fenv","11.nest\u002F7.env",{"title":97,"icon":98,"path":99,"stem":100,"children":101,"page":45},"Client","i-simple-icons-nuxt","\u002Fnuxt","12.nuxt",[102,105],{"title":5,"path":103,"stem":104},"\u002Fnuxt\u002Fintroduction","12.nuxt\u002F1.introduction",{"title":106,"path":107,"stem":108},"Coming Soon","\u002Fnuxt\u002Fcoming-soon","12.nuxt\u002F2.coming-soon",{"title":110,"icon":111,"path":112,"stem":113,"children":114,"page":45},"Configuration","i-lucide-settings","\u002Fconfiguration","13.configuration",[115,119,123],{"title":116,"path":117,"stem":118},"Opensya Config","\u002Fconfiguration\u002Fopensya-config","13.configuration\u002F1.opensya-config",{"title":120,"path":121,"stem":122},"Runtime Config","\u002Fconfiguration\u002Fruntime-config","13.configuration\u002F2.runtime-config",{"title":124,"path":125,"stem":126},"Server Config","\u002Fconfiguration\u002Fserver-config","13.configuration\u002F3.server-config",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":45},"Deployment","i-lucide-cloud","\u002Fdeployment","14.deployment",[133,136,140,144],{"title":5,"path":134,"stem":135},"\u002Fdeployment\u002Fintroduction","14.deployment\u002F1.introduction",{"title":137,"path":138,"stem":139},"Docker","\u002Fdeployment\u002Fdocker","14.deployment\u002F2.docker",{"title":141,"path":142,"stem":143},"Production","\u002Fdeployment\u002Fproduction","14.deployment\u002F3.production",{"title":145,"path":146,"stem":147},"Self Hosting","\u002Fdeployment\u002Fself-hosting","14.deployment\u002F4.self-hosting",{"title":149,"icon":150,"path":151,"stem":152,"children":153,"page":45},"Advanced","i-lucide-plus","\u002Fadvanced","15.advanced",[154,158,162,165,169],{"title":155,"path":156,"stem":157},"Internals","\u002Fadvanced\u002Finternals","15.advanced\u002F1.internals",{"title":159,"path":160,"stem":161},"Compiler","\u002Fadvanced\u002Fcompiler","15.advanced\u002F2.compiler",{"title":41,"path":163,"stem":164},"\u002Fadvanced\u002Fmodules","15.advanced\u002F3.modules",{"title":166,"path":167,"stem":168},"Globals","\u002Fadvanced\u002Fglobals","15.advanced\u002F4.globals",{"title":170,"path":171,"stem":172},"Lifecycle","\u002Fadvanced\u002Flifecycle","15.advanced\u002F5.lifecycle",{"id":174,"title":88,"body":175,"description":1280,"extension":1281,"links":1282,"meta":1283,"navigation":1284,"path":89,"seo":1285,"stem":90,"__hash__":1286},"docs\u002F11.nest\u002F6.locales.md",{"type":176,"value":177,"toc":1262},"minimark",[178,182,185,193,200,205,211,253,256,259,263,266,353,356,360,363,366,369,400,403,410,414,417,486,493,503,507,510,529,531,594,597,601,604,624,626,674,677,681,692,699,768,773,949,952,956,959,1020,1024,1027,1051,1098,1102,1105,1108,1206,1209,1240,1245,1249,1252,1255,1258],[179,180,181],"p",{},"Locales define translations used by the OpenSya backend runtime.",[179,183,184],{},"They allow applications and modules to add new translation keys, override existing translations and support additional languages.",[179,186,187,188,192],{},"OpenSya automatically discovers locale files from the ",[189,190,191],"code",{},"server\u002Flocales"," directory and merges them with the native runtime translations.",[194,195,197],"callout",{"color":196,"icon":91},"primary",[179,198,199],{},"Locales make OpenSya applications customizable, multilingual and module-friendly.",[201,202,204],"h2",{"id":203},"filesystem-structure","Filesystem Structure",[179,206,207,208,210],{},"Locale files are placed inside the ",[189,209,191],{}," directory.",[212,213,219],"pre",{"className":214,"code":215,"filename":216,"language":217,"meta":218,"style":218},"language-txt shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","server\u002Flocales\u002F\n├── fr\u002F\n│   └── common.json\n└── en\u002F\n    └── common.json\n","Structure","txt","",[189,220,221,229,235,241,247],{"__ignoreMap":218},[222,223,226],"span",{"class":224,"line":225},"line",1,[222,227,228],{},"server\u002Flocales\u002F\n",[222,230,232],{"class":224,"line":231},2,[222,233,234],{},"├── fr\u002F\n",[222,236,238],{"class":224,"line":237},3,[222,239,240],{},"│   └── common.json\n",[222,242,244],{"class":224,"line":243},4,[222,245,246],{},"└── en\u002F\n",[222,248,250],{"class":224,"line":249},5,[222,251,252],{},"    └── common.json\n",[179,254,255],{},"Each language has its own directory.",[179,257,258],{},"Each JSON file represents a translation namespace.",[201,260,262],{"id":261},"adding-translations","Adding Translations",[179,264,265],{},"You can add new translations by creating a JSON file inside a language directory.",[212,267,272],{"className":268,"code":269,"filename":270,"language":271,"meta":218,"style":218},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"candidate\": {\n    \"created\": \"Candidat créé avec succès\",\n    \"not_found\": \"Candidat introuvable\"\n  }\n}\n","server\u002Flocales\u002Ffr\u002Fcommon.json","json",[189,273,274,280,298,323,342,347],{"__ignoreMap":218},[222,275,276],{"class":224,"line":225},[222,277,279],{"class":278},"sMK4o","{\n",[222,281,282,285,289,292,295],{"class":224,"line":231},[222,283,284],{"class":278},"  \"",[222,286,288],{"class":287},"spNyl","candidate",[222,290,291],{"class":278},"\"",[222,293,294],{"class":278},":",[222,296,297],{"class":278}," {\n",[222,299,300,303,307,309,311,314,318,320],{"class":224,"line":237},[222,301,302],{"class":278},"    \"",[222,304,306],{"class":305},"sBMFI","created",[222,308,291],{"class":278},[222,310,294],{"class":278},[222,312,313],{"class":278}," \"",[222,315,317],{"class":316},"sfazB","Candidat créé avec succès",[222,319,291],{"class":278},[222,321,322],{"class":278},",\n",[222,324,325,327,330,332,334,336,339],{"class":224,"line":243},[222,326,302],{"class":278},[222,328,329],{"class":305},"not_found",[222,331,291],{"class":278},[222,333,294],{"class":278},[222,335,313],{"class":278},[222,337,338],{"class":316},"Candidat introuvable",[222,340,341],{"class":278},"\"\n",[222,343,344],{"class":224,"line":249},[222,345,346],{"class":278},"  }\n",[222,348,350],{"class":224,"line":349},6,[222,351,352],{"class":278},"}\n",[179,354,355],{},"The translations are automatically loaded by the runtime.",[201,357,359],{"id":358},"merging-with-native-translations","Merging With Native Translations",[179,361,362],{},"OpenSya includes native translation files.",[179,364,365],{},"When you create a locale file with the same language and filename as a native locale, OpenSya merges your file with the native one.",[179,367,368],{},"Example:",[212,370,373],{"className":214,"code":371,"filename":372,"language":217,"meta":218,"style":218},"server\u002Flocales\u002Ffr\u002Fcommon.json\n        +\nnative fr\u002Fcommon.json\n        ↓\nmerged fr\u002Fcommon.json\n","Merge Example",[189,374,375,380,385,390,395],{"__ignoreMap":218},[222,376,377],{"class":224,"line":225},[222,378,379],{},"server\u002Flocales\u002Ffr\u002Fcommon.json\n",[222,381,382],{"class":224,"line":231},[222,383,384],{},"        +\n",[222,386,387],{"class":224,"line":237},[222,388,389],{},"native fr\u002Fcommon.json\n",[222,391,392],{"class":224,"line":243},[222,393,394],{},"        ↓\n",[222,396,397],{"class":224,"line":249},[222,398,399],{},"merged fr\u002Fcommon.json\n",[179,401,402],{},"This allows you to add or override specific translation keys without replacing the entire native translation file.",[194,404,407],{"color":405,"icon":406},"info","i-lucide-git-merge",[179,408,409],{},"Local translations are merged with native OpenSya translations when they share the same language and filename.",[201,411,413],{"id":412},"overriding-existing-translations","Overriding Existing Translations",[179,415,416],{},"You can override an existing translation by declaring the same key in your project locale file.",[212,418,420],{"className":268,"code":419,"filename":270,"language":271,"meta":218,"style":218},"{\n  \"session\": {\n    \"errors\": {\n      \"not_authorized\": \"Vous n'êtes pas autorisé à effectuer cette action.\"\n    }\n  }\n}\n",[189,421,422,426,439,452,472,477,481],{"__ignoreMap":218},[222,423,424],{"class":224,"line":225},[222,425,279],{"class":278},[222,427,428,430,433,435,437],{"class":224,"line":231},[222,429,284],{"class":278},[222,431,432],{"class":287},"session",[222,434,291],{"class":278},[222,436,294],{"class":278},[222,438,297],{"class":278},[222,440,441,443,446,448,450],{"class":224,"line":237},[222,442,302],{"class":278},[222,444,445],{"class":305},"errors",[222,447,291],{"class":278},[222,449,294],{"class":278},[222,451,297],{"class":278},[222,453,454,457,461,463,465,467,470],{"class":224,"line":243},[222,455,456],{"class":278},"      \"",[222,458,460],{"class":459},"sbssI","not_authorized",[222,462,291],{"class":278},[222,464,294],{"class":278},[222,466,313],{"class":278},[222,468,469],{"class":316},"Vous n'êtes pas autorisé à effectuer cette action.",[222,471,341],{"class":278},[222,473,474],{"class":224,"line":249},[222,475,476],{"class":278},"    }\n",[222,478,479],{"class":224,"line":349},[222,480,346],{"class":278},[222,482,484],{"class":224,"line":483},7,[222,485,352],{"class":278},[179,487,488,489,492],{},"If the key already exists in the native ",[189,490,491],{},"fr\u002Fcommon.json",", your project value takes precedence.",[194,494,497,500],{"color":495,"icon":496},"warning","i-lucide-triangle-alert",[179,498,499],{},"Be careful when overriding native translation keys.",[179,501,502],{},"Changing native messages can affect runtime errors, guards, services and built-in behaviors.",[201,504,506],{"id":505},"adding-a-new-language","Adding a New Language",[179,508,509],{},"You can add a new language by creating a new language directory.",[212,511,514],{"className":214,"code":512,"filename":513,"language":217,"meta":218,"style":218},"server\u002Flocales\u002F\n└── wo\u002F\n    └── common.json\n","New Language",[189,515,516,520,525],{"__ignoreMap":218},[222,517,518],{"class":224,"line":225},[222,519,228],{},[222,521,522],{"class":224,"line":231},[222,523,524],{},"└── wo\u002F\n",[222,526,527],{"class":224,"line":237},[222,528,252],{},[179,530,368],{},[212,532,535],{"className":268,"code":533,"filename":534,"language":271,"meta":218,"style":218},"{\n  \"session\": {\n    \"errors\": {\n      \"not_authorized\": \"Amoo sañ-sañ ci jëf jii.\"\n    }\n  }\n}\n","server\u002Flocales\u002Fwo\u002Fcommon.json",[189,536,537,541,553,565,582,586,590],{"__ignoreMap":218},[222,538,539],{"class":224,"line":225},[222,540,279],{"class":278},[222,542,543,545,547,549,551],{"class":224,"line":231},[222,544,284],{"class":278},[222,546,432],{"class":287},[222,548,291],{"class":278},[222,550,294],{"class":278},[222,552,297],{"class":278},[222,554,555,557,559,561,563],{"class":224,"line":237},[222,556,302],{"class":278},[222,558,445],{"class":305},[222,560,291],{"class":278},[222,562,294],{"class":278},[222,564,297],{"class":278},[222,566,567,569,571,573,575,577,580],{"class":224,"line":243},[222,568,456],{"class":278},[222,570,460],{"class":459},[222,572,291],{"class":278},[222,574,294],{"class":278},[222,576,313],{"class":278},[222,578,579],{"class":316},"Amoo sañ-sañ ci jëf jii.",[222,581,341],{"class":278},[222,583,584],{"class":224,"line":249},[222,585,476],{"class":278},[222,587,588],{"class":224,"line":349},[222,589,346],{"class":278},[222,591,592],{"class":224,"line":483},[222,593,352],{"class":278},[179,595,596],{},"If the language does not exist natively, OpenSya creates and registers it during runtime initialization.",[201,598,600],{"id":599},"namespaces","Namespaces",[179,602,603],{},"The filename represents the translation namespace.",[212,605,607],{"className":214,"code":606,"filename":600,"language":217,"meta":218,"style":218},"server\u002Flocales\u002Ffr\u002Fcommon.json   → common\nserver\u002Flocales\u002Ffr\u002Fsession.json  → session\nserver\u002Flocales\u002Ffr\u002Ferrors.json   → errors\n",[189,608,609,614,619],{"__ignoreMap":218},[222,610,611],{"class":224,"line":225},[222,612,613],{},"server\u002Flocales\u002Ffr\u002Fcommon.json   → common\n",[222,615,616],{"class":224,"line":231},[222,617,618],{},"server\u002Flocales\u002Ffr\u002Fsession.json  → session\n",[222,620,621],{"class":224,"line":237},[222,622,623],{},"server\u002Flocales\u002Ffr\u002Ferrors.json   → errors\n",[179,625,368],{},[212,627,630],{"className":268,"code":628,"filename":629,"language":271,"meta":218,"style":218},"{\n  \"errors\": {\n    \"expired\": \"Votre session a expiré.\"\n  }\n}\n","server\u002Flocales\u002Ffr\u002Fsession.json",[189,631,632,636,648,666,670],{"__ignoreMap":218},[222,633,634],{"class":224,"line":225},[222,635,279],{"class":278},[222,637,638,640,642,644,646],{"class":224,"line":231},[222,639,284],{"class":278},[222,641,445],{"class":287},[222,643,291],{"class":278},[222,645,294],{"class":278},[222,647,297],{"class":278},[222,649,650,652,655,657,659,661,664],{"class":224,"line":237},[222,651,302],{"class":278},[222,653,654],{"class":305},"expired",[222,656,291],{"class":278},[222,658,294],{"class":278},[222,660,313],{"class":278},[222,662,663],{"class":316},"Votre session a expiré.",[222,665,341],{"class":278},[222,667,668],{"class":224,"line":243},[222,669,346],{"class":278},[222,671,672],{"class":224,"line":249},[222,673,352],{"class":278},[179,675,676],{},"The namespace helps organize translations by domain.",[201,678,680],{"id":679},"using-translations","Using Translations",[179,682,683,684,687,688,691],{},"Translations can be accessed using ",[189,685,686],{},"useTranslate()"," or ",[189,689,690],{},"$t",".",[693,694,696,697],"h3",{"id":695},"using-usetranslate","Using ",[189,698,686],{},[212,700,705],{"className":701,"code":702,"filename":703,"language":704,"meta":218,"style":218},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const t = useTranslate();\n\nthrow new Error(t('session.errors.not_authorized'));\n","server\u002Fservices\u002Fsession\u002Fvalidate.ts","ts",[189,706,707,729,735],{"__ignoreMap":218},[222,708,709,712,716,719,723,726],{"class":224,"line":225},[222,710,711],{"class":287},"const",[222,713,715],{"class":714},"sTEyZ"," t ",[222,717,718],{"class":278},"=",[222,720,722],{"class":721},"s2Zo4"," useTranslate",[222,724,725],{"class":714},"()",[222,727,728],{"class":278},";\n",[222,730,731],{"class":224,"line":231},[222,732,734],{"emptyLinePlaceholder":733},true,"\n",[222,736,737,741,744,747,750,753,755,758,761,763,766],{"class":224,"line":237},[222,738,740],{"class":739},"s7zQu","throw",[222,742,743],{"class":278}," new",[222,745,746],{"class":721}," Error",[222,748,749],{"class":714},"(",[222,751,752],{"class":721},"t",[222,754,749],{"class":714},[222,756,757],{"class":278},"'",[222,759,760],{"class":316},"session.errors.not_authorized",[222,762,757],{"class":278},[222,764,765],{"class":714},"))",[222,767,728],{"class":278},[693,769,696,771],{"id":770},"using-t",[189,772,690],{},[212,774,777],{"className":701,"code":775,"filename":776,"language":704,"meta":218,"style":218},"export default defineGuard(({ controllerOptions, request }) => {\n  if (!controllerOptions.roles) return;\n\n  if (!controllerOptions.roles.includes(request._user?.role)) {\n    return {\n      pass: false,\n      errorMessage: $t('session.errors.not_authorized'),\n    };\n  }\n});\n","server\u002Fguards\u002Froles.ts",[189,778,779,813,841,845,885,892,905,928,934,939],{"__ignoreMap":218},[222,780,781,784,787,790,792,795,799,802,805,808,811],{"class":224,"line":225},[222,782,783],{"class":739},"export",[222,785,786],{"class":739}," default",[222,788,789],{"class":721}," defineGuard",[222,791,749],{"class":714},[222,793,794],{"class":278},"({",[222,796,798],{"class":797},"sHdIc"," controllerOptions",[222,800,801],{"class":278},",",[222,803,804],{"class":797}," request",[222,806,807],{"class":278}," })",[222,809,810],{"class":287}," =>",[222,812,297],{"class":278},[222,814,815,818,822,825,828,830,833,836,839],{"class":224,"line":231},[222,816,817],{"class":739},"  if",[222,819,821],{"class":820},"swJcz"," (",[222,823,824],{"class":278},"!",[222,826,827],{"class":714},"controllerOptions",[222,829,691],{"class":278},[222,831,832],{"class":714},"roles",[222,834,835],{"class":820},") ",[222,837,838],{"class":739},"return",[222,840,728],{"class":278},[222,842,843],{"class":224,"line":237},[222,844,734],{"emptyLinePlaceholder":733},[222,846,847,849,851,853,855,857,859,861,864,866,869,871,874,877,880,883],{"class":224,"line":243},[222,848,817],{"class":739},[222,850,821],{"class":820},[222,852,824],{"class":278},[222,854,827],{"class":714},[222,856,691],{"class":278},[222,858,832],{"class":714},[222,860,691],{"class":278},[222,862,863],{"class":721},"includes",[222,865,749],{"class":820},[222,867,868],{"class":714},"request",[222,870,691],{"class":278},[222,872,873],{"class":714},"_user",[222,875,876],{"class":278},"?.",[222,878,879],{"class":714},"role",[222,881,882],{"class":820},")) ",[222,884,279],{"class":278},[222,886,887,890],{"class":224,"line":249},[222,888,889],{"class":739},"    return",[222,891,297],{"class":278},[222,893,894,897,899,903],{"class":224,"line":349},[222,895,896],{"class":820},"      pass",[222,898,294],{"class":278},[222,900,902],{"class":901},"sfNiH"," false",[222,904,322],{"class":278},[222,906,907,910,912,915,917,919,921,923,926],{"class":224,"line":483},[222,908,909],{"class":820},"      errorMessage",[222,911,294],{"class":278},[222,913,914],{"class":721}," $t",[222,916,749],{"class":820},[222,918,757],{"class":278},[222,920,760],{"class":316},[222,922,757],{"class":278},[222,924,925],{"class":820},")",[222,927,322],{"class":278},[222,929,931],{"class":224,"line":930},8,[222,932,933],{"class":278},"    };\n",[222,935,937],{"class":224,"line":936},9,[222,938,346],{"class":278},[222,940,942,945,947],{"class":224,"line":941},10,[222,943,944],{"class":278},"}",[222,946,925],{"class":714},[222,948,728],{"class":278},[179,950,951],{},"Both helpers resolve translations from the runtime i18n registry.",[201,953,955],{"id":954},"common-use-cases","Common Use Cases",[179,957,958],{},"Locales are useful for:",[960,961,962,976],"table",{},[963,964,965],"thead",{},[966,967,968,973],"tr",{},[969,970,972],"th",{"align":971},"left","Use Case",[969,974,975],{"align":971},"Description",[977,978,979,990,1000,1010],"tbody",{},[966,980,981,987],{},[982,983,984],"td",{},[189,985,986],{},"Runtime errors",[982,988,989],{},"Translate errors returned by guards, services or controllers.",[966,991,992,997],{},[982,993,994],{},[189,995,996],{},"Validation messages",[982,998,999],{},"Provide localized validation feedback.",[966,1001,1002,1007],{},[982,1003,1004],{},[189,1005,1006],{},"Module translations",[982,1008,1009],{},"Allow modules to expose their own translations.",[966,1011,1012,1017],{},[982,1013,1014],{},[189,1015,1016],{},"Native overrides",[982,1018,1019],{},"Customize built-in OpenSya messages.",[201,1021,1023],{"id":1022},"runtime-discovery","Runtime Discovery",[179,1025,1026],{},"During startup, OpenSya automatically:",[1028,1029,1030,1034,1037,1040,1043],"ol",{},[1031,1032,1033],"li",{},"Discovers locale directories",[1031,1035,1036],{},"Loads JSON translation files",[1031,1038,1039],{},"Merges project locales with native locales",[1031,1041,1042],{},"Registers new languages",[1031,1044,1045,1046,1048,1049],{},"Makes translations available through ",[189,1047,686],{}," and ",[189,1050,690],{},[212,1052,1055],{"className":214,"code":1053,"filename":1054,"language":217,"meta":218,"style":218},"Filesystem Discovery\n        ↓\nLocale Loading\n        ↓\nNative Locale Merge\n        ↓\nLanguage Registration\n        ↓\nRuntime Translation\n","Runtime Lifecycle",[189,1056,1057,1062,1066,1071,1075,1080,1084,1089,1093],{"__ignoreMap":218},[222,1058,1059],{"class":224,"line":225},[222,1060,1061],{},"Filesystem Discovery\n",[222,1063,1064],{"class":224,"line":231},[222,1065,394],{},[222,1067,1068],{"class":224,"line":237},[222,1069,1070],{},"Locale Loading\n",[222,1072,1073],{"class":224,"line":243},[222,1074,394],{},[222,1076,1077],{"class":224,"line":249},[222,1078,1079],{},"Native Locale Merge\n",[222,1081,1082],{"class":224,"line":349},[222,1083,394],{},[222,1085,1086],{"class":224,"line":483},[222,1087,1088],{},"Language Registration\n",[222,1090,1091],{"class":224,"line":930},[222,1092,394],{},[222,1094,1095],{"class":224,"line":936},[222,1096,1097],{},"Runtime Translation\n",[201,1099,1101],{"id":1100},"best-practices","Best Practices",[179,1103,1104],{},"Use clear and stable translation keys.",[179,1106,1107],{},"Prefer domain-based namespaces and nested keys.",[212,1109,1112],{"className":268,"code":1110,"filename":1111,"language":271,"meta":218,"style":218},"{\n  \"candidate\": {\n    \"errors\": {\n      \"not_found\": \"Candidate not found\"\n    },\n    \"messages\": {\n      \"created\": \"Candidate created successfully\"\n    }\n  }\n}\n","Recommended",[189,1113,1114,1118,1130,1142,1159,1164,1177,1194,1198,1202],{"__ignoreMap":218},[222,1115,1116],{"class":224,"line":225},[222,1117,279],{"class":278},[222,1119,1120,1122,1124,1126,1128],{"class":224,"line":231},[222,1121,284],{"class":278},[222,1123,288],{"class":287},[222,1125,291],{"class":278},[222,1127,294],{"class":278},[222,1129,297],{"class":278},[222,1131,1132,1134,1136,1138,1140],{"class":224,"line":237},[222,1133,302],{"class":278},[222,1135,445],{"class":305},[222,1137,291],{"class":278},[222,1139,294],{"class":278},[222,1141,297],{"class":278},[222,1143,1144,1146,1148,1150,1152,1154,1157],{"class":224,"line":243},[222,1145,456],{"class":278},[222,1147,329],{"class":459},[222,1149,291],{"class":278},[222,1151,294],{"class":278},[222,1153,313],{"class":278},[222,1155,1156],{"class":316},"Candidate not found",[222,1158,341],{"class":278},[222,1160,1161],{"class":224,"line":249},[222,1162,1163],{"class":278},"    },\n",[222,1165,1166,1168,1171,1173,1175],{"class":224,"line":349},[222,1167,302],{"class":278},[222,1169,1170],{"class":305},"messages",[222,1172,291],{"class":278},[222,1174,294],{"class":278},[222,1176,297],{"class":278},[222,1178,1179,1181,1183,1185,1187,1189,1192],{"class":224,"line":483},[222,1180,456],{"class":278},[222,1182,306],{"class":459},[222,1184,291],{"class":278},[222,1186,294],{"class":278},[222,1188,313],{"class":278},[222,1190,1191],{"class":316},"Candidate created successfully",[222,1193,341],{"class":278},[222,1195,1196],{"class":224,"line":930},[222,1197,476],{"class":278},[222,1199,1200],{"class":224,"line":936},[222,1201,346],{"class":278},[222,1203,1204],{"class":224,"line":941},[222,1205,352],{"class":278},[179,1207,1208],{},"Avoid using long sentences as translation keys.",[212,1210,1213],{"className":268,"code":1211,"filename":1212,"language":271,"meta":218,"style":218},"{\n  \"Candidate was not found in the database\": \"Candidate was not found in the database\"\n}\n","Not Recommended",[189,1214,1215,1219,1236],{"__ignoreMap":218},[222,1216,1217],{"class":224,"line":225},[222,1218,279],{"class":278},[222,1220,1221,1223,1226,1228,1230,1232,1234],{"class":224,"line":231},[222,1222,284],{"class":278},[222,1224,1225],{"class":287},"Candidate was not found in the database",[222,1227,291],{"class":278},[222,1229,294],{"class":278},[222,1231,313],{"class":278},[222,1233,1225],{"class":316},[222,1235,341],{"class":278},[222,1237,1238],{"class":224,"line":237},[222,1239,352],{"class":278},[194,1241,1242],{"color":405,"icon":29},[179,1243,1244],{},"Keep translations organized by language, namespace and domain.",[201,1246,1248],{"id":1247},"philosophy","Philosophy",[179,1250,1251],{},"Locales are part of the OpenSya runtime customization layer.",[179,1253,1254],{},"They allow recruitment and business platforms to adapt messages, errors and module text without modifying native runtime code.",[179,1256,1257],{},"This keeps applications customizable while preserving a clean and modular architecture.",[1259,1260,1261],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":218,"searchDepth":225,"depth":231,"links":1263},[1264,1265,1266,1267,1268,1269,1270,1276,1277,1278,1279],{"id":203,"depth":231,"text":204},{"id":261,"depth":231,"text":262},{"id":358,"depth":231,"text":359},{"id":412,"depth":231,"text":413},{"id":505,"depth":231,"text":506},{"id":599,"depth":231,"text":600},{"id":679,"depth":231,"text":680,"children":1271},[1272,1274],{"id":695,"depth":237,"text":1273},"Using useTranslate()",{"id":770,"depth":237,"text":1275},"Using $t",{"id":954,"depth":231,"text":955},{"id":1022,"depth":231,"text":1023},{"id":1100,"depth":231,"text":1101},{"id":1247,"depth":231,"text":1248},"Learn how to add, override and use translations in the OpenSya Nest runtime.","md",null,{},{"icon":91},{"title":88,"description":1280},"rJqOzA5l-qzPmVpB7yUxtrSmhZWO9frnijD-lhX-d3I",[1288,1290],{"title":83,"path":84,"stem":85,"description":1289,"icon":86,"children":-1},"Learn how to define reusable business logic with the OpenSya Nest runtime.",{"title":93,"path":94,"stem":95,"description":218,"children":-1},1779143767266]