11using CounterStrikeSharp . API . Core ;
22using CounterStrikeSharp . API . Core . Commands ;
3+ using CounterStrikeSharp . API . Core . Translations ;
34using CounterStrikeSharp . API . Modules . Commands ;
45using CounterStrikeSharp . API . Modules . Commands . Targeting ;
56using CounterStrikeSharp . API . Modules . Entities ;
@@ -205,6 +206,14 @@ public void RegisterMenuCategory(string categoryId, string categoryName, string
205206 Menus . MenuManager . Instance . RegisterCategory ( categoryId , categoryName , permission ) ;
206207 }
207208
209+ public void RegisterMenuCategory ( string categoryId , string categoryNameKey , string permission , object moduleLocalizer )
210+ {
211+ if ( moduleLocalizer is not IStringLocalizer localizer )
212+ throw new InvalidOperationException ( "moduleLocalizer must be an IStringLocalizer instance" ) ;
213+
214+ Menus . MenuManager . Instance . RegisterCategory ( categoryId , categoryNameKey , permission , localizer ) ;
215+ }
216+
208217 public void RegisterMenu ( string categoryId , string menuId , string menuName ,
209218 Func < CCSPlayerController , object > menuFactory , string ? permission = null , string ? commandName = null )
210219 {
@@ -263,6 +272,39 @@ MenuBuilder BuilderFactory(CCSPlayerController player)
263272 }
264273 }
265274
275+ public void RegisterMenu ( string categoryId , string menuId , string menuNameKey ,
276+ Func < CCSPlayerController , MenuContext , object > menuFactory , string ? permission , string ? commandName , object moduleLocalizer )
277+ {
278+ if ( moduleLocalizer is not IStringLocalizer localizer )
279+ throw new InvalidOperationException ( "moduleLocalizer must be an IStringLocalizer instance" ) ;
280+
281+ Menus . MenuManager . Instance . RegisterMenu ( categoryId , menuId , menuNameKey , BuilderFactory , permission , commandName , localizer ) ;
282+ return ;
283+
284+ MenuBuilder BuilderFactory ( CCSPlayerController player )
285+ {
286+ var context = new MenuContext ( categoryId , menuId , menuNameKey , permission , commandName ) ;
287+
288+ if ( menuFactory ( player , context ) is not MenuBuilder menuBuilder )
289+ throw new InvalidOperationException ( "Menu factory must return MenuBuilder" ) ;
290+
291+ // Dodaj automatyczną obsługę przycisku 'Wróć'
292+ menuBuilder . WithBackAction ( p =>
293+ {
294+ if ( Menus . MenuManager . Instance . GetMenuCategories ( ) . TryGetValue ( categoryId , out var category ) )
295+ {
296+ Menus . MenuManager . Instance . CreateCategoryMenuPublic ( category , p ) . OpenMenu ( p ) ;
297+ }
298+ else
299+ {
300+ Menus . MenuManager . Instance . OpenMainMenu ( p ) ;
301+ }
302+ } ) ;
303+
304+ return menuBuilder ;
305+ }
306+ }
307+
266308
267309 public void UnregisterMenu ( string categoryId , string menuId )
268310 {
@@ -289,7 +331,30 @@ public object CreateMenuWithBack(string title, string categoryId, CCSPlayerContr
289331
290332 public object CreateMenuWithBack ( MenuContext context , CCSPlayerController player )
291333 {
292- return CreateMenuWithBack ( context . MenuTitle , context . CategoryId , player ) ;
334+ // Get translated title if module has localizer
335+ string title = context . MenuTitle ;
336+
337+ if ( Menus . MenuManager . Instance . GetMenuCategories ( ) . TryGetValue ( context . CategoryId , out var category ) )
338+ {
339+ // Check if this specific menu has a localizer
340+ if ( category . MenuLocalizers . TryGetValue ( context . MenuId , out var menuLocalizer ) )
341+ {
342+ using ( new WithTemporaryCulture ( player . GetLanguage ( ) ) )
343+ {
344+ title = menuLocalizer [ context . MenuTitle ] ?? context . MenuTitle ;
345+ }
346+ }
347+ // Fallback to category localizer
348+ else if ( category . ModuleLocalizer != null )
349+ {
350+ using ( new WithTemporaryCulture ( player . GetLanguage ( ) ) )
351+ {
352+ title = category . ModuleLocalizer [ context . MenuTitle ] ?? context . MenuTitle ;
353+ }
354+ }
355+ }
356+
357+ return CreateMenuWithBack ( title , context . CategoryId , player ) ;
293358 }
294359
295360 public List < CCSPlayerController > GetValidPlayers ( )
@@ -321,7 +386,30 @@ public object CreateMenuWithPlayers(string title, string categoryId, CCSPlayerCo
321386 public object CreateMenuWithPlayers ( MenuContext context , CCSPlayerController admin ,
322387 Func < CCSPlayerController , bool > filter , Action < CCSPlayerController , CCSPlayerController > onSelect )
323388 {
324- return CreateMenuWithPlayers ( context . MenuTitle , context . CategoryId , admin , filter , onSelect ) ;
389+ // Get translated title if module has localizer
390+ string title = context . MenuTitle ;
391+
392+ if ( Menus . MenuManager . Instance . GetMenuCategories ( ) . TryGetValue ( context . CategoryId , out var category ) )
393+ {
394+ // Check if this specific menu has a localizer
395+ if ( category . MenuLocalizers . TryGetValue ( context . MenuId , out var menuLocalizer ) )
396+ {
397+ using ( new WithTemporaryCulture ( admin . GetLanguage ( ) ) )
398+ {
399+ title = menuLocalizer [ context . MenuTitle ] ?? context . MenuTitle ;
400+ }
401+ }
402+ // Fallback to category localizer
403+ else if ( category . ModuleLocalizer != null )
404+ {
405+ using ( new WithTemporaryCulture ( admin . GetLanguage ( ) ) )
406+ {
407+ title = category . ModuleLocalizer [ context . MenuTitle ] ?? context . MenuTitle ;
408+ }
409+ }
410+ }
411+
412+ return CreateMenuWithPlayers ( title , context . CategoryId , admin , filter , onSelect ) ;
325413 }
326414
327415 public void AddMenuOption ( object menu , string name , Action < CCSPlayerController > action , bool disabled = false ,
0 commit comments