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

View File

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

View File

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

View File

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

View File

@ -1,20 +1,22 @@
require("language")
if (game:issingleplayer()) then
return
return
end
if (Engine.InFrontend()) then
require("shader_dialog")
require("gamemodes")
require("no_mode_switch")
require("disable_useless_things")
require("shader_dialog")
require("gamemodes")
require("no_mode_switch")
require("disable_useless_things")
end
-- defined in mp_hud/hudutils.lua
function GetGameModeName()
return Engine.Localize(Engine.TableLookup(GameTypesTable.File,
GameTypesTable.Cols.Ref, GameX.GetGameMode(), GameTypesTable.Cols.Name))
return Engine.Localize(Engine.TableLookup(GameTypesTable.File, GameTypesTable.Cols.Ref, GameX.GetGameMode(),
GameTypesTable.Cols.Name))
end
function NeverAllowChangeTeams()
return false
return false
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)
local function dialog(...)
if (game:sharedget("has_accepted_shader_caching") == "1") then
return LUI.ShaderCacheDialog.new(...)
end
if (game:sharedget("has_accepted_shader_caching") == "1") then
return LUI.ShaderCacheDialog.new(...)
end
return LUI.MenuBuilder.BuildRegisteredType("generic_yesno_popup", {
popup_title = Engine.Localize("@MENU_WARNING"),
message_text = Engine.Localize("@PLATFORM_SHADER_PRECACHE_ASK"),
yes_action = function()
game:sharedset("has_accepted_shader_caching", "1")
LUI.FlowManager.RequestAddMenu(nil, "ShaderCacheDialog_original")
end,
yes_text = Engine.Localize("@MENU_YES"),
no_text = Engine.Localize("@MENU_NO_DONT_ASK"),
no_action = function()
Engine.SetDvarInt("r_preloadShadersFrontendAllow", 0)
end,
default_focus_index = 2,
cancel_will_close = false
})
return LUI.MenuBuilder.BuildRegisteredType("generic_yesno_popup", {
popup_title = Engine.Localize("@MENU_WARNING"),
message_text = Engine.Localize("@PLATFORM_SHADER_PRECACHE_ASK"),
yes_action = function()
game:sharedset("has_accepted_shader_caching", "1")
LUI.FlowManager.RequestAddMenu(nil, "ShaderCacheDialog_original")
end,
yes_text = Engine.Localize("@MENU_YES"),
no_text = Engine.Localize("@MENU_NO_DONT_ASK"),
no_action = function()
Engine.SetDvarInt("r_preloadShadersFrontendAllow", 0)
end,
default_focus_index = 2,
cancel_will_close = false
})
end
LUI.MenuBuilder.m_types_build["ShaderCacheDialog"] = dialog

View File

@ -2,257 +2,251 @@ local Lobby = luiglobals.Lobby
local SystemLinkJoinMenu = LUI.mp_menus.SystemLinkJoinMenu
if (not SystemLinkJoinMenu) then
return
return
end
local columns = {
{
offset = 40,
text = "@MENU_HOST_NAME",
dataindex = 0
},
{
offset = 500,
text = "@MENU_MAP",
dataindex = 1
},
{
offset = 700,
text = "@MENU_TYPE1",
dataindex = 3
},
{
offset = 950,
text = "@MENU_NUMPLAYERS",
dataindex = 2
},
{
offset = 1100,
text = "@MENU_PING",
dataindex = 4
},
{
offset = 10,
image = "s1_icon_locked",
customelement = function(value, offset)
return LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
height = 20,
width = 20,
left = offset,
top = 2,
material = RegisterMaterial(CoD.Material.RestrictedIcon),
alpha = value == "1" and 1 or 0,
color = {
r = 1,
b = 1,
g = 1
}
})
end,
dataindex = 5
}
}
local columns = {{
offset = 40,
text = "@MENU_HOST_NAME",
dataindex = 0
}, {
offset = 500,
text = "@MENU_MAP",
dataindex = 1
}, {
offset = 725,
text = "@MENU_TYPE1",
dataindex = 3
}, {
offset = 920,
text = "@MENU_NUMPLAYERS",
dataindex = 2
}, {
offset = 1070,
text = "@MENU_PING",
dataindex = 4
}, {
offset = 10,
image = "s1_icon_locked",
customelement = function(value, offset)
return LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
height = 20,
width = 20,
left = offset,
top = 2,
material = RegisterMaterial(CoD.Material.RestrictedIcon),
alpha = value == "1" and 1 or 0,
color = {
r = 1,
b = 1,
g = 1
}
})
end,
dataindex = 5
}}
function textlength(text, font, height)
local _, _, width = luiglobals.GetTextDimensions(text, font, height)
return width
local _, _, width = luiglobals.GetTextDimensions(text, font, height)
return width
end
function trimtext(text, font, height, maxwidth)
if (maxwidth < 0) then
return text
end
if (maxwidth < 0) then
return text
end
while (textlength(text, font, height) > maxwidth) do
text = text:sub(1, #text - 1)
end
while (textlength(text, font, height) > maxwidth) do
text = text:sub(1, #text - 1)
end
return text
return text
end
SystemLinkJoinMenu.AddHeaderButton = function(menu, f12_arg1, width)
local state = CoD.CreateState(0, f12_arg1, nil, nil, CoD.AnchorTypes.TopLeft)
state.width = width
local element = LUI.UIElement.new(state)
local button = SystemLinkJoinMenu.CreateButton("header", 24)
local state = CoD.CreateState(0, f12_arg1, nil, nil, CoD.AnchorTypes.TopLeft)
state.width = width
local element = LUI.UIElement.new(state)
local button = SystemLinkJoinMenu.CreateButton("header", 24)
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.TopLeftRight), 40,
LUI.Divider.Grey))
button:makeNotFocusable()
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.BottomLeftRight), 40,
LUI.Divider.Grey))
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.TopLeftRight), 40,
LUI.Divider.Grey))
button:makeNotFocusable()
button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.BottomLeftRight), 40,
LUI.Divider.Grey))
button.m_eventHandlers = {}
button.m_eventHandlers = {}
for i = 1, #columns do
if (columns[i].text) then
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, Engine.Localize(columns[i].text), nil)
elseif (columns[i].image) then
local image = LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
height = 20,
width = 20,
top = 2,
left = columns[i].offset,
material = RegisterMaterial(columns[i].image)
})
button.textHolder:addElement(image)
end
end
for i = 1, #columns do
if (columns[i].text) then
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, Engine.Localize(columns[i].text), nil)
elseif (columns[i].image) then
local image = LUI.UIImage.new({
leftAnchor = true,
topAnchor = true,
height = 20,
width = 20,
top = 2,
left = columns[i].offset,
material = RegisterMaterial(columns[i].image)
})
button.textHolder:addElement(image)
end
end
element:addElement(button)
menu:addElement(element)
element:addElement(button)
menu:addElement(element)
end
SystemLinkJoinMenu.AddServerButton = function(menu, controller, index)
local button = SystemLinkJoinMenu.CreateButton(index or "header", 24)
button:makeFocusable()
button.index = index
button:addEventHandler("button_action", SystemLinkJoinMenu.OnJoinGame)
local button = SystemLinkJoinMenu.CreateButton(index or "header", 24)
button:makeFocusable()
button.index = index
button:addEventHandler("button_action", SystemLinkJoinMenu.OnJoinGame)
local gettext = function(i)
local text = Lobby.GetServerData(controller, index, columns[i].dataindex)
if (columns[i].customelement) then
text = columns[i].customelement(text)
end
local gettext = function(i)
local text = Lobby.GetServerData(controller, index, columns[i].dataindex)
if (columns[i].customelement) then
text = columns[i].customelement(text)
end
local islast = not columns[i + 1]
local end_ = islast and 1130 or columns[i + 1].offset
local maxlength = end_ - columns[i].offset
local islast = not columns[i + 1]
local end_ = islast and 1130 or columns[i + 1].offset
local maxlength = end_ - columns[i].offset
if (maxlength < 0) then
maxlength = columns[i].offset - end_
end
if (maxlength < 0) then
maxlength = columns[i].offset - end_
end
if (not islast) then
maxlength = maxlength - 50
end
if (not islast) then
maxlength = maxlength - 50
end
return trimtext(text, CoD.TextSettings.TitleFontSmall.Font, 14, maxlength)
end
return trimtext(text, CoD.TextSettings.TitleFontSmall.Font, 14, maxlength)
end
for i = 1, #columns do
if (columns[i].customelement) then
local value = Lobby.GetServerData(controller, index, columns[i].dataindex)
local element = columns[i].customelement(value, columns[i].offset)
button.textHolder:addElement(element)
else
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, gettext(i), luiglobals.Colors.h1.medium_grey)
end
end
for i = 1, #columns do
if (columns[i].customelement) then
local value = Lobby.GetServerData(controller, index, columns[i].dataindex)
local element = columns[i].customelement(value, columns[i].offset)
button.textHolder:addElement(element)
else
SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, gettext(i),
luiglobals.Colors.h1.medium_grey)
end
end
menu.list:addElement(button)
return button
menu.list:addElement(button)
return button
end
SystemLinkJoinMenu.MakeText = function(menu, f5_arg1, text, color)
local state = CoD.CreateState(f5_arg1, nil, f5_arg1 + 200, nil, CoD.AnchorTypes.Left)
state.font = CoD.TextSettings.TitleFontSmall.Font
state.top = -6
state.height = 14
state.alignment = nil
state.glow = LUI.GlowState.None
state.color = color
local state = CoD.CreateState(f5_arg1, nil, f5_arg1 + 200, nil, CoD.AnchorTypes.Left)
state.font = CoD.TextSettings.TitleFontSmall.Font
state.top = -6
state.height = 14
state.alignment = nil
state.glow = LUI.GlowState.None
state.color = color
local el = LUI.UIText.new(state)
el:registerAnimationState("focused", {
color = luiglobals.Colors.white
})
local el = LUI.UIText.new(state)
el:registerAnimationState("focused", {
color = luiglobals.Colors.white
})
el:registerEventHandler("focused", function(element, event)
element:animateToState("focused", 0)
end)
el:registerEventHandler("focused", function(element, event)
element:animateToState("focused", 0)
end)
el:registerEventHandler("unfocused", function(element, event)
element:animateToState("default", 0)
end)
el:registerEventHandler("unfocused", function(element, event)
element:animateToState("default", 0)
end)
el:setText(text)
menu:addElement(el)
el:setText(text)
menu:addElement(el)
return el
return el
end
function menu_systemlink_join(f19_arg0, f19_arg1)
local width = 1145
local width = 1145
local menu = LUI.MenuTemplate.new(f19_arg0, {
menu_title = "@PLATFORM_SYSTEM_LINK_TITLE",
menu_width = width,
menu_top_indent = 20,
disableDeco = true,
spacing = 1
})
local menu = LUI.MenuTemplate.new(f19_arg0, {
menu_title = "@PLATFORM_SYSTEM_LINK_TITLE",
menu_width = width,
menu_top_indent = 20,
disableDeco = true,
spacing = 1
})
SystemLinkJoinMenu.AddHeaderButton(menu, 80, width)
SystemLinkJoinMenu.AddLowerCounter(menu, width)
SystemLinkJoinMenu.UpdateCounterText(menu, nil)
Lobby.BuildServerList(Engine.GetFirstActiveController())
SystemLinkJoinMenu.AddHeaderButton(menu, 80, width)
SystemLinkJoinMenu.AddLowerCounter(menu, width)
SystemLinkJoinMenu.UpdateCounterText(menu, nil)
Lobby.BuildServerList(Engine.GetFirstActiveController())
local playercount = LUI.UIText.new({
rightAnchor = true,
topAnchor = true,
height = 18,
bottom = 58,
font = CoD.TextSettings.BodyFont.Font,
width = 300,
alignment = LUI.Alignment.Right,
})
menu:addElement(playercount)
local playercount = LUI.UIText.new({
rightAnchor = true,
topAnchor = true,
height = 18,
bottom = 58,
font = CoD.TextSettings.BodyFont.Font,
width = 300,
alignment = LUI.Alignment.Right
})
menu:addElement(playercount)
local servercount = LUI.UIText.new({
rightAnchor = true,
topAnchor = true,
height = 18,
bottom = 58 - 25,
font = CoD.TextSettings.BodyFont.Font,
width = 300,
alignment = LUI.Alignment.Right,
})
menu:addElement(servercount)
local servercount = LUI.UIText.new({
rightAnchor = true,
topAnchor = true,
height = 18,
bottom = 58 - 25,
font = CoD.TextSettings.BodyFont.Font,
width = 300,
alignment = LUI.Alignment.Right
})
menu:addElement(servercount)
menu.list:registerEventHandler(LUI.UIScrollIndicator.UpdateEvent, function(element, event)
SystemLinkJoinMenu.UpdateCounterText(menu, event)
menu.list:registerEventHandler(LUI.UIScrollIndicator.UpdateEvent, function(element, event)
SystemLinkJoinMenu.UpdateCounterText(menu, event)
playercount:setText(Engine.Localize("@SERVERLIST_PLAYER_COUNT", serverlist:getplayercount()))
servercount:setText(Engine.Localize("@SERVERLIST_SERVER_COUNT", serverlist:getservercount()))
end)
playercount:setText(Engine.Localize("@SERVERLIST_PLAYER_COUNT", serverlist:getplayercount()))
servercount:setText(Engine.Localize("@SERVERLIST_SERVER_COUNT", serverlist:getservercount()))
end)
SystemLinkJoinMenu.UpdateGameList(menu)
menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList)
SystemLinkJoinMenu.UpdateGameList(menu)
menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList)
LUI.ButtonHelperText.ClearHelperTextObjects(menu.help, {
side = "all"
})
LUI.ButtonHelperText.ClearHelperTextObjects(menu.help, {
side = "all"
})
menu:AddHelp({
name = "add_button_helper_text",
button_ref = "button_alt1",
helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"),
side = "right",
clickable = true,
priority = -1000
}, function(f21_arg0, f21_arg1)
SystemLinkJoinMenu.RefreshServers(f21_arg0, f21_arg1, menu)
end)
menu:AddHelp({
name = "add_button_helper_text",
button_ref = "button_alt1",
helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"),
side = "right",
clickable = true,
priority = -1000
}, function(f21_arg0, f21_arg1)
SystemLinkJoinMenu.RefreshServers(f21_arg0, f21_arg1, menu)
end)
menu:AddHelp({
name = "add_button_helper_text",
button_ref = "button_action",
helper_text = Engine.Localize("@MENU_JOIN_GAME1"),
side = "left",
clickable = false,
priority = -1000
}, nil, nil, true)
menu:AddHelp({
name = "add_button_helper_text",
button_ref = "button_action",
helper_text = Engine.Localize("@MENU_JOIN_GAME1"),
side = "left",
clickable = false,
priority = -1000
}, nil, nil, true)
menu:AddBackButton()
menu:AddBackButton()
Lobby.RefreshServerList(Engine.GetFirstActiveController())
Lobby.RefreshServerList(Engine.GetFirstActiveController())
return menu
return menu
end
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
return
return
end
function createdivider(menu, text)
local element = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
left = 0,
right = 0,
topAnchor = true,
bottomAnchor = false,
top = 0,
bottom = 33.33
})
local element = LUI.UIElement.new({
leftAnchor = true,
rightAnchor = true,
left = 0,
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 = Engine.ToUpperCase(Engine.Localize(text))
}))
element.scrollingToNext = true
element:addElement(LUI.MenuBuilder.BuildRegisteredType("h1_option_menu_titlebar", {
title_bar_text = Engine.ToUpperCase(Engine.Localize(text))
}))
menu.list:addElement(element)
menu.list:addElement(element)
end
local personalizationbutton = LUI.MPLobbyBase.AddPersonalizationButton
LUI.MPLobbyBase.AddPersonalizationButton = function(menu)
personalizationbutton(menu)
menu:AddButton("@LUA_MENU_STATS", function()
LUI.FlowManager.RequestAddMenu(nil, "stats_menu")
end)
personalizationbutton(menu)
menu:AddButton("@LUA_MENU_STATS", function()
LUI.FlowManager.RequestAddMenu(nil, "stats_menu")
end)
end
LUI.MenuBuilder.registerType("stats_menu", function(a1)
local menu = LUI.MenuTemplate.new(a1, {
menu_title = Engine.ToUpperCase(Engine.Localize("@LUA_MENU_STATS")),
menu_width = luiglobals.GenericMenuDims.OptionMenuWidth
})
local menu = LUI.MenuTemplate.new(a1, {
menu_title = Engine.ToUpperCase(Engine.Localize("@LUA_MENU_STATS")),
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",
"@LUA_MENU_UNLOCKALL_ITEMS_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_items", "@LUA_MENU_UNLOCKALL_ITEMS",
"@LUA_MENU_UNLOCKALL_ITEMS_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_loot", "@LUA_MENU_UNLOCKALL_LOOT",
"@LUA_MENU_UNLOCKALL_LOOT_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_loot", "@LUA_MENU_UNLOCKALL_LOOT",
"@LUA_MENU_UNLOCKALL_LOOT_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_classes", "@LUA_MENU_UNLOCKALL_CLASSES",
"@LUA_MENU_UNLOCKALL_CLASSES_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, nil, nil)
LUI.Options.CreateOptionButton(menu, "cg_unlockall_classes", "@LUA_MENU_UNLOCKALL_CLASSES",
"@LUA_MENU_UNLOCKALL_CLASSES_DESC", {{
text = "@LUA_MENU_ENABLED",
value = true
}, {
text = "@LUA_MENU_DISABLED",
value = false
}}, 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 experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local rank = Lobby.GetRankForXP(experience, prestige)
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local rank = Lobby.GetRankForXP(experience, prestige)
prestigeeditbutton(menu, function(value)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "prestige", tonumber(value))
end)
prestigeeditbutton(menu, function(value)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "prestige", tonumber(value))
end)
rankeditbutton(menu, function(value)
local rank = tonumber(value)
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = rank == 0 and 0 or Rank.GetRankMaxXP(tonumber(value) - 1, prestige)
rankeditbutton(menu, function(value)
local rank = tonumber(value)
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = rank == 0 and 0 or Rank.GetRankMaxXP(tonumber(value) - 1, prestige)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "experience", experience)
end)
Engine.SetPlayerData(0, CoD.StatsGroup.Ranked, "experience", experience)
end)
LUI.Options.InitScrollingList(menu.list, nil)
LUI.Options.AddOptionTextInfo(menu)
LUI.Options.InitScrollingList(menu.list, nil)
LUI.Options.AddOptionTextInfo(menu)
menu:AddBackButton()
menu:AddBackButton()
return menu
return menu
end)
function prestigeeditbutton(menu, callback)
local options = {}
local max = Lobby.GetMaxPrestigeLevel()
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local options = {}
local max = Lobby.GetMaxPrestigeLevel()
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
table.insert(options, {
text = "@" .. i,
value = i .. ""
})
end
table.insert(options, {
text = "@" .. i,
value = i .. ""
})
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,
nil, nil, callback)
LUI.Options.CreateOptionButton(menu, "ui_prestige_level", "@LUA_MENU_PRESTIGE", "@LUA_MENU_PRESTIGE_DESC", options,
nil, nil, callback)
end
function rankeditbutton(menu, callback)
local options = {}
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local options = {}
local prestige = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "prestige") or 0
local experience = Engine.GetPlayerData(0, CoD.StatsGroup.Ranked, "experience") or 0
local rank = Lobby.GetRankForXP(experience, prestige)
local max = Rank.GetMaxRank(prestige)
local maxprestige = Lobby.GetMaxPrestigeLevel()
local rank = Lobby.GetRankForXP(experience, prestige)
local max = Rank.GetMaxRank(prestige)
local maxprestige = Lobby.GetMaxPrestigeLevel()
for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
for i = 0, max do
game:addlocalizedstring("LUA_MENU_" .. i, i .. "")
table.insert(options, {
text = "@" .. (i + 1),
value = i .. ""
})
end
table.insert(options, {
text = "@" .. (i + 1),
value = i .. ""
})
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,
nil, callback)
return LUI.Options.CreateOptionButton(menu, "ui_rank_level_", "@LUA_MENU_RANK", "@LUA_MENU_RANK_DESC", options, nil,
nil, callback)
end
local isclasslocked = Cac.IsCustomClassLocked
Cac.IsCustomClassLocked = function(...)
if (Engine.GetDvarBool("cg_unlockall_classes")) then
return false
end
if (Engine.GetDvarBool("cg_unlockall_classes")) then
return false
end
return isclasslocked(...)
return isclasslocked(...)
end

View File

@ -1,2 +1,14 @@
deu_h1_mod_common
eng_h1_mod_common
ens_h1_mod_common
fra_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
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_DESC": "Save changes.",
"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");
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)

View File

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

View File

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

View File

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

View File

@ -1,5 +1,10 @@
#pragma once
#include "component/console.hpp"
#include <utils/io.hpp>
#define LANGUAGE_FILE "players2/default/language"
namespace steam
{
class apps
@ -7,6 +12,24 @@ namespace steam
public:
~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 BIsLowViolence();
virtual bool BIsCybercafe();