Fallback fonts + localizations (#262)

* Fallback fonts + localizations

* cannot find address on h1 [skip]

* fix build

* fix language menu

* small fix

* improved regular font

* format LUI stuff [skip ci]

Co-authored-by: m <mjkzyalt@gmail.com>
This commit is contained in:
Vlad 2022-09-25 18:12:58 +03:00 committed by GitHub
parent 637913f7cb
commit 367548e86e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
43 changed files with 1983 additions and 901 deletions

Binary file not shown.

View File

@ -1,272 +1,272 @@
if (game:issingleplayer() or Engine.InFrontend()) then if (game:issingleplayer() or Engine.InFrontend()) then
return return
end end
local container = LUI.UIVerticalList.new({ local container = LUI.UIVerticalList.new({
topAnchor = true, topAnchor = true,
rightAnchor = true, rightAnchor = true,
top = 20, top = 20,
right = 200, right = 200,
width = 200, width = 200,
spacing = 5, spacing = 5
}) })
function canasktojoin(userid) function canasktojoin(userid)
history = history or {} history = history or {}
if (history[userid] ~= nil) then if (history[userid] ~= nil) then
return false return false
end end
history[userid] = true history[userid] = true
game:ontimeout(function() game:ontimeout(function()
history[userid] = nil history[userid] = nil
end, 15000) end, 15000)
return true return true
end end
function truncatename(name, length) function truncatename(name, length)
if (#name <= length - 3) then if (#name <= length - 3) then
return name return name
end end
return name:sub(1, length - 3) .. "..." return name:sub(1, length - 3) .. "..."
end end
function addrequest(request) function addrequest(request)
if (not canasktojoin(request.userid)) then if (not canasktojoin(request.userid)) then
return return
end end
if (container.temp) then if (container.temp) then
container:removeElement(container.temp) container:removeElement(container.temp)
container.temp = nil container.temp = nil
end end
local invite = LUI.UIElement.new({ local invite = LUI.UIElement.new({
leftAnchor = true, leftAnchor = true,
rightAnchor = true, rightAnchor = true,
height = 75, height = 75
}) })
invite:registerAnimationState("move_in", { invite:registerAnimationState("move_in", {
leftAnchor = true, leftAnchor = true,
height = 75, height = 75,
width = 200, width = 200,
left = -220, left = -220
}) })
invite:animateToState("move_in", 100) invite:animateToState("move_in", 100)
local background = LUI.UIImage.new({ local background = LUI.UIImage.new({
topAnchor = true, topAnchor = true,
leftAnchor = true, leftAnchor = true,
rightAnchor = true, rightAnchor = true,
bottomAnchor = true, bottomAnchor = true,
top = 1, top = 1,
left = 1, left = 1,
bottom = -1, bottom = -1,
right = -1, right = -1,
material = RegisterMaterial("white"), material = RegisterMaterial("white"),
color = { color = {
r = 0, r = 0,
b = 0, b = 0,
g = 0, g = 0
}, },
alpha = 0.6, alpha = 0.6
}) })
local border = LUI.UIImage.new({ local border = LUI.UIImage.new({
topAnchor = true, topAnchor = true,
leftAnchor = true, leftAnchor = true,
rightAnchor = true, rightAnchor = true,
bottomAnchor = true, bottomAnchor = true,
material = RegisterMaterial("btn_focused_rect_innerglow"), material = RegisterMaterial("btn_focused_rect_innerglow")
}) })
border:setup9SliceImage(10, 5, 0.25, 0.12) border:setup9SliceImage(10, 5, 0.25, 0.12)
local paddingvalue = 10 local paddingvalue = 10
local padding = LUI.UIElement.new({ local padding = LUI.UIElement.new({
topAnchor = true, topAnchor = true,
leftAnchor = true, leftAnchor = true,
rightAnchor = true, rightAnchor = true,
bottomAnchor = true, bottomAnchor = true,
top = paddingvalue, top = paddingvalue,
left = paddingvalue, left = paddingvalue,
right = -paddingvalue, right = -paddingvalue,
bottom = -paddingvalue, bottom = -paddingvalue
}) })
local avatarmaterial = discord.getavatarmaterial(request.userid) local avatarmaterial = discord.getavatarmaterial(request.userid)
local avatar = LUI.UIImage.new({ local avatar = LUI.UIImage.new({
leftAnchor = true, leftAnchor = true,
topAnchor = true, topAnchor = true,
width = 32, width = 32,
height = 32, height = 32,
left = 1, left = 1,
material = RegisterMaterial(avatarmaterial) material = RegisterMaterial(avatarmaterial)
}) })
local username = LUI.UIText.new({ local username = LUI.UIText.new({
leftAnchor = true, leftAnchor = true,
topAnchor = true, topAnchor = true,
height = 12, height = 12,
left = 32 + paddingvalue, left = 32 + paddingvalue,
color = Colors.white, color = Colors.white,
alignment = LUI.Alignment.Left, alignment = LUI.Alignment.Left,
rightAnchor = true, rightAnchor = true,
font = CoD.TextSettings.BodyFontBold.Font font = CoD.TextSettings.BodyFontBold.Font
}) })
username:setText(string.format("%s^7#%s requested to join your game!", username:setText(string.format("%s^7#%s requested to join your game!", truncatename(request.username, 18),
truncatename(request.username, 18), request.discriminator)) request.discriminator))
local buttons = LUI.UIElement.new({ local buttons = LUI.UIElement.new({
leftAnchor = true, leftAnchor = true,
rightAnchor = true, rightAnchor = true,
topAnchor = true, topAnchor = true,
top = 37, top = 37,
height = 18, height = 18
}) })
local createbutton = function(text, left) local createbutton = function(text, left)
local button = LUI.UIElement.new({ local button = LUI.UIElement.new({
leftAnchor = left, leftAnchor = left,
rightAnchor = not left, rightAnchor = not left,
topAnchor = true, topAnchor = true,
height = 18, height = 18,
width = 85, width = 85,
material = RegisterMaterial("btn_focused_rect_innerglow"), material = RegisterMaterial("btn_focused_rect_innerglow")
}) })
local center = LUI.UIText.new({ local center = LUI.UIText.new({
rightAnchor = true, rightAnchor = true,
height = 12, height = 12,
width = 85, width = 85,
top = -6.5, top = -6.5,
alignment = LUI.Alignment.Center, alignment = LUI.Alignment.Center,
font = CoD.TextSettings.BodyFontBold.Font font = CoD.TextSettings.BodyFontBold.Font
}) })
button:setup9SliceImage(10, 5, 0.25, 0.12) button:setup9SliceImage(10, 5, 0.25, 0.12)
center:setText(text) center:setText(text)
button:addElement(center) button:addElement(center)
return button return button
end end
buttons:addElement(createbutton("[F1] Accept", true)) buttons:addElement(createbutton("[F1] Accept", true))
buttons:addElement(createbutton("[F2] Deny")) buttons:addElement(createbutton("[F2] Deny"))
local fadeouttime = 50 local fadeouttime = 50
local timeout = 10 * 1000 - fadeouttime local timeout = 10 * 1000 - fadeouttime
local function close() local function close()
container:processEvent({ container:processEvent({
name = "update_navigation", name = "update_navigation",
dispatchToChildren = true dispatchToChildren = true
}) })
invite:animateToState("fade_out", fadeouttime) invite:animateToState("fade_out", fadeouttime)
invite:addElement(LUI.UITimer.new(fadeouttime + 50, "remove")) invite:addElement(LUI.UITimer.new(fadeouttime + 50, "remove"))
invite:registerEventHandler("remove", function() invite:registerEventHandler("remove", function()
container:removeElement(invite) container:removeElement(invite)
if (container.temp) then if (container.temp) then
container:removeElement(container.temp) container:removeElement(container.temp)
container.temp = nil container.temp = nil
end end
local temp = LUI.UIElement.new({}) local temp = LUI.UIElement.new({})
container.temp = temp container.temp = temp
container:addElement(temp) container:addElement(temp)
end) end)
end end
buttons:registerEventHandler("keydown_", function(element, event) buttons:registerEventHandler("keydown_", function(element, event)
if (event.key == "F1") then if (event.key == "F1") then
close() close()
discord.respond(request.userid, discord.reply.yes) discord.respond(request.userid, discord.reply.yes)
end end
if (event.key == "F2") then if (event.key == "F2") then
close() close()
discord.respond(request.userid, discord.reply.no) discord.respond(request.userid, discord.reply.no)
end end
end) end)
invite:registerAnimationState("fade_out", { invite:registerAnimationState("fade_out", {
leftAnchor = true, leftAnchor = true,
rightAnchor = true, rightAnchor = true,
height = 75, height = 75,
alpha = 0, alpha = 0,
left = 0 left = 0
}) })
invite:addElement(LUI.UITimer.new(timeout, "end_invite")) invite:addElement(LUI.UITimer.new(timeout, "end_invite"))
invite:registerEventHandler("end_invite", function() invite:registerEventHandler("end_invite", function()
close() close()
discord.respond(request.userid, discord.reply.ignore) discord.respond(request.userid, discord.reply.ignore)
end) end)
local bar = LUI.UIImage.new({ local bar = LUI.UIImage.new({
bottomAnchor = true, bottomAnchor = true,
leftAnchor = true, leftAnchor = true,
bottom = -3, bottom = -3,
left = 3, left = 3,
width = 200 - 6, width = 200 - 6,
material = RegisterMaterial("white"), material = RegisterMaterial("white"),
height = 2, height = 2,
color = { color = {
r = 92 / 255, r = 92 / 255,
g = 206 / 255, g = 206 / 255,
b = 113 / 255, b = 113 / 255
} }
}) })
bar:registerAnimationState("closing", { bar:registerAnimationState("closing", {
bottomAnchor = true, bottomAnchor = true,
leftAnchor = true, leftAnchor = true,
bottom = -3, bottom = -3,
left = 3, left = 3,
width = 0, width = 0,
height = 2, height = 2
}) })
bar:animateToState("closing", timeout) bar:animateToState("closing", timeout)
avatar:registerEventHandler("update", function() avatar:registerEventHandler("update", function()
local avatarmaterial = discord.getavatarmaterial(request.userid) local avatarmaterial = discord.getavatarmaterial(request.userid)
avatar:setImage(RegisterMaterial(avatarmaterial)) avatar:setImage(RegisterMaterial(avatarmaterial))
end) end)
avatar:addElement(LUI.UITimer.new(100, "update")) avatar:addElement(LUI.UITimer.new(100, "update"))
invite:addElement(background) invite:addElement(background)
invite:addElement(bar) invite:addElement(bar)
invite:addElement(border) invite:addElement(border)
invite:addElement(padding) invite:addElement(padding)
padding:addElement(username) padding:addElement(username)
padding:addElement(avatar) padding:addElement(avatar)
padding:addElement(buttons) padding:addElement(buttons)
container:addElement(invite) container:addElement(invite)
end end
container:registerEventHandler("keydown", function(element, event) container:registerEventHandler("keydown", function(element, event)
local first = container:getFirstChild() local first = container:getFirstChild()
if (not first) then if (not first) then
return return
end end
first:processEvent({ first:processEvent({
name = "keydown_", name = "keydown_",
key = event.key key = event.key
}) })
end) end)
LUI.roots.UIRoot0:registerEventHandler("discord_join_request", function(element, event) LUI.roots.UIRoot0:registerEventHandler("discord_join_request", function(element, event)
addrequest(event.request) addrequest(event.request)
end) end)
LUI.roots.UIRoot0:addElement(container) LUI.roots.UIRoot0:addElement(container)

View File

@ -4,195 +4,190 @@ local textheight = 13
local textoffsety = barheight / 2 - textheight / 2 local textoffsety = barheight / 2 - textheight / 2
function createinfobar() function createinfobar()
local infobar = LUI.UIElement.new({ local infobar = LUI.UIElement.new({
left = 213, left = 213,
top = -6, top = -6,
height = barheight, height = barheight,
width = 70, width = 70,
leftAnchor = true, leftAnchor = true,
topAnchor = true topAnchor = true
}) })
infobar:registerAnimationState("minimap_on", { infobar:registerAnimationState("minimap_on", {
left = 213, left = 213,
top = -6, top = -6,
height = barheight, height = barheight,
width = 70, width = 70,
leftAnchor = true, leftAnchor = true,
topAnchor = true topAnchor = true
}) })
infobar:registerAnimationState("minimap_off", { infobar:registerAnimationState("minimap_off", {
left = 0, left = 0,
top = 0, top = 0,
height = barheight, height = barheight,
width = 70, width = 70,
leftAnchor = true, leftAnchor = true,
topAnchor = true topAnchor = true
}) })
infobar:registerAnimationState("hud_on", { infobar:registerAnimationState("hud_on", {
alpha = 1 alpha = 1
}) })
infobar:registerAnimationState("hud_off", { infobar:registerAnimationState("hud_off", {
alpha = 0 alpha = 0
}) })
return infobar return infobar
end end
function updateinfobarvisibility() function updateinfobarvisibility()
local root = Engine.GetLuiRoot() local root = Engine.GetLuiRoot()
local menus = root:AnyActiveMenusInStack() local menus = root:AnyActiveMenusInStack()
local infobar = root.infobar local infobar = root.infobar
if (not infobar) then if (not infobar) then
return return
end end
if (menus or Game.InKillCam()) then if (menus or Game.InKillCam()) then
infobar:animateToState("hud_off") infobar:animateToState("hud_off")
else else
infobar:animateToState("hud_on") infobar:animateToState("hud_on")
end end
local validstates = { local validstates = {"hud_on", "active", "nosignal", "scrambled"}
"hud_on",
"active",
"nosignal",
"scrambled"
}
infobar:animateToState("minimap_off") infobar:animateToState("minimap_off")
for i = 1, #validstates do for i = 1, #validstates do
if (validstates[i] == root.hud.minimap.current_state) then if (validstates[i] == root.hud.minimap.current_state) then
infobar:animateToState("minimap_on") infobar:animateToState("minimap_on")
break break
end end
end end
end end
function populateinfobar(infobar) function populateinfobar(infobar)
elementoffset = 0 elementoffset = 0
if (Engine.GetDvarBool("cg_infobar_fps")) then if (Engine.GetDvarBool("cg_infobar_fps")) then
infobar:addElement(infoelement({ infobar:addElement(infoelement({
label = "FPS: ", label = Engine.Localize("@MPHUD_FPS"),
getvalue = function() getvalue = function()
return game:getfps() return game:getfps()
end, end,
width = 70, width = 70,
interval = 100 interval = 100
})) }))
end end
if (Engine.GetDvarBool("cg_infobar_ping")) then if (Engine.GetDvarBool("cg_infobar_ping")) then
infobar:addElement(infoelement({ infobar:addElement(infoelement({
label = "Latency: ", label = Engine.Localize("@MPHUD_LATENCY"),
getvalue = function() getvalue = function()
return game:getping() .. " ms" return game:getping() .. Engine.Localize("@MPHUD_LATENCY_MS")
end, end,
width = 115, width = 115,
interval = 100 interval = 100
})) }))
end end
updateinfobarvisibility() updateinfobarvisibility()
end end
function infoelement(data) function infoelement(data)
local container = LUI.UIElement.new({ local container = LUI.UIElement.new({
bottomAnchor = true, bottomAnchor = true,
leftAnchor = true, leftAnchor = true,
topAnchor = true, topAnchor = true,
width = data.width, width = data.width,
left = elementoffset left = elementoffset
}) })
elementoffset = elementoffset + data.width + 10 elementoffset = elementoffset + data.width + 10
local background = LUI.UIImage.new({ local background = LUI.UIImage.new({
bottomAnchor = true, bottomAnchor = true,
leftAnchor = true, leftAnchor = true,
topAnchor = true, topAnchor = true,
rightAnchor = true, rightAnchor = true,
material = luiglobals.RegisterMaterial("white"), material = luiglobals.RegisterMaterial("white"),
color = luiglobals.Colors.black, color = luiglobals.Colors.black,
alpha = 0.5 alpha = 0.5
}) })
local labelfont = CoD.TextSettings.FontBold110 local labelfont = CoD.TextSettings.FontBold110
local label = LUI.UIText.new({ local label = LUI.UIText.new({
left = 5, left = 5,
top = textoffsety, top = textoffsety,
font = labelfont.Font, font = labelfont.Font,
height = textheight, height = textheight,
leftAnchor = true, leftAnchor = true,
topAnchor = true, topAnchor = true,
color = { color = {
r = 0.8, r = 0.8,
g = 0.8, g = 0.8,
b = 0.8 b = 0.8
} }
}) })
label:setText(data.label) label:setText(data.label)
local _, _, left = luiglobals.GetTextDimensions(data.label, labelfont.Font, textheight) local _, _, left = luiglobals.GetTextDimensions(data.label, labelfont.Font, textheight)
local value = LUI.UIText.new({ local value = LUI.UIText.new({
left = left + 5, left = left + 5,
top = textoffsety, top = textoffsety,
font = labelfont.Font, font = labelfont.Font,
height = textheight, height = textheight,
leftAnchor = true, leftAnchor = true,
topAnchor = true, topAnchor = true,
color = { color = {
r = 0.6, r = 0.6,
g = 0.6, g = 0.6,
b = 0.6 b = 0.6
} }
}) })
value:addElement(LUI.UITimer.new(data.interval, "update")) value:addElement(LUI.UITimer.new(data.interval, "update"))
value:setText(data.getvalue()) value:setText(data.getvalue())
value:addEventHandler("update", function() value:addEventHandler("update", function()
value:setText(data.getvalue()) value:setText(data.getvalue())
end) end)
container:addElement(background) container:addElement(background)
container:addElement(label) container:addElement(label)
container:addElement(value) container:addElement(value)
return container return container
end end
local updatehudvisibility = mphud.updateHudVisibility local updatehudvisibility = mphud.updateHudVisibility
mphud.updateHudVisibility = function(a1, a2) mphud.updateHudVisibility = function(a1, a2)
updatehudvisibility(a1, a2) updatehudvisibility(a1, a2)
updateinfobarvisibility() updateinfobarvisibility()
end end
LUI.onmenuopen("mp_hud", function(hud) LUI.onmenuopen("mp_hud", function(hud)
if (Engine.InFrontend()) then if (Engine.InFrontend()) then
return return
end end
local infobar = createinfobar() local infobar = createinfobar()
local root = Engine.GetLuiRoot() local root = Engine.GetLuiRoot()
root.infobar = infobar root.infobar = infobar
root.hud = hud root.hud = hud
populateinfobar(infobar) populateinfobar(infobar)
root:registerEventHandler("update_hud_infobar_settings", function() root:registerEventHandler("update_hud_infobar_settings", function()
infobar:removeAllChildren() infobar:removeAllChildren()
populateinfobar(infobar) populateinfobar(infobar)
end) end)
root:processEvent({ root:processEvent({
name = "update_hud_infobar_settings" name = "update_hud_infobar_settings"
}) })
hud.static.scalable:addElement(infobar) hud.static.scalable:addElement(infobar)
end) end)

View File

@ -1,133 +1,121 @@
local pcdisplay = luiglobals.require("LUI.PCDisplay") local pcdisplay = luiglobals.require("LUI.PCDisplay")
function createdivider(menu, text) function createdivider(menu, text)
local element = LUI.UIElement.new({ local element = LUI.UIElement.new({
leftAnchor = true, leftAnchor = true,
rightAnchor = true, rightAnchor = true,
left = 0, left = 0,
right = 0, right = 0,
topAnchor = true, topAnchor = true,
bottomAnchor = false, bottomAnchor = false,
top = 0, top = 0,
bottom = 33.33 bottom = 33.33
}) })
element.scrollingToNext = true element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", { element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = text title_bar_text = text
})) }))
menu.list:addElement(element) menu.list:addElement(element)
end end
pcdisplay.CreateOptions = function(menu) pcdisplay.CreateOptions = function(menu)
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@LUA_MENU_COLORBLIND_FILTER", "@LUA_MENU_COLOR_BLIND_DESC", LUI.Options.GetRenderColorBlindText, "@LUA_MENU_COLORBLIND_FILTER", "@LUA_MENU_COLOR_BLIND_DESC", LUI.Options.GetRenderColorBlindText,
LUI.Options.RenderColorBlindToggle, LUI.Options.RenderColorBlindToggle) LUI.Options.RenderColorBlindToggle, LUI.Options.RenderColorBlindToggle)
if Engine.IsMultiplayer() and Engine.GetDvarType("cg_paintballFx") == luiglobals.DvarTypeTable.DvarBool then if Engine.IsMultiplayer() and Engine.GetDvarType("cg_paintballFx") == luiglobals.DvarTypeTable.DvarBool then
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@LUA_MENU_PAINTBALL", "@LUA_MENU_PAINTBALL_DESC", "@LUA_MENU_PAINTBALL", "@LUA_MENU_PAINTBALL_DESC",
LUI.Options.GetDvarEnableTextFunc("cg_paintballFx", false), LUI.Options.ToggleDvarFunc("cg_paintballFx"), LUI.Options.GetDvarEnableTextFunc("cg_paintballFx", false), LUI.Options.ToggleDvarFunc("cg_paintballFx"),
LUI.Options.ToggleDvarFunc("cg_paintballFx")) LUI.Options.ToggleDvarFunc("cg_paintballFx"))
end end
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, "@LUA_MENU_BLOOD", LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, "@LUA_MENU_BLOOD",
"@LUA_MENU_BLOOD_DESC", LUI.Options.GetDvarEnableTextFunc("cg_blood", false), LUI.Options "@LUA_MENU_BLOOD_DESC", LUI.Options.GetDvarEnableTextFunc("cg_blood", false), LUI.Options
.ToggleProfiledataFunc("showblood", Engine.GetControllerForLocalClient(0)), LUI.Options .ToggleProfiledataFunc("showblood", Engine.GetControllerForLocalClient(0)), LUI.Options
.ToggleProfiledataFunc("showblood", Engine.GetControllerForLocalClient(0))) .ToggleProfiledataFunc("showblood", Engine.GetControllerForLocalClient(0)))
if not Engine.IsMultiplayer() then if not Engine.IsMultiplayer() then
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@LUA_MENU_CROSSHAIR", "@LUA_MENU_CROSSHAIR_DESC", "@LUA_MENU_CROSSHAIR", "@LUA_MENU_CROSSHAIR_DESC",
LUI.Options.GetDvarEnableTextFunc("cg_drawCrosshairOption", false), LUI.Options.GetDvarEnableTextFunc("cg_drawCrosshairOption", false),
LUI.Options.ToggleDvarFunc("cg_drawCrosshairOption"), LUI.Options.ToggleDvarFunc("cg_drawCrosshairOption")) LUI.Options.ToggleDvarFunc("cg_drawCrosshairOption"), LUI.Options.ToggleDvarFunc("cg_drawCrosshairOption"))
LUI.Options.CreateOptionButton(menu, "cg_drawDamageFeedbackOption", "@LUA_MENU_HIT_MARKER", LUI.Options.CreateOptionButton(menu, "cg_drawDamageFeedbackOption", "@LUA_MENU_HIT_MARKER",
"@LUA_MENU_HIT_MARKER_DESC", {{ "@LUA_MENU_HIT_MARKER_DESC", {{
text = "@LUA_MENU_ENABLED", text = "@LUA_MENU_ENABLED",
value = true value = true
}, { }, {
text = "@LUA_MENU_DISABLED", text = "@LUA_MENU_DISABLED",
value = false value = false
}}) }})
end end
if Engine.IsMultiplayer() then if Engine.IsMultiplayer() then
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@MENU_DISPLAY_KILLSTREAK_COUNTER", "@MENU_DISPLAY_KILLSTREAK_COUNTER_DESC", "@MENU_DISPLAY_KILLSTREAK_COUNTER", "@MENU_DISPLAY_KILLSTREAK_COUNTER_DESC",
pcdisplay.GetDisplayKillstreakCounterText, pcdisplay.DisplayKillstreakCounterToggle, pcdisplay.GetDisplayKillstreakCounterText, pcdisplay.DisplayKillstreakCounterToggle,
pcdisplay.DisplayKillstreakCounterToggle) pcdisplay.DisplayKillstreakCounterToggle)
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@MENU_DISPLAY_MEDAL_SPLASHES", "@MENU_DISPLAY_MEDAL_SPLASHES_DESC", pcdisplay.GetDisplayMedalSplashesText, "@MENU_DISPLAY_MEDAL_SPLASHES", "@MENU_DISPLAY_MEDAL_SPLASHES_DESC", pcdisplay.GetDisplayMedalSplashesText,
pcdisplay.DisplayMedalSplashesToggle, pcdisplay.DisplayMedalSplashesToggle) pcdisplay.DisplayMedalSplashesToggle, pcdisplay.DisplayMedalSplashesToggle)
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select, LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Select,
"@MENU_DISPLAY_WEAPON_EMBLEMS", "@MENU_DISPLAY_WEAPON_EMBLEMS_DESC", pcdisplay.GetDisplayWeaponEmblemsText, "@MENU_DISPLAY_WEAPON_EMBLEMS", "@MENU_DISPLAY_WEAPON_EMBLEMS_DESC", pcdisplay.GetDisplayWeaponEmblemsText,
pcdisplay.DisplayWeaponEmblemsToggle, pcdisplay.DisplayWeaponEmblemsToggle) pcdisplay.DisplayWeaponEmblemsToggle, pcdisplay.DisplayWeaponEmblemsToggle)
end end
LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Common, "@MENU_BRIGHTNESS", LUI.Options.AddButtonOptionVariant(menu, luiglobals.GenericButtonSettings.Variants.Common, "@MENU_BRIGHTNESS",
"@MENU_BRIGHTNESS_DESC1", nil, nil, nil, pcdisplay.OpenBrightnessMenu, nil, nil, nil) "@MENU_BRIGHTNESS_DESC1", nil, nil, nil, pcdisplay.OpenBrightnessMenu, nil, nil, nil)
local reddotbounds = {
step = 0.2,
max = 4,
min = 0.2
}
local reddotbounds = { LUI.Options.AddButtonOptionVariant(menu, GenericButtonSettings.Variants.Slider, "@LUA_MENU_RED_DOT_BRIGHTNESS",
step = 0.2, "@LUA_MENU_RED_DOT_BRIGHTNESS_DESC", function()
max = 4, return (Engine.GetDvarFloat("r_redDotBrightnessScale") - reddotbounds.min) /
min = 0.2 (reddotbounds.max - reddotbounds.min)
} end, function()
Engine.SetDvarFloat("r_redDotBrightnessScale", math.min(reddotbounds.max, math.max(reddotbounds.min,
Engine.GetDvarFloat("r_redDotBrightnessScale") - reddotbounds.step)))
end, function()
Engine.SetDvarFloat("r_redDotBrightnessScale", math.min(reddotbounds.max, math.max(reddotbounds.min,
Engine.GetDvarFloat("r_redDotBrightnessScale") + reddotbounds.step)))
end)
LUI.Options.AddButtonOptionVariant( createdivider(menu, Engine.Localize("@LUA_MENU_TELEMETRY"))
menu,
GenericButtonSettings.Variants.Slider,
"@LUA_MENU_RED_DOT_BRIGHTNESS",
"@LUA_MENU_RED_DOT_BRIGHTNESS_DESC",
function()
return (Engine.GetDvarFloat( "r_redDotBrightnessScale" ) -
reddotbounds.min) / (reddotbounds.max - reddotbounds.min)
end,
function()
Engine.SetDvarFloat("r_redDotBrightnessScale",
math.min(reddotbounds.max,
math.max(reddotbounds.min, Engine.GetDvarFloat("r_redDotBrightnessScale") - reddotbounds.step))
)
end,
function()
Engine.SetDvarFloat("r_redDotBrightnessScale",
math.min(reddotbounds.max,
math.max(reddotbounds.min, Engine.GetDvarFloat("r_redDotBrightnessScale") + reddotbounds.step))
)
end
)
createdivider(menu, "TELEMETRY") LUI.Options.CreateOptionButton(menu, "cg_infobar_ping", "@LUA_MENU_LATENCY", "@LUA_MENU_LATENCY_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil, function(value)
Engine.SetDvarBool("cg_infobar_ping", value)
Engine.GetLuiRoot():processEvent({
name = "update_hud_infobar_settings"
})
end)
LUI.Options.CreateOptionButton(menu, "cg_infobar_ping", "@LUA_MENU_LATENCY", "@LUA_MENU_LATENCY_DESC", {{ LUI.Options.CreateOptionButton(menu, "cg_infobar_fps", "@LUA_MENU_FPS", "@LUA_MENU_FPS_DESC", {{
text = "@LUA_MENU_ENABLED", text = "@LUA_MENU_ENABLED",
value = true value = true
}, { }, {
text = "@LUA_MENU_DISABLED", text = "@LUA_MENU_DISABLED",
value = false value = false
}}, nil, nil, function(value) }}, nil, nil, function(value)
Engine.SetDvarBool("cg_infobar_ping", value) Engine.SetDvarBool("cg_infobar_fps", value)
Engine.GetLuiRoot():processEvent({ Engine.GetLuiRoot():processEvent({
name = "update_hud_infobar_settings" name = "update_hud_infobar_settings"
}) })
end) end)
LUI.Options.CreateOptionButton(menu, "cg_infobar_fps", "@LUA_MENU_FPS", "@LUA_MENU_FPS_DESC", {{ LUI.Options.InitScrollingList(menu.list, nil)
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil, function(value)
Engine.SetDvarBool("cg_infobar_fps", value)
Engine.GetLuiRoot():processEvent({
name = "update_hud_infobar_settings"
})
end)
LUI.Options.InitScrollingList(menu.list, nil)
end end

View File

@ -1,32 +1,32 @@
function createdivider(menu, text) function createdivider(menu, text)
local element = LUI.UIElement.new({ local element = LUI.UIElement.new({
leftAnchor = true, leftAnchor = true,
rightAnchor = true, rightAnchor = true,
left = 0, left = 0,
right = 0, right = 0,
topAnchor = true, topAnchor = true,
bottomAnchor = false, bottomAnchor = false,
top = 0, top = 0,
bottom = 33.33 bottom = 33.33
}) })
element.scrollingToNext = true element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", { element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = Engine.ToUpperCase(text) title_bar_text = Engine.ToUpperCase(text)
})) }))
element.text = element:getFirstChild():getFirstChild():getNextSibling() element.text = element:getFirstChild():getFirstChild():getNextSibling()
menu.list:addElement(element) menu.list:addElement(element)
return element return element
end end
function string:truncate(length) function string:truncate(length)
if (#self <= length) then if (#self <= length) then
return self return self
end end
return self:sub(1, length - 3) .. "..." return self:sub(1, length - 3) .. "..."
end end
if (game:issingleplayer()) then if (game:issingleplayer()) then
@ -41,75 +41,75 @@ if (game:issingleplayer()) then
end end
function getmodname(path) function getmodname(path)
local name = path local name = path
game:addlocalizedstring(name, name) game:addlocalizedstring(name, name)
local desc = Engine.Localize("LUA_MENU_MOD_DESC_DEFAULT", name) local desc = Engine.Localize("LUA_MENU_MOD_DESC_DEFAULT", name)
local infofile = path .. "/info.json" local infofile = path .. "/info.json"
if (io.fileexists(infofile)) then if (io.fileexists(infofile)) then
pcall(function() pcall(function()
local data = json.decode(io.readfile(infofile)) local data = json.decode(io.readfile(infofile))
game:addlocalizedstring(data.description, data.description) game:addlocalizedstring(data.description, data.description)
game:addlocalizedstring(data.author, data.author) game:addlocalizedstring(data.author, data.author)
game:addlocalizedstring(data.version, data.version) game:addlocalizedstring(data.version, data.version)
desc = Engine.Localize("@LUA_MENU_MOD_DESC", desc = Engine.Localize("@LUA_MENU_MOD_DESC", data.description, data.author, data.version)
data.description, data.author, data.version) name = data.name
name = data.name end)
end) end
end
return name, desc return name, desc
end end
LUI.MenuBuilder.registerType("mods_menu", function(a1) LUI.MenuBuilder.registerType("mods_menu", function(a1)
local menu = LUI.MenuTemplate.new(a1, { local menu = LUI.MenuTemplate.new(a1, {
menu_title = "@MENU_MODS", menu_title = "@MENU_MODS",
exclusiveController = 0, exclusiveController = 0,
menu_width = 400, menu_width = 400,
menu_top_indent = LUI.MenuTemplate.spMenuOffset, menu_top_indent = LUI.MenuTemplate.spMenuOffset,
showTopRightSmallBar = true showTopRightSmallBar = true,
}) uppercase_title = true
})
local modfolder = game:getloadedmod() local modfolder = game:getloadedmod()
if (modfolder ~= "") then if (modfolder ~= "") then
local name = getmodname(modfolder) local name = getmodname(modfolder)
createdivider(menu, Engine.Localize("@LUA_MENU_LOADED_MOD", name:truncate(24))) createdivider(menu, Engine.Localize("@LUA_MENU_LOADED_MOD", name:truncate(24)))
menu:AddButton("@LUA_MENU_UNLOAD", function() menu:AddButton("@LUA_MENU_UNLOAD", function()
Engine.Exec("unloadmod") Engine.Exec("unloadmod")
end, nil, true, nil, { end, nil, true, nil, {
desc_text = Engine.Localize("@LUA_MENU_UNLOAD_DESC") desc_text = Engine.Localize("@LUA_MENU_UNLOAD_DESC")
}) })
end end
createdivider(menu, Engine.Localize("@LUA_MENU_AVAILABLE_MODS")) createdivider(menu, Engine.Localize("@LUA_MENU_AVAILABLE_MODS"))
if (io.directoryexists("mods")) then if (io.directoryexists("mods")) then
local mods = io.listfiles("mods/") local mods = io.listfiles("mods/")
for i = 1, #mods do for i = 1, #mods do
if (io.directoryexists(mods[i]) and not io.directoryisempty(mods[i])) then if (io.directoryexists(mods[i]) and not io.directoryisempty(mods[i])) then
local name, desc = getmodname(mods[i]) local name, desc = getmodname(mods[i])
if (mods[i] ~= modfolder) then if (mods[i] ~= modfolder) then
game:addlocalizedstring(name, name) game:addlocalizedstring(name, name)
menu:AddButton(name, function() menu:AddButton(name, function()
Engine.Exec("loadmod " .. mods[i]) Engine.Exec("loadmod " .. mods[i])
end, nil, true, nil, { end, nil, true, nil, {
desc_text = desc desc_text = desc
}) })
end end
end end
end end
end end
menu:AddBackButton(function(a1) menu:AddBackButton(function(a1)
Engine.PlaySound(CoD.SFX.MenuBack) Engine.PlaySound(CoD.SFX.MenuBack)
LUI.FlowManager.RequestLeaveMenu(a1) LUI.FlowManager.RequestLeaveMenu(a1)
end) end)
LUI.Options.InitScrollingList(menu.list, nil) LUI.Options.InitScrollingList(menu.list, nil)
menu:CreateBottomDivider() menu:CreateBottomDivider()
menu.optionTextInfo = LUI.Options.AddOptionTextInfo(menu) menu.optionTextInfo = LUI.Options.AddOptionTextInfo(menu)
return menu return menu
end) end)

View File

@ -1,20 +1,22 @@
require("language")
if (game:issingleplayer()) then if (game:issingleplayer()) then
return return
end end
if (Engine.InFrontend()) then if (Engine.InFrontend()) then
require("shader_dialog") require("shader_dialog")
require("gamemodes") require("gamemodes")
require("no_mode_switch") require("no_mode_switch")
require("disable_useless_things") require("disable_useless_things")
end end
-- defined in mp_hud/hudutils.lua -- defined in mp_hud/hudutils.lua
function GetGameModeName() function GetGameModeName()
return Engine.Localize(Engine.TableLookup(GameTypesTable.File, return Engine.Localize(Engine.TableLookup(GameTypesTable.File, GameTypesTable.Cols.Ref, GameX.GetGameMode(),
GameTypesTable.Cols.Ref, GameX.GetGameMode(), GameTypesTable.Cols.Name)) GameTypesTable.Cols.Name))
end end
function NeverAllowChangeTeams() function NeverAllowChangeTeams()
return false return false
end end

View File

@ -0,0 +1,97 @@
local available_languages = {"english", "english_safe", "french", "german", "italian", "polish", "portuguese",
"russian", "spanish", "simplified_chinese", "traditional_chinese", "japanese_partial",
"korean"}
local current_language = "english"
LUI.UIButtonText.IsOffsetedLanguage = function()
return false
end
function get_current_language()
current_language = game:getcurrentgamelanguage()
end
function set_language(value)
local file_path = "players2/default/language"
local file = io.open(file_path, "w")
file:write(value)
file:close()
end
function does_zone_folder_exists(language)
return io.directoryexists("zone/" .. language)
end
get_current_language()
LUI.addmenubutton("pc_controls", {
index = 4,
text = "@MENU_LANGUAGE",
description = Engine.Localize("@LUA_MENU_CHOOSE_LANGUAGE"),
callback = function()
LUI.FlowManager.RequestAddMenu(nil, "choose_language_menu")
end
})
LUI.MenuBuilder.registerType("choose_language_menu", function(a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = "@LUA_MENU_CHOOSE_LANGUAGE",
menu_list_divider_top_offset = -(LUI.H1MenuTab.tabChangeHoldingElementHeight + H1MenuDims.spacing),
uppercase_title = true
})
function createdivider(menu, text)
local element = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = false,
left = 10,
right = 0,
topAnchor = true,
bottomAnchor = false,
top = 0,
bottom = 33.33
})
element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = text
}))
menu.list:addElement(element)
end
createdivider(menu, "^2" .. Engine.Localize("@LUA_MENU_DOWNLOAD") .. ": ^7https://docs.h1.gg/languages")
for i = 1, #available_languages do
if does_zone_folder_exists(available_languages[i]) then
menu:AddButton(Engine.Localize(string.format("MENU_%s", available_languages[i])), function()
LUI.yesnopopup({
title = Engine.Localize("@MENU_NOTICE"),
text = Engine.Localize("MENU_" .. current_language) .. "" ..
Engine.Localize("MENU_" .. available_languages[i]) .. "\n\n" ..
Engine.Localize("@LUA_MENU_CONFIRM_LANGUAGE") .. " " ..
Engine.Localize("@MENU_APPLY_LANGUAGE_SETTINGS"),
callback = function(result)
if (result) then
set_language(available_languages[i])
updater.relaunch()
else
LUI.FlowManager.RequestLeaveMenu(popup)
end
end
})
end, available_languages[i] == current_language, true, nil, {
desc_text = Engine.Localize("LOCALE_" .. (available_languages[i]))
})
end
end
LUI.Options.InitScrollingList(menu.list, nil, {
rows = 12
})
LUI.Options.AddOptionTextInfo(menu)
menu:AddBackButton()
return menu
end)

View File

@ -1,25 +1,25 @@
LUI.MenuBuilder.registerPopupType("ShaderCacheDialog_original", LUI.ShaderCacheDialog.new) LUI.MenuBuilder.registerPopupType("ShaderCacheDialog_original", LUI.ShaderCacheDialog.new)
local function dialog(...) local function dialog(...)
if (game:sharedget("has_accepted_shader_caching") == "1") then if (game:sharedget("has_accepted_shader_caching") == "1") then
return LUI.ShaderCacheDialog.new(...) return LUI.ShaderCacheDialog.new(...)
end end
return LUI.MenuBuilder.BuildRegisteredType("generic_yesno_popup", { return LUI.MenuBuilder.BuildRegisteredType("generic_yesno_popup", {
popup_title = Engine.Localize("@MENU_WARNING"), popup_title = Engine.Localize("@MENU_WARNING"),
message_text = Engine.Localize("@PLATFORM_SHADER_PRECACHE_ASK"), message_text = Engine.Localize("@PLATFORM_SHADER_PRECACHE_ASK"),
yes_action = function() yes_action = function()
game:sharedset("has_accepted_shader_caching", "1") game:sharedset("has_accepted_shader_caching", "1")
LUI.FlowManager.RequestAddMenu(nil, "ShaderCacheDialog_original") LUI.FlowManager.RequestAddMenu(nil, "ShaderCacheDialog_original")
end, end,
yes_text = Engine.Localize("@MENU_YES"), yes_text = Engine.Localize("@MENU_YES"),
no_text = Engine.Localize("@MENU_NO_DONT_ASK"), no_text = Engine.Localize("@MENU_NO_DONT_ASK"),
no_action = function() no_action = function()
Engine.SetDvarInt("r_preloadShadersFrontendAllow", 0) Engine.SetDvarInt("r_preloadShadersFrontendAllow", 0)
end, end,
default_focus_index = 2, default_focus_index = 2,
cancel_will_close = false cancel_will_close = false
}) })
end end
LUI.MenuBuilder.m_types_build["ShaderCacheDialog"] = dialog LUI.MenuBuilder.m_types_build["ShaderCacheDialog"] = dialog

View File

@ -2,257 +2,251 @@ local Lobby = luiglobals.Lobby
local SystemLinkJoinMenu = LUI.mp_menus.SystemLinkJoinMenu local SystemLinkJoinMenu = LUI.mp_menus.SystemLinkJoinMenu
if (not SystemLinkJoinMenu) then if (not SystemLinkJoinMenu) then
return return
end end
local columns = { local columns = {{
{ offset = 40,
offset = 40, text = "@MENU_HOST_NAME",
text = "@MENU_HOST_NAME", dataindex = 0
dataindex = 0 }, {
}, offset = 500,
{ text = "@MENU_MAP",
offset = 500, dataindex = 1
text = "@MENU_MAP", }, {
dataindex = 1 offset = 725,
}, text = "@MENU_TYPE1",
{ dataindex = 3
offset = 700, }, {
text = "@MENU_TYPE1", offset = 920,
dataindex = 3 text = "@MENU_NUMPLAYERS",
}, dataindex = 2
{ }, {
offset = 950, offset = 1070,
text = "@MENU_NUMPLAYERS", text = "@MENU_PING",
dataindex = 2 dataindex = 4
}, }, {
{ offset = 10,
offset = 1100, image = "s1_icon_locked",
text = "@MENU_PING", customelement = function(value, offset)
dataindex = 4 return LUI.UIImage.new({
}, leftAnchor = true,
{ topAnchor = true,
offset = 10, height = 20,
image = "s1_icon_locked", width = 20,
customelement = function(value, offset) left = offset,
return LUI.UIImage.new({ top = 2,
leftAnchor = true, material = RegisterMaterial(CoD.Material.RestrictedIcon),
topAnchor = true, alpha = value == "1" and 1 or 0,
height = 20, color = {
width = 20, r = 1,
left = offset, b = 1,
top = 2, g = 1
material = RegisterMaterial(CoD.Material.RestrictedIcon), }
alpha = value == "1" and 1 or 0, })
color = { end,
r = 1, dataindex = 5
b = 1, }}
g = 1
}
})
end,
dataindex = 5
}
}
function textlength(text, font, height) function textlength(text, font, height)
local _, _, width = luiglobals.GetTextDimensions(text, font, height) local _, _, width = luiglobals.GetTextDimensions(text, font, height)
return width return width
end end
function trimtext(text, font, height, maxwidth) function trimtext(text, font, height, maxwidth)
if (maxwidth < 0) then if (maxwidth < 0) then
return text return text
end end
while (textlength(text, font, height) > maxwidth) do while (textlength(text, font, height) > maxwidth) do
text = text:sub(1, #text - 1) text = text:sub(1, #text - 1)
end end
return text return text
end end
SystemLinkJoinMenu.AddHeaderButton = function(menu, f12_arg1, width) SystemLinkJoinMenu.AddHeaderButton = function(menu, f12_arg1, width)
local state = CoD.CreateState(0, f12_arg1, nil, nil, CoD.AnchorTypes.TopLeft) local state = CoD.CreateState(0, f12_arg1, nil, nil, CoD.AnchorTypes.TopLeft)
state.width = width state.width = width
local element = LUI.UIElement.new(state) local element = LUI.UIElement.new(state)
local button = SystemLinkJoinMenu.CreateButton("header", 24) local button = SystemLinkJoinMenu.CreateButton("header", 24)
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.TopLeftRight), 40, button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.TopLeftRight), 40,
LUI.Divider.Grey)) LUI.Divider.Grey))
button:makeNotFocusable() button:makeNotFocusable()
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.BottomLeftRight), 40, button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.BottomLeftRight), 40,
LUI.Divider.Grey)) LUI.Divider.Grey))
button.m_eventHandlers = {} button.m_eventHandlers = {}
for i = 1, #columns do for i = 1, #columns do
if (columns[i].text) then if (columns[i].text) then
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, Engine.Localize(columns[i].text), nil) SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, Engine.Localize(columns[i].text), nil)
elseif (columns[i].image) then elseif (columns[i].image) then
local image = LUI.UIImage.new({ local image = LUI.UIImage.new({
leftAnchor = true, leftAnchor = true,
topAnchor = true, topAnchor = true,
height = 20, height = 20,
width = 20, width = 20,
top = 2, top = 2,
left = columns[i].offset, left = columns[i].offset,
material = RegisterMaterial(columns[i].image) material = RegisterMaterial(columns[i].image)
}) })
button.textHolder:addElement(image) button.textHolder:addElement(image)
end end
end end
element:addElement(button) element:addElement(button)
menu:addElement(element) menu:addElement(element)
end end
SystemLinkJoinMenu.AddServerButton = function(menu, controller, index) SystemLinkJoinMenu.AddServerButton = function(menu, controller, index)
local button = SystemLinkJoinMenu.CreateButton(index or "header", 24) local button = SystemLinkJoinMenu.CreateButton(index or "header", 24)
button:makeFocusable() button:makeFocusable()
button.index = index button.index = index
button:addEventHandler("button_action", SystemLinkJoinMenu.OnJoinGame) button:addEventHandler("button_action", SystemLinkJoinMenu.OnJoinGame)
local gettext = function(i) local gettext = function(i)
local text = Lobby.GetServerData(controller, index, columns[i].dataindex) local text = Lobby.GetServerData(controller, index, columns[i].dataindex)
if (columns[i].customelement) then if (columns[i].customelement) then
text = columns[i].customelement(text) text = columns[i].customelement(text)
end end
local islast = not columns[i + 1] local islast = not columns[i + 1]
local end_ = islast and 1130 or columns[i + 1].offset local end_ = islast and 1130 or columns[i + 1].offset
local maxlength = end_ - columns[i].offset local maxlength = end_ - columns[i].offset
if (maxlength < 0) then if (maxlength < 0) then
maxlength = columns[i].offset - end_ maxlength = columns[i].offset - end_
end end
if (not islast) then if (not islast) then
maxlength = maxlength - 50 maxlength = maxlength - 50
end end
return trimtext(text, CoD.TextSettings.TitleFontSmall.Font, 14, maxlength) return trimtext(text, CoD.TextSettings.TitleFontSmall.Font, 14, maxlength)
end end
for i = 1, #columns do for i = 1, #columns do
if (columns[i].customelement) then if (columns[i].customelement) then
local value = Lobby.GetServerData(controller, index, columns[i].dataindex) local value = Lobby.GetServerData(controller, index, columns[i].dataindex)
local element = columns[i].customelement(value, columns[i].offset) local element = columns[i].customelement(value, columns[i].offset)
button.textHolder:addElement(element) button.textHolder:addElement(element)
else else
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, gettext(i), luiglobals.Colors.h1.medium_grey) SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, gettext(i),
end luiglobals.Colors.h1.medium_grey)
end end
end
menu.list:addElement(button) menu.list:addElement(button)
return button return button
end end
SystemLinkJoinMenu.MakeText = function(menu, f5_arg1, text, color) SystemLinkJoinMenu.MakeText = function(menu, f5_arg1, text, color)
local state = CoD.CreateState(f5_arg1, nil, f5_arg1 + 200, nil, CoD.AnchorTypes.Left) local state = CoD.CreateState(f5_arg1, nil, f5_arg1 + 200, nil, CoD.AnchorTypes.Left)
state.font = CoD.TextSettings.TitleFontSmall.Font state.font = CoD.TextSettings.TitleFontSmall.Font
state.top = -6 state.top = -6
state.height = 14 state.height = 14
state.alignment = nil state.alignment = nil
state.glow = LUI.GlowState.None state.glow = LUI.GlowState.None
state.color = color state.color = color
local el = LUI.UIText.new(state) local el = LUI.UIText.new(state)
el:registerAnimationState("focused", { el:registerAnimationState("focused", {
color = luiglobals.Colors.white color = luiglobals.Colors.white
}) })
el:registerEventHandler("focused", function(element, event) el:registerEventHandler("focused", function(element, event)
element:animateToState("focused", 0) element:animateToState("focused", 0)
end) end)
el:registerEventHandler("unfocused", function(element, event) el:registerEventHandler("unfocused", function(element, event)
element:animateToState("default", 0) element:animateToState("default", 0)
end) end)
el:setText(text) el:setText(text)
menu:addElement(el) menu:addElement(el)
return el return el
end end
function menu_systemlink_join(f19_arg0, f19_arg1) function menu_systemlink_join(f19_arg0, f19_arg1)
local width = 1145 local width = 1145
local menu = LUI.MenuTemplate.new(f19_arg0, { local menu = LUI.MenuTemplate.new(f19_arg0, {
menu_title = "@PLATFORM_SYSTEM_LINK_TITLE", menu_title = "@PLATFORM_SYSTEM_LINK_TITLE",
menu_width = width, menu_width = width,
menu_top_indent = 20, menu_top_indent = 20,
disableDeco = true, disableDeco = true,
spacing = 1 spacing = 1
}) })
SystemLinkJoinMenu.AddHeaderButton(menu, 80, width) SystemLinkJoinMenu.AddHeaderButton(menu, 80, width)
SystemLinkJoinMenu.AddLowerCounter(menu, width) SystemLinkJoinMenu.AddLowerCounter(menu, width)
SystemLinkJoinMenu.UpdateCounterText(menu, nil) SystemLinkJoinMenu.UpdateCounterText(menu, nil)
Lobby.BuildServerList(Engine.GetFirstActiveController()) Lobby.BuildServerList(Engine.GetFirstActiveController())
local playercount = LUI.UIText.new({ local playercount = LUI.UIText.new({
rightAnchor = true, rightAnchor = true,
topAnchor = true, topAnchor = true,
height = 18, height = 18,
bottom = 58, bottom = 58,
font = CoD.TextSettings.BodyFont.Font, font = CoD.TextSettings.BodyFont.Font,
width = 300, width = 300,
alignment = LUI.Alignment.Right, alignment = LUI.Alignment.Right
}) })
menu:addElement(playercount) menu:addElement(playercount)
local servercount = LUI.UIText.new({ local servercount = LUI.UIText.new({
rightAnchor = true, rightAnchor = true,
topAnchor = true, topAnchor = true,
height = 18, height = 18,
bottom = 58 - 25, bottom = 58 - 25,
font = CoD.TextSettings.BodyFont.Font, font = CoD.TextSettings.BodyFont.Font,
width = 300, width = 300,
alignment = LUI.Alignment.Right, alignment = LUI.Alignment.Right
}) })
menu:addElement(servercount) menu:addElement(servercount)
menu.list:registerEventHandler(LUI.UIScrollIndicator.UpdateEvent, function(element, event) menu.list:registerEventHandler(LUI.UIScrollIndicator.UpdateEvent, function(element, event)
SystemLinkJoinMenu.UpdateCounterText(menu, event) SystemLinkJoinMenu.UpdateCounterText(menu, event)
playercount:setText(Engine.Localize("@SERVERLIST_PLAYER_COUNT", serverlist:getplayercount())) playercount:setText(Engine.Localize("@SERVERLIST_PLAYER_COUNT", serverlist:getplayercount()))
servercount:setText(Engine.Localize("@SERVERLIST_SERVER_COUNT", serverlist:getservercount())) servercount:setText(Engine.Localize("@SERVERLIST_SERVER_COUNT", serverlist:getservercount()))
end) end)
SystemLinkJoinMenu.UpdateGameList(menu) SystemLinkJoinMenu.UpdateGameList(menu)
menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList) menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList)
LUI.ButtonHelperText.ClearHelperTextObjects(menu.help, { LUI.ButtonHelperText.ClearHelperTextObjects(menu.help, {
side = "all" side = "all"
}) })
menu:AddHelp({ menu:AddHelp({
name = "add_button_helper_text", name = "add_button_helper_text",
button_ref = "button_alt1", button_ref = "button_alt1",
helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"), helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"),
side = "right", side = "right",
clickable = true, clickable = true,
priority = -1000 priority = -1000
}, function(f21_arg0, f21_arg1) }, function(f21_arg0, f21_arg1)
SystemLinkJoinMenu.RefreshServers(f21_arg0, f21_arg1, menu) SystemLinkJoinMenu.RefreshServers(f21_arg0, f21_arg1, menu)
end) end)
menu:AddHelp({ menu:AddHelp({
name = "add_button_helper_text", name = "add_button_helper_text",
button_ref = "button_action", button_ref = "button_action",
helper_text = Engine.Localize("@MENU_JOIN_GAME1"), helper_text = Engine.Localize("@MENU_JOIN_GAME1"),
side = "left", side = "left",
clickable = false, clickable = false,
priority = -1000 priority = -1000
}, nil, nil, true) }, nil, nil, true)
menu:AddBackButton() menu:AddBackButton()
Lobby.RefreshServerList(Engine.GetFirstActiveController()) Lobby.RefreshServerList(Engine.GetFirstActiveController())
return menu return menu
end end
LUI.MenuBuilder.m_types_build["menu_systemlink_join"] = menu_systemlink_join LUI.MenuBuilder.m_types_build["menu_systemlink_join"] = menu_systemlink_join

View File

@ -1,145 +1,145 @@
if (game:issingleplayer() or not Engine.InFrontend()) then if (game:issingleplayer() or not Engine.InFrontend()) then
return return
end end
function createdivider(menu, text) function createdivider(menu, text)
local element = LUI.UIElement.new({ local element = LUI.UIElement.new({
leftAnchor = true, leftAnchor = true,
rightAnchor = true, rightAnchor = true,
left = 0, left = 0,
right = 0, right = 0,
topAnchor = true, topAnchor = true,
bottomAnchor = false, bottomAnchor = false,
top = 0, top = 0,
bottom = 33.33 bottom = 33.33
}) })
element.scrollingToNext = true element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", { element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = Engine.ToUpperCase(Engine.Localize(text)) title_bar_text = Engine.ToUpperCase(Engine.Localize(text))
})) }))
menu.list:addElement(element) menu.list:addElement(element)
end end
local personalizationbutton = LUI.MPLobbyBase.AddPersonalizationButton local personalizationbutton = LUI.MPLobbyBase.AddPersonalizationButton
LUI.MPLobbyBase.AddPersonalizationButton = function(menu) LUI.MPLobbyBase.AddPersonalizationButton = function(menu)
personalizationbutton(menu) personalizationbutton(menu)
menu:AddButton("@LUA_MENU_STATS", function() menu:AddButton("@LUA_MENU_STATS", function()
LUI.FlowManager.RequestAddMenu(nil, "stats_menu") LUI.FlowManager.RequestAddMenu(nil, "stats_menu")
end) end)
end end
LUI.MenuBuilder.registerType("stats_menu", function(a1) LUI.MenuBuilder.registerType("stats_menu", function(a1)
local menu = LUI.MenuTemplate.new(a1, { local menu = LUI.MenuTemplate.new(a1, {
menu_title = Engine.ToUpperCase(Engine.Localize("@LUA_MENU_STATS")), menu_title = Engine.ToUpperCase(Engine.Localize("@LUA_MENU_STATS")),
menu_width = luiglobals.GenericMenuDims.OptionMenuWidth menu_width = luiglobals.GenericMenuDims.OptionMenuWidth
}) })
createdivider(menu, "@LUA_MENU_SETTINGS") createdivider(menu, "@LUA_MENU_SETTINGS")
LUI.Options.CreateOptionButton(menu, "cg_unlockall_items", "@LUA_MENU_UNLOCKALL_ITEMS", LUI.Options.CreateOptionButton(menu, "cg_unlockall_items", "@LUA_MENU_UNLOCKALL_ITEMS",
"@LUA_MENU_UNLOCKALL_ITEMS_DESC", {{ "@LUA_MENU_UNLOCKALL_ITEMS_DESC", {{
text = "@LUA_MENU_ENABLED", text = "@LUA_MENU_ENABLED",
value = true value = true
}, { }, {
text = "@LUA_MENU_DISABLED", text = "@LUA_MENU_DISABLED",
value = false value = false
}}, nil, nil) }}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_loot", "@LUA_MENU_UNLOCKALL_LOOT", LUI.Options.CreateOptionButton(menu, "cg_unlockall_loot", "@LUA_MENU_UNLOCKALL_LOOT",
"@LUA_MENU_UNLOCKALL_LOOT_DESC", {{ "@LUA_MENU_UNLOCKALL_LOOT_DESC", {{
text = "@LUA_MENU_ENABLED", text = "@LUA_MENU_ENABLED",
value = true value = true
}, { }, {
text = "@LUA_MENU_DISABLED", text = "@LUA_MENU_DISABLED",
value = false value = false
}}, nil, nil) }}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_classes", "@LUA_MENU_UNLOCKALL_CLASSES", LUI.Options.CreateOptionButton(menu, "cg_unlockall_classes", "@LUA_MENU_UNLOCKALL_CLASSES",
"@LUA_MENU_UNLOCKALL_CLASSES_DESC", {{ "@LUA_MENU_UNLOCKALL_CLASSES_DESC", {{
text = "@LUA_MENU_ENABLED", text = "@LUA_MENU_ENABLED",
value = true value = true
}, { }, {
text = "@LUA_MENU_DISABLED", text = "@LUA_MENU_DISABLED",
value = false value = false
}}, nil, nil) }}, nil, nil)
createdivider(menu, "@LUA_MENU_EDIT_STATS") createdivider(menu, "@LUA_MENU_EDIT_STATS")
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0 local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0 local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local rank = Lobby.GetRankForXP(experience, prestige) local rank = Lobby.GetRankForXP(experience, prestige)
prestigeeditbutton(menu, function(value) prestigeeditbutton(menu, function(value)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "prestige", tonumber(value)) Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "prestige", tonumber(value))
end) end)
rankeditbutton(menu, function(value) rankeditbutton(menu, function(value)
local rank = tonumber(value) local rank = tonumber(value)
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0 local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = rank == 0 and 0 or Rank.GetRankMaxXP(tonumber(value) - 1, prestige) local experience = rank == 0 and 0 or Rank.GetRankMaxXP(tonumber(value) - 1, prestige)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "experience", experience) Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "experience", experience)
end) end)
LUI.Options.InitScrollingList(menu.list, nil) LUI.Options.InitScrollingList(menu.list, nil)
LUI.Options.AddOptionTextInfo(menu) LUI.Options.AddOptionTextInfo(menu)
menu:AddBackButton() menu:AddBackButton()
return menu return menu
end) end)
function prestigeeditbutton(menu, callback) function prestigeeditbutton(menu, callback)
local options = {} local options = {}
local max = Lobby.GetMaxPrestigeLevel() local max = Lobby.GetMaxPrestigeLevel()
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0 local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
for i = 0, max do for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "") game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
table.insert(options, { table.insert(options, {
text = "@" .. i, text = "@" .. i,
value = i .. "" value = i .. ""
}) })
end end
Engine.SetDvarFromString("ui_prestige_level", prestige .. "") Engine.SetDvarFromString("ui_prestige_level", prestige .. "")
LUI.Options.CreateOptionButton(menu, "ui_prestige_level", "@LUA_MENU_PRESTIGE", "@LUA_MENU_PRESTIGE_DESC", options, LUI.Options.CreateOptionButton(menu, "ui_prestige_level", "@LUA_MENU_PRESTIGE", "@LUA_MENU_PRESTIGE_DESC", options,
nil, nil, callback) nil, nil, callback)
end end
function rankeditbutton(menu, callback) function rankeditbutton(menu, callback)
local options = {} local options = {}
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0 local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0 local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local rank = Lobby.GetRankForXP(experience, prestige) local rank = Lobby.GetRankForXP(experience, prestige)
local max = Rank.GetMaxRank(prestige) local max = Rank.GetMaxRank(prestige)
local maxprestige = Lobby.GetMaxPrestigeLevel() local maxprestige = Lobby.GetMaxPrestigeLevel()
for i = 0, max do for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "") game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
table.insert(options, { table.insert(options, {
text = "@" .. (i + 1), text = "@" .. (i + 1),
value = i .. "" value = i .. ""
}) })
end end
Engine.SetDvarFromString("ui_rank_level_", rank .. "") Engine.SetDvarFromString("ui_rank_level_", rank .. "")
return LUI.Options.CreateOptionButton(menu, "ui_rank_level_", "@LUA_MENU_RANK", "@LUA_MENU_RANK_DESC", options, nil, return LUI.Options.CreateOptionButton(menu, "ui_rank_level_", "@LUA_MENU_RANK", "@LUA_MENU_RANK_DESC", options, nil,
nil, callback) nil, callback)
end end
local isclasslocked = Cac.IsCustomClassLocked local isclasslocked = Cac.IsCustomClassLocked
Cac.IsCustomClassLocked = function(...) Cac.IsCustomClassLocked = function(...)
if (Engine.GetDvarBool("cg_unlockall_classes")) then if (Engine.GetDvarBool("cg_unlockall_classes")) then
return false return false
end end
return isclasslocked(...) return isclasslocked(...)
end end

View File

@ -1,2 +1,14 @@
deu_h1_mod_common
eng_h1_mod_common eng_h1_mod_common
ens_h1_mod_common
fra_h1_mod_common
h1_mod_common h1_mod_common
ita_h1_mod_common
jpp_h1_mod_common
kor_h1_mod_common
pol_h1_mod_common
por_h1_mod_common
rus_h1_mod_common
sch_h1_mod_common
spa_h1_mod_common
tch_h1_mod_common

View File

@ -0,0 +1 @@
localize,german
1 localize german

View File

@ -0,0 +1 @@
localize,english_safe
1 localize english_safe

View File

@ -0,0 +1 @@
localize,french
1 localize french

View File

@ -1 +1,2 @@
localize,english localize,english
ttf,fonts/default.otf
1 localize english
2 ttf fonts/default.otf

View File

@ -0,0 +1 @@
localize,italian
1 localize italian

View File

@ -0,0 +1 @@
localize,japanese_partial
1 localize japanese_partial

View File

@ -0,0 +1 @@
localize,korean
1 localize korean

View File

@ -0,0 +1 @@
localize,polish
1 localize polish

View File

@ -0,0 +1 @@
localize,portuguese
1 localize portuguese

View File

@ -0,0 +1 @@
localize,russian
1 localize russian

View File

@ -0,0 +1 @@
localize,simplified_chinese
1 localize simplified_chinese

View File

@ -0,0 +1 @@
localize,spanish
1 localize spanish

View File

@ -0,0 +1 @@
localize,traditional_chinese
1 localize traditional_chinese

Binary file not shown.

View File

@ -49,5 +49,47 @@
"LUA_MENU_SAVE": "Save changes", "LUA_MENU_SAVE": "Save changes",
"LUA_MENU_SAVE_DESC": "Save changes.", "LUA_MENU_SAVE_DESC": "Save changes.",
"LUA_MENU_SETTINGS": "Settings", "LUA_MENU_SETTINGS": "Settings",
"LUA_MENU_EDIT_STATS": "Edit Stats" "LUA_MENU_EDIT_STATS": "Edit Stats",
"UPDATER_POPUP_NO_UPDATES_AVAILABLE": "No updates available",
"UPDATER_POPUP_AVAILABLE_UPDATE_TEXT": "An update is available, proceed with installation?",
"UPDATER_POPUP_SUCCESSFUL": "Update successful",
"UPDATER_POPUP_RESTART_POPUP_TEXT": "Update requires restart",
"UPDATER_POPUP_CHECKING_FOR_UPDATES": "Checking for updates...",
"MPHUD_FPS": "FPS: ",
"MPHUD_LATENCY": "Latency: ",
"MPHUD_LATENCY_MS": " ms",
"LUA_MENU_TELEMETRY": "TELEMETRY",
"MENU_ENGLISH": "English",
"MENU_ENGLISH_SAFE": "English (Safe)",
"MENU_FRENCH": "Français",
"MENU_GERMAN": "Deutsch",
"MENU_ITALIAN": "Italiano",
"MENU_JAPANESE_PARTIAL": "日本語(一部)",
"MENU_KOREAN": "한국어",
"MENU_POLISH": "Polski",
"MENU_PORTUGUESE": "Português",
"MENU_RUSSIAN": "Русский",
"MENU_SIMPLIFIED_CHINESE": "简体中文",
"MENU_SPANISH": "Español",
"MENU_TRADITIONAL_CHINESE": "繁體中文",
"LOCALE_ENGLISH": "English",
"LOCALE_ENGLISH_SAFE": "English (Safe)",
"LOCALE_FRENCH": "French",
"LOCALE_GERMAN": "German",
"LOCALE_ITALIAN": "Italian",
"LOCALE_JAPANESE_PARTIAL": "Japanese (Partial)",
"LOCALE_KOREAN": "Korean",
"LOCALE_POLISH": "Polish",
"LOCALE_PORTUGUESE": "Portuguese",
"LOCALE_RUSSIAN": "Russian",
"LOCALE_SIMPLIFIED_CHINESE": "Simplified Chinese",
"LOCALE_SPANISH": "Spanish",
"LOCALE_TRADITIONAL_CHINESE": "Traditional Chinese",
"LUA_MENU_CHOOSE_LANGUAGE": "Choose your language",
"MENU_APPLY_LANGUAGE_SETTINGS": "Apply language settings?"
} }

View File

@ -0,0 +1,95 @@
{
"CUSTOM_DEPOT_EULA_1": "Dear User,",
"CUSTOM_DEPOT_EULA_2": "By using this feature, you acknowledge that you are over the age of 18 years old, and that any sort of gambling is allowed in your country. (even if they do not involve real money)",
"CUSTOM_DEPOT_EULA_3": "The H1-mod team is not responsible if you break any law within your country, and the sole responsibility will be upon you to respect the same.",
"CUSTOM_DEPOT_EULA_4": "The H1-mod team will never include real money transactions within the modified systems. The only way to get currency, should you wish to, is by playing the game.",
"CUSTOM_DEPOT_EULA_5": "Best regards,",
"CUSTOM_DEPOT_EULA_6": "The H1-mod team.",
"LUA_MENU_FPS": "FPS Counter",
"LUA_MENU_FPS_DESC": "Show FPS counter.",
"LUA_MENU_LATENCY": "Server Latency",
"LUA_MENU_LATENCY_DESC": "Show server latency.",
"LUA_MENU_RED_DOT_BRIGHTNESS": "Red Dot Brightness",
"LUA_MENU_RED_DOT_BRIGHTNESS_DESC": "Adjust the brightness of red dot reticles.",
"MENU_SYSINFO_CUSTOMER_SUPPORT_URL": "https://h1.gg/",
"MENU_MODS": "MODS",
"MENU_MODS_DESC": "Load installed mods.",
"LUA_MENU_MOD_DESC_DEFAULT": "Load &&1.",
"LUA_MENU_MOD_DESC": "&&1\nAuthor: &&2\nVersion: &&3",
"LUA_MENU_LOADED_MOD": "Loaded mod: ^2&&1",
"LUA_MENU_AVAILABLE_MODS": "Available mods",
"LUA_MENU_UNLOAD": "Unload",
"LUA_MENU_UNLOAD_DESC": "Unload the currently loaded mod.",
"PLATFORM_SHADER_PRECACHE_ASK": "Would you like to populate the shader cache? It may cause crashes with certain GPUs (e.g. RTX cards) but will improve performance if successful.",
"MENU_NO_DONT_ASK": "No, don't ask me again",
"LUA_MENU_SERVERLIST": "SERVER LIST",
"MENU_NUMPLAYERS": "Players",
"MENU_PING": "Ping",
"SERVERLIST_PLAYER_COUNT": "&&1 Players",
"SERVERLIST_SERVER_COUNT": "&&1 Servers",
"LUA_MENU_STATS": "Stats",
"LUA_MENU_STATS_DESC": "Edit player stats settings.",
"LUA_MENU_UNLOCKALL_ITEMS": "Unlock all items",
"LUA_MENU_UNLOCKALL_ITEMS_DESC": "Whether items should be locked based on the player's stats or always unlocked.",
"LUA_MENU_UNLOCKALL_LOOT": "Unlock all loot",
"LUA_MENU_UNLOCKALL_LOOT_DESC": "Whether loot should be locked based on the player's stats or always unlocked.",
"LUA_MENU_UNLOCKALL_CLASSES": "Unlock all classes",
"LUA_MENU_UNLOCKALL_CLASSES_DESC": "Whether classes should be locked based on the player's stats or always unlocked.",
"LUA_MENU_PRESTIGE": "Prestige",
"LUA_MENU_PRESTIGE_DESC": "Edit prestige level.",
"LUA_MENU_RANK": "Rank",
"LUA_MENU_RANK_DESC": "Edit rank.",
"LUA_MENU_UNSAVED_CHANGES": "You have unsaved changes: are you sure you want to exit?",
"LUA_MENU_SAVE": "Save changes",
"LUA_MENU_SAVE_DESC": "Save changes.",
"LUA_MENU_SETTINGS": "Settings",
"LUA_MENU_EDIT_STATS": "Edit Stats",
"UPDATER_POPUP_NO_UPDATES_AVAILABLE": "No updates available",
"UPDATER_POPUP_AVAILABLE_UPDATE_TEXT": "An update is available, proceed with installation?",
"UPDATER_POPUP_SUCCESSFUL": "Update successful",
"UPDATER_POPUP_RESTART_POPUP_TEXT": "Update requires restart",
"UPDATER_POPUP_CHECKING_FOR_UPDATES": "Checking for updates...",
"MPHUD_FPS": "FPS: ",
"MPHUD_LATENCY": "Latency: ",
"MPHUD_LATENCY_MS": " ms",
"LUA_MENU_TELEMETRY": "TELEMETRY",
"MENU_ENGLISH": "English",
"MENU_ENGLISH_SAFE": "English (Safe)",
"MENU_FRENCH": "Français",
"MENU_GERMAN": "Deutsch",
"MENU_ITALIAN": "Italiano",
"MENU_JAPANESE_PARTIAL": "日本語(一部)",
"MENU_KOREAN": "한국어",
"MENU_POLISH": "Polski",
"MENU_PORTUGUESE": "Português",
"MENU_RUSSIAN": "Русский",
"MENU_SIMPLIFIED_CHINESE": "简体中文",
"MENU_SPANISH": "Español",
"MENU_TRADITIONAL_CHINESE": "繁體中文",
"LOCALE_ENGLISH": "English",
"LOCALE_ENGLISH_SAFE": "English (Safe)",
"LOCALE_FRENCH": "French",
"LOCALE_GERMAN": "German",
"LOCALE_ITALIAN": "Italian",
"LOCALE_JAPANESE_PARTIAL": "Japanese (Partial)",
"LOCALE_KOREAN": "Korean",
"LOCALE_POLISH": "Polish",
"LOCALE_PORTUGUESE": "Portuguese",
"LOCALE_RUSSIAN": "Russian",
"LOCALE_SIMPLIFIED_CHINESE": "Simplified Chinese",
"LOCALE_SPANISH": "Spanish",
"LOCALE_TRADITIONAL_CHINESE": "Traditional Chinese",
"LUA_MENU_CHOOSE_LANGUAGE": "Choose your language",
"MENU_APPLY_LANGUAGE_SETTINGS": "Apply language settings?"
}

View File

@ -0,0 +1,76 @@
{
"LUA_MENU_FPS": "Compteur d'IPS",
"LUA_MENU_FPS_DESC": "Afficher le compteur d'IPS.",
"LUA_MENU_LATENCY": "Latence du serveur",
"LUA_MENU_LATENCY_DESC": "Afficher la latence du serveur",
"LUA_MENU_RED_DOT_BRIGHTNESS": "Luminosité du point rouge",
"LUA_MENU_RED_DOT_BRIGHTNESS_DESC": "Ajustez la luminosité du point rouge des réticules.",
"MENU_MODS": "MODS",
"MENU_MODS_DESC": "Charger les mods installés.",
"LUA_MENU_MOD_DESC_DEFAULT": "Charger &&1.",
"LUA_MENU_MOD_DESC": "&&1\nAuteur: &&2\nVersion: &&3",
"LUA_MENU_LOADED_MOD": "Mod chargé: ^2&&1",
"LUA_MENU_AVAILABLE_MODS": "Mods disponibles",
"LUA_MENU_UNLOAD": "Décharger",
"LUA_MENU_UNLOAD_DESC": "Déchargez le mod actuellement chargé.",
"PLATFORM_SHADER_PRECACHE_ASK": "Souhaitez-vous remplir le cache de shader ? Cela peut provoquer des plantages avec certains GPU (par exemple, les cartes RTX), mais améliorera les performances en cas de succès.",
"MENU_NO_DONT_ASK": "Non, ne plus me le demander",
"LUA_MENU_SERVERLIST": "LISTE DES SERVEURS",
"MENU_NUMPLAYERS": "Joueurs",
"MENU_PING": "Latence",
"SERVERLIST_PLAYER_COUNT": "&&1 Joueurs",
"SERVERLIST_SERVER_COUNT": "&&1 Serveurs",
"LUA_MENU_STATS": "Stats",
"LUA_MENU_STATS_DESC": "Modifier les paramètres des statistiques du joueur.",
"LUA_MENU_UNLOCKALL_ITEMS": "Déverrouiller tous les éléments",
"LUA_MENU_UNLOCKALL_ITEMS_DESC": "Si les éléments doivent être verrouillés en fonction des statistiques du joueur ou toujours déverrouillés.",
"LUA_MENU_UNLOCKALL_LOOT": "Débloquez tout le butin",
"LUA_MENU_UNLOCKALL_LOOT_DESC": "Si le butin doit être verrouillé en fonction des statistiques du joueur ou toujours déverrouillé.",
"LUA_MENU_UNLOCKALL_CLASSES": "Débloquer toutes les classes",
"LUA_MENU_UNLOCKALL_CLASSES_DESC": "Si les classes doivent être verrouillées en fonction des statistiques du joueur ou toujours déverrouillées.",
"LUA_MENU_PRESTIGE": "Prestige",
"LUA_MENU_PRESTIGE_DESC": "Modifier le niveau de prestige.",
"LUA_MENU_RANK": "Grade",
"LUA_MENU_RANK_DESC": "Modifier le grade.",
"LUA_MENU_UNSAVED_CHANGES": "Vous avez des modifications non enregistrées, êtes-vous sûr de vouloir quitter ?",
"LUA_MENU_SAVE": "Sauvegarder les modifications",
"LUA_MENU_SAVE_DESC": "Sauvegarder les modifications.",
"LUA_MENU_SETTINGS": "Paramètres",
"LUA_MENU_EDIT_STATS": "Modifier les statistiques",
"UPDATER_POPUP_NO_UPDATES_AVAILABLE": "Aucune mise à jour disponible",
"UPDATER_POPUP_AVAILABLE_UPDATE_TEXT": "Une mise à jour est disponible,\npoursuivre l'installation ?",
"UPDATER_POPUP_SUCCESSFUL": "Mise à jour réussie",
"UPDATER_POPUP_RESTART_POPUP_TEXT": "La mise à jour nécessite un redémarrage",
"UPDATER_POPUP_CHECKING_FOR_UPDATES": "Vérification des mises à jour...",
"MPHUD_FPS": "IPS: ",
"MPHUD_LATENCY": "Latence: ",
"MPHUD_LATENCY_MS": " ms",
"LUA_MENU_TELEMETRY": "TÉLÉMÉTRIE",
"LOCALE_ENGLISH": "Anglais",
"LOCALE_ENGLISH_SAFE": "Anglais (sécuritaire)",
"LOCALE_FRENCH": "Français",
"LOCALE_GERMAN": "Allemand",
"LOCALE_ITALIAN": "Italien",
"LOCALE_JAPANESE_PARTIAL": "Japonais (partiel)",
"LOCALE_KOREAN": "Coréen",
"LOCALE_POLISH": "Polonais",
"LOCALE_PORTUGUESE": "Portugais",
"LOCALE_RUSSIAN": "Russe",
"LOCALE_SIMPLIFIED_CHINESE": "Chinois simplifié",
"LOCALE_SPANISH": "Espagnol",
"LOCALE_TRADITIONAL_CHINESE": "Chinois traditionnel",
"LUA_MENU_CHOOSE_LANGUAGE": "Choisissez la langue",
"LUA_MENU_MULTIPLAYER_CAPS": "H1-MOD: MULTIJOUEUR\n",
"MENU_MULTIPLAYER_CAPS": "H1-MOD: MULTIJOUEUR\n",
"PLATFORM_SYSTEM_LINK_TITLE": "LISTE DES SERVEURS"
}

View File

@ -0,0 +1,15 @@
{
"LOCALE_ENGLISH": "Englisch",
"LOCALE_ENGLISH_SAFE": "Englisch (Sicher)",
"LOCALE_FRENCH": "Französisch",
"LOCALE_GERMAN": "Deutsch",
"LOCALE_ITALIAN": "Italienisch",
"LOCALE_JAPANESE_PARTIAL": "Japanisch (Untertitelt)",
"LOCALE_KOREAN": "Koreanisch",
"LOCALE_POLISH": "Polnisch",
"LOCALE_PORTUGUESE": "Portugiesisch",
"LOCALE_RUSSIAN": "Russisch",
"LOCALE_SIMPLIFIED_CHINESE": "Vereinfachtes Chinesisch",
"LOCALE_SPANISH": "Spanisch",
"LOCALE_TRADITIONAL_CHINESE": "Traditionelles Chinesisch"
}

View File

@ -0,0 +1,23 @@
{
"MENU_MODS_DESC": "Abilita mod installate.",
"LUA_MENU_MOD_DESC_DEFAULT": "Abilita &&1.",
"LUA_MENU_MOD_DESC": "&&1\nAutore: &&2\nVersione: &&3",
"LUA_MENU_LOADED_MOD": "Mod attiva: ^2&&1",
"LUA_MENU_AVAILABLE_MODS": "Mod disponibili",
"LUA_MENU_UNLOAD": "Disabilita",
"LUA_MENU_UNLOAD_DESC": "Disabilita la mod attualmente attiva.",
"LOCALE_ENGLISH": "Inglese",
"LOCALE_ENGLISH_SAFE": "Inglese (sicuro)",
"LOCALE_FRENCH": "Francese",
"LOCALE_GERMAN": "Tedesco",
"LOCALE_ITALIAN": "Italiano",
"LOCALE_JAPANESE_PARTIAL": "Giapponese (parziale)",
"LOCALE_KOREAN": "Coreano",
"LOCALE_POLISH": "Polacco",
"LOCALE_PORTUGUESE": "Portoghese",
"LOCALE_RUSSIAN": "Russo",
"LOCALE_SIMPLIFIED_CHINESE": "Cinese semplificato",
"LOCALE_SPANISH": "Spagnolo",
"LOCALE_TRADITIONAL_CHINESE": "Cinese tradizionale"
}

View File

@ -0,0 +1,15 @@
{
"LOCALE_ENGLISH": "英語",
"LOCALE_ENGLISH_SAFE": "英語(検閲)",
"LOCALE_FRENCH": "フランス語",
"LOCALE_GERMAN": "ドイツ語",
"LOCALE_ITALIAN": "イタリア語",
"LOCALE_JAPANESE_PARTIAL": "日本語(一部)",
"LOCALE_KOREAN": "韓国語",
"LOCALE_POLISH": "ポーランド語",
"LOCALE_PORTUGUESE": "ポルトガル語",
"LOCALE_RUSSIAN": "ロシア語",
"LOCALE_SIMPLIFIED_CHINESE": "簡体字中国語",
"LOCALE_SPANISH": "スペイン語",
"LOCALE_TRADITIONAL_CHINESE": "繁体字中国語"
}

View File

@ -0,0 +1,15 @@
{
"LOCALE_ENGLISH": "영어",
"LOCALE_ENGLISH_SAFE": "영어(검열)",
"LOCALE_FRENCH": "프랑스어",
"LOCALE_GERMAN": "독일어",
"LOCALE_ITALIAN": "이탈리아어",
"LOCALE_JAPANESE_PARTIAL": "일본어(일부)",
"LOCALE_KOREAN": "한국어",
"LOCALE_POLISH": "폴란드어",
"LOCALE_PORTUGUESE": "포르투갈어",
"LOCALE_RUSSIAN": "러시아어",
"LOCALE_SIMPLIFIED_CHINESE": "중국어(간체)",
"LOCALE_SPANISH": "스페인어",
"LOCALE_TRADITIONAL_CHINESE": "중국어(번체)"
}

View File

@ -0,0 +1,15 @@
{
"LOCALE_ENGLISH": "Angielski",
"LOCALE_ENGLISH_SAFE": "Angielski (cenzuralny)",
"LOCALE_FRENCH": "Francuski",
"LOCALE_GERMAN": "Niemiecki",
"LOCALE_ITALIAN": "Włoski",
"LOCALE_JAPANESE_PARTIAL": "Japoński (częściowy)",
"LOCALE_KOREAN": "Koreański",
"LOCALE_POLISH": "Polski",
"LOCALE_PORTUGUESE": "Portugalski",
"LOCALE_RUSSIAN": "Rosyjski",
"LOCALE_SIMPLIFIED_CHINESE": "Chiński uproszczony",
"LOCALE_SPANISH": "Hiszpański",
"LOCALE_TRADITIONAL_CHINESE": "Chiński tradycyjny"
}

View File

@ -0,0 +1,15 @@
{
"LOCALE_ENGLISH": "Inglês",
"LOCALE_ENGLISH_SAFE": "Inglês (Censurado)",
"LOCALE_FRENCH": "Français",
"LOCALE_GERMAN": "Alemão",
"LOCALE_ITALIAN": "Italiano",
"LOCALE_JAPANESE_PARTIAL": "Japonês (Parcial)",
"LOCALE_KOREAN": "Coreano",
"LOCALE_POLISH": "Polonês",
"LOCALE_PORTUGUESE": "Português",
"LOCALE_RUSSIAN": "Russo",
"LOCALE_SIMPLIFIED_CHINESE": "Chinês simplificado",
"LOCALE_SPANISH": "Español",
"LOCALE_TRADITIONAL_CHINESE": "Chinês tradicional"
}

View File

@ -0,0 +1,595 @@
{
"CUSTOM_DEPOT_EULA_1": "Уважаемый игрок,",
"CUSTOM_DEPOT_EULA_2": "Используя эту функцию, вы подтверждаете, что вам исполнилось 18 лет и что в вашей стране разрешены азартные игры и сюрприз-механики (даже если они в них не вовлечены реальные деньги)",
"CUSTOM_DEPOT_EULA_3": "Команда H1-mod не несет ответственности, если вы нарушите какой-либо закон у себя в стране, и вы несете исключительную ответственность за соблюдение правил.",
"CUSTOM_DEPOT_EULA_4": "Команда H1-mod никогда не добавит микротранзакции с реальными деньгами в свой мод. Единственный способ получить внутриигровую валюту, если вы того захотите, это играть в игру.",
"CUSTOM_DEPOT_EULA_5": "С наилучшими пожеланиями,",
"CUSTOM_DEPOT_EULA_6": "Команда H1-mod.",
"LUA_MENU_FPS": "Счетчик кадров",
"LUA_MENU_FPS_DESC": "Показывать частоту кадров в секунду (FPS).",
"LUA_MENU_LATENCY": "Задержка до сервера",
"LUA_MENU_LATENCY_DESC": "Показывать пинг до сервера.",
"LUA_MENU_RED_DOT_BRIGHTNESS": "Яркость коллиматора",
"LUA_MENU_RED_DOT_BRIGHTNESS_DESC": "Регулировка яркости красной точки коллиматорных прицелов.",
"MENU_MODS": "МОДЫ",
"MENU_MODS_DESC": "Запуск установленных модов.",
"LUA_MENU_MOD_DESC_DEFAULT": "Запустить &&1.",
"LUA_MENU_MOD_DESC": "&&1\nАвтор: &&2\nВерсия: &&3.",
"LUA_MENU_LOADED_MOD": "Запущенный мод: ^3&&1",
"LUA_MENU_AVAILABLE_MODS": "Доступные моды",
"LUA_MENU_UNLOAD": "Выгрузить",
"LUA_MENU_UNLOAD_DESC": "Выгрузить из игры запущенный сейчас мод.",
"PLATFORM_SHADER_PRECACHE_ASK": "Хотите скомпилировать шейдеры? С некоторыми видеокартами (например, серии GeForce RTX, GTX 16xx) это может привести к вылетам игры, но в общем случае повысит производительность.",
"MENU_NO_DONT_ASK": "Нет, больше не спрашивать",
"LUA_MENU_SERVERLIST": "Список серверов",
"MENU_NUMPLAYERS": "Игроки [+боты]",
"MENU_PING": "Пинг",
"SERVERLIST_PLAYER_COUNT": "Игроков: &&1",
"SERVERLIST_SERVER_COUNT": "Серверов: &&1",
"LUA_MENU_STATS": "Статистика",
"LUA_MENU_STATS_DESC": "Изменение статистических показателей игрока.",
"LUA_MENU_UNLOCKALL_ITEMS": "Открыть все предметы",
"LUA_MENU_UNLOCKALL_ITEMS_DESC": "Определяет, должны ли камуфляжи и базовые предметы открываться в соответствии со статистикой игрока или всегда быть разблокированы.",
"LUA_MENU_UNLOCKALL_LOOT": "Открыть все трофеи",
"LUA_MENU_UNLOCKALL_LOOT_DESC": "Определяет, должно ли оружие из DLC (не включая DLC-камуфляжи) открываться по правилам или всегда быть разблокировано.",
"LUA_MENU_UNLOCKALL_CLASSES": "Открыть все классы",
"LUA_MENU_UNLOCKALL_CLASSES_DESC": "Определяет, должны ли дополнительные классы открываться при достижении нового уровня престижа или всегда быть разблокированы.",
"LUA_MENU_PRESTIGE": "Престиж",
"LUA_MENU_PRESTIGE_DESC": "Изменение уровня престижа.",
"LUA_MENU_RANK": "Ранг",
"LUA_MENU_RANK_DESC": "Изменение ранга.",
"LUA_MENU_UNSAVED_CHANGES": "Изменения не были сохранены, вы уверены, что хотите выйти?",
"LUA_MENU_SAVE": "Сохранить изменения",
"LUA_MENU_SAVE_DESC": "Внесение изменений в игру.",
"LUA_MENU_SETTINGS": "Параметры",
"LUA_MENU_EDIT_STATS": "Корректировка статистики",
"UPDATER_POPUP_NO_UPDATES_AVAILABLE": "У вас установлены все последние обновления",
"UPDATER_POPUP_AVAILABLE_UPDATE_TEXT": "Доступно обновление клиента игры,\nначать установку сейчас?",
"UPDATER_POPUP_SUCCESSFUL": "Обновление завершено",
"UPDATER_POPUP_RESTART_POPUP_TEXT": "Для применения изменений необходим перезапуск игры",
"UPDATER_POPUP_CHECKING_FOR_UPDATES": "Проверка наличия обновлений...",
"MPHUD_FPS": "К/С: ",
"MPHUD_LATENCY": "Задержка: ",
"MPHUD_LATENCY_MS": " мс",
"LUA_MENU_TELEMETRY": "ТЕЛЕМЕТРИЯ",
"LOCALE_ENGLISH": "Английский",
"LOCALE_ENGLISH_SAFE": "Английский цензурный",
"LOCALE_FRENCH": "Французский",
"LOCALE_GERMAN": "Немецкий",
"LOCALE_ITALIAN": "Итальянский",
"LOCALE_JAPANESE_PARTIAL": "Японский (английская озвучка)",
"LOCALE_KOREAN": "Корейский",
"LOCALE_POLISH": "Польский",
"LOCALE_PORTUGUESE": "Португальский",
"LOCALE_RUSSIAN": "Русский",
"LOCALE_SIMPLIFIED_CHINESE": "Китайский упрощенный",
"LOCALE_SPANISH": "Испанский",
"LOCALE_TRADITIONAL_CHINESE": "Китайский традиционный",
"LUA_MENU_DOWNLOAD": "Скачать",
"LUA_MENU_MULTIPLAYER_CAPS": "H1-MOD: СЕТЕВАЯ ИГРА\n",
"MENU_MULTIPLAYER_CAPS": "H1-MOD: СЕТЕВАЯ ИГРА",
"PLATFORM_SYSTEM_LINK_TITLE": "СПИСОК СЕРВЕРОВ",
"MPUI_MP44": "MP-44",
"WEAPON_AT4": "AT4",
"WEAPON_BARRETT": "Barrett .50",
"WEAPON_BERETTA": "M9",
"WEAPON_COLT1911": "M1911 .45",
"WEAPON_COLT45": "M1911 .45",
"WEAPON_DESERTEAGLE55": "Командирский Дезерт Игл",
"WEAPON_DESERTEAGLEGOLD": "Золотой Дезерт Игл",
"WEAPON_HK79": "HK79",
"WEAPON_MELEESHOVEL": "Могильщик",
"WEAPON_MP44": "MP-44",
"WEAPON_MP5_SILENCER": "MP5 с глушителем",
"WEAPON_NO_AMMO_CAPS": "НЕТ ПАТРОНОВ",
"WEAPON_NO_FRAG_GRENADE": "Осколочных гранат не осталось",
"WEAPON_NO_SPECIAL_GRENADE": "Особых гранат не осталось",
"WEAPON_P90_SILENCER": "P90 с глушителем",
"WEAPON_SILENCER_ATTACHMENT": "с глушителем",
"WEAPON_USP": "USP .45",
"EXE_SAY": "^3Всем^7",
"EXE_SAYTEAM": "^5Команде^7",
"MENU_SB_TOOLTIP_BTN_REFRESH": "Обновить список",
"MENU_TYPE1": "Режим",
"SERVERLIST_ADD_TO_BLACKLIST": "Добавить в ЧС",
"SERVERLIST_REMOVE_FROM_BLACKLIST": "Убрать из ЧС",
"LUI_MENU_BLACKLIST": "Черный список",
"MPUI_ATDM_RECIPE_NAME": "Usilenie",
"MPUI_BALL_RECIPE_NAME": "Stancija svjazi",
"MPUI_CONF_RECIPE_NAME": "Ubijstvo podtverzhdeno",
"MPUI_CTF_PRO_RECIPE_NAME": "Zahvat flaga PRO",
"MPUI_CTF_RECIPE_NAME": "Zahvat flaga",
"MPUI_DD_RECIPE_NAME": "Unichtozhenie",
"MPUI_DEATHMATCH_RECIPE_NAME": "Kazhdyj za sebja",
"MPUI_DOMINATION_RECIPE_NAME": "Prevoshodstvo",
"MPUI_GUN_RECIPE_NAME": "Oruzhie",
"MPUI_HEADQUARTERS_RECIPE_NAME": "Shtab",
"MPUI_HP_RECIPE_NAME": "Opornyj punkt",
"MPUI_INFECT_RECIPE_NAME": "Zarazhenie",
"MPUI_JUGG_RECIPE_NAME": "Dzhaggernaut",
"MPUI_KINGS_RECIPE_NAME": "Koroli",
"MPUI_KOTM_RECIPE_NAME": "Gora",
"MPUI_OIC_RECIPE_NAME": "Poslednij patron",
"MPUI_SABOTAGE_RECIPE_NAME": "Sabotazh",
"MPUI_SD_RECIPE_NAME": "NiU",
"MPUI_SOTF_FFA_RECIPE_NAME": "Ohota KZS",
"MPUI_SOTF_RECIPE_NAME": "Ohota",
"MPUI_SR_RECIPE_NAME": "NiS",
"MPUI_TWAR_RECIPE_NAME": "Impuls",
"MPUI_WAR_RECIPE_NAME": "Komandnyj boj",
"MPUI_XTDM_RECIPE_NAME": "XTDM",
"CLASS_SPETSNAZ_CLASSES": "КЛАССЫ СПЕЦНАЗА",
"LOOT_DEC_CHAR_REWARD_02": "ЧАД",
"LOOT_DEC_COSTUME_15": "ЧАД",
"LOOT_DEC_ITEMSET_32_SPECIAL": "ЧАД",
"LUA_MENU_SCOREBOARD_MARINES": "%d · МОРПЕХИ",
"LUA_MENU_SCOREBOARD_MARINES_LOST": "%d · МОРПЕХИ ПРОИГРАЛИ",
"MPUI_MARINES_DESERT": "Морпехи",
"MPUI_MARINES_SHORT": "Морпехи",
"MPUI_OPFOR": "Оппозиция",
"MPUI_OPFOR_SHORT": "Оппозиция",
"MPUI_SPETSNAZ": "Спецназ",
"MPUI_SPETSNAZ_SHORT": "Спецназ",
"CGAME_COMPLAINTDISMISSED": "Жалоба отклонена",
"CGAME_COMPLAINTFILED": "Жалоба учтена",
"CGAME_COMPLAINTSERVERHOST": "Нельзя пожаловаться на хост",
"CGAME_COMPLAINTTEAMKILLFILE": "Отправить жалобу на игрока &&1 за убийство товарища по команде?",
"CGAME_CONNECTIONINTERUPTED": "Связь прервана",
"CGAME_CONTINUE_SAVING": "Сохранить и выйти",
"CGAME_CRUSH": "раздавлен",
"CGAME_FALLING": "упал",
"CGAME_HEAD_SHOT": "выстрел в голову",
"CGAME_MISSIONOBJECTIVES": "ЦЕЛИ ЗАДАНИЯ",
"CGAME_NOSPECTATORVOICECHAT": "Зрители не могут использовать голосовую связь.",
"CGAME_PRESSYESNO": "Для ответа ДА нажмите '&&1', для ответа НЕТ - '&&2'",
"CGAME_PRONE_BLOCKED": "Движение лежа заблокировано",
"CGAME_PRONE_BLOCKED_WEAPON": "С этим оружием нельзя лечь",
"CGAME_RESTART_WARNING": "Если начать игру заново, \nвесь прогресс в текущем \nзадании будет утрачен\n\nНачать заново?",
"CGAME_SAVE_WARNING": "Если вы сохраните игру сейчас,\nвесь прогресс с момента последней\nконтрольной точки будет утрачен\n\nСохранить игру?",
"CGAME_SB_ASSISTS": "Помощь",
"CGAME_SB_DEATHS": "Смерти",
"CGAME_SB_KILLS": "Убийства",
"CGAME_SB_PING": "Пинг",
"CGAME_SERVERHOSTTEAMKILLED": "Вас убил хост вашей же команды",
"CGAME_SPECTATOR": "ЗРИТЕЛЬ",
"CGAME_SPECTATORS": "Зрители",
"CGAME_TEAMMATE": "НАПАРНИК",
"CGAME_UNKNOWN": "неизвестно",
"CGAME_WAITINGFORSERVERLOAD": "Ожидание загрузки новой карты на сервере",
"CGAME_YOUKILLED": "Вы убили игрока &&1",
"CGAME_YOUWEREKILLED": "Вас убил игрок &&1",
"CLANS_OFFENSIVENAME": "Имя клана отвергнуто: запрещенный текст",
"DEPOT_NEXT_DEPOT_CREDIT": "До след. начисления",
"DLC_MAPS": "Загружаемые карты",
"EXE_DISCONNECTED": "Соединение с сервером разорвано",
"EXE_ERR_BAD_GAME_FOLDER": "Указана неверная папка с игрой.",
"EXE_ERR_CORRECT_FOLDER": "Убедитесь, что игра запущена из правильной папки.",
"EXE_ERR_HIGH_PING_ONLY": "Этот сервер предназначен только для игроков с большим пингом.",
"EXE_ERR_HUNK_ALLOC_FAILED": "Не удалось выделить &&1 Мб.",
"EXE_ERR_LOW_PING_ONLY": "Этот сервер предназначен только для игроков с небольшим пингом.",
"EXE_ERR_WRONG_MAP_VERSION_NUM": "Неверная версия карты '&&1'.",
"EXE_FAVORITES": "Избранное",
"EXE_GAMEISENDING": "Не удалось войти - игра уже заканчивается",
"EXE_HOST_HANDLE_ERROR": "Не удалось обеспечить защищенную связь с сервером.",
"EXE_INVALIDUPDATESERVERDOWNLOAD": "Загруженное обновление повреждено",
"EXE_KEYWAIT": "Нажмите ESC для отмены или BACKSPACE для сброса",
"EXE_SERVERFILTER": "Фильтр: &&1",
"EXE_SERVERKILLED": "Сервер остановлен.",
"EXE_SHADERPRELOAD": "Подгрузка шейдеров... &&1%",
"EXE_SV_INFO_FRIENDLY_FIRE": "Огонь по своим",
"EXE_SV_INFO_GAMETYPE": "Режим игры",
"EXE_SV_INFO_KILLCAM": "Повтор",
"EXE_SV_INFO_NAME": "имя",
"EXE_SV_INFO_PASSWORD": "С паролем",
"EXE_SV_INFO_PING": "пинг",
"EXE_TIMEDOUT": "Время ожидания запроса истекло",
"EXE_YES": "Да",
"GAME_CHEATSNOTENABLED": "На этом сервере отключены чит-коды.",
"GAME_CROUCH_BLOCKED": "Здесь нельзя пригнуться",
"GAME_DIFFICULTY_HARD": "Сложность: Закаленный",
"GAME_DIFFICULTY_MEDIUM": "Сложность: Рядовой",
"GAME_DIFFICULTY_UNKNOWN": "Сложность: Неизвестна",
"GAME_DROPPEDFORINACTIVITY": "Отключен от сервера из-за бездействия.",
"GAME_INVALIDGAMETYPE": "Неверный режим игры.",
"GAME_NOSPECTATORCALLVOTE": "Зрители не могут начинать голосование.",
"GAME_NOSPECTATORVOTE": "Зрители не могут голосовать.",
"GAME_OBJECTIVECOMPLETED": "Задача выполнена.",
"GAME_OBJECTIVEFAILED": "Цель не достигнута.",
"GAME_OBJECTIVESUPDATED": "Новая цель.",
"GAME_SPECTATOR": "Зритель",
"GAME_VOTE_GAMETYPE": "Режим: ",
"KEY_COMMAND": "Command",
"KEY_ENTER": "Enter",
"KEY_ESCAPE": "Escape",
"KEY_KP_MINUS": "- (цифр.)",
"KEY_KP_PLUS": "+ (цифр.)",
"KEY_KP_STAR": "* (цифр.)",
"KEY_MOUSE1": "ЛКМ",
"KEY_MOUSE2": "ПКМ",
"KEY_MOUSE3": "СКМ",
"KEY_USE": "использовать",
"LUA_MENU_ADVANCED_VIDEO": "Параметры графики",
"LUA_MENU_AIM_ASSIST_LOCKON_DESC": "Поворот оружия в сторону цели во время движения.",
"LUA_MENU_AIM_ASSIST_SLOWDOWN_DESC": "Замедление движений прицела при наведении оружия на цель.",
"LUA_MENU_AUTO_MANTLE_DESC": "Автоматически цепляться за уступ при прыжке рядом с ним.",
"LUA_MENU_BOTS_REGULAR": "Рядовой",
"LUA_MENU_CHALLENGE_XP": "&&1 XP",
"LUA_MENU_CHANGE_FACTION": "Смена фракции",
"LUA_MENU_CHANGE_TEAM": "Смена команды",
"LUA_MENU_CHANGE_TEAM_CAPS": "ВЫБОР КОМАНДЫ",
"LUA_MENU_CHOOSE_CLASS": "Смена класса",
"LUA_MENU_CHOOSE_CLASS_CAPS": "ВЫБОР КЛАССА",
"LUA_MENU_COLOR_BLIND_DESC": "Включение и отключение цветовой схемы для людей с пониженной чувствительностью к цвету.",
"LUA_MENU_COMPLETE": "ЗАВЕРШЕНО",
"LUA_MENU_CONFIRMS": "Жетоны",
"LUA_MENU_CONFIRMS_CAPS": "ЖЕТОНЫ",
"LUA_MENU_CONFIRM_REDEEM_DUPLICATES_CAPS": "ОБМЕНЯТЬ ДУБЛИКАТЫ ПРЕДМЕТОВ (&&1) НА ОПЫТ?",
"LUA_MENU_CONF_CAPS": "УБИЙСТВО ПОДТВЕРЖДЕНО",
"LUA_MENU_CONF_RECIPE_DESC": "Версия на основе режима Убийство подтверждено",
"LUA_MENU_CONF_RECIPE_NAME": "Версия У.П.",
"LUA_MENU_CREATE_A_CLASS": "Создание классов",
"LUA_MENU_CREATE_A_CLASS_CAPS": "ИЗМЕНИТЬ КЛАСС",
"LUA_MENU_DATE": "&&2.&&1.&&3",
"LUA_MENU_DAYS": "&&1 д",
"LUA_MENU_DAYS_HOURS_MINUTES_SECONDS": "&&1 д &&2 ч &&3 м &&4 с",
"LUA_MENU_DEATHMATCH": "Каждый за себя",
"LUA_MENU_DEATHMATCH_CAPS": "КАЖДЫЙ ЗА СЕБЯ",
"LUA_MENU_DEATHMATCH_RECIPE_DESC": "Версия на основе режима Каждый за себя",
"LUA_MENU_DEATHMATCH_RECIPE_NAME": "Версия Каждый за себя",
"LUA_MENU_DEFENDS": "Защиты",
"LUA_MENU_DEFENDS_CAPS": "ЗАЩИТЫ",
"LUA_MENU_DESC_LEADERBOARD_CONF": "Убийство подтверждено - список лидеров",
"LUA_MENU_DESC_LEADERBOARD_DM": "Каждый за себя - список лидеров",
"LUA_MENU_DESC_LEADERBOARD_DOM": "Превосходство - список лидеров",
"LUA_MENU_DESC_LEADERBOARD_SOTF_FFA": "Охота КЗС - список лидеров",
"LUA_MENU_DISPLAY_OPTIONS": "Интерфейс",
"LUA_MENU_DM_HARDCORE": "Каждый за себя. Хардкор",
"LUA_MENU_DOMINATION": "Превосходство",
"LUA_MENU_DOMINATION_CAPS": "ПРЕВОСХОДСТВО",
"LUA_MENU_DOMINATION_RECIPE_DESC": "Версия на основе режима Превосходство",
"LUA_MENU_DOMINATION_RECIPE_NAME": "Версия Превосходство",
"LUA_MENU_END_GAME": "Выйти из боя",
"LUA_MENU_ENVIRONMENT_KILLS": "Убито предметами окружения",
"LUA_MENU_FREE_ONLY": "Свободная камера",
"LUA_MENU_GAME_SETUP": "Параметры боя",
"LUA_MENU_GAME_SETUP_CAPS": "ПАРАМЕТРЫ БОЯ",
"LUA_MENU_GRAPHICS": "Изображение",
"LUA_MENU_GRAPHIC_OPTIONS": "Изображение",
"LUA_MENU_HEALTH_AND_DAMAGE": "Здоровье и урон",
"LUA_MENU_KILLCAM_FINAL_CAPS": "ПОСЛЕДНЕЕ УБИЙСТВО",
"LUA_MENU_KILLS": "Убийства",
"LUA_MENU_KILLS_CAPS": "УБИЙСТВА",
"LUA_MENU_LEAVE_GAME_TITLE": "Покинуть бой?",
"LUA_MENU_LOSING": "Вы проигрываете",
"LUA_MENU_LOSSES_CAPS": "ПОРАЖЕНИЯ",
"LUA_MENU_MELEEKILLS": "С ножа",
"LUA_MENU_MODE_WINDOWED_NO_BORDER": "В окне (без границ)",
"LUA_MENU_OPTIMAL_VIDEO_AUDIO": "Сбросить настройки изображения",
"LUA_MENU_OPTIONS_UPPER_CASE": "НАСТРОЙКИ",
"LUA_MENU_PLAY_TIME": "Всего наиграно",
"LUA_MENU_PRESET_CLASSES": "Готовые классы",
"LUA_MENU_PRESET_CLASSES_CAPS": "ГОТОВЫЕ КЛАССЫ",
"LUA_MENU_RATIO_CAPS": "У/С",
"LUA_MENU_RECIPE_LOAD_CUSTOM": "Загрузить свою версию",
"LUA_MENU_REPORT_DEFEAT": "Поражение",
"LUA_MENU_REPORT_DEFEAT_CAPS": "ПОРАЖЕНИЕ",
"LUA_MENU_REPORT_VICTORY": "Победа",
"LUA_MENU_REPORT_VICTORY_CAPS": "ПОБЕДА",
"LUA_MENU_RESTORE_EACH_SETTING": "Вернуть параметры управления к значениям по умолчанию?",
"LUA_MENU_RESTRICTIONS_TACTICAL_CAPS": "ОГРАНИЧЕНИЯ НА ТАКТИЧЕСКОЕ ОРУЖИЕ",
"LUA_MENU_RESTRICT_TACTICAL": "Ограничение на тактическое оружие",
"LUA_MENU_ROTATION": "Несколько",
"LUA_MENU_RULES_EDIT_DEF_CLASSES": "Список заготовленных классов",
"LUA_MENU_RULES_FAST": "Быстро",
"LUA_MENU_RULES_GUN_CQC": "Холодное",
"LUA_MENU_RULES_GUN_MELEE": "Холодное",
"LUA_MENU_RULES_GUN_MELEE_RPG": "Холодное, РПГ",
"LUA_MENU_RULES_GUN_PROGRESSION_END": "Последнее оружие",
"LUA_MENU_RULES_GUN_RPG_MELEE": "РПГ, холодное",
"LUA_MENU_RULES_HEADSHOTS_ONLY": "Только попадания в голову",
"LUA_MENU_RULES_NORMAL": "По умолчанию",
"LUA_MENU_RULES_RETURN_TIME": "Время автовозврата флага",
"LUA_MENU_RULES_SETBACK_LEVELS": "Потеря уровня от ножа",
"LUA_MENU_RULES_STREAK_GRACE_PERIOD": "Отсрочка серии",
"LUA_MENU_RULES_TEAMKILL_KICK": "Исключение за убийство союзников",
"LUA_MENU_RULES_TEAM_SWITCH": "Смена команды посреди игры",
"LUA_MENU_RULES_TOGGLE_ROTATION_OFF": "Указать одну карту",
"LUA_MENU_RULES_TOGGLE_ROTATION_ON": "Указать несколько карт",
"LUA_MENU_RULES_UNLIMITED": "Без ограничений",
"LUA_MENU_SAS": "S.A.S",
"LUA_MENU_SD_RECIPE_DESC": "Версия на основе режима Найти и Уничтожить",
"LUA_MENU_SD_RECIPE_NAME": "Версия Найти и уничтожить",
"LUA_MENU_SETBACKS": "Откаты",
"LUA_MENU_SPAWN_SETTINGS": "Возрождение",
"LUA_MENU_SR_RECIPE_DESC": "Версия на основе Найти и спасти",
"LUA_MENU_SR_RECIPE_NAME": "Версия Найти и спасти",
"LUA_MENU_SUPPLY_DROP_MTX": "Редкий ящик снабжения",
"LUA_MENU_SYSTEM_INFO": "Другое",
"LUA_MENU_SYSTEM_INFO_CAPS": "ДРУГОЕ",
"LUA_MENU_VERSUS": "VS",
"LUA_MENU_VIDEO_OPTIONS": "Отображение",
"LUA_MENU_VIDEO_OPTIONS_CAPS": "ОТОБРАЖЕНИЕ",
"LUA_MENU_WAR_RECIPE_DESC": "Версия на основе режима Командный бой",
"LUA_MENU_WAR_RECIPE_NAME": "Версия Командный бой",
"LUA_MENU_WEAPON_ATTRIBUTE_HEADER": "СВОЙСТВА",
"LUA_MENU_WEAPON_STAT_MOBILITY": "МОБИЛЬН.",
"LUA_MENU_WEAPPERF_KILLS": "Убийства",
"LUA_MENU_WIN_PERCENTAGE": "% побед",
"LUA_MENU_WL_RATIO": "Победы/поражения",
"LUA_MP_FRONTEND_SCORE_PER_MINUTE_CAPS": "Очков в минуту",
"MENU_ACT_I": "Акт I",
"MENU_ACT_II": "Акт II",
"MENU_ACT_III": "Акт III",
"MENU_ADVANCED_VIDEO": "Параметры графики",
"MENU_AIM_DOWN_THE_SIGHT": "Прицелиться",
"MENU_AIM_DOWN_THE_SIGHT_AUTOAIM": "Автонаведение при прицеливании",
"MENU_ALLOW_ENEMY_SPECTATING": "Наблюдение за противником: ",
"MENU_APPLY_SETTINGS": "Применить новые значения?",
"MENU_AUTOAIM": "Автонаведение",
"MENU_A_GAME_TYPE_WILL_BE_SELECTED_AT_RANDOM": "Режим игры будет выбран случайно.",
"MENU_BRIGHTNESS": "Яркость изображения",
"MENU_BUTTON_LAYOUT": "Раскладка кнопок",
"MENU_CAMPAIGN_ARCADE_CHEAT_UNLOCKED_DESC_GERMAN_SKU": "Вы получили доступ к чит-кодам игры.\n\nАктивировать их можно в главном меню или меню паузы.\n ",
"MENU_CAPTURE_AND_HOLD_THE": "Зарабатывайте очки, захватывая и удерживая указанные позиции. ",
"MENU_CCS_RESTART_BUTTON_LABEL": "Перезапустить",
"MENU_CHANGE_GAME_TYPE": "Изменить режим игры",
"MENU_CHANGE_RATE_OF_FIRE": "Изменить темп стрельбы",
"MENU_CHANGE_WEAPON": "Сменить оружие",
"MENU_CHEAT_ENABLED": "Чит-код активирован",
"MENU_COMPLETED": "Пройдено",
"MENU_COMPLETED_CHEAT": "Доступен чит-код",
"MENU_COMPLETED_HARDENED": "Пройдено (Закаленный)",
"MENU_COMPLETED_REGULAR": "Пройдено (Рядовой)",
"MENU_COMPLETED_SKILLED": "Пройдено (Опытный)",
"MENU_COMPLETED_VETERAN": "Пройдено (Ветеран)",
"MENU_CONF_DESC": "Зарабатывайте очки, убивая противников и собирая их жетоны.",
"MENU_CORRUPT_SAVEDATA_MESSAGE": "Сохраненные данные не были загружены, поскольку они повреждены. В случае продолжения они будут удалены.",
"MENU_CREATE_A_CLASS_CAPS": "СОЗДАНИЕ КЛАССОВ",
"MENU_CUSTOM": "Свои",
"MENU_CUSTOM_N": "Свой (&&1)",
"MENU_DEATHS": "Смерти",
"MENU_DEFAULT_ALT": "Станд. перевернутая",
"MENU_DIFFICULTY_HARDENED": "Сложность: Закаленный",
"MENU_DIFFICULTY_REGULAR": "Сложность: Рядовой",
"MENU_DIFFICULTY_WARNING": "Вам рекомендуется другой уровень сложности. Хотите продолжить на этом?",
"MENU_DISPLAY_MODE": "Режим вывода",
"MENU_DOF": "Глубина резкости",
"MENU_EXTRA": "Ультра",
"MENU_FILL_MEMORY_TEXTURES": "Заполнить оставшуюся память",
"MENU_FIRE_RATE": "Темп стрельбы:",
"MENU_FRAG_EQUIPMENT": "Граната/снаряжение",
"MENU_FREE_FOR_ALL": "Каждый за себя",
"MENU_FREE_LOOK": "Своб. обзор",
"MENU_FRIENDLY_FIRE": "Огонь по своим: ",
"MENU_GAME_OPTIONS": "Правила игры",
"MENU_GAME_SETUP_CAPS": "ПАРАМЕТРЫ БОЯ",
"MENU_GAME_TYPE": "Режим игры: ",
"MENU_GAME_TYPE1": "Режим игры",
"MENU_GAME_TYPES": "Режимы игры",
"MENU_GAME_TYPE_SETTINGS": "Настройки режима игры",
"MENU_GO_TO_CROUCH": "Пригнуться",
"MENU_GO_TO_PRONE": "Лечь",
"MENU_GRAPHICS": "Изображение",
"MENU_HARDENED": "Закаленный",
"MENU_HIGH": "Высок.",
"MENU_HP_DESC": "Зарабатывайте очки, захватывая и удерживая опорные пункты. ",
"MENU_INSANE": "Безумн.",
"MENU_INSPECT_WEAPON": "Осмотреть оружие",
"MENU_INTEL": "ЧИТ-КОДЫ",
"MENU_JOIN_SERVER_CAP": "ПОДКЛЮЧИТЬСЯ",
"MENU_JUMP_STANCE_UP": "Прыгнуть/Подняться",
"MENU_KILLS": "Убийства",
"MENU_KILLSTREAK_REWARD_SLOT_1": "Награды за серию убийств - ячейка 1",
"MENU_KILLSTREAK_REWARD_SLOT_2": "Награды за серию убийств - ячейка 2",
"MENU_KILLSTREAK_REWARD_SLOT_3": "Награды за серию убийств - ячейка 3",
"MENU_KILLSTREAK_REWARD_SLOT_4": "Награды за серию убийств - ячейка 4",
"MENU_KILLSTREAK_REWARD_SLOT_5": "Награды за серию убийств - ячейка 5",
"MENU_LARGE": "Больш.",
"MENU_LAST_CHECKPOINT": "Посл. контрольная точка",
"MENU_LAUNCH_WITHOUT_MODS": "Запустить без модов",
"MENU_LEADERBOARD": "Список лидеров",
"MENU_LEAVE_GAME_RANKED2": "игры лишит вас бонуса за матч и",
"MENU_LEAVE_GAME_RANKED3": "будет засчитан как поражение.",
"MENU_LEGACY": "Классика",
"MENU_LOAD_MISSION": "Загрузить задание?",
"MENU_LOAD_RECIPE_CAPS": "ЗАГРУЗИТЬ ВЕРСИЮ",
"MENU_LOAD_RECIPE_FROM_DISK": "Загрузить версию с диска",
"MENU_LOOK_INVERSION": "Инверсия обзора",
"MENU_LOSSES": "Проигрыши",
"MENU_LOWER_DIFFICULTY": "Понизить сложность",
"MENU_MELEE_CAPS": "ХОЛОДНОЕ",
"MENU_MISSES": "Промахи",
"MENU_MODIFIERS": "Модификаторы",
"MENU_NORMAL_MAP_RESOLUTION": "Разрешение карт нормалей",
"MENU_NO_CONTROLLER_INITIAL": "У вас не подключен геймпад. Переключиться на схему управления клавиатурой и мышью?",
"MENU_ONLINE_STATS": "Сетевая статистика",
"MENU_OPTIONS": "Настройки",
"MENU_OPTIONS_UPPER_CASE": "НАСТРОЙКИ",
"MENU_PAUSED_CAP": "ПАУЗА",
"MENU_PRESTIGE_RESET_TITLE2": "Подробнее",
"MENU_PRESTIGE_RESET_WARNING3": "Обратного пути нет...",
"MENU_PRIVATE_MATCH": "Закрытый матч",
"MENU_QUIT": "Выйти",
"MENU_RATIO": "У/С",
"MENU_RECIPE_CHANGE_BASE_CAPS": "СМЕНИТЬ ТИП ВЕРСИИ",
"MENU_RECIPE_LOAD_CUSTOM": "Загрузить свою версию",
"MENU_RECIPE_SAVE_CUSTOM": "Сохранить свою версию",
"MENU_RECIPE_SETUP_CAPS": "НАСТРОЙКА ВЕРСИИ",
"MENU_RECRUIT": "Новобранец",
"MENU_REGULAR": "Рядовой",
"MENU_REGULAR_CAPS": "РЯДОВОЙ",
"MENU_REMOVE_FROM_FAVORITES": "Убрать из избранного",
"MENU_REPORT_CHEATING": "Читерство",
"MENU_RESET_SYSTEM_DEFAULTS": "Оптимальные настройки игры",
"MENU_RESTART_LEVEL_Q": "Начать уровень сначала?",
"MENU_RESTORE_DEFAULTS": "Системные настройки будут возвращены к значениям по умолчанию, продолжить?",
"MENU_RESTORE_EACH_SETTING": "Все параметры будут возвращены к значениям по умолчанию, продолжить?",
"MENU_RESUMEGAME_NOSAVE": "Продолжить без сохранения",
"MENU_RESUMEGAME_Q_DESC": "Хотите возобновить прохождение задания?",
"MENU_RESUME_CREDITS": "Продолжить",
"MENU_SAVEDATA_CORRUPTED": "Невозможно возобновить игру, т.к. поврежден файл сохранения. Пожалуйста, перезапустите уровень из меню выбора задания.",
"MENU_SCORE_LOSING": "Вы проигрываете &&1 - &&2",
"MENU_SCORE_LOSING_WITH": "Вы проигрываете с &&1 из &&2 очков.",
"MENU_SCORE_WINNING": "Вы ведете &&1 - &&2",
"MENU_SCORE_WINNING_WITH": "Вы ведете с &&1 из &&2 очков.",
"MENU_SCREENSHOT": "Скриншот",
"MENU_SEARCHINGFORGAMES_100MS": "Поиск игр - пинг 100 мс",
"MENU_SEARCHINGFORGAMES_150MS": "Поиск игр - пинг 150 мс",
"MENU_SEARCHINGFORGAMES_200MS": "Поиск игр - пинг 200 мс",
"MENU_SEARCHINGFORGAMES_250MS": "Поиск игр - пинг 250 мс",
"MENU_SEARCHINGFORGAMES_300MS": "Поиск игр - пинг 300 мс",
"MENU_SEARCHINGFORGAMES_350MS": "Поиск игр - пинг 350 мс",
"MENU_SEARCHINGFORGAMES_50MS": "Поиск игр - пинг 50 мс",
"MENU_SEARCHINGFORGAMES_NMS": "Поиск игр: пинг <&&1 мс",
"MENU_SELECT_DIFFICULTY": "Выбор сложности",
"MENU_SELECT_GAME_TYPE": "Выбрать режим игры",
"MENU_SELECT_LEVEL": "Выбрать уровень",
"MENU_SELECT_MATCH_TYPE": "Выбрать тип матча",
"MENU_SELECT_NEXT_MISSION": "Выбрать следующее задание",
"MENU_SET_MAP_PREFERENCES": "Укажите, на каких картах вы предпочитаете играть",
"MENU_SHARED": "Урон обоим",
"MENU_SPECTATOR": "Зритель",
"MENU_SPECTATOR_MODE": "Режим зрителя",
"MENU_SPECULAR_MAP": "Карта бликов",
"MENU_SPECULAR_MAP_RESOLUTION": "Разрешение карт бликов",
"MENU_SPRINT_HOLD_BREATH": "Бег/Задержка дыхания",
"MENU_SPRINT_STEADY_SNIPER_RIFLE": "Бег/Удержание прицела",
"MENU_STANDARD_4_3": "Стандартное 4:3",
"MENU_TEXTURE_RESOLUTION": "Разрешение текстур",
"MENU_UNLOCK": "Открыть",
"MENU_VERY_LOW": "Очень низк.",
"MENU_VIDEO": "Отображение",
"MENU_VIEW_FRIENDLY_FIRE": "Огонь по своим:",
"MENU_WARNING": "Внимание",
"MENU_WARNING_CHECKPOINT_RESET_TITLE": "Откат к началу задания",
"MENU_WIDE_16_10": "Широкое 16:10",
"MENU_WIDE_16_9": "Широкое 16:9",
"MENU_WIDE_21_9": "Сверхширокое 21:9",
"MENU_WINS": "Победы",
"MENU_WLRATIO": "Победы/Поражения",
"MENU_YES": "Да",
"MPUI_ACCURACY_FRIENDS": "Меткость (Друзья)",
"MPUI_ACCURACY_GLOBAL": "Меткость (Все игроки)",
"MPUI_BOTS_REGULAR": "Рядовой",
"MPUI_CHANGE_GAMETYPEMAP": "Сменить режим игры/карту",
"MPUI_CHANGE_GAME_TYPE": "Изменить режим игры",
"MPUI_CHANGE_GAME_TYPEMAP": "Сменить режим/карту",
"MPUI_COMBATRECORD_GAMEMODESTAT_CONFIRMS": "Жетоны",
"MPUI_COMBATRECORD_GAMEMODESTAT_DEFENDS": "Защиты",
"MPUI_CONF": "Убийство подтверждено",
"MPUI_CONF_CAPS": "УБИЙСТВО ПОДТВЕРЖДЕНО",
"MPUI_CONF_RECIPE_DESC": "Версия на основе режима Убийство подтверждено",
"MPUI_DD": "Уничтожение",
"MPUI_DD_CAPS": "УНИЧТОЖЕНИЕ",
"MPUI_DEATHMATCH": "Каждый за себя",
"MPUI_DEATHMATCH_CAPS": "КАЖДЫЙ ЗА СЕБЯ",
"MPUI_DESC_CHANGE_GAMETYPE": "Выбрать другой режим игры.",
"MPUI_DESC_CHANGE_RULES": "Изменить правила матча.",
"MPUI_DESC_GAME_SETUP": "Сменить карту, режим и правила игры.",
"MPUI_DESC_LEADERBOARD_CONF": "Убийство подтверждено - список лидеров",
"MPUI_DESC_LEADERBOARD_DM": "Каждый за себя - список лидеров",
"MPUI_DESC_LEADERBOARD_DOM": "Превосходство - список лидеров",
"MPUI_DOMINATION": "Превосходство",
"MPUI_DOMINATION_CAPS": "ПРЕВОСХОДСТВО",
"MPUI_ENABLED_NO_BLEED": "Без ограничений",
"MPUI_FRIENDY_FIRE_PRE": "Огонь по своим:",
"MPUI_HARDCORE_PRE": "Хардкор:",
"MPUI_HARDPOINT": "Каждый за себя",
"MPUI_HITS": "Попадания",
"MPUI_LOSING_CAPS": "ТЕРЯЕМ",
"MPUI_LOSSES": "Поражения",
"MPUI_MISSES": "Промахи",
"MPUI_N_XP": "&&1 XP",
"MPUI_RANK": "Уровень",
"MPUI_RATIO": "У/С",
"MPUI_RECOMMENDEDPLAYERS": "Рекоменд. лимит игроков: &&1",
"MPUI_ROUND_SWITCH_PRE": "Смена сторон:",
"MPUI_RULES_FRIENDLY_FIRE": "Огонь по своим:",
"MPUI_RULES_HARDCORE": "Хардкор:",
"MPUI_RULES_INSTANT": "Сразу",
"MPUI_RULES_OLDSCHOOL": "Режим \"Старая школа\":",
"MPUI_RULES_ROUND_SWITCH": "Смена сторон:",
"MPUI_RULES_SHARED": "Урон обоим",
"MPUI_RULES_SPECTATING": "Вид от:",
"MPUI_RULES_TOGGLE_ROTATION_OFF": "Отключить ротацию карт",
"MPUI_RULES_TOGGLE_ROTATION_ON": "Включить ротацию карт",
"MPUI_RUSSIAN": "Русский",
"MPUI_SPECTATE": "Смотреть",
"MPUI_SPECTATING_PRE": "Вид от:",
"MPUI_SPECTATOR": "Зритель",
"MPUI_WAR_HARDCORE": "Командный бой. Хардкор",
"MPUI_WAR_RECIPE_DESC": "Версия на основе режима Командный бой",
"MPUI_WINLOSSRATIO": "Победы/поражения",
"MPUI_WINS": "Победы",
"MPUI_YES": "Да",
"MP_DEATHMATCH": "Каждый за себя",
"MP_DEATHMATCH_TIMER": "Каждый за себя - &&1",
"MP_HALFTIME": "Конец раунда",
"MP_IED_PRESS_LEFT_TRIGGER_TO_DETONATE": "Нажмите левый триггер, чтобы активировать детонатор",
"MP_INVALIDGAMETYPE": "Неверный режим игры.",
"MP_JOINED_ONE": "%s присоединяется к первому отряду",
"MP_KILLCAM": "ПОВТОР",
"MP_MATCH_BEGINS_IN_VAL": "Бой начнется через &&1 с",
"MP_MELEE": "Холодное",
"MP_NOSPECTATORCALLVOTE": "Зрители не могут начинать голосование.",
"MP_NOSPECTATORVOTE": "Зрители не могут голосовать.",
"MP_PLAY_TYPE": "Выберите режим",
"MP_SWITCHING_SIDES": "СМЕНА СТОРОН",
"MP_TEAMKILL": "Убийство своего",
"MP_THE_SERVER_DOES_NOT_HAVE": "На сервере нет этой карты.",
"MP_VOTE_GAMETYPE": "Режим игры: &&1",
"MP_VOTE_TEMPBAN": "Временно забанить: &&1",
"MP_ZOOM": "^3[{+ads}]^7 Смена кратности",
"PLATFORM_EMBLEM_LAYER_DOWN_KBM": "Опустить слой",
"PLATFORM_EMBLEM_LAYER_UP_KBM": "Поднять слой",
"PLATFORM_FOV": "Угол обзора (FOV)",
"PLATFORM_HOLD_TO_SKIP": "Удерж. \u0001 для пропуска",
"PLATFORM_HOLD_TO_SKIP_KEYBOARD": "Удерж. ^2ENTER^7 для пропуска\n",
"PLATFORM_LOW_AMMO_NO_RELOAD": "Мало боеприпасов",
"PLATFORM_LOW_AMMO_NO_RELOAD_CAPS": "МАЛО БОЕПРИПАСОВ",
"PLATFORM_MDAO": "Затенение методом MDAO",
"PLATFORM_PLAY_ONLINE": "Сетевая игра",
"PLATFORM_RELOAD_CAPS": "ПЕРЕЗАРЯДКА",
"PLATFORM_SSAO": "Затенение методом SSAO",
"PLATFORM_UI_ADAPTER": "Видеокарта",
"PLATFORM_UI_ANTI_ALIASING_OPTIONS": "Настройки сглаживания",
"PLATFORM_UI_CACHED_SPOT_SHADOWS": "Кэшировать точечные тени",
"PLATFORM_UI_CACHED_SUN_SHADOWS": "Кэшировать тени от солнца",
"PLATFORM_UI_DEDICATED_VIDEO_MEMORY": "Загрузка видеопамяти",
"PLATFORM_UI_HEADER_PLAY_MP_CAPS": "СЕТЕВАЯ ИГРА",
"PLATFORM_UI_IMAGE_QUALITY": "Разрешение картинки",
"PLATFORM_UI_NATIVE_RENDER_RESOLUTION": "Отрисовка в родном разрешении",
"PLATFORM_UI_NATIVE_RENDER_RESOLUTION_OPTION": "Родное (&&1 x &&2)",
"PLATFORM_UI_POST_AA": "Постобработка",
"PLATFORM_UI_SHADER_PRELOAD_AFTER_CINEMATIC": "Во время роликов",
"PLATFORM_UI_VIDEO_ADAPTER": "Видеокарта",
"PLATFORM_YES": "Да",
"PRESENCE_CONF_TDM": "Убийство подтверждено",
"PRESENCE_C_DOM": "Превосходство. Классика",
"PRESENCE_C_DOM_SYSTEM_DIALOG": "Превосходство, классика",
"PRESENCE_FFA": "Каждый за себя",
"PRESENCE_FFA_SYSTEM_DIALOG": "Каждый за себя",
"PRESENCE_HC_DOM": "Превосходство. Хардкор",
"PRESENCE_HC_FFA": "Каждый за себя. Хардкор",
"PRESENCE_HC_FFA_SYSTEM_DIALOG": "Каждый за себя, хардкор",
"SPLASHES_CAPTURE": "Плеймейкер!",
"SPLASHES_LAST_MAN_DEFUSE": "Крепкая хватка",
"SPLASHES_TAG_COLLECTOR": "Инкассатор",
"XBOXLIVE_DESTROYPARTY": "Распустить команду?"
}

View File

@ -0,0 +1,15 @@
{
"LOCALE_ENGLISH": "英语",
"LOCALE_ENGLISH_SAFE": "英语 (审查制度)",
"LOCALE_FRENCH": "法语",
"LOCALE_GERMAN": "德语",
"LOCALE_ITALIAN": "意大利语",
"LOCALE_JAPANESE_PARTIAL": "日语(部分)",
"LOCALE_KOREAN": "韩语",
"LOCALE_POLISH": "波兰语",
"LOCALE_PORTUGUESE": "葡萄牙语",
"LOCALE_RUSSIAN": "俄语",
"LOCALE_SIMPLIFIED_CHINESE": "简体中文",
"LOCALE_SPANISH": "西班牙语",
"LOCALE_TRADITIONAL_CHINESE": "繁体中文"
}

View File

@ -0,0 +1,15 @@
{
"LOCALE_ENGLISH": "Inglés",
"LOCALE_ENGLISH_SAFE": "Inglés (censura)",
"LOCALE_FRENCH": "Français",
"LOCALE_GERMAN": "Alemán",
"LOCALE_ITALIAN": "Italiano",
"LOCALE_JAPANESE_PARTIAL": "Japonés (parcial)",
"LOCALE_KOREAN": "Coreano",
"LOCALE_POLISH": "Polaco",
"LOCALE_PORTUGUESE": "Portugués",
"LOCALE_RUSSIAN": "Ruso",
"LOCALE_SIMPLIFIED_CHINESE": "Chino simplificado",
"LOCALE_SPANISH": "Español",
"LOCALE_TRADITIONAL_CHINESE": "Chino tradicional"
}

View File

@ -0,0 +1,15 @@
{
"LOCALE_ENGLISH": "英文",
"LOCALE_ENGLISH_SAFE": "英文 (審查制度)",
"LOCALE_FRENCH": "法文",
"LOCALE_GERMAN": "德文",
"LOCALE_ITALIAN": "義大利文",
"LOCALE_JAPANESE_PARTIAL": "日文(部份)",
"LOCALE_KOREAN": "韓文",
"LOCALE_POLISH": "波蘭文",
"LOCALE_PORTUGUESE": "葡萄牙文",
"LOCALE_RUSSIAN": "俄文",
"LOCALE_SIMPLIFIED_CHINESE": "簡體中文",
"LOCALE_SPANISH": "西班牙文",
"LOCALE_TRADITIONAL_CHINESE": "繁體中文"
}

View File

@ -32,7 +32,7 @@ namespace filesystem
{ {
static const auto* loc_language = game::Dvar_FindVar("loc_language"); static const auto* loc_language = game::Dvar_FindVar("loc_language");
const auto id = loc_language->current.integer; const auto id = loc_language->current.integer;
return id == 5 || id == 6 || id == 8 || id == 9 || id == 10 || id == 11 || id == 12 || id == 13 || id == 15; return id == 5 || id == 6 || id == 8 || id == 9 || id == 10 || id == 11 || id == 13 || id == 15;
} }
void fs_startup_stub(const char* name) void fs_startup_stub(const char* name)

View File

@ -30,6 +30,8 @@
#include <utils/io.hpp> #include <utils/io.hpp>
#include <utils/binary_resource.hpp> #include <utils/binary_resource.hpp>
#include "steam/steam.hpp"
namespace ui_scripting namespace ui_scripting
{ {
namespace namespace
@ -344,6 +346,11 @@ namespace ui_scripting
::game::Dvar_SetFromStringByNameFromSource("virtualLobbyPresentable", "1", ::game::DvarSetSource::DVAR_SOURCE_INTERNAL); ::game::Dvar_SetFromStringByNameFromSource("virtualLobbyPresentable", "1", ::game::DvarSetSource::DVAR_SOURCE_INTERNAL);
}; };
game_type["getcurrentgamelanguage"] = [](const game&)
{
return steam::SteamApps()->GetCurrentGameLanguage();
};
auto server_list_table = table(); auto server_list_table = table();
lua["serverlist"] = server_list_table; lua["serverlist"] = server_list_table;

View File

@ -12,7 +12,7 @@ function startupdatecheck(popup, autoclose)
end end
if (not updater.getupdatecheckstatus()) then if (not updater.getupdatecheckstatus()) then
popup.text:setText("Error: " .. updater.getlasterror()) popup.text:setText(Engine.Localize("@MENU_ERROR") .. ": " .. updater.getlasterror())
return return
end end
@ -22,13 +22,13 @@ function startupdatecheck(popup, autoclose)
return return
end end
popup.text:setText("No updates available") popup.text:setText(Engine.Localize("UPDATER_POPUP_NO_UPDATES_AVAILABLE"))
return return
end end
LUI.yesnopopup({ LUI.yesnopopup({
title = "NOTICE", title = Engine.Localize("@MENU_NOTICE"),
text = "An update is available, proceed with installation?", text = Engine.Localize("UPDATER_POPUP_AVAILABLE_UPDATE_TEXT"),
callback = function(result) callback = function(result)
if (result) then if (result) then
startupdatedownload(popup, autoclose) startupdatedownload(popup, autoclose)
@ -55,7 +55,7 @@ function startupdatedownload(popup, autoclose)
end end
file = previousfile file = previousfile
popup.text:setText("Downloading file " .. updater.getcurrentfile() .. "...") popup.text:setText(Engine.Localize("@EXE_DOWNLOADING") .. " " .. updater.getcurrentfile() .. "...")
end) end)
Engine.GetLuiRoot():registerEventHandler("update_done", function(element, event) Engine.GetLuiRoot():registerEventHandler("update_done", function(element, event)
@ -66,17 +66,17 @@ function startupdatedownload(popup, autoclose)
end end
if (not updater.getupdatedownloadstatus()) then if (not updater.getupdatedownloadstatus()) then
popup.text:setText("Error: " .. updater.getlasterror()) popup.text:setText(Engine.Localize("@MENU_ERROR") .. ": " .. updater.getlasterror())
return return
end end
popup.text:setText("Update successful") popup.text:setText(Engine.Localize("UPDATER_POPUP_SUCCESSFUL"))
if (updater.isrestartrequired()) then if (updater.isrestartrequired()) then
LUI.confirmationpopup({ LUI.confirmationpopup({
title = "RESTART REQUIRED", title = Engine.Localize("@MENU_CCS_RESTART_CONFIRMATION_TITLE"),
text = "Update requires restart", text = Engine.Localize("UPDATER_POPUP_RESTART_POPUP_TEXT"),
buttontext = "RESTART", buttontext = Engine.Localize("@MENU_CCS_RESTART_BUTTON_LABEL"),
callback = function() callback = function()
updater.relaunch() updater.relaunch()
end end
@ -97,7 +97,7 @@ function updaterpopup(oncancel)
return LUI.openpopupmenu("generic_waiting_popup_", { return LUI.openpopupmenu("generic_waiting_popup_", {
oncancel = oncancel, oncancel = oncancel,
withcancel = true, withcancel = true,
text = "Checking for updates..." text = Engine.Localize("UPDATER_POPUP_CHECKING_FOR_UPDATES")
}) })
end end

View File

@ -25,12 +25,12 @@ namespace steam
const char* apps::GetCurrentGameLanguage() const char* apps::GetCurrentGameLanguage()
{ {
return "english"; return language;
} }
const char* apps::GetAvailableGameLanguages() const char* apps::GetAvailableGameLanguages()
{ {
return "english"; return language;
} }
bool apps::BIsSubscribedApp(unsigned int appID) bool apps::BIsSubscribedApp(unsigned int appID)

View File

@ -1,5 +1,10 @@
#pragma once #pragma once
#include "component/console.hpp"
#include <utils/io.hpp>
#define LANGUAGE_FILE "players2/default/language"
namespace steam namespace steam
{ {
class apps class apps
@ -7,6 +12,24 @@ namespace steam
public: public:
~apps() = default; ~apps() = default;
char language[0x30] = { 0 };
apps()
{
std::string content;
if (::utils::io::read_file(LANGUAGE_FILE, &content))
{
#if DEBUG
console::info("Language switched to \"%s\".\n", content.data());
#endif
strcpy_s(language, sizeof(language), content.data());
return;
}
// default to english if no file is found
strcpy_s(language, sizeof(language), "english");
}
virtual bool BIsSubscribed(); virtual bool BIsSubscribed();
virtual bool BIsLowViolence(); virtual bool BIsLowViolence();
virtual bool BIsCybercafe(); virtual bool BIsCybercafe();