mindroot 9.11.0__py3-none-any.whl → 9.12.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mindroot might be problematic. Click here for more details.

Files changed (415) hide show
  1. mindroot/coreplugins/home/templates/home.jinja2 +1 -0
  2. mindroot/docs/Makefile +20 -0
  3. mindroot/docs/_build/doctrees/chat_with_assistant.doctree +0 -0
  4. mindroot/docs/_build/doctrees/developer_documentation.doctree +0 -0
  5. mindroot/docs/_build/doctrees/environment.pickle +0 -0
  6. mindroot/docs/_build/doctrees/getting_started.doctree +0 -0
  7. mindroot/docs/_build/doctrees/index.doctree +0 -0
  8. mindroot/docs/_build/doctrees/install_plugins_with_tools.doctree +0 -0
  9. mindroot/docs/_build/doctrees/installation.doctree +0 -0
  10. mindroot/docs/_build/doctrees/llm_api_key.doctree +0 -0
  11. mindroot/docs/_build/doctrees/llm_plugin_installation.doctree +0 -0
  12. mindroot/docs/_build/doctrees/programming_task.doctree +0 -0
  13. mindroot/docs/_build/doctrees/source/ahp.doctree +0 -0
  14. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.admin.doctree +0 -0
  15. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.api_keys.doctree +0 -0
  16. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat.doctree +0 -0
  17. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.chat_avatar.doctree +0 -0
  18. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.check_list.doctree +0 -0
  19. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.credits.doctree +0 -0
  20. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.doctree +0 -0
  21. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.email.doctree +0 -0
  22. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.env_manager.doctree +0 -0
  23. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.events.doctree +0 -0
  24. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.doctree +0 -0
  25. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.index.handlers.doctree +0 -0
  26. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.jwt_auth.doctree +0 -0
  27. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.l8n.doctree +0 -0
  28. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.mcp_.doctree +0 -0
  29. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.persona.doctree +0 -0
  30. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.startup.doctree +0 -0
  31. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.subscriptions.doctree +0 -0
  32. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.usage.doctree +0 -0
  33. mindroot/docs/_build/doctrees/source/mindroot.coreplugins.user_service.doctree +0 -0
  34. mindroot/docs/_build/doctrees/source/mindroot.doctree +0 -0
  35. mindroot/docs/_build/doctrees/source/mindroot.lib.auth.doctree +0 -0
  36. mindroot/docs/_build/doctrees/source/mindroot.lib.doctree +0 -0
  37. mindroot/docs/_build/doctrees/source/mindroot.lib.json_str_block.doctree +0 -0
  38. mindroot/docs/_build/doctrees/source/mindroot.lib.plugins.doctree +0 -0
  39. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.backup.doctree +0 -0
  40. mindroot/docs/_build/doctrees/source/mindroot.lib.providers.doctree +0 -0
  41. mindroot/docs/_build/doctrees/source/mindroot.registry.doctree +0 -0
  42. mindroot/docs/_build/doctrees/source/modules.doctree +0 -0
  43. mindroot/docs/_build/doctrees/source/mr_agent_expert_instr.doctree +0 -0
  44. mindroot/docs/_build/doctrees/starting_mindroot.doctree +0 -0
  45. mindroot/docs/_build/doctrees/user_documentation.doctree +0 -0
  46. mindroot/docs/_build/html/.buildinfo +4 -0
  47. mindroot/docs/_build/html/.buildinfo.bak +4 -0
  48. mindroot/docs/_build/html/_images/envvar.png +0 -0
  49. mindroot/docs/_build/html/_images/files.png +0 -0
  50. mindroot/docs/_build/html/_images/installopenrouter.png +0 -0
  51. mindroot/docs/_build/html/_images/mood.png +0 -0
  52. mindroot/docs/_build/html/_images/moon.png +0 -0
  53. mindroot/docs/_build/html/_images/openrouter.png +0 -0
  54. mindroot/docs/_build/html/_images/restart.png +0 -0
  55. mindroot/docs/_build/html/_modules/index.html +425 -0
  56. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_importer.html +292 -0
  57. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/agent_router.html +620 -0
  58. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/asset_manager.html +289 -0
  59. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/command_router.html +518 -0
  60. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_catalog_routes.html +275 -0
  61. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_publish_routes.html +581 -0
  62. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_registry_routes.html +623 -0
  63. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mcp_routes.html +347 -0
  64. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/mod.html +163 -0
  65. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/oauth_callback_router.html +188 -0
  66. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_handler.html +195 -0
  67. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/persona_router.html +428 -0
  68. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_manager.html +610 -0
  69. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_router.html +146 -0
  70. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/plugin_routes.html +230 -0
  71. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/registry_settings_routes.html +253 -0
  72. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/router.html +267 -0
  73. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/server_router.html +271 -0
  74. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/service_models.html +195 -0
  75. mindroot/docs/_build/html/_modules/mindroot/coreplugins/admin/settings_router.html +403 -0
  76. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/api_key_manager.html +215 -0
  77. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/mod.html +127 -0
  78. mindroot/docs/_build/html/_modules/mindroot/coreplugins/api_keys/router.html +170 -0
  79. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/commands.html +565 -0
  80. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/mod.html +118 -0
  81. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/models.html +130 -0
  82. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/router.html +571 -0
  83. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/services.html +645 -0
  84. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_manager.html +258 -0
  85. mindroot/docs/_build/html/_modules/mindroot/coreplugins/chat/widget_routes.html +409 -0
  86. mindroot/docs/_build/html/_modules/mindroot/coreplugins/check_list/mod.html +460 -0
  87. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/conversion.html +232 -0
  88. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/ledger.html +283 -0
  89. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/mod.html +355 -0
  90. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/models.html +269 -0
  91. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/router.html +306 -0
  92. mindroot/docs/_build/html/_modules/mindroot/coreplugins/credits/storage.html +257 -0
  93. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/email_provider.html +159 -0
  94. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/imap_handler.html +343 -0
  95. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/mod.html +210 -0
  96. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/services.html +172 -0
  97. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/smtp_handler.html +188 -0
  98. mindroot/docs/_build/html/_modules/mindroot/coreplugins/email/test_email_service.html +179 -0
  99. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/mod.html +409 -0
  100. mindroot/docs/_build/html/_modules/mindroot/coreplugins/env_manager/router.html +147 -0
  101. mindroot/docs/_build/html/_modules/mindroot/coreplugins/events/router.html +201 -0
  102. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/agent_ops.html +195 -0
  103. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/index_ops.html +214 -0
  104. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/plugin_ops.html +263 -0
  105. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/handlers/publish.html +225 -0
  106. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/mod.html +120 -0
  107. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/models.html +148 -0
  108. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/router.html +184 -0
  109. mindroot/docs/_build/html/_modules/mindroot/coreplugins/index/utils.html +166 -0
  110. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/middleware.html +400 -0
  111. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/mod.html +153 -0
  112. mindroot/docs/_build/html/_modules/mindroot/coreplugins/jwt_auth/router.html +134 -0
  113. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/language_detection.html +296 -0
  114. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/middleware.html +258 -0
  115. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/mod.html +393 -0
  116. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_enhanced.html +408 -0
  117. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_l8n_standalone.html +379 -0
  118. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/test_middleware.html +394 -0
  119. mindroot/docs/_build/html/_modules/mindroot/coreplugins/l8n/utils.html +348 -0
  120. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_commands.html +456 -0
  121. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/catalog_manager.html +409 -0
  122. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/dynamic_commands.html +267 -0
  123. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mcp_manager.html +1186 -0
  124. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/mod.html +510 -0
  125. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/oauth_storage.html +260 -0
  126. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/server_installer.html +195 -0
  127. mindroot/docs/_build/html/_modules/mindroot/coreplugins/mcp_/testmcpclient.html +217 -0
  128. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/init_persona.html +117 -0
  129. mindroot/docs/_build/html/_modules/mindroot/coreplugins/persona/mod.html +276 -0
  130. mindroot/docs/_build/html/_modules/mindroot/coreplugins/startup/mod.html +122 -0
  131. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/credit_integration.html +163 -0
  132. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/mod.html +1089 -0
  133. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/models.html +261 -0
  134. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/router.html +502 -0
  135. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/storage.html +413 -0
  136. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/stripe_integration.html +178 -0
  137. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/subscription_manager.html +289 -0
  138. mindroot/docs/_build/html/_modules/mindroot/coreplugins/subscriptions/webhook_handler.html +327 -0
  139. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/handlers.html +157 -0
  140. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/mod.html +253 -0
  141. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/models.html +141 -0
  142. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/reporting.html +226 -0
  143. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/router.html +228 -0
  144. mindroot/docs/_build/html/_modules/mindroot/coreplugins/usage/storage.html +264 -0
  145. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/admin_init.html +234 -0
  146. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/email_service.html +204 -0
  147. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/mod.html +260 -0
  148. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/models.html +148 -0
  149. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/password_reset_service.html +336 -0
  150. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/role_service.html +183 -0
  151. mindroot/docs/_build/html/_modules/mindroot/coreplugins/user_service/router.html +202 -0
  152. mindroot/docs/_build/html/_modules/mindroot/lib/auth/api_key.html +129 -0
  153. mindroot/docs/_build/html/_modules/mindroot/lib/auth/auth.html +203 -0
  154. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog.html +259 -0
  155. mindroot/docs/_build/html/_modules/mindroot/lib/buchatlog2.html +500 -0
  156. mindroot/docs/_build/html/_modules/mindroot/lib/butemplates.html +415 -0
  157. mindroot/docs/_build/html/_modules/mindroot/lib/chatcontext.html +401 -0
  158. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog.html +619 -0
  159. mindroot/docs/_build/html/_modules/mindroot/lib/chatlog_optimized.html +655 -0
  160. mindroot/docs/_build/html/_modules/mindroot/lib/json_escape.html +138 -0
  161. mindroot/docs/_build/html/_modules/mindroot/lib/json_str_block/json_str_block.html +213 -0
  162. mindroot/docs/_build/html/_modules/mindroot/lib/parent_templates.html +181 -0
  163. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/installation.html +481 -0
  164. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/l8n_static_handler.html +347 -0
  165. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader.html +403 -0
  166. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/loader_with_l8n.html +391 -0
  167. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/manifest.html +450 -0
  168. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/mapping.html +127 -0
  169. mindroot/docs/_build/html/_modules/mindroot/lib/plugins/paths.html +215 -0
  170. mindroot/docs/_build/html/_modules/mindroot/lib/plugins_install.html +171 -0
  171. mindroot/docs/_build/html/_modules/mindroot/lib/providers/commands.html +125 -0
  172. mindroot/docs/_build/html/_modules/mindroot/lib/providers/hooks.html +117 -0
  173. mindroot/docs/_build/html/_modules/mindroot/lib/providers/missing.html +169 -0
  174. mindroot/docs/_build/html/_modules/mindroot/lib/providers/model_preferences_v2.html +291 -0
  175. mindroot/docs/_build/html/_modules/mindroot/lib/providers/services.html +122 -0
  176. mindroot/docs/_build/html/_modules/mindroot/lib/providers.html +465 -0
  177. mindroot/docs/_build/html/_modules/mindroot/lib/route_decorators.html +175 -0
  178. mindroot/docs/_build/html/_modules/mindroot/lib/session_files.html +142 -0
  179. mindroot/docs/_build/html/_modules/mindroot/lib/streamcmd.html +246 -0
  180. mindroot/docs/_build/html/_modules/mindroot/lib/templates.html +677 -0
  181. mindroot/docs/_build/html/_modules/mindroot/lib/token_counter.html +326 -0
  182. mindroot/docs/_build/html/_modules/mindroot/migrate.html +153 -0
  183. mindroot/docs/_build/html/_modules/mindroot/registry/component_manager.html +140 -0
  184. mindroot/docs/_build/html/_modules/mindroot/registry/data_access.html +302 -0
  185. mindroot/docs/_build/html/_modules/mindroot/server.html +317 -0
  186. mindroot/docs/_build/html/_modules/mindroot/server_missing_normal_args.html +322 -0
  187. mindroot/docs/_build/html/_modules/mindroot/server_prev.html +298 -0
  188. mindroot/docs/_build/html/_sources/chat_with_assistant.rst.txt +14 -0
  189. mindroot/docs/_build/html/_sources/developer_documentation.rst.txt +26 -0
  190. mindroot/docs/_build/html/_sources/getting_started.rst.txt +139 -0
  191. mindroot/docs/_build/html/_sources/index.rst.txt +38 -0
  192. mindroot/docs/_build/html/_sources/install_plugins_with_tools.rst.txt +25 -0
  193. mindroot/docs/_build/html/_sources/installation.rst.txt +21 -0
  194. mindroot/docs/_build/html/_sources/llm_api_key.rst.txt +22 -0
  195. mindroot/docs/_build/html/_sources/llm_plugin_installation.rst.txt +27 -0
  196. mindroot/docs/_build/html/_sources/programming_task.rst.txt +10 -0
  197. mindroot/docs/_build/html/_sources/source/ahp.rst.txt +7 -0
  198. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.admin.rst.txt +189 -0
  199. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.api_keys.rst.txt +45 -0
  200. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat.rst.txt +93 -0
  201. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.chat_avatar.rst.txt +10 -0
  202. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.check_list.rst.txt +21 -0
  203. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.credits.rst.txt +61 -0
  204. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.email.rst.txt +77 -0
  205. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.env_manager.rst.txt +29 -0
  206. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.events.rst.txt +29 -0
  207. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.handlers.rst.txt +45 -0
  208. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.index.rst.txt +53 -0
  209. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.jwt_auth.rst.txt +45 -0
  210. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.l8n.rst.txt +109 -0
  211. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.mcp_.rst.txt +93 -0
  212. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.persona.rst.txt +29 -0
  213. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.rst.txt +35 -0
  214. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.startup.rst.txt +21 -0
  215. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.subscriptions.rst.txt +85 -0
  216. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.usage.rst.txt +61 -0
  217. mindroot/docs/_build/html/_sources/source/mindroot.coreplugins.user_service.rst.txt +69 -0
  218. mindroot/docs/_build/html/_sources/source/mindroot.lib.auth.rst.txt +29 -0
  219. mindroot/docs/_build/html/_sources/source/mindroot.lib.json_str_block.rst.txt +21 -0
  220. mindroot/docs/_build/html/_sources/source/mindroot.lib.plugins.rst.txt +69 -0
  221. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.backup.rst.txt +10 -0
  222. mindroot/docs/_build/html/_sources/source/mindroot.lib.providers.rst.txt +61 -0
  223. mindroot/docs/_build/html/_sources/source/mindroot.lib.rst.txt +152 -0
  224. mindroot/docs/_build/html/_sources/source/mindroot.registry.rst.txt +29 -0
  225. mindroot/docs/_build/html/_sources/source/mindroot.rst.txt +54 -0
  226. mindroot/docs/_build/html/_sources/source/modules.rst.txt +7 -0
  227. mindroot/docs/_build/html/_sources/source/mr_agent_expert_instr.rst.txt +7 -0
  228. mindroot/docs/_build/html/_sources/starting_mindroot.rst.txt +12 -0
  229. mindroot/docs/_build/html/_sources/user_documentation.rst.txt +16 -0
  230. mindroot/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  231. mindroot/docs/_build/html/_static/basic.css +906 -0
  232. mindroot/docs/_build/html/_static/css/badge_only.css +1 -0
  233. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  234. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  235. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  236. mindroot/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  237. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  238. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  239. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  240. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  241. mindroot/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  242. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  243. mindroot/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  244. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  245. mindroot/docs/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  246. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  247. mindroot/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  248. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  249. mindroot/docs/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  250. mindroot/docs/_build/html/_static/css/theme.css +4 -0
  251. mindroot/docs/_build/html/_static/custom.css +19 -0
  252. mindroot/docs/_build/html/_static/debug.css +69 -0
  253. mindroot/docs/_build/html/_static/doctools.js +149 -0
  254. mindroot/docs/_build/html/_static/documentation_options.js +13 -0
  255. mindroot/docs/_build/html/_static/file.png +0 -0
  256. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  257. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  258. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  259. mindroot/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  260. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  261. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  262. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  263. mindroot/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  264. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  265. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  266. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  267. mindroot/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  268. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  269. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  270. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  271. mindroot/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  272. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  273. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  274. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  275. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  276. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  277. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  278. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  279. mindroot/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  280. mindroot/docs/_build/html/_static/jquery.js +2 -0
  281. mindroot/docs/_build/html/_static/js/badge_only.js +1 -0
  282. mindroot/docs/_build/html/_static/js/theme.js +1 -0
  283. mindroot/docs/_build/html/_static/js/versions.js +228 -0
  284. mindroot/docs/_build/html/_static/language_data.js +192 -0
  285. mindroot/docs/_build/html/_static/minus.png +0 -0
  286. mindroot/docs/_build/html/_static/plus.png +0 -0
  287. mindroot/docs/_build/html/_static/pygments.css +232 -0
  288. mindroot/docs/_build/html/_static/scripts/furo-extensions.js +0 -0
  289. mindroot/docs/_build/html/_static/scripts/furo.js +3 -0
  290. mindroot/docs/_build/html/_static/scripts/furo.js.LICENSE.txt +7 -0
  291. mindroot/docs/_build/html/_static/scripts/furo.js.map +1 -0
  292. mindroot/docs/_build/html/_static/searchtools.js +635 -0
  293. mindroot/docs/_build/html/_static/skeleton.css +296 -0
  294. mindroot/docs/_build/html/_static/sphinx_highlight.js +154 -0
  295. mindroot/docs/_build/html/_static/styles/furo-extensions.css +2 -0
  296. mindroot/docs/_build/html/_static/styles/furo-extensions.css.map +1 -0
  297. mindroot/docs/_build/html/_static/styles/furo.css +2 -0
  298. mindroot/docs/_build/html/_static/styles/furo.css.map +1 -0
  299. mindroot/docs/_build/html/chat_with_assistant.html +329 -0
  300. mindroot/docs/_build/html/developer_documentation.html +338 -0
  301. mindroot/docs/_build/html/genindex.html +4690 -0
  302. mindroot/docs/_build/html/getting_started.html +423 -0
  303. mindroot/docs/_build/html/index.html +357 -0
  304. mindroot/docs/_build/html/install_plugins_with_tools.html +336 -0
  305. mindroot/docs/_build/html/installation.html +330 -0
  306. mindroot/docs/_build/html/llm_api_key.html +337 -0
  307. mindroot/docs/_build/html/llm_plugin_installation.html +338 -0
  308. mindroot/docs/_build/html/objects.inv +0 -0
  309. mindroot/docs/_build/html/programming_task.html +326 -0
  310. mindroot/docs/_build/html/py-modindex.html +1307 -0
  311. mindroot/docs/_build/html/search.html +307 -0
  312. mindroot/docs/_build/html/searchindex.js +1 -0
  313. mindroot/docs/_build/html/source/ahp.html +302 -0
  314. mindroot/docs/_build/html/source/mindroot.coreplugins.admin.html +2212 -0
  315. mindroot/docs/_build/html/source/mindroot.coreplugins.api_keys.html +532 -0
  316. mindroot/docs/_build/html/source/mindroot.coreplugins.chat.html +1185 -0
  317. mindroot/docs/_build/html/source/mindroot.coreplugins.chat_avatar.html +311 -0
  318. mindroot/docs/_build/html/source/mindroot.coreplugins.check_list.html +441 -0
  319. mindroot/docs/_build/html/source/mindroot.coreplugins.credits.html +879 -0
  320. mindroot/docs/_build/html/source/mindroot.coreplugins.email.html +554 -0
  321. mindroot/docs/_build/html/source/mindroot.coreplugins.env_manager.html +447 -0
  322. mindroot/docs/_build/html/source/mindroot.coreplugins.events.html +338 -0
  323. mindroot/docs/_build/html/source/mindroot.coreplugins.html +1785 -0
  324. mindroot/docs/_build/html/source/mindroot.coreplugins.index.handlers.html +481 -0
  325. mindroot/docs/_build/html/source/mindroot.coreplugins.index.html +696 -0
  326. mindroot/docs/_build/html/source/mindroot.coreplugins.jwt_auth.html +432 -0
  327. mindroot/docs/_build/html/source/mindroot.coreplugins.l8n.html +933 -0
  328. mindroot/docs/_build/html/source/mindroot.coreplugins.mcp_.html +1271 -0
  329. mindroot/docs/_build/html/source/mindroot.coreplugins.persona.html +386 -0
  330. mindroot/docs/_build/html/source/mindroot.coreplugins.startup.html +327 -0
  331. mindroot/docs/_build/html/source/mindroot.coreplugins.subscriptions.html +1631 -0
  332. mindroot/docs/_build/html/source/mindroot.coreplugins.usage.html +677 -0
  333. mindroot/docs/_build/html/source/mindroot.coreplugins.user_service.html +681 -0
  334. mindroot/docs/_build/html/source/mindroot.html +811 -0
  335. mindroot/docs/_build/html/source/mindroot.lib.auth.html +407 -0
  336. mindroot/docs/_build/html/source/mindroot.lib.html +2027 -0
  337. mindroot/docs/_build/html/source/mindroot.lib.json_str_block.html +344 -0
  338. mindroot/docs/_build/html/source/mindroot.lib.plugins.html +1050 -0
  339. mindroot/docs/_build/html/source/mindroot.lib.providers.backup.html +324 -0
  340. mindroot/docs/_build/html/source/mindroot.lib.providers.html +572 -0
  341. mindroot/docs/_build/html/source/mindroot.registry.html +501 -0
  342. mindroot/docs/_build/html/source/modules.html +377 -0
  343. mindroot/docs/_build/html/source/mr_agent_expert_instr.html +302 -0
  344. mindroot/docs/_build/html/starting_mindroot.html +325 -0
  345. mindroot/docs/_build/html/user_documentation.html +333 -0
  346. mindroot/docs/_static/custom.css +19 -0
  347. mindroot/docs/chat_with_assistant.rst +14 -0
  348. mindroot/docs/conf.py +54 -0
  349. mindroot/docs/data/agents/local/Assistant/agent.json +27 -0
  350. mindroot/docs/data/agents/local/SysAdmin/agent.json +33 -0
  351. mindroot/docs/data/equivalent_flags.json +1 -0
  352. mindroot/docs/data/mcp/servers.json +9 -0
  353. mindroot/docs/data/models.json +57 -0
  354. mindroot/docs/data/plugin_manifest.json +95 -0
  355. mindroot/docs/data/preferred_models.json +12 -0
  356. mindroot/docs/data/providers.json +62 -0
  357. mindroot/docs/developer_documentation.rst +26 -0
  358. mindroot/docs/envvar.png +0 -0
  359. mindroot/docs/files.png +0 -0
  360. mindroot/docs/getting_started.rst +139 -0
  361. mindroot/docs/index.rst +38 -0
  362. mindroot/docs/install_plugins_with_tools.rst +25 -0
  363. mindroot/docs/installation.rst +21 -0
  364. mindroot/docs/installopenrouter.png +0 -0
  365. mindroot/docs/llm_api_key.rst +22 -0
  366. mindroot/docs/llm_plugin_installation.rst +27 -0
  367. mindroot/docs/make.bat +35 -0
  368. mindroot/docs/mood.png +0 -0
  369. mindroot/docs/moon.png +0 -0
  370. mindroot/docs/openrouter.png +0 -0
  371. mindroot/docs/personas/local/Assistant/avatar.png +0 -0
  372. mindroot/docs/personas/local/Assistant/faceref.png +0 -0
  373. mindroot/docs/personas/local/Assistant/persona.json +7 -0
  374. mindroot/docs/programming_task.rst +10 -0
  375. mindroot/docs/restart.png +0 -0
  376. mindroot/docs/source/ahp.rst +7 -0
  377. mindroot/docs/source/mindroot.coreplugins.admin.rst +189 -0
  378. mindroot/docs/source/mindroot.coreplugins.api_keys.rst +45 -0
  379. mindroot/docs/source/mindroot.coreplugins.chat.rst +93 -0
  380. mindroot/docs/source/mindroot.coreplugins.chat_avatar.rst +10 -0
  381. mindroot/docs/source/mindroot.coreplugins.check_list.rst +21 -0
  382. mindroot/docs/source/mindroot.coreplugins.credits.rst +61 -0
  383. mindroot/docs/source/mindroot.coreplugins.email.rst +77 -0
  384. mindroot/docs/source/mindroot.coreplugins.env_manager.rst +29 -0
  385. mindroot/docs/source/mindroot.coreplugins.events.rst +29 -0
  386. mindroot/docs/source/mindroot.coreplugins.index.handlers.rst +45 -0
  387. mindroot/docs/source/mindroot.coreplugins.index.rst +53 -0
  388. mindroot/docs/source/mindroot.coreplugins.jwt_auth.rst +45 -0
  389. mindroot/docs/source/mindroot.coreplugins.l8n.rst +109 -0
  390. mindroot/docs/source/mindroot.coreplugins.mcp_.rst +93 -0
  391. mindroot/docs/source/mindroot.coreplugins.persona.rst +29 -0
  392. mindroot/docs/source/mindroot.coreplugins.rst +35 -0
  393. mindroot/docs/source/mindroot.coreplugins.startup.rst +21 -0
  394. mindroot/docs/source/mindroot.coreplugins.subscriptions.rst +85 -0
  395. mindroot/docs/source/mindroot.coreplugins.usage.rst +61 -0
  396. mindroot/docs/source/mindroot.coreplugins.user_service.rst +69 -0
  397. mindroot/docs/source/mindroot.lib.auth.rst +29 -0
  398. mindroot/docs/source/mindroot.lib.json_str_block.rst +21 -0
  399. mindroot/docs/source/mindroot.lib.plugins.rst +69 -0
  400. mindroot/docs/source/mindroot.lib.providers.backup.rst +10 -0
  401. mindroot/docs/source/mindroot.lib.providers.rst +61 -0
  402. mindroot/docs/source/mindroot.lib.rst +152 -0
  403. mindroot/docs/source/mindroot.registry.rst +29 -0
  404. mindroot/docs/source/mindroot.rst +54 -0
  405. mindroot/docs/source/modules.rst +7 -0
  406. mindroot/docs/source/mr_agent_expert_instr.rst +7 -0
  407. mindroot/docs/starting_mindroot.rst +12 -0
  408. mindroot/docs/user_documentation.rst +16 -0
  409. mindroot/server.py +10 -1
  410. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/METADATA +1 -1
  411. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/RECORD +415 -8
  412. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/WHEEL +0 -0
  413. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/entry_points.txt +0 -0
  414. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/licenses/LICENSE +0 -0
  415. {mindroot-9.11.0.dist-info → mindroot-9.12.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,296 @@
1
+
2
+
3
+ <!DOCTYPE html>
4
+ <html class="writer-html5" lang="en" data-content_root="../../../../">
5
+ <head>
6
+ <meta charset="utf-8" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>mindroot.coreplugins.l8n.language_detection &mdash; MindRoot 9.10.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=b86133f3" />
10
+ <link rel="stylesheet" type="text/css" href="../../../../_static/css/theme.css?v=e59714d7" />
11
+
12
+
13
+ <script src="../../../../_static/jquery.js?v=5d32c60e"></script>
14
+ <script src="../../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
15
+ <script src="../../../../_static/documentation_options.js?v=3c16008f"></script>
16
+ <script src="../../../../_static/doctools.js?v=9bcbadda"></script>
17
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
18
+ <script src="../../../../_static/js/theme.js"></script>
19
+ <link rel="index" title="Index" href="../../../../genindex.html" />
20
+ <link rel="search" title="Search" href="../../../../search.html" />
21
+ </head>
22
+
23
+ <body class="wy-body-for-nav">
24
+ <div class="wy-grid-for-nav">
25
+ <nav data-toggle="wy-nav-shift" class="wy-nav-side">
26
+ <div class="wy-side-scroll">
27
+ <div class="wy-side-nav-search" style="background: #343131" >
28
+
29
+
30
+
31
+ <a href="../../../../index.html" class="icon icon-home">
32
+ MindRoot
33
+ </a>
34
+ <div role="search">
35
+ <form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
36
+ <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
37
+ <input type="hidden" name="check_keywords" value="yes" />
38
+ <input type="hidden" name="area" value="default" />
39
+ </form>
40
+ </div>
41
+ </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
42
+ <!-- Local TOC -->
43
+ <div class="local-toc"></div>
44
+ </div>
45
+ </div>
46
+ </nav>
47
+
48
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
49
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
50
+ <a href="../../../../index.html">MindRoot</a>
51
+ </nav>
52
+
53
+ <div class="wy-nav-content">
54
+ <div class="rst-content">
55
+ <div role="navigation" aria-label="Page navigation">
56
+ <ul class="wy-breadcrumbs">
57
+ <li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
58
+ <li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
59
+ <li class="breadcrumb-item active">mindroot.coreplugins.l8n.language_detection</li>
60
+ <li class="wy-breadcrumbs-aside">
61
+ </li>
62
+ </ul>
63
+ <hr/>
64
+ </div>
65
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
66
+ <div itemprop="articleBody">
67
+
68
+ <h1>Source code for mindroot.coreplugins.l8n.language_detection</h1><div class="highlight"><pre>
69
+ <span></span><span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
70
+ <span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Optional</span>
71
+
72
+ <div class="viewcode-block" id="get_current_language_from_request">
73
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.language_detection.get_current_language_from_request">[docs]</a>
74
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_current_language_from_request</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
75
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
76
+ <span class="sd"> Get the current language from various request sources.</span>
77
+ <span class="sd"> </span>
78
+ <span class="sd"> This function checks multiple sources in order of priority:</span>
79
+ <span class="sd"> 1. Environment variable MINDROOT_LANGUAGE</span>
80
+ <span class="sd"> 2. FastAPI request context (if available)</span>
81
+ <span class="sd"> 3. HTTP Accept-Language header</span>
82
+ <span class="sd"> 4. URL parameters (?lang=es)</span>
83
+ <span class="sd"> 5. Cookie values</span>
84
+ <span class="sd"> 6. User preferences from database/session</span>
85
+ <span class="sd"> </span>
86
+ <span class="sd"> Returns:</span>
87
+ <span class="sd"> Language code (e.g., &#39;en&#39;, &#39;es&#39;, &#39;fr&#39;)</span>
88
+ <span class="sd"> &quot;&quot;&quot;</span>
89
+ <span class="c1"># 1. Check environment variable first (for testing/override)</span>
90
+ <span class="n">env_lang</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MINDROOT_LANGUAGE&#39;</span><span class="p">)</span>
91
+ <span class="k">if</span> <span class="n">env_lang</span><span class="p">:</span>
92
+ <span class="k">return</span> <span class="n">env_lang</span>
93
+
94
+ <span class="c1"># 2. Try to get language from FastAPI request context</span>
95
+ <span class="k">try</span><span class="p">:</span>
96
+ <span class="kn">from</span><span class="w"> </span><span class="nn">contextvars</span><span class="w"> </span><span class="kn">import</span> <span class="n">ContextVar</span>
97
+ <span class="kn">import</span><span class="w"> </span><span class="nn">contextvars</span>
98
+
99
+ <span class="c1"># Try to find request context</span>
100
+ <span class="n">request_lang</span> <span class="o">=</span> <span class="n">_get_language_from_fastapi_context</span><span class="p">()</span>
101
+ <span class="k">if</span> <span class="n">request_lang</span><span class="p">:</span>
102
+ <span class="k">return</span> <span class="n">request_lang</span>
103
+ <span class="k">except</span> <span class="p">(</span><span class="ne">ImportError</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">):</span>
104
+ <span class="k">pass</span>
105
+
106
+ <span class="c1"># 3. Fallback to default language</span>
107
+ <span class="k">return</span> <span class="s1">&#39;en&#39;</span></div>
108
+
109
+
110
+ <span class="k">def</span><span class="w"> </span><span class="nf">_get_language_from_fastapi_context</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
111
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
112
+ <span class="sd"> Extract language from FastAPI request context.</span>
113
+ <span class="sd"> </span>
114
+ <span class="sd"> This function attempts to access the current FastAPI request</span>
115
+ <span class="sd"> and extract language information from various sources.</span>
116
+ <span class="sd"> </span>
117
+ <span class="sd"> Returns:</span>
118
+ <span class="sd"> Language code if found, None otherwise</span>
119
+ <span class="sd"> &quot;&quot;&quot;</span>
120
+ <span class="k">try</span><span class="p">:</span>
121
+ <span class="c1"># Try to get the current request from FastAPI context</span>
122
+ <span class="kn">from</span><span class="w"> </span><span class="nn">starlette.requests</span><span class="w"> </span><span class="kn">import</span> <span class="n">Request</span>
123
+ <span class="kn">import</span><span class="w"> </span><span class="nn">contextvars</span>
124
+
125
+ <span class="c1"># This is a placeholder - in a real implementation, we would need</span>
126
+ <span class="c1"># to access the actual request context that MindRoot uses</span>
127
+ <span class="c1"># For now, we&#39;ll implement the detection logic structure</span>
128
+
129
+ <span class="c1"># Check if there&#39;s a way to get the current request</span>
130
+ <span class="c1"># This would need to be integrated with MindRoot&#39;s request handling</span>
131
+
132
+ <span class="k">return</span> <span class="kc">None</span> <span class="c1"># Placeholder</span>
133
+
134
+ <span class="k">except</span> <span class="p">(</span><span class="ne">ImportError</span><span class="p">,</span> <span class="ne">Exception</span><span class="p">):</span>
135
+ <span class="k">return</span> <span class="kc">None</span>
136
+
137
+ <span class="k">def</span><span class="w"> </span><span class="nf">_parse_accept_language_header</span><span class="p">(</span><span class="n">accept_language</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
138
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
139
+ <span class="sd"> Parse the Accept-Language header and return the preferred language.</span>
140
+ <span class="sd"> </span>
141
+ <span class="sd"> Args:</span>
142
+ <span class="sd"> accept_language: Accept-Language header value</span>
143
+ <span class="sd"> </span>
144
+ <span class="sd"> Returns:</span>
145
+ <span class="sd"> Preferred language code</span>
146
+ <span class="sd"> </span>
147
+ <span class="sd"> Example:</span>
148
+ <span class="sd"> &#39;en-US,en;q=0.9,es;q=0.8,fr;q=0.7&#39; -&gt; &#39;en&#39;</span>
149
+ <span class="sd"> &quot;&quot;&quot;</span>
150
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">accept_language</span><span class="p">:</span>
151
+ <span class="k">return</span> <span class="s1">&#39;en&#39;</span>
152
+
153
+ <span class="c1"># Parse the Accept-Language header</span>
154
+ <span class="n">languages</span> <span class="o">=</span> <span class="p">[]</span>
155
+ <span class="k">for</span> <span class="n">lang_range</span> <span class="ow">in</span> <span class="n">accept_language</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">):</span>
156
+ <span class="n">lang_range</span> <span class="o">=</span> <span class="n">lang_range</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
157
+ <span class="k">if</span> <span class="s1">&#39;;q=&#39;</span> <span class="ow">in</span> <span class="n">lang_range</span><span class="p">:</span>
158
+ <span class="n">lang</span><span class="p">,</span> <span class="n">quality</span> <span class="o">=</span> <span class="n">lang_range</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;;q=&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
159
+ <span class="k">try</span><span class="p">:</span>
160
+ <span class="n">quality</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">quality</span><span class="p">)</span>
161
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
162
+ <span class="n">quality</span> <span class="o">=</span> <span class="mf">1.0</span>
163
+ <span class="k">else</span><span class="p">:</span>
164
+ <span class="n">lang</span> <span class="o">=</span> <span class="n">lang_range</span>
165
+ <span class="n">quality</span> <span class="o">=</span> <span class="mf">1.0</span>
166
+
167
+ <span class="c1"># Extract just the language code (e.g., &#39;en&#39; from &#39;en-US&#39;)</span>
168
+ <span class="n">lang_code</span> <span class="o">=</span> <span class="n">lang</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
169
+ <span class="n">languages</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">lang_code</span><span class="p">,</span> <span class="n">quality</span><span class="p">))</span>
170
+
171
+ <span class="c1"># Sort by quality (highest first)</span>
172
+ <span class="n">languages</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
173
+
174
+ <span class="c1"># Return the highest quality language</span>
175
+ <span class="k">if</span> <span class="n">languages</span><span class="p">:</span>
176
+ <span class="k">return</span> <span class="n">languages</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
177
+
178
+ <span class="k">return</span> <span class="s1">&#39;en&#39;</span>
179
+
180
+ <div class="viewcode-block" id="set_language_for_request">
181
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.language_detection.set_language_for_request">[docs]</a>
182
+ <span class="k">def</span><span class="w"> </span><span class="nf">set_language_for_request</span><span class="p">(</span><span class="n">language</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
183
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
184
+ <span class="sd"> Set the language for the current request context.</span>
185
+ <span class="sd"> </span>
186
+ <span class="sd"> This function would be called by middleware or route handlers</span>
187
+ <span class="sd"> to set the language for the current request.</span>
188
+ <span class="sd"> </span>
189
+ <span class="sd"> Args:</span>
190
+ <span class="sd"> language: Language code to set</span>
191
+ <span class="sd"> &quot;&quot;&quot;</span>
192
+ <span class="c1"># Set environment variable as a simple implementation</span>
193
+ <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;MINDROOT_LANGUAGE&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">language</span></div>
194
+
195
+
196
+ <span class="c1"># In a real implementation, this would set the language</span>
197
+ <span class="c1"># in the request context or thread-local storage</span>
198
+
199
+ <div class="viewcode-block" id="get_supported_languages">
200
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.language_detection.get_supported_languages">[docs]</a>
201
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_supported_languages</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">:</span>
202
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
203
+ <span class="sd"> Get the list of supported languages.</span>
204
+ <span class="sd"> </span>
205
+ <span class="sd"> Returns:</span>
206
+ <span class="sd"> List of supported language codes</span>
207
+ <span class="sd"> &quot;&quot;&quot;</span>
208
+ <span class="c1"># This could be configured via environment variables or config files</span>
209
+ <span class="n">supported</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MINDROOT_SUPPORTED_LANGUAGES&#39;</span><span class="p">,</span> <span class="s1">&#39;en,es,fr,de,it,pt,ru,zh,ja,ko&#39;</span><span class="p">)</span>
210
+ <span class="k">return</span> <span class="p">[</span><span class="n">lang</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">lang</span> <span class="ow">in</span> <span class="n">supported</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">)]</span></div>
211
+
212
+
213
+ <div class="viewcode-block" id="is_language_supported">
214
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.language_detection.is_language_supported">[docs]</a>
215
+ <span class="k">def</span><span class="w"> </span><span class="nf">is_language_supported</span><span class="p">(</span><span class="n">language</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
216
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
217
+ <span class="sd"> Check if a language is supported.</span>
218
+ <span class="sd"> </span>
219
+ <span class="sd"> Args:</span>
220
+ <span class="sd"> language: Language code to check</span>
221
+ <span class="sd"> </span>
222
+ <span class="sd"> Returns:</span>
223
+ <span class="sd"> True if language is supported, False otherwise</span>
224
+ <span class="sd"> &quot;&quot;&quot;</span>
225
+ <span class="k">return</span> <span class="n">language</span> <span class="ow">in</span> <span class="n">get_supported_languages</span><span class="p">()</span></div>
226
+
227
+
228
+ <div class="viewcode-block" id="get_fallback_language">
229
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.language_detection.get_fallback_language">[docs]</a>
230
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_fallback_language</span><span class="p">(</span><span class="n">language</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
231
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
232
+ <span class="sd"> Get a fallback language if the requested language is not supported.</span>
233
+ <span class="sd"> </span>
234
+ <span class="sd"> Args:</span>
235
+ <span class="sd"> language: Requested language code</span>
236
+ <span class="sd"> </span>
237
+ <span class="sd"> Returns:</span>
238
+ <span class="sd"> Fallback language code</span>
239
+ <span class="sd"> &quot;&quot;&quot;</span>
240
+ <span class="k">if</span> <span class="n">is_language_supported</span><span class="p">(</span><span class="n">language</span><span class="p">):</span>
241
+ <span class="k">return</span> <span class="n">language</span>
242
+
243
+ <span class="c1"># Language family fallbacks</span>
244
+ <span class="n">fallbacks</span> <span class="o">=</span> <span class="p">{</span>
245
+ <span class="s1">&#39;en-us&#39;</span><span class="p">:</span> <span class="s1">&#39;en&#39;</span><span class="p">,</span>
246
+ <span class="s1">&#39;en-gb&#39;</span><span class="p">:</span> <span class="s1">&#39;en&#39;</span><span class="p">,</span>
247
+ <span class="s1">&#39;es-es&#39;</span><span class="p">:</span> <span class="s1">&#39;es&#39;</span><span class="p">,</span>
248
+ <span class="s1">&#39;es-mx&#39;</span><span class="p">:</span> <span class="s1">&#39;es&#39;</span><span class="p">,</span>
249
+ <span class="s1">&#39;fr-fr&#39;</span><span class="p">:</span> <span class="s1">&#39;fr&#39;</span><span class="p">,</span>
250
+ <span class="s1">&#39;fr-ca&#39;</span><span class="p">:</span> <span class="s1">&#39;fr&#39;</span><span class="p">,</span>
251
+ <span class="s1">&#39;de-de&#39;</span><span class="p">:</span> <span class="s1">&#39;de&#39;</span><span class="p">,</span>
252
+ <span class="s1">&#39;de-at&#39;</span><span class="p">:</span> <span class="s1">&#39;de&#39;</span><span class="p">,</span>
253
+ <span class="s1">&#39;pt-br&#39;</span><span class="p">:</span> <span class="s1">&#39;pt&#39;</span><span class="p">,</span>
254
+ <span class="s1">&#39;pt-pt&#39;</span><span class="p">:</span> <span class="s1">&#39;pt&#39;</span><span class="p">,</span>
255
+ <span class="s1">&#39;zh-cn&#39;</span><span class="p">:</span> <span class="s1">&#39;zh&#39;</span><span class="p">,</span>
256
+ <span class="s1">&#39;zh-tw&#39;</span><span class="p">:</span> <span class="s1">&#39;zh&#39;</span><span class="p">,</span>
257
+ <span class="p">}</span>
258
+
259
+ <span class="c1"># Try fallback</span>
260
+ <span class="n">fallback</span> <span class="o">=</span> <span class="n">fallbacks</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">language</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
261
+ <span class="k">if</span> <span class="n">fallback</span> <span class="ow">and</span> <span class="n">is_language_supported</span><span class="p">(</span><span class="n">fallback</span><span class="p">):</span>
262
+ <span class="k">return</span> <span class="n">fallback</span>
263
+
264
+ <span class="c1"># Default to English</span>
265
+ <span class="k">return</span> <span class="s1">&#39;en&#39;</span></div>
266
+
267
+ </pre></div>
268
+
269
+ </div>
270
+ </div>
271
+ <footer>
272
+
273
+ <hr/>
274
+
275
+ <div role="contentinfo">
276
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
277
+ </div>
278
+
279
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
280
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
281
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
282
+
283
+
284
+ </footer>
285
+ </div>
286
+ </div>
287
+ </section>
288
+ </div>
289
+ <script>
290
+ jQuery(function () {
291
+ SphinxRtdTheme.Navigation.enable(true);
292
+ });
293
+ </script>
294
+
295
+ </body>
296
+ </html>
@@ -0,0 +1,258 @@
1
+
2
+
3
+ <!DOCTYPE html>
4
+ <html class="writer-html5" lang="en" data-content_root="../../../../">
5
+ <head>
6
+ <meta charset="utf-8" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>mindroot.coreplugins.l8n.middleware &mdash; MindRoot 9.10.0 documentation</title>
9
+ <link rel="stylesheet" type="text/css" href="../../../../_static/pygments.css?v=b86133f3" />
10
+ <link rel="stylesheet" type="text/css" href="../../../../_static/css/theme.css?v=e59714d7" />
11
+
12
+
13
+ <script src="../../../../_static/jquery.js?v=5d32c60e"></script>
14
+ <script src="../../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
15
+ <script src="../../../../_static/documentation_options.js?v=3c16008f"></script>
16
+ <script src="../../../../_static/doctools.js?v=9bcbadda"></script>
17
+ <script src="../../../../_static/sphinx_highlight.js?v=dc90522c"></script>
18
+ <script src="../../../../_static/js/theme.js"></script>
19
+ <link rel="index" title="Index" href="../../../../genindex.html" />
20
+ <link rel="search" title="Search" href="../../../../search.html" />
21
+ </head>
22
+
23
+ <body class="wy-body-for-nav">
24
+ <div class="wy-grid-for-nav">
25
+ <nav data-toggle="wy-nav-shift" class="wy-nav-side">
26
+ <div class="wy-side-scroll">
27
+ <div class="wy-side-nav-search" style="background: #343131" >
28
+
29
+
30
+
31
+ <a href="../../../../index.html" class="icon icon-home">
32
+ MindRoot
33
+ </a>
34
+ <div role="search">
35
+ <form id="rtd-search-form" class="wy-form" action="../../../../search.html" method="get">
36
+ <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
37
+ <input type="hidden" name="check_keywords" value="yes" />
38
+ <input type="hidden" name="area" value="default" />
39
+ </form>
40
+ </div>
41
+ </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
42
+ <!-- Local TOC -->
43
+ <div class="local-toc"></div>
44
+ </div>
45
+ </div>
46
+ </nav>
47
+
48
+ <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" style="background: #343131" >
49
+ <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
50
+ <a href="../../../../index.html">MindRoot</a>
51
+ </nav>
52
+
53
+ <div class="wy-nav-content">
54
+ <div class="rst-content">
55
+ <div role="navigation" aria-label="Page navigation">
56
+ <ul class="wy-breadcrumbs">
57
+ <li><a href="../../../../index.html" class="icon icon-home" aria-label="Home"></a></li>
58
+ <li class="breadcrumb-item"><a href="../../../index.html">Module code</a></li>
59
+ <li class="breadcrumb-item active">mindroot.coreplugins.l8n.middleware</li>
60
+ <li class="wy-breadcrumbs-aside">
61
+ </li>
62
+ </ul>
63
+ <hr/>
64
+ </div>
65
+ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
66
+ <div itemprop="articleBody">
67
+
68
+ <h1>Source code for mindroot.coreplugins.l8n.middleware</h1><div class="highlight"><pre>
69
+ <span></span><span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">Request</span>
70
+
71
+ <span class="k">try</span><span class="p">:</span>
72
+ <span class="kn">from</span><span class="w"> </span><span class="nn">.language_detection</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
73
+ <span class="n">_parse_accept_language_header</span><span class="p">,</span>
74
+ <span class="n">get_fallback_language</span><span class="p">,</span>
75
+ <span class="n">set_language_for_request</span>
76
+ <span class="p">)</span>
77
+ <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
78
+ <span class="c1"># For standalone testing</span>
79
+ <span class="kn">from</span><span class="w"> </span><span class="nn">language_detection</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
80
+ <span class="n">_parse_accept_language_header</span><span class="p">,</span>
81
+ <span class="n">get_fallback_language</span><span class="p">,</span>
82
+ <span class="n">set_language_for_request</span>
83
+ <span class="p">)</span>
84
+ <span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
85
+
86
+ <span class="c1"># Global variable to store the current request language</span>
87
+ <span class="c1"># This will be set by the middleware for each request</span>
88
+ <span class="n">_current_request_language</span> <span class="o">=</span> <span class="kc">None</span>
89
+
90
+ <div class="viewcode-block" id="get_request_language">
91
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.middleware.get_request_language">[docs]</a>
92
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_request_language</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
93
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
94
+ <span class="sd"> Get the language that was detected for the current request.</span>
95
+ <span class="sd"> </span>
96
+ <span class="sd"> This function is called by the monkey patch system to get the</span>
97
+ <span class="sd"> language for template translation.</span>
98
+ <span class="sd"> </span>
99
+ <span class="sd"> Returns:</span>
100
+ <span class="sd"> Language code for the current request</span>
101
+ <span class="sd"> &quot;&quot;&quot;</span>
102
+ <span class="k">global</span> <span class="n">_current_request_language</span>
103
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n: Current request language is &#39;</span><span class="si">{</span><span class="n">_current_request_language</span><span class="si">}</span><span class="s2">&#39;&quot;</span><span class="p">)</span>
104
+ <span class="c1"># If we have a request-specific language, use it</span>
105
+ <span class="k">if</span> <span class="n">_current_request_language</span><span class="p">:</span>
106
+ <span class="k">return</span> <span class="n">_current_request_language</span>
107
+
108
+ <span class="c1"># Fallback to environment variable or default</span>
109
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;L8n: No request language set, falling back to environment variable or default&quot;</span><span class="p">)</span>
110
+ <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MINDROOT_LANGUAGE&#39;</span><span class="p">,</span> <span class="s1">&#39;en&#39;</span><span class="p">)</span></div>
111
+
112
+
113
+ <div class="viewcode-block" id="detect_language_from_request">
114
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.middleware.detect_language_from_request">[docs]</a>
115
+ <span class="k">def</span><span class="w"> </span><span class="nf">detect_language_from_request</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
116
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
117
+ <span class="sd"> Detect the preferred language from a FastAPI request.</span>
118
+ <span class="sd"> </span>
119
+ <span class="sd"> Checks multiple sources in order of priority:</span>
120
+ <span class="sd"> 1. URL parameter (?lang=es)</span>
121
+ <span class="sd"> 2. Cookie value (mindroot_language)</span>
122
+ <span class="sd"> 3. Accept-Language header</span>
123
+ <span class="sd"> 4. Environment variable</span>
124
+ <span class="sd"> 5. Default to &#39;en&#39;</span>
125
+ <span class="sd"> </span>
126
+ <span class="sd"> Args:</span>
127
+ <span class="sd"> request: FastAPI Request object</span>
128
+ <span class="sd"> </span>
129
+ <span class="sd"> Returns:</span>
130
+ <span class="sd"> Detected language code</span>
131
+ <span class="sd"> &quot;&quot;&quot;</span>
132
+ <span class="c1"># 1. Check URL parameter first (highest priority)</span>
133
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n: Checking URL parameters for language: </span><span class="si">{</span><span class="n">request</span><span class="o">.</span><span class="n">query_params</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
134
+ <span class="n">url_lang</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">query_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;lang&#39;</span><span class="p">)</span>
135
+ <span class="k">if</span> <span class="n">url_lang</span><span class="p">:</span>
136
+
137
+ <span class="k">return</span> <span class="n">get_fallback_language</span><span class="p">(</span><span class="n">url_lang</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
138
+
139
+ <span class="c1"># 2. Check cookie value</span>
140
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n: Checking cookies for language: </span><span class="si">{</span><span class="n">request</span><span class="o">.</span><span class="n">cookies</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
141
+ <span class="n">cookie_lang</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">cookies</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;mindroot_language&#39;</span><span class="p">)</span>
142
+ <span class="k">if</span> <span class="n">cookie_lang</span><span class="p">:</span>
143
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n: Found language in cookie: </span><span class="si">{</span><span class="n">cookie_lang</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
144
+ <span class="k">return</span> <span class="n">get_fallback_language</span><span class="p">(</span><span class="n">cookie_lang</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
145
+
146
+ <span class="c1"># 3. Check Accept-Language header</span>
147
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n: Accept-Language header: </span><span class="si">{</span><span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;accept-language&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
148
+ <span class="n">accept_language</span> <span class="o">=</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;accept-language&#39;</span><span class="p">)</span>
149
+ <span class="k">if</span> <span class="n">accept_language</span><span class="p">:</span>
150
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n: Parsing Accept-Language header: </span><span class="si">{</span><span class="n">accept_language</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
151
+ <span class="n">parsed_lang</span> <span class="o">=</span> <span class="n">_parse_accept_language_header</span><span class="p">(</span><span class="n">accept_language</span><span class="p">)</span>
152
+ <span class="k">if</span> <span class="n">parsed_lang</span><span class="p">:</span>
153
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n: Parsed language from header: </span><span class="si">{</span><span class="n">parsed_lang</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
154
+ <span class="k">return</span> <span class="n">get_fallback_language</span><span class="p">(</span><span class="n">parsed_lang</span><span class="p">)</span>
155
+
156
+ <span class="c1"># 4. Check environment variable</span>
157
+ <span class="n">env_lang</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;MINDROOT_LANGUAGE&#39;</span><span class="p">)</span>
158
+ <span class="k">if</span> <span class="n">env_lang</span><span class="p">:</span>
159
+ <span class="k">return</span> <span class="n">get_fallback_language</span><span class="p">(</span><span class="n">env_lang</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
160
+
161
+ <span class="c1"># 5. Default to English</span>
162
+ <span class="k">return</span> <span class="s1">&#39;en&#39;</span></div>
163
+
164
+
165
+ <div class="viewcode-block" id="middleware">
166
+ <a class="viewcode-back" href="../../../../source/mindroot.coreplugins.l8n.html#mindroot.coreplugins.l8n.middleware.middleware">[docs]</a>
167
+ <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">middleware</span><span class="p">(</span><span class="n">request</span><span class="p">:</span> <span class="n">Request</span><span class="p">,</span> <span class="n">call_next</span><span class="p">):</span>
168
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
169
+ <span class="sd"> L8n middleware for language detection and setting.</span>
170
+ <span class="sd"> </span>
171
+ <span class="sd"> This middleware runs early in the request pipeline to:</span>
172
+ <span class="sd"> 1. Detect the preferred language for the request</span>
173
+ <span class="sd"> 2. Store it globally for use by the template system</span>
174
+ <span class="sd"> 3. Set it in the request state for other components</span>
175
+ <span class="sd"> </span>
176
+ <span class="sd"> Args:</span>
177
+ <span class="sd"> request: FastAPI Request object</span>
178
+ <span class="sd"> call_next: Next middleware/handler in the chain</span>
179
+ <span class="sd"> </span>
180
+ <span class="sd"> Returns:</span>
181
+ <span class="sd"> Response from the next handler</span>
182
+ <span class="sd"> &quot;&quot;&quot;</span>
183
+ <span class="k">global</span> <span class="n">_current_request_language</span>
184
+ <span class="k">try</span><span class="p">:</span>
185
+ <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;L8n middleware: Starting language detection&quot;</span><span class="p">)</span>
186
+ <span class="c1"># Detect the language for this request</span>
187
+ <span class="n">detected_language</span> <span class="o">=</span> <span class="n">detect_language_from_request</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
188
+
189
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n: Detected language &#39;</span><span class="si">{</span><span class="n">detected_language</span><span class="si">}</span><span class="s2">&#39; for </span><span class="si">{</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
190
+ <span class="c1"># Store it globally for the template system</span>
191
+ <span class="n">_current_request_language</span> <span class="o">=</span> <span class="n">detected_language</span>
192
+
193
+ <span class="c1"># Also store it in request state for other components</span>
194
+ <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">language</span> <span class="o">=</span> <span class="n">detected_language</span>
195
+
196
+ <span class="c1"># Set it using the language detection system</span>
197
+ <span class="n">set_language_for_request</span><span class="p">(</span><span class="n">detected_language</span><span class="p">)</span>
198
+
199
+ <span class="c1"># Debug logging (can be removed in production)</span>
200
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n: Detected language &#39;</span><span class="si">{</span><span class="n">detected_language</span><span class="si">}</span><span class="s2">&#39; for </span><span class="si">{</span><span class="n">request</span><span class="o">.</span><span class="n">url</span><span class="o">.</span><span class="n">path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
201
+
202
+ <span class="c1"># Process the request</span>
203
+ <span class="n">response</span> <span class="o">=</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
204
+
205
+ <span class="c1"># Optionally set a cookie to remember the language preference</span>
206
+ <span class="c1"># Only set if it was explicitly requested via URL parameter</span>
207
+ <span class="k">if</span> <span class="n">request</span><span class="o">.</span><span class="n">query_params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;lang&#39;</span><span class="p">):</span>
208
+ <span class="n">response</span><span class="o">.</span><span class="n">set_cookie</span><span class="p">(</span>
209
+ <span class="n">key</span><span class="o">=</span><span class="s2">&quot;mindroot_language&quot;</span><span class="p">,</span>
210
+ <span class="n">value</span><span class="o">=</span><span class="n">detected_language</span><span class="p">,</span>
211
+ <span class="n">max_age</span><span class="o">=</span><span class="mi">30</span> <span class="o">*</span> <span class="mi">24</span> <span class="o">*</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">60</span><span class="p">,</span> <span class="c1"># 30 days</span>
212
+ <span class="n">httponly</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
213
+ <span class="n">samesite</span><span class="o">=</span><span class="s2">&quot;lax&quot;</span>
214
+ <span class="p">)</span>
215
+
216
+ <span class="k">return</span> <span class="n">response</span>
217
+
218
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
219
+ <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;L8n middleware error: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
220
+ <span class="c1"># If there&#39;s an error, continue with default language</span>
221
+ <span class="n">_current_request_language</span> <span class="o">=</span> <span class="s1">&#39;en&#39;</span>
222
+ <span class="n">request</span><span class="o">.</span><span class="n">state</span><span class="o">.</span><span class="n">language</span> <span class="o">=</span> <span class="s1">&#39;en&#39;</span>
223
+ <span class="k">return</span> <span class="k">await</span> <span class="n">call_next</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
224
+
225
+ <span class="k">finally</span><span class="p">:</span>
226
+ <span class="c1"># Clean up the global variable after the request</span>
227
+ <span class="n">_current_request_language</span> <span class="o">=</span> <span class="kc">None</span></div>
228
+
229
+ </pre></div>
230
+
231
+ </div>
232
+ </div>
233
+ <footer>
234
+
235
+ <hr/>
236
+
237
+ <div role="contentinfo">
238
+ <p>&#169; Copyright 2025, Jason Livesay.</p>
239
+ </div>
240
+
241
+ Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
242
+ <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
243
+ provided by <a href="https://readthedocs.org">Read the Docs</a>.
244
+
245
+
246
+ </footer>
247
+ </div>
248
+ </div>
249
+ </section>
250
+ </div>
251
+ <script>
252
+ jQuery(function () {
253
+ SphinxRtdTheme.Navigation.enable(true);
254
+ });
255
+ </script>
256
+
257
+ </body>
258
+ </html>