Merge branch 'main' into mod-panel

This commit is contained in:
jvyden 2022-07-26 19:30:40 -04:00
commit ea25751e71
No known key found for this signature in database
GPG key ID: 18BCF2BE0262B278
136 changed files with 4358 additions and 161 deletions

View file

@ -15,6 +15,7 @@
<Path>ProjectLighthouse.sln.DotSettings.user</Path>
<Path>README.md</Path>
<Path>create-migration.sh</Path>
<Path>crowdin.yml</Path>
<Path>docker-compose.yml</Path>
<Path>global.json</Path>
<Path>scripts-and-tools</Path>

View file

@ -17,9 +17,6 @@ Once you've gotten MySQL running you can run Lighthouse. It will take care of th
PS3 is difficult to set up, so I will be going over how to set up RPCS3 instead. A guide will be coming for PS3 closer
to release. You can also follow this guide if you want to learn how to modify your EBOOT.
*Note: This requires a patched copy of RPCS3. You can find a working
version [on our GitHub](https://github.com/LBPUnion/rpcs3).*
Start by getting a copy of LittleBigPlanet 1/2 installed. (Check the LittleBigPlanet 1 section, since you'll need to do
extra steps for your game to not crash upon entering pod computer).
@ -44,8 +41,8 @@ Now, copy the `EBOOTlocalhost.elf` file to where you got your `EBOOT.elf` file f
To launch the game with the patched EBOOT, open up RPCS3, go to File, Boot SELF/ELF, and open up `EBOOTlocalhost.elf`.
Assuming you are running the patched version of RPCS3, you patched the file correctly, the database is migrated, and
Project Lighthouse is running, the game should now connect and you may begin contributing!
Assuming you patched the file correctly, the database is migrated, and
Project Lighthouse is running, the game should now connect, and you may begin contributing!
### LittleBigPlanet 1

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Home</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Users</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Photos</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Levels</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Authentication</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Login / Register</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profile</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Admin Panel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Log out</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Forside</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Brugere</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Fotos</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Baner</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Godkendelse</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Log ind / Registrer</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profil</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Administrationspanel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Log ud</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Hejmo</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Uzantoj</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Fotoj</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Etaĝoj</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Aŭtentigado</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Ensaluto / Registro</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profilo</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Panelo de administranto</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Adiaŭi</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Inicio</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Usuarios</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Fotos</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Niveles</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Autenticación</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Iniciar sesión / Registrarse</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Perfil</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Panel de administración</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Cerrar sesión</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Home</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Users</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Photos</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Levels</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Authentication</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Login / Register</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profile</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Admin Panel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Log out</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Home</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Users</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Photos</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Levels</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Authentication</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Login / Register</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profile</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Admin Panel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Log out</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Home</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Users</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Photos</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Levels</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Authentication</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Login / Register</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profile</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Admin Panel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Log out</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Home</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Users</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Photos</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Levels</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Authentication</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Login / Register</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profile</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Admin Panel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Log out</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>ホーム</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>ユーザー</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>画像</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>レベル</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>認証</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>ログイン/サインアップ</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>プロフィール</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>管理者の部屋</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>ログアウト</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Hjem</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Brukere</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Bilder</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Nivåer</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Godkjenning</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Logg inn/Registrer</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profil</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Administrasjon</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Logg ut</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Strona Główna</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Gracze</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Zdjęcia</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Poziomy</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Autoryzacja</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Login / Rejestracja</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profil</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Panel Administracyjny</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Wyloguj</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Home</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Users</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Photos</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Levels</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Authentication</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Login / Register</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profile</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Admin Panel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Log out</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Главная</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Пользователи</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Фотографии</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Уровни</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Аутентификация</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Вход / Регистрация</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Профиль</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Админпанель</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Выйти</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Startsida</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Användare</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Foton</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Banor</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Autentisering</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Logga in / Registrera</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Min Profil</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Administrationspanel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Logga ut</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>主页</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>用户</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>图片</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>追踪</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Authentication</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Login / Register</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profile</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Admin Panel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Log out</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
</root>

View file

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="header_home" xml:space="preserve">
<value>Home</value>
<comment>A button on the header that takes you to the landing page.</comment>
</data>
<data name="header_users" xml:space="preserve">
<value>Users</value>
<comment>A button on the header that takes you to the user listing.</comment>
</data>
<data name="header_photos" xml:space="preserve">
<value>Photos</value>
<comment>A button on the header that takes you to a list of user-uploaded photos.</comment>
</data>
<data name="header_slots" xml:space="preserve">
<value>Levels</value>
<comment>A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".</comment>
</data>
<data name="header_authentication" xml:space="preserve">
<value>Authentication</value>
<comment>A button on the header that takes you to a list of authentication attempts.</comment>
</data>
<data name="header_loginRegister" xml:space="preserve">
<value>Login / Register</value>
<comment>A button on the header that lets you log in or register.</comment>
</data>
<data name="header_profile" xml:space="preserve">
<value>Profile</value>
<comment>A quick shortcut on the header to take you to your profile if logged in.</comment>
</data>
<data name="header_adminPanel" xml:space="preserve">
<value>Admin Panel</value>
<comment>A header link that takes you to the admin panel if available.</comment>
</data>
<data name="header_logout" xml:space="preserve">
<value>Log out</value>
<comment>A shortcut to log you out of your account.</comment>
</data>
<data name="header_modPanel" xml:space="preserve">
<value>Mod Panel</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Brugernavn</value>
</data>
<data name="password" xml:space="preserve">
<value>Adgangskode</value>
</data>
<data name="register" xml:space="preserve">
<value>Registrer</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Glemt adgangskode?</value>
</data>
<data name="error" xml:space="preserve">
<value>Åh nej!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log ind</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>ユーザーネーム</value>
</data>
<data name="password" xml:space="preserve">
<value>パスワード</value>
</data>
<data name="register" xml:space="preserve">
<value>登録する</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>パスワードを忘れましたか?</value>
</data>
<data name="error" xml:space="preserve">
<value>おおっと!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>ログイン</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Brukernavn</value>
</data>
<data name="password" xml:space="preserve">
<value>Passord</value>
</data>
<data name="register" xml:space="preserve">
<value>Registrer</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Glemt Passord?</value>
</data>
<data name="error" xml:space="preserve">
<value>Ånei!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Logg in</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Användarnamn</value>
</data>
<data name="password" xml:space="preserve">
<value>Lösenord</value>
</data>
<data name="register" xml:space="preserve">
<value>Registrera</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Glömt lösenordet?</value>
</data>
<data name="error" xml:space="preserve">
<value>Ajdå!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Logga in</value>
</data>
</root>

View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>用户名</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>忘记密码?</value>
</data>
<data name="error" xml:space="preserve">
<value>哎呀!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>登入</value>
</data>
</root>

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="username" xml:space="preserve">
<value>Username</value>
</data>
<data name="password" xml:space="preserve">
<value>Password</value>
</data>
<data name="register" xml:space="preserve">
<value>Register</value>
</data>
<data name="forgot_password" xml:space="preserve">
<value>Forgot Password?</value>
</data>
<data name="error" xml:space="preserve">
<value>Uh oh!</value>
</data>
<data name="log_in" xml:space="preserve">
<value>Log In</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>You are currently logged in as {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>There are no users online. Why not hop on?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>There is 1 user currently online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>There are currently {0} users online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>You have {0} authentication attempts pending. Click here to view them.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Velkommen til {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>Du er i øjeblikket logget ind som {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>Der er ingen brugere online. Hvorfor ikke hoppe på?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>Der er 1 bruger online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>Der er {0} brugere online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>Du har {0} godkendelsesforsøg afventende. Klik her for at se dem.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Seneste Baner</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Seneste Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>Vi ensalutinta kiel {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>Ne estas uzantoj enretaj. Kial ne sursalti?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>Estas 1 uzanto enreta:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>Estas {0} uzantoj enretaj:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>Vi havas {0} pritraktatajn aŭtentigajn provojn. Klaku ĉi tie por vidi ilin.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>Estás conectado actualmente como {0}</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>No hay usuarios en línea. ¿Por qué no subirse?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>Hay 1 usuario actualmente en línea:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>Actualmente hay {0} usuarios en línea:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>Tiene {0} intentos de autenticación pendientes. Haga clic aquí para verlos.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>You are currently logged in as {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>There are no users online. Why not hop on?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>There is 1 user currently online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>There are currently {0} users online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>You have {0} authentication attempts pending. Click here to view them.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>You are currently logged in as {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>There are no users online. Why not hop on?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>There is 1 user currently online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>There are currently {0} users online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>You have {0} authentication attempts pending. Click here to view them.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>You are currently logged in as {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>There are no users online. Why not hop on?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>There is 1 user currently online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>There are currently {0} users online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>You have {0} authentication attempts pending. Click here to view them.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>You are currently logged in as {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>There are no users online. Why not hop on?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>There is 1 user currently online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>There are currently {0} users online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>You have {0} authentication attempts pending. Click here to view them.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>{0}へようこそ</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>{0}がログインしています</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>オンラインユーザーはなし</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>1人のユーザーがオンライン</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>{0}人のユーザーがオンライン</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>{0} の認証が保留中です。ここをクリックして確認してください。</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>最新のレベル</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>最新のチームピック</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Velkommen til {0}</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>Du er logget inn som {0}</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>Det er ingen brukere på. Hvorfor ikke hoppe på?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>Det er 1 bruker på for øyeblikket:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>For tiden er {0} brukere pålogget:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>Du har {0} autentiseringsforsøk. Klikk her for å se dem.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Nyeste nivåer</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Siste lag valg</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>Jesteś zalogowany jako {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>Nikt nie jest online. Dlaczego by nie zagrać?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>Jest 1 gracz online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>Obecnie jest {0} graczy online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>Masz {0} oczekujących prób autoryzacji. Kliknij tutaj, by je zobaczyć.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>You are currently logged in as {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>There are no users online. Why not hop on?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>There is 1 user currently online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>There are currently {0} users online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>You have {0} authentication attempts pending. Click here to view them.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>Вы вошли как {0}</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>Нет пользователей в сети. Почему бы и не поиграть?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>Сейчас в сети 1 пользователь:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>В настоящее время сейчас {0} онлайн:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>У вас есть {0} попыток аутентификации в ожидании. Нажмите здесь, чтобы просмотреть их.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Välkommen till {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>Du är inloggad som {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>Ingen är online. Dags att gibba?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>1 användare är online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>{0} användare är online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>{0} autentiseringsförsök väntar. Klicka här för att visa dem.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Senaste Banor</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Senaste Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>You are currently logged in as {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>There are no users online. Why not hop on?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>There is 1 user currently online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>There are currently {0} users online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>You have {0} authentication attempts pending. Click here to view them.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="welcome" xml:space="preserve">
<value>Welcome to {0}!</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="loggedInAs" xml:space="preserve">
<value>You are currently logged in as {0}.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_none" xml:space="preserve">
<value>There are no users online. Why not hop on?</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_single" xml:space="preserve">
<value>There is 1 user currently online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="users_multiple" xml:space="preserve">
<value>There are currently {0} users online:</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="authAttemptsPending" xml:space="preserve">
<value>You have {0} authentication attempts pending. Click here to view them.</value>
<comment>A greeting on the main page of the website.</comment>
</data>
<data name="newest_levels" xml:space="preserve">
<value>Newest Levels</value>
</data>
<data name="latest_team_picks" xml:space="preserve">
<value>Latest Team Picks</value>
</data>
</root>

View file

@ -0,0 +1,108 @@
using System.Diagnostics;
using System.Reflection;
using System.Resources;
namespace LBPUnion.ProjectLighthouse.Localization;
public static class LocalizationManager
{
private static readonly string namespaceStr = typeof(LocalizationManager).Namespace ?? "";
public const string DefaultLang = "en-US";
public static string GetLocalizedString(TranslationAreas translationArea, string language, string key)
{
// ASP.NET requires specific names for certain languages (like ja for japanese as opposed to the standard ja-JP)
// We map that value back here.
language = mapLanguageBack(language);
#if DEBUG
Console.WriteLine($"Attempting to load '{key}' for '{language}'");
#endif
string resourceBasename = $"{namespaceStr}.{translationArea.ToString()}";
// We don't have an en-US .resx, so if we aren't using en-US then we need to add the appropriate language.
// Otherwise, keep it to the normal .resx file
// e.g. BaseLayout.resx as opposed to BaseLayout.lang-da-DK.resx.
if (language != DefaultLang) resourceBasename += $".lang-{language}";
string? localizedString = null;
try
{
ResourceManager resourceManager = new(resourceBasename,
Assembly.GetExecutingAssembly());
localizedString = resourceManager.GetString(key);
}
catch
{
// ignored
}
if (localizedString == null)
{
#if DEBUG
if (Debugger.IsAttached) Debugger.Break();
#endif
return $"{translationArea.ToString()}.{language}.{key}";
}
return localizedString;
}
// If a language isn't working, it might be because a language is using a different name than what ASP.NET expects.
// You can retrieve the name of the language from the <c>Accept-Language</c> header in an HTTP request.
private static readonly Dictionary<string, string> languageMappings = new()
{
{
"ja-JP", "ja"
},
{
"eo-UY", "eo"
},
};
/// <summary>
/// Some languages crowdin uses have names that differ from the ones that ASP.NET expects. This function converts the names.
/// </summary>
/// <param name="language">The language to convert to ASP.NET names</param>
/// <returns>The name of the language that ASP.NET expects.</returns>
public static string MapLanguage(string language)
{
foreach ((string? key, string? value) in languageMappings)
{
if (key == language) return value;
}
return language;
}
private static string mapLanguageBack(string language)
{
foreach ((string? key, string? value) in languageMappings)
{
if (value == language) return key;
}
return language;
}
// This is a bit scuffed, but it will work for what I need it to do.
public static IEnumerable<string> GetAvailableLanguages()
{
string area = TranslationAreas.BaseLayout.ToString();
List<string> languages = Assembly.GetExecutingAssembly()
.GetManifestResourceNames()
.Where(r => r.StartsWith($"{namespaceStr}.{area}"))
.Select(r => r.Substring(r.IndexOf(area), r.Length - r.IndexOf(area)).Substring(area.Length + 1))
.Select(r => r.Replace(".resources", string.Empty)) // Remove .resources
.Select(r => r.Replace("lang-", string.Empty)) // Remove 'lang-' prefix from languages
.Where(r => r != "resources")
.ToList();
languages.Add(DefaultLang);
return languages;
}
}

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logget ud</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>Du er blevet logget ud. Du vil blive omdirigeret om 5 sekunder, eller du kan klikke nedenfor for at gøre det manuelt.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Omdiriger</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>ログアウトしました</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>正常にログアウトされました。5秒後にリダイレクトされるか、以下をクリックして手動でログアウトできます。</value>
</data>
<data name="redirect" xml:space="preserve">
<value>リダイレクト</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logget ut</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>Du har blitt logget ut. Du vil bli omdirigert om 5 sekunder, eller du kan klikke nedenfor for å gjøre det manuelt.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Videresend</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Utloggad</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>Du har loggat ut. Om 5 sekunder kommer du bli omderigerad, eller kan du klicka på knappen under, manuellt.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Omdirigera</value>
</data>
</root>

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="logged_out" xml:space="preserve">
<value>Logged Out</value>
</data>
<data name="logged_out_info" xml:space="preserve">
<value>You have been successfully logged out. You will be redirected in 5 seconds, or you may click below to do so manually.</value>
</data>
<data name="redirect" xml:space="preserve">
<value>Redirect</value>
</data>
</root>

View file

@ -0,0 +1,22 @@
using System.Reflection;
namespace LBPUnion.ProjectLighthouse.Localization;
public static class Program
{
public static void Main()
{
Console.WriteLine("Resource files loaded:");
foreach (string resourceFile in Assembly.GetExecutingAssembly().GetManifestResourceNames())
{
Console.WriteLine(" " + resourceFile);
}
Console.Write('\n');
foreach (string language in LocalizationManager.GetAvailableLanguages())
{
Console.WriteLine(LocalizationManager.GetLocalizedString(TranslationAreas.BaseLayout, language, "header_home"));
}
}
}

View file

@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RootNamespace>LBPUnion.ProjectLighthouse.Localization</RootNamespace>
<OutputType>Exe</OutputType>
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Update="LandingPage.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>LandingPage.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="General.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>General.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="LoggedOut.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>LoggedOut.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

View file

@ -0,0 +1,18 @@
namespace LBPUnion.ProjectLighthouse.Localization.StringLists;
public static class BaseLayoutStrings
{
public static readonly TranslatableString HeaderHome = create("header_home");
public static readonly TranslatableString HeaderUsers = create("header_users");
public static readonly TranslatableString HeaderPhotos = create("header_photos");
public static readonly TranslatableString HeaderSlots = create("header_slots");
public static readonly TranslatableString HeaderAuthentication = create("header_authentication");
public static readonly TranslatableString HeaderLoginRegister = create("header_loginRegister");
public static readonly TranslatableString HeaderProfile = create("header_profile");
public static readonly TranslatableString HeaderAdminPanel = create("header_adminPanel");
public static readonly TranslatableString HeaderModPanel = create("header_modPanel");
public static readonly TranslatableString HeaderLogout = create("header_logout");
private static TranslatableString create(string key) => new(TranslationAreas.BaseLayout, key);
}

View file

@ -0,0 +1,13 @@
namespace LBPUnion.ProjectLighthouse.Localization.StringLists;
public static class GeneralStrings
{
public static readonly TranslatableString Username = create("username");
public static readonly TranslatableString Password = create("password");
public static readonly TranslatableString Register = create("register");
public static readonly TranslatableString ForgotPassword = create("forgot_password");
public static readonly TranslatableString Error = create("error");
public static readonly TranslatableString LogIn = create("log_in");
private static TranslatableString create(string key) => new(TranslationAreas.General, key);
}

View file

@ -0,0 +1,18 @@
namespace LBPUnion.ProjectLighthouse.Localization.StringLists;
public static class LandingPageStrings
{
public static readonly TranslatableString Welcome = create("welcome");
public static readonly TranslatableString LoggedInAs = create("loggedInAs");
public static readonly TranslatableString UsersNone = create("users_none");
public static readonly TranslatableString UsersSingle = create("users_single");
public static readonly TranslatableString UsersMultiple = create("users_multiple");
public static readonly TranslatableString LatestTeamPicks = create("latest_team_picks");
public static readonly TranslatableString NewestLevels = create("newest_levels");
public static readonly TranslatableString AuthAttemptsPending = create("authAttemptsPending");
private static TranslatableString create(string key) => new(TranslationAreas.LandingPage, key);
}

View file

@ -0,0 +1,10 @@
namespace LBPUnion.ProjectLighthouse.Localization.StringLists;
public static class LoggedOutStrings
{
public static readonly TranslatableString LoggedOut = create("logged_out");
public static readonly TranslatableString LoggedOutInfo = create("logged_out_info");
public static readonly TranslatableString Redirect = create("redirect");
private static TranslatableString create(string key) => new(TranslationAreas.LoggedOut, key);
}

View file

@ -0,0 +1,27 @@
namespace LBPUnion.ProjectLighthouse.Localization;
public class TranslatableString
{
public TranslatableString(TranslationAreas area, string key)
{
this.Key = key;
this.Area = area;
}
public string Key { get; init; }
public TranslationAreas Area { get; init; }
public string Translate(string language) => LocalizationManager.GetLocalizedString(this.Area, language, this.Key);
public string Translate(string language, params object?[] format) => string.Format(LocalizationManager.GetLocalizedString(this.Area, language, this.Key), format);
// CS0809 is a warning about obsolete methods overriding non-obsoleted methods.
// That works against what we're trying to do here, so we disable the warning here.
#pragma warning disable CS0809
[Obsolete("Do not translate by using ToString. Use TranslatableString.Translate().", true)]
public override string ToString() => "NOT TRANSLATED CORRECTLY!";
#pragma warning restore CS0809
[Obsolete("Do not translate by using ToString. Use TranslatableString.Translate().", true)]
public static implicit operator string(TranslatableString _) => "NOT TRANSLATED CORRECTLY!";
}

View file

@ -0,0 +1,9 @@
namespace LBPUnion.ProjectLighthouse.Localization;
public enum TranslationAreas
{
BaseLayout,
LandingPage,
General,
LoggedOut,
}

View file

@ -1,6 +1,7 @@
#nullable enable
using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
using LBPUnion.ProjectLighthouse.Types;
using LBPUnion.ProjectLighthouse.PlayerData;
using LBPUnion.ProjectLighthouse.Helpers;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
@ -54,4 +55,33 @@ public class UserEndpoints : ApiEndpointController
return this.Ok(userStatus);
}
[HttpPost("user/inviteToken")]
public async Task<IActionResult> CreateUserInviteToken()
{
if (Configuration.ServerConfiguration.Instance.Authentication.PrivateRegistration ||
Configuration.ServerConfiguration.Instance.Authentication.RegistrationEnabled)
{
string authHeader = this.Request.Headers["Authorization"];
if (!string.IsNullOrWhiteSpace(authHeader))
{
string authToken = authHeader.Substring(authHeader.IndexOf(' ') + 1);
APIKey? apiKey = await this.database.APIKeys.FirstOrDefaultAsync(k => k.Key == authToken);
if (apiKey == null) return this.StatusCode(403, null);
RegistrationToken token = new();
token.Created = DateTime.Now;
token.Token = CryptoHelper.GenerateAuthToken();
this.database.RegistrationTokens.Add(token);
await this.database.SaveChangesAsync();
return Ok(token.Token);
}
}
return this.NotFound();
}
}

View file

@ -29,7 +29,7 @@ public class ClientConfigurationController : ControllerBase
HostString hostname = this.Request.Host;
return this.Ok
(
"ProbabilityOfPacketDelay 0.0\nMinPacketDelayFrames 0\nMaxPacketDelayFrames 3\nProbabilityOfPacketDrop 0.0\nEnableFakeConditionsForLoopback true\nNumberOfFramesPredictionAllowedForNonLocalPlayer 1000\nEnablePrediction true\nMinPredictedFrames 0\nMaxPredictedFrames 10\nAllowGameRendCameraSplit true\nFramesBeforeAgressiveCatchup 30\nPredictionPadSides 200\nPredictionPadTop 200\nPredictionPadBottom 200\nShowErrorNumbers true\nAllowModeratedLevels false\nAllowModeratedPoppetItems false\nTIMEOUT_WAIT_FOR_JOIN_RESPONSE_FROM_PREV_PARTY_HOST 50.0\nTIMEOUT_WAIT_FOR_CHANGE_LEVEL_PARTY_HOST 30.0\nTIMEOUT_WAIT_FOR_CHANGE_LEVEL_PARTY_MEMBER 45.0\nTIMEOUT_WAIT_FOR_REQUEST_JOIN_FRIEND 15.0\nTIMEOUT_WAIT_FOR_CONNECTION_FROM_HOST 30.0\nTIMEOUT_WAIT_FOR_ROOM_ID_TO_JOIN 60.0\nTIMEOUT_WAIT_FOR_GET_NUM_PLAYERS_ONLINE 60.0\nTIMEOUT_WAIT_FOR_SIGNALLING_CONNECTIONS 120.0\nTIMEOUT_WAIT_FOR_PARTY_DATA 60.0\nTIME_TO_WAIT_FOR_LEAVE_MESSAGE_TO_COME_BACK 20.0\nTIME_TO_WAIT_FOR_FOLLOWING_REQUESTS_TO_ARRIVE 30.0\nTIMEOUT_WAIT_FOR_FINISHED_MIGRATING_HOST 30.0\nTIMEOUT_WAIT_FOR_PARTY_LEADER_FINISH_JOINING 45.0\nTIMEOUT_WAIT_FOR_QUICKPLAY_LEVEL 60.0\nTIMEOUT_WAIT_FOR_PLAYERS_TO_JOIN 30.0\nTIMEOUT_WAIT_FOR_DIVE_IN_PLAYERS 240.0\nTIMEOUT_WAIT_FOR_FIND_BEST_ROOM 60.0\nTIMEOUT_DIVE_IN_TOTAL 300.0\nTIMEOUT_WAIT_FOR_SOCKET_CONNECTION 120.0\nTIMEOUT_WAIT_FOR_REQUEST_RESOURCE_MESSAGE 120.0\nTIMEOUT_WAIT_FOR_LOCAL_CLIENT_TO_GET_RESOURCE_LIST 120.0\nTIMEOUT_WAIT_FOR_CLIENT_TO_LOAD_RESOURCES 120.0\nTIMEOUT_WAIT_FOR_LOCAL_CLIENT_TO_SAVE_GAME_STATE 30.0\nTIMEOUT_WAIT_FOR_ADD_PLAYERS_TO_TAKE 30.0\nTIMEOUT_WAIT_FOR_UPDATE_FROM_CLIENT 90.0\nTIMEOUT_WAIT_FOR_HOST_TO_GET_RESOURCE_LIST 60.0\nTIMEOUT_WAIT_FOR_HOST_TO_SAVE_GAME_STATE 60.0\nTIMEOUT_WAIT_FOR_HOST_TO_ADD_US 30.0\nTIMEOUT_WAIT_FOR_UPDATE 60.0\nTIMEOUT_WAIT_FOR_REQUEST_JOIN 50.0\nTIMEOUT_WAIT_FOR_AUTOJOIN_PRESENCE 60.0\nTIMEOUT_WAIT_FOR_AUTOJOIN_CONNECTION 120.0\nSECONDS_BETWEEN_PINS_AWARDED_UPLOADS 300.0\nEnableKeepAlive true\nAllowVoIPRecordingPlayback true\nOverheatingThresholdDisallowMidgameJoin 0.95\nMaxCatchupFrames 3\nMaxLagBeforeShowLoading 23\nMinLagBeforeHideLoading 30\nLagImprovementInflectionPoint -1.0\nFlickerThreshold 2.0\nClosedDemo2014Version 1\nClosedDemo2014Expired false\nEnablePlayedFilter true\nEnableCommunityDecorations true\nGameStateUpdateRate 10.0\nGameStateUpdateRateWithConsumers 1.0\nDisableDLCPublishCheck false\nEnableDiveIn true\nEnableHackChecks false\nAllowOnlineCreate true" +
"ProbabilityOfPacketDelay 0.0\nMinPacketDelayFrames 0\nMaxPacketDelayFrames 3\nProbabilityOfPacketDrop 0.0\nEnableFakeConditionsForLoopback true\nNumberOfFramesPredictionAllowedForNonLocalPlayer 1000\nEnablePrediction true\nMinPredictedFrames 0\nMaxPredictedFrames 10\nAllowGameRendCameraSplit true\nFramesBeforeAgressiveCatchup 30\nPredictionPadSides 200\nPredictionPadTop 200\nPredictionPadBottom 200\nShowErrorNumbers true\nAllowModeratedLevels false\nAllowModeratedPoppetItems false\nTIMEOUT_WAIT_FOR_JOIN_RESPONSE_FROM_PREV_PARTY_HOST 50.0\nTIMEOUT_WAIT_FOR_CHANGE_LEVEL_PARTY_HOST 30.0\nTIMEOUT_WAIT_FOR_CHANGE_LEVEL_PARTY_MEMBER 45.0\nTIMEOUT_WAIT_FOR_REQUEST_JOIN_FRIEND 15.0\nTIMEOUT_WAIT_FOR_CONNECTION_FROM_HOST 30.0\nTIMEOUT_WAIT_FOR_ROOM_ID_TO_JOIN 60.0\nTIMEOUT_WAIT_FOR_GET_NUM_PLAYERS_ONLINE 60.0\nTIMEOUT_WAIT_FOR_SIGNALLING_CONNECTIONS 120.0\nTIMEOUT_WAIT_FOR_PARTY_DATA 60.0\nTIME_TO_WAIT_FOR_LEAVE_MESSAGE_TO_COME_BACK 20.0\nTIME_TO_WAIT_FOR_FOLLOWING_REQUESTS_TO_ARRIVE 30.0\nTIMEOUT_WAIT_FOR_FINISHED_MIGRATING_HOST 30.0\nTIMEOUT_WAIT_FOR_PARTY_LEADER_FINISH_JOINING 45.0\nTIMEOUT_WAIT_FOR_QUICKPLAY_LEVEL 60.0\nTIMEOUT_WAIT_FOR_PLAYERS_TO_JOIN 30.0\nTIMEOUT_WAIT_FOR_DIVE_IN_PLAYERS 240.0\nTIMEOUT_WAIT_FOR_FIND_BEST_ROOM 60.0\nTIMEOUT_DIVE_IN_TOTAL 300.0\nTIMEOUT_WAIT_FOR_SOCKET_CONNECTION 120.0\nTIMEOUT_WAIT_FOR_REQUEST_RESOURCE_MESSAGE 120.0\nTIMEOUT_WAIT_FOR_LOCAL_CLIENT_TO_GET_RESOURCE_LIST 120.0\nTIMEOUT_WAIT_FOR_CLIENT_TO_LOAD_RESOURCES 120.0\nTIMEOUT_WAIT_FOR_LOCAL_CLIENT_TO_SAVE_GAME_STATE 30.0\nTIMEOUT_WAIT_FOR_ADD_PLAYERS_TO_TAKE 30.0\nTIMEOUT_WAIT_FOR_UPDATE_FROM_CLIENT 90.0\nTIMEOUT_WAIT_FOR_HOST_TO_GET_RESOURCE_LIST 60.0\nTIMEOUT_WAIT_FOR_HOST_TO_SAVE_GAME_STATE 60.0\nTIMEOUT_WAIT_FOR_HOST_TO_ADD_US 30.0\nTIMEOUT_WAIT_FOR_UPDATE 60.0\nTIMEOUT_WAIT_FOR_REQUEST_JOIN 50.0\nTIMEOUT_WAIT_FOR_AUTOJOIN_PRESENCE 60.0\nTIMEOUT_WAIT_FOR_AUTOJOIN_CONNECTION 120.0\nSECONDS_BETWEEN_PINS_AWARDED_UPLOADS 300.0\nEnableKeepAlive true\nAllowVoIPRecordingPlayback true\nOverheatingThresholdDisallowMidgameJoin 0.95\nMaxCatchupFrames 3\nMaxLagBeforeShowLoading 23\nMinLagBeforeHideLoading 30\nLagImprovementInflectionPoint -1.0\nFlickerThreshold 2.0\nClosedDemo2014Version 1\nClosedDemo2014Expired false\nEnablePlayedFilter true\nEnableCommunityDecorations true\nGameStateUpdateRate 10.0\nGameStateUpdateRateWithConsumers 1.0\nDisableDLCPublishCheck false\nEnableDiveIn true\nEnableHackChecks false\nAllowOnlineCreate true\n" +
$"TelemetryServer {hostname}\n" +
$"CDNHostName {hostname}\n" +
$"ShowLevelBoos {ServerConfiguration.Instance.UserGeneratedContentLimits.BooingEnabled.ToString().ToLower()}\n"

View file

@ -4,6 +4,7 @@ using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Files;
using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.Levels;
using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.PlayerData;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
using LBPUnion.ProjectLighthouse.Serialization;
@ -82,34 +83,67 @@ public class PublishController : ControllerBase
GameToken gameToken = userAndToken.Value.Item2;
Slot? slot = await this.getSlotFromBody();
if (slot == null) return this.BadRequest();
if (slot == null)
{
Logger.Warn("Rejecting level upload, slot is null", LogArea.Publish);
return this.BadRequest();
}
if (slot.Location == null) return this.BadRequest();
if (slot.Location == null)
{
Logger.Warn("Rejecting level upload, slot location is null", LogArea.Publish);
return this.BadRequest();
}
if (slot.Description.Length > 500) return this.BadRequest();
if (slot.Description.Length > 512)
{
Logger.Warn($"Rejecting level upload, description too long ({slot.Description.Length} characters)", LogArea.Publish);
return this.BadRequest();
}
if (slot.Name.Length > 64) return this.BadRequest();
if (slot.Name.Length > 64)
{
Logger.Warn($"Rejecting level upload, title too long ({slot.Name.Length} characters)", LogArea.Publish);
return this.BadRequest();
}
if (slot.Resources.Any(resource => !FileHelper.ResourceExists(resource)))
{
Logger.Warn("Rejecting level upload, missing resource(s)", LogArea.Publish);
return this.BadRequest();
}
LbpFile? rootLevel = LbpFile.FromHash(slot.RootLevel);
if (rootLevel == null) return this.BadRequest();
if (rootLevel == null)
{
Logger.Warn("Rejecting level upload, unable to find rootLevel", LogArea.Publish);
return this.BadRequest();
}
if (rootLevel.FileType != LbpFileType.Level) return this.BadRequest();
if (rootLevel.FileType != LbpFileType.Level)
{
Logger.Warn("Rejecting level upload, rootLevel is not a level", LogArea.Publish);
return this.BadRequest();
}
// Republish logic
if (slot.SlotId != 0)
{
Slot? oldSlot = await this.database.Slots.Include(s => s.Location).FirstOrDefaultAsync(s => s.SlotId == slot.SlotId);
if (oldSlot == null) return this.NotFound();
if (oldSlot == null)
{
Logger.Warn("Rejecting level republish, wasn't able to find old slot", LogArea.Publish);
return this.NotFound();
}
if (oldSlot.Location == null) throw new ArgumentNullException();
if (oldSlot.CreatorId != user.UserId) return this.BadRequest();
if (oldSlot.CreatorId != user.UserId)
{
Logger.Warn("Rejecting level republish, old level not owned by current user", LogArea.Publish);
return this.BadRequest();
}
oldSlot.Location.X = slot.Location.X;
oldSlot.Location.Y = slot.Location.Y;
@ -166,7 +200,8 @@ public class PublishController : ControllerBase
if (user.GetUsedSlotsForGame(gameToken.GameVersion) > ServerConfiguration.Instance.UserGeneratedContentLimits.EntitledSlots)
{
return this.StatusCode(403, "");
Logger.Warn("Rejecting level upload, too many published slots", LogArea.Publish);
return this.BadRequest();
}
//TODO: parse location in body
@ -198,6 +233,8 @@ public class PublishController : ControllerBase
$"**{user.Username}** just published a new level: [**{slot.Name}**]({ServerConfiguration.Instance.ExternalUrl}/slot/{slot.SlotId})\n{slot.Description}"
);
Logger.Success($"Successfully published level {slot.Name} (id: {slot.SlotId}) by {user.Username} (id: {user.UserId})", LogArea.Publish);
return this.Ok(slot.Serialize(gameToken.GameVersion));
}

View file

@ -104,12 +104,9 @@ public class UserController : ControllerBase
user.Biography = update.Biography;
}
foreach (string? resource in new[]
foreach (string? resource in new[]{update.IconHash, update.YayHash, update.MehHash, update.BooHash, update.PlanetHash,})
{
update.IconHash, update.YayHash, update.MehHash, update.BooHash, update.PlanetHash,
})
{
if (resource != null && !FileHelper.ResourceExists(resource)) return this.BadRequest();
if (resource != null && !resource.StartsWith('g') && !FileHelper.ResourceExists(resource)) return this.BadRequest();
}
if (update.IconHash != null) user.IconHash = update.IconHash;

View file

@ -46,4 +46,17 @@ public class RoomVisualizerController : ControllerBase
return this.Redirect("/debug/roomVisualizer");
#endif
}
[HttpGet("createRoomsWithDuplicatePlayers")]
public async Task<IActionResult> CreateRoomsWithDuplicatePlayers()
{
#if !DEBUG
return this.NotFound();
#else
List<int> users = await this.database.Users.OrderByDescending(_ => EF.Functions.Random()).Take(1).Select(u => u.UserId).ToListAsync();
RoomHelper.CreateRoom(users, GameVersion.LittleBigPlanet2, Platform.PS3);
RoomHelper.CreateRoom(users, GameVersion.LittleBigPlanet2, Platform.PS3);
return this.Redirect("/debug/roomVisualizer");
#endif
}
}

View file

@ -1,5 +1,4 @@
using LBPUnion.ProjectLighthouse.Files;
using LBPUnion.ProjectLighthouse.Helpers;
using Microsoft.AspNetCore.Mvc;
using IOFile = System.IO.File;

View file

@ -0,0 +1,56 @@
@page "/admin/keys"
@using LBPUnion.ProjectLighthouse.PlayerData
@model LBPUnion.ProjectLighthouse.Servers.Website.Pages.Admin.AdminAPIKeyPageModel
@{
Layout = "Layouts/BaseLayout";
Model.Title = "API Keys";
}
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Antiforgery
@{
var token = Antiforgery.GetAndStoreTokens(HttpContext).RequestToken;
}
<script>function deleteKey(keyID) {
document.getElementById("trashbutton-".concat(keyID)).classList.add('loading');
fetch("@Url.RouteUrl(ViewContext.RouteData.Values)", {
method: 'post',
headers: {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
},
credentials: 'same-origin',
body: 'keyID='.concat(keyID).concat("&__RequestVerificationToken=@token")
})
.then(function (data) {
document.getElementById("keyitem-".concat(keyID)).remove();
window.location.reload(true);
})
.catch(function (error) {
console.log('Request failed', error);
});
}</script>
<p>There are <b>@Model.KeyCount</b> API keys registered.</p>
@if (Model.KeyCount == 0)
{
<p>To create one, you can use the "Create API key" command in the admin panel.</p>
}
<div class="ui four column grid">
@foreach (APIKey key in Model.APIKeys)
{
<div id="keyitem-@key.Id" class="five wide column">
<div class="ui blue segment">
<div class="ui tiny bottom left attached label">
Created at: @key.Created.ToString()
</div>
<button id="trashbutton-@key.Id" class="right floated circular ui icon button" onclick="deleteKey(@key.Id);">
<i class="trash can icon"></i>
</button>
<h2>@key.Description</h2>
</div>
</div>
}
</div>

View file

@ -0,0 +1,43 @@
using LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts;
using LBPUnion.ProjectLighthouse.PlayerData;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.Website.Pages.Admin
{
public class AdminAPIKeyPageModel : BaseLayout
{
public List<APIKey> APIKeys = new();
public int KeyCount;
public AdminAPIKeyPageModel(Database database) : base(database)
{ }
public async Task<IActionResult> OnGet()
{
User? user = this.Database.UserFromWebRequest(this.Request);
if (user == null) return this.Redirect("~/login");
if (!user.IsAdmin) return this.NotFound();
this.APIKeys = await this.Database.APIKeys.OrderByDescending(k => k.Id).ToListAsync();
this.KeyCount = this.APIKeys.Count;
return this.Page();
}
public async Task<IActionResult> OnPost(string keyID)
{
User? user = this.Database.UserFromWebRequest(this.Request);
if (user == null || !user.IsAdmin) return this.NotFound();
APIKey? apiKey = await this.Database.APIKeys.FirstOrDefaultAsync(k => k.Id == int.Parse(keyID));
if (apiKey == null) return this.NotFound();
this.Database.APIKeys.Remove(apiKey);
await this.Database.SaveChangesAsync();
return this.Page();
}
}
}

View file

@ -30,6 +30,8 @@ public class AdminPanelPage : BaseLayout
this.Statistics.Add(new AdminPanelStatistic("Users", await StatisticsHelper.UserCount(), "/admin/users"));
this.Statistics.Add(new AdminPanelStatistic("Slots", await StatisticsHelper.SlotCount()));
this.Statistics.Add(new AdminPanelStatistic("Photos", await StatisticsHelper.PhotoCount()));
this.Statistics.Add(new AdminPanelStatistic("Reports", await StatisticsHelper.ReportCount(), "/admin/reports/0"));
this.Statistics.Add(new AdminPanelStatistic("API Keys", await StatisticsHelper.APIKeyCount(), "/admin/keys"));
if (!string.IsNullOrEmpty(command))
{

View file

@ -11,7 +11,7 @@
<form action="/moderation/reports/0">
<div class="ui icon input">
<input type="text" name="name" placeholder="Search reports..." value="@Model.SearchValue">
<input type="text" autocomplete="off" name="name" placeholder="Search reports..." value="@Model.SearchValue">
<i class="search icon"></i>
</div>
</form>

View file

@ -44,6 +44,10 @@
<div class="ui blue button">Create Fake Room</div>
</a>
<a href="/debug/roomVisualizer/createRoomsWithDuplicatePlayers">
<div class="ui blue button">Create Rooms With Duplicate Players</div>
</a>
<a href="/debug/roomVisualizer/deleteRooms">
<div class="ui red button">Nuke all rooms</div>
</a>

View file

@ -3,6 +3,7 @@
@using LBPUnion.ProjectLighthouse.Extensions
@using LBPUnion.ProjectLighthouse.PlayerData.Profiles
@using LBPUnion.ProjectLighthouse.Levels
@using LBPUnion.ProjectLighthouse.Localization.StringLists
@model LBPUnion.ProjectLighthouse.Servers.Website.Pages.LandingPage
@{
@ -10,22 +11,22 @@
Model.ShowTitleInPage = false;
bool isMobile = this.Request.IsMobile();
}
<h1>Welcome to <b>@ServerConfiguration.Instance.Customization.ServerName</b>!</h1>
<h1>@Model.Translate(LandingPageStrings.Welcome, ServerConfiguration.Instance.Customization.ServerName)</h1>
@if (Model.User != null)
{
<p>You are currently logged in as <b>@Model.User.Username</b>.</p>
if (ServerConfiguration.Instance.Authentication.UseExternalAuth && Model.AuthenticationAttemptsCount > 0)
<p>@Model.Translate(LandingPageStrings.LoggedInAs, Model.User.Username)</p>
if (ServerConfiguration.Instance.Authentication.UseExternalAuth && Model.PendingAuthAttempts > 0)
{
<p>
<b>You have @Model.AuthenticationAttemptsCount authentication attempts pending. Click <a href="/authentication">here</a> to view them.</b>
<b><a href="/authentication">@Model.Translate(LandingPageStrings.AuthAttemptsPending, Model.PendingAuthAttempts)</a></b>
</p>
}
}
@if (Model.PlayersOnlineCount == 1)
{
<p>There is 1 user currently online:</p>
<p>@Model.Translate(LandingPageStrings.UsersSingle)</p>
@foreach (User user in Model.PlayersOnline)
{
<a href="/user/@user.UserId" title="@user.Status.ToString()">@user.Username</a>
@ -34,11 +35,11 @@
else if (Model.PlayersOnlineCount == 0)
{
<p>There are no users online. Why not hop on?</p>
<p>@Model.Translate(LandingPageStrings.UsersNone)</p>
}
else
{
<p>There are currently @Model.PlayersOnlineCount users online:</p>
<p>@Model.Translate(LandingPageStrings.UsersMultiple, Model.PlayersOnlineCount)</p>
@foreach (User user in Model.PlayersOnline)
{
<a href="/user/@user.UserId" title="@user.Status.ToString()">@user.Username</a>
@ -50,7 +51,7 @@ else
<div class="@(isMobile ? "" : "ui center aligned grid")">
<div class="eight wide column">
<div class="ui pink segment">
<h1><i class="ribbon icon"></i>Latest Team Picks</h1>
<h1><i class="ribbon icon"></i>@Model.Translate(LandingPageStrings.LatestTeamPicks)</h1>
<div class="ui divider"></div>
<div class="ui left aligned segment">
@foreach (Slot slot in Model.LatestTeamPicks!) @* Can't reach a point where this is null *@
@ -67,7 +68,7 @@ else
}
<div class="eight wide column">
<div class="ui blue segment">
<h1><i class="certificate icon"></i>Newest Levels</h1>
<h1><i class="certificate icon"></i>@Model.Translate(LandingPageStrings.NewestLevels)</h1>
<div class="ui divider"></div>
<div class="ui left aligned segment">
@foreach (Slot slot in Model.NewestLevels!) @* Can't reach a point where this is null *@

View file

@ -15,7 +15,7 @@ public class LandingPage : BaseLayout
public LandingPage(Database database) : base(database)
{}
public int AuthenticationAttemptsCount;
public int PendingAuthAttempts;
public List<User> PlayersOnline = new();
public int PlayersOnlineCount;
@ -32,7 +32,7 @@ public class LandingPage : BaseLayout
this.PlayersOnlineCount = await StatisticsHelper.RecentMatches();
if (user != null)
this.AuthenticationAttemptsCount = await this.Database.AuthenticationAttempts.Include
this.PendingAuthAttempts = await this.Database.AuthenticationAttempts.Include
(a => a.GameToken)
.CountAsync(a => a.GameToken.UserId == user.UserId);

View file

@ -1,31 +1,32 @@
@using LBPUnion.ProjectLighthouse.Configuration
@using LBPUnion.ProjectLighthouse.Extensions
@using LBPUnion.ProjectLighthouse.Helpers
@using LBPUnion.ProjectLighthouse.Localization.StringLists
@using LBPUnion.ProjectLighthouse.Types
@model LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts.BaseLayout
@{
if (Model!.User == null)
{
Model.NavigationItemsRight.Add(new PageNavigationItem("Login / Register", "/login", "sign in"));
Model.NavigationItemsRight.Add(new PageNavigationItem(BaseLayoutStrings.HeaderLoginRegister, "/login", "sign in"));
}
else
{
if (ServerConfiguration.Instance.Authentication.UseExternalAuth)
{
Model.NavigationItems.Add(new PageNavigationItem("Authentication", "/authentication", "key"));
Model.NavigationItems.Add(new PageNavigationItem(BaseLayoutStrings.HeaderAuthentication, "/authentication", "key"));
}
Model.NavigationItemsRight.Add(new PageNavigationItem("Profile", "/user/" + Model.User.UserId, "user alternate"));
Model.NavigationItemsRight.Add(new PageNavigationItem(BaseLayoutStrings.HeaderProfile, "/user/" + Model.User.UserId, "user alternate"));
@if (Model.User.IsAdmin)
{
Model.NavigationItemsRight.Add(new PageNavigationItem("Admin Panel", "/admin", "cogs"));
Model.NavigationItemsRight.Add(new PageNavigationItem(BaseLayoutStrings.HeaderAdminPanel, "/admin", "cogs"));
}
else if (Model.User.IsModerator)
{
Model.NavigationItemsRight.Add(new PageNavigationItem("Mod Panel", "/moderation", "user shield"));
Model.NavigationItemsRight.Add(new PageNavigationItem(BaseLayoutStrings.HeaderModPanel, "/moderation", "user shield"));
}
Model.NavigationItemsRight.Add(new PageNavigationItem("Log out", "/logout", "user alternate slash")); // should always be last
Model.NavigationItemsRight.Add(new PageNavigationItem(BaseLayoutStrings.HeaderLogout, "/logout", "user alternate slash")); // should always be last
}
Model.IsMobile = Model.Request.IsMobile();
@ -99,7 +100,7 @@
@if (!Model.IsMobile)
{
@navigationItem.Name
@Model.Translate(navigationItem.Name)
}
</a>
}
@ -114,7 +115,7 @@
@if (!Model.IsMobile)
{
@navigationItem.Name
@Model.Translate(navigationItem.Name)
}
</a>
}

View file

@ -1,22 +1,21 @@
#nullable enable
using System;
using System.Collections.Generic;
using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Localization;
using LBPUnion.ProjectLighthouse.Localization.StringLists;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
using LBPUnion.ProjectLighthouse.Types;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts;
public class BaseLayout : PageModel
{
public readonly Database Database;
public readonly List<PageNavigationItem> NavigationItems = new()
{
new PageNavigationItem("Home", "/", "home"),
new PageNavigationItem("Users", "/users/0", "user friends"),
new PageNavigationItem("Photos", "/photos/0", "camera"),
new PageNavigationItem("Levels", "/slots/0", "certificate"),
};
public readonly List<PageNavigationItem> NavigationItems = new();
public readonly List<PageNavigationItem> NavigationItemsRight = new();
public string Description = string.Empty;
@ -31,6 +30,11 @@ public class BaseLayout : PageModel
public BaseLayout(Database database)
{
this.Database = database;
this.NavigationItems.Add(new PageNavigationItem(BaseLayoutStrings.HeaderHome, "/", "home"));
this.NavigationItems.Add(new PageNavigationItem(BaseLayoutStrings.HeaderUsers, "/users/0", "user friends"));
this.NavigationItems.Add(new PageNavigationItem(BaseLayoutStrings.HeaderPhotos, "/photos/0", "camera"));
this.NavigationItems.Add(new PageNavigationItem(BaseLayoutStrings.HeaderSlots, "/slots/0", "certificate"));
}
public new User? User {
@ -41,4 +45,17 @@ public class BaseLayout : PageModel
}
set => this.user = value;
}
private string getLanguage()
{
if (ServerStatics.IsUnitTesting) return "en-US";
IRequestCultureFeature? requestCulture = Request.HttpContext.Features.Get<IRequestCultureFeature>();
if (requestCulture == null) return LocalizationManager.DefaultLang;
return requestCulture.RequestCulture.UICulture.Name;
}
public string Translate(TranslatableString translatableString) => translatableString.Translate(this.getLanguage());
public string Translate(TranslatableString translatableString, params object?[] format) => translatableString.Translate(this.getLanguage(), format);
}

View file

@ -1,21 +1,27 @@
@page "/login"
@using LBPUnion.ProjectLighthouse.Configuration
@using LBPUnion.ProjectLighthouse.Localization.StringLists
@model LBPUnion.ProjectLighthouse.Servers.Website.Pages.LoginForm
@{
Layout = "Layouts/BaseLayout";
Model.Title = "Log in";
Model.Title = Model.Translate(GeneralStrings.LogIn);
}
<script src="https://geraintluff.github.io/sha256/sha256.min.js"></script>
<script>
function onSubmit(form) {
if (document.referrer !== null && document.referrer !== "") {
const url = new URL(document.referrer);
if (url.pathname !== "/logout" && url.pathname !== "/login")
document.getElementById("redirect").value = url.pathname;
}
const passwordInput = document.getElementById("password");
const passwordSubmit = document.getElementById("password-submit");
passwordSubmit.value = sha256(passwordInput.value);
return true;
}
</script>
@ -24,7 +30,7 @@
{
<div class="ui negative message">
<div class="header">
Uh oh!
@Model.Translate(GeneralStrings.Error)
</div>
<p style="white-space: pre-line">@Model.Error</p>
</div>
@ -32,19 +38,20 @@
<form class="ui form" onsubmit="return onSubmit(this)" method="post">
@Html.AntiForgeryToken()
<input type="hidden" id="redirect" name="redirect">
<div class="field">
<label>Username</label>
<label>@Model.Translate(GeneralStrings.Username)</label>
<div class="ui left icon input">
<input type="text" name="username" id="text" placeholder="Username">
<input type="text" name="username" id="text" placeholder="@Model.Translate(GeneralStrings.Username)">
<i class="user icon"></i>
</div>
</div>
<div class="field">
<label>Password</label>
<label>@Model.Translate(GeneralStrings.Password)</label>
<div class="ui left icon input">
<input type="password" id="password" placeholder="Password">
<input type="password" id="password" placeholder="@Model.Translate(GeneralStrings.Password)">
<input type="hidden" id="password-submit" name="password">
<i class="lock icon"></i>
</div>
@ -55,14 +62,22 @@
@await Html.PartialAsync("Partials/CaptchaPartial")
}
<input type="submit" value="Log in" id="submit" class="ui blue button">
<div class="row">
<input type="submit" value="@Model.Translate(GeneralStrings.LogIn)" id="submit" class="ui blue button">
@if (ServerConfiguration.Instance.Authentication.RegistrationEnabled)
{
<a href="/register">
<div class="ui button">
<i class="user alternate add icon"></i>
Register
@Model.Translate(GeneralStrings.Register)
</div>
</a>
}
</div>
<br/>
<a href="/passwordResetRequest">
<div class="ui button">
@Model.Translate(GeneralStrings.ForgotPassword)
</div>
</a>
</form>

View file

@ -22,7 +22,7 @@ public class LoginForm : BaseLayout
public string? Error { get; private set; }
[UsedImplicitly]
public async Task<IActionResult> OnPost(string username, string password)
public async Task<IActionResult> OnPost(string username, string password, string redirect)
{
if (string.IsNullOrWhiteSpace(username))
{
@ -105,9 +105,19 @@ public class LoginForm : BaseLayout
if (user.PasswordResetRequired) return this.Redirect("~/passwordResetRequired");
if (ServerConfiguration.Instance.Mail.MailEnabled && !user.EmailAddressVerified) return this.Redirect("~/login/sendVerificationEmail");
if (string.IsNullOrWhiteSpace(redirect))
{
return this.RedirectToPage(nameof(LandingPage));
}
return this.Redirect(redirect);
}
[UsedImplicitly]
public IActionResult OnGet() => this.Page();
public IActionResult OnGet()
{
if (this.Database.UserFromWebRequest(this.Request) != null)
return this.RedirectToPage(nameof(LandingPage));
return this.Page();
}
}

View file

@ -1,10 +1,16 @@
@page "/logout"
@using LBPUnion.ProjectLighthouse.Localization.StringLists
@model LBPUnion.ProjectLighthouse.Servers.Website.Pages.LogoutPage
@{
Layout = "Layouts/BaseLayout";
Model.Title = "Logged out";
Model.Title = Model.Translate(LoggedOutStrings.LoggedOut);
}
<p>You have been successfully logged out. You will be redirected in 5 seconds, or you may click <a href="/">here</a> to do so manually.</p>
<p>@Model.Translate(LoggedOutStrings.LoggedOutInfo)</p>
<a href="/" class="ui blue button">
@Model.Translate(LoggedOutStrings.Redirect)
</a>
<meta http-equiv="refresh" content="5; url=/"/>

View file

@ -1,6 +1,17 @@
@using LBPUnion.ProjectLighthouse.Configuration
@if (ServerConfiguration.Instance.Captcha.CaptchaEnabled)
{
@switch (ServerConfiguration.Instance.Captcha.Type)
{
case CaptchaType.HCaptcha:
<div class="h-captcha" data-sitekey="@ServerConfiguration.Instance.Captcha.SiteKey"></div>
<script src="https://js.hcaptcha.com/1/api.js" async defer></script>
break;
case CaptchaType.ReCaptcha:
<div class="g-recaptcha" data-sitekey="@ServerConfiguration.Instance.Captcha.SiteKey"></div>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
break;
default:
throw new ArgumentOutOfRangeException();
}
}

View file

@ -1,4 +1,5 @@
@using System.Web
@using System.IO
@using LBPUnion.ProjectLighthouse.PlayerData.Profiles
<div class="ui yellow segment" id="comments">
<h2>Comments</h2>
@ -47,7 +48,14 @@
int rating = comment.ThumbsUp - comment.ThumbsDown;
<div style="display: flex" id="@comment.CommentId">
<div class="voting">
@{
string style = "";
if (Model.User?.UserId == comment.PosterUserId)
{
style = "visibility: hidden";
}
}
<div class="voting" style="@(style)">
<a href="@url/rateComment?commentId=@(comment.CommentId)&rating=@(comment.YourThumb == 1 ? 0 : 1)">
<i class="fitted @(comment.YourThumb == 1 ? "green" : "grey") arrow up link icon" style="display: block"></i>
</a>

View file

@ -37,7 +37,9 @@
}
<div>
<img src="~/assets/slotCardOverlay.png" style="min-width: @(size)px; width: @(size)px; height: @(size)px; pointer-events: none; position: absolute">
<img class="cardIcon slotCardIcon" src="/gameAssets/@iconHash" style="min-width: @(size)px; width: @(size)px; height: @(size)px">
<img src="~/assets/slotCardBackground.png" style="min-width: @(size)px; width: @(size)px; height: @(size)px; position: absolute; z-index: -1;">
<img class="cardIcon slotCardIcon" src="/gameAssets/@iconHash" style="min-width: @(size)px; width: @(size)px; height: @(size)px;"
onerror="this.onerror='';this.src='/gameAssets/@ServerConfiguration.Instance.WebsiteConfiguration.MissingIconHash'">
</div>
<div class="cardStats">
@if (!mini)
@ -80,7 +82,7 @@
@if (Model.GameVersion == GameVersion.LittleBigPlanet1)
{
<i class="yellow star icon" title="LBP1 Stars"></i>
<span>@Model.RatingLBP1</span>
<span>@(Math.Round(Model.RatingLBP1 * 10) / 10)</span>
}
</div>
<p>

View file

@ -4,7 +4,6 @@ using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
using LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts;
using LBPUnion.ProjectLighthouse.Types;
using Microsoft.AspNetCore.Mvc;
namespace LBPUnion.ProjectLighthouse.Servers.Website.Pages;
@ -19,8 +18,21 @@ public class PasswordResetPage : BaseLayout
[UsedImplicitly]
public async Task<IActionResult> OnPost(string password, string confirmPassword)
{
User? user = this.Database.UserFromWebRequest(this.Request);
User? user;
if (Request.Query.ContainsKey("token"))
{
user = await this.Database.UserFromPasswordResetToken(Request.Query["token"][0]);
if (user == null)
{
this.Error = "This password reset link either is invalid or has expired. Please try again.";
return this.Page();
}
}
else
{
user = this.Database.UserFromWebRequest(this.Request);
if (user == null) return this.Redirect("~/login");
}
if (string.IsNullOrWhiteSpace(password))
{
@ -48,6 +60,8 @@ public class PasswordResetPage : BaseLayout
[UsedImplicitly]
public IActionResult OnGet()
{
if (this.Request.Query.ContainsKey("token")) return this.Page();
User? user = this.Database.UserFromWebRequest(this.Request);
if (user == null) return this.Redirect("~/login");

View file

@ -0,0 +1,34 @@
@page "/passwordResetRequest"
@model LBPUnion.ProjectLighthouse.Servers.Website.Pages.PasswordResetRequestForm
@{
Layout = "Layouts/BaseLayout";
Model.Title = "Password Reset";
}
@if (!string.IsNullOrWhiteSpace(Model.Error))
{
<div class="ui negative message">
<div class="header">
Uh oh!
</div>
<p style="white-space: pre-line">@Model.Error</p>
</div>
}
@if (!string.IsNullOrWhiteSpace(Model.Status))
{
<div class="ui positive message">
<div class="header">
Success!
</div>
<p style="white-space: pre-line">@Model.Status</p>
</div>
}
<form class="ui form" method="post">
@Html.AntiForgeryToken()
<input type="text" autocomplete="no" id="username" placeholder="Username" name="username"/><br/><br/>
<input type="submit" value="Request Password Reset" class="ui blue button"/>
</form>

View file

@ -0,0 +1,67 @@
using JetBrains.Annotations;
using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Helpers;
using LBPUnion.ProjectLighthouse.PlayerData;
using LBPUnion.ProjectLighthouse.PlayerData.Profiles;
using LBPUnion.ProjectLighthouse.Servers.Website.Pages.Layouts;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace LBPUnion.ProjectLighthouse.Servers.Website.Pages;
public class PasswordResetRequestForm : BaseLayout
{
public string? Error { get; private set; }
public string? Status { get; private set; }
public PasswordResetRequestForm(Database database) : base(database)
{ }
[UsedImplicitly]
public async Task<IActionResult> OnPost(string username)
{
if (!ServerConfiguration.Instance.Mail.MailEnabled)
{
this.Error = "Email is not configured on this server, so password resets cannot be issued. Please contact your instance administrator for more details.";
return this.Page();
}
if (string.IsNullOrWhiteSpace(username))
{
this.Error = "The username field is required.";
return this.Page();
}
User? user = await this.Database.Users.FirstOrDefaultAsync(u => u.Username == username);
if (user == null)
{
this.Error = "User does not exist.";
return this.Page();
}
PasswordResetToken token = new()
{
Created = DateTime.Now,
UserId = user.UserId,
ResetToken = CryptoHelper.GenerateAuthToken(),
};
string messageBody = $"Hello, {user.Username}.\n\n" +
"A request to reset your account's password was issued. If this wasn't you, this can probably be ignored.\n\n" +
$"If this was you, your {ServerConfiguration.Instance.Customization.ServerName} password can be reset at the following link:\n" +
$"{ServerConfiguration.Instance.ExternalUrl}/passwordReset?token={token.ResetToken}";
SMTPHelper.SendEmail(user.EmailAddress, $"Project Lighthouse Password Reset Request for {user.Username}", messageBody);
this.Database.PasswordResetTokens.Add(token);
await this.Database.SaveChangesAsync();
this.Status = $"Password reset email sent to {CensorHelper.MaskEmail(user.EmailAddress)}.";
return this.Page();
}
public void OnGet() => this.Page();
}

View file

@ -12,7 +12,7 @@
<form action="/photos/0">
<div class="ui icon input">
<input type="text" name="name" placeholder="Search photos..." value="@Model.SearchValue">
<input type="text" autocomplete="off" name="name" placeholder="Search photos..." value="@Model.SearchValue">
<i class="search icon"></i>
</div>
</form>

View file

@ -23,7 +23,22 @@ public class RegisterForm : BaseLayout
[SuppressMessage("ReSharper", "SpecifyStringComparison")]
public async Task<IActionResult> OnPost(string username, string password, string confirmPassword, string emailAddress)
{
if (!ServerConfiguration.Instance.Authentication.RegistrationEnabled) return this.NotFound();
if (ServerConfiguration.Instance.Authentication.PrivateRegistration)
{
if (this.Request.Query.ContainsKey("token"))
{
if (!this.Database.IsRegistrationTokenValid(this.Request.Query["token"]))
return this.StatusCode(403, "Invalid Token");
}
else
{
return this.NotFound();
}
}
else if (!ServerConfiguration.Instance.Authentication.RegistrationEnabled)
{
return this.NotFound();
}
if (string.IsNullOrWhiteSpace(username))
{
@ -68,6 +83,11 @@ public class RegisterForm : BaseLayout
return this.Page();
}
if (this.Request.Query.ContainsKey("token"))
{
await Database.RemoveRegistrationToken(this.Request.Query["token"]);
}
User user = await this.Database.CreateUser(username, CryptoHelper.BCryptHash(password), emailAddress);
WebToken webToken = new()
@ -91,7 +111,22 @@ public class RegisterForm : BaseLayout
public IActionResult OnGet()
{
this.Error = string.Empty;
if (!ServerConfiguration.Instance.Authentication.RegistrationEnabled) return this.NotFound();
if (ServerConfiguration.Instance.Authentication.PrivateRegistration)
{
if (this.Request.Query.ContainsKey("token"))
{
if (!this.Database.IsRegistrationTokenValid(this.Request.Query["token"]))
return this.StatusCode(403, "Invalid Token");
}
else
{
return this.NotFound();
}
}
else if (!ServerConfiguration.Instance.Authentication.RegistrationEnabled)
{
return this.NotFound();
}
return this.Page();
}

View file

@ -12,7 +12,7 @@
<form action="/slots/0">
<div class="ui icon input">
<input type="text" name="name" placeholder="Search levels..." value="@Model.SearchValue">
<input type="text" autocomplete="off" name="name" placeholder="Search levels..." value="@Model.SearchValue">
<i class="search icon"></i>
</div>
</form>

Some files were not shown because too many files have changed in this diff Show more