diff --git a/.idea/.idea.ProjectLighthouse/.idea/indexLayout.xml b/.idea/.idea.ProjectLighthouse/.idea/indexLayout.xml
index 022ac2e7..69ba74a2 100644
--- a/.idea/.idea.ProjectLighthouse/.idea/indexLayout.xml
+++ b/.idea/.idea.ProjectLighthouse/.idea/indexLayout.xml
@@ -12,6 +12,7 @@
ProjectLighthouse.sln.DotSettings.user
README.md
create-migration.sh
+ crowdin.yml
docker-compose.yml
global.json
diff --git a/ProjectLighthouse.Localisation/BaseLayout.resx b/ProjectLighthouse.Localisation/BaseLayout.resx
new file mode 100644
index 00000000..3734bd86
--- /dev/null
+++ b/ProjectLighthouse.Localisation/BaseLayout.resx
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 1.3
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
+ PublicKeyToken=b77a5c561934e089
+
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
+ PublicKeyToken=b77a5c561934e089
+
+
+
+
+ Home
+ A button on the header that takes you to the landing page.
+
+
+
+ Users
+ A button on the header that takes you to the user listing.
+
+
+
+ Photos
+ A button on the header that takes you to a list of user-uploaded photos.
+
+
+
+ Levels
+ A button on the header that takes you to a list of user-uploaded levels. Levels are internally referred to as "slots".
+
+
\ No newline at end of file
diff --git a/ProjectLighthouse.Localisation/ProjectLighthouse.Localisation.csproj b/ProjectLighthouse.Localisation/ProjectLighthouse.Localisation.csproj
new file mode 100644
index 00000000..7905a768
--- /dev/null
+++ b/ProjectLighthouse.Localisation/ProjectLighthouse.Localisation.csproj
@@ -0,0 +1,17 @@
+
+
+
+ net6.0
+ enable
+ enable
+ LBPUnion.ProjectLighthouse.Localisation
+
+
+
+
+ ResXFileCodeGenerator
+ BaseLayout.Designer.cs
+
+
+
+
diff --git a/ProjectLighthouse.sln b/ProjectLighthouse.sln
index 9f80122f..9f7d42c0 100644
--- a/ProjectLighthouse.sln
+++ b/ProjectLighthouse.sln
@@ -10,6 +10,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectLighthouse.Tests.Gam
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectLighthouse.Tests.WebsiteTests", "ProjectLighthouse.Tests.WebsiteTests\ProjectLighthouse.Tests.WebsiteTests.csproj", "{CF65EB5B-5364-4D2A-8639-F147A67F08E7}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ProjectLighthouse.Localisation", "ProjectLighthouse.Localisation\ProjectLighthouse.Localisation.csproj", "{CDB81465-F758-4842-B843-F77ABEE7C3BF}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -29,6 +31,10 @@ Global
{CF65EB5B-5364-4D2A-8639-F147A67F08E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CF65EB5B-5364-4D2A-8639-F147A67F08E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CF65EB5B-5364-4D2A-8639-F147A67F08E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CDB81465-F758-4842-B843-F77ABEE7C3BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CDB81465-F758-4842-B843-F77ABEE7C3BF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CDB81465-F758-4842-B843-F77ABEE7C3BF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CDB81465-F758-4842-B843-F77ABEE7C3BF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{AFC74569-B289-4ACC-B21C-313A3A62C017} = {D360C08E-EA47-43AC-A566-FDF413442980}
diff --git a/ProjectLighthouse/Helpers/LocalisationHelper.cs b/ProjectLighthouse/Helpers/LocalisationHelper.cs
new file mode 100644
index 00000000..f7d6d580
--- /dev/null
+++ b/ProjectLighthouse/Helpers/LocalisationHelper.cs
@@ -0,0 +1,4 @@
+namespace LBPUnion.ProjectLighthouse.Helpers;
+
+public static class LocalisationHelper
+{}
\ No newline at end of file
diff --git a/ProjectLighthouse/ProjectLighthouse.csproj b/ProjectLighthouse/ProjectLighthouse.csproj
index 3be87bf1..d0c22455 100644
--- a/ProjectLighthouse/ProjectLighthouse.csproj
+++ b/ProjectLighthouse/ProjectLighthouse.csproj
@@ -51,18 +51,22 @@
Always
-
-
+
+
-
+
+
+
+
+
-
-
-
-
+
+
+
+
diff --git a/crowdin.yml b/crowdin.yml
new file mode 100644
index 00000000..6f4e10a3
--- /dev/null
+++ b/crowdin.yml
@@ -0,0 +1,116 @@
+#
+# Choose file structure in Crowdin
+# e.g. true or false
+#
+"preserve_hierarchy": true
+
+files: [
+ {
+ #
+ # Source files filter
+ # e.g. "/resources/en/*.json"
+ #
+ "source": "/ProjectLighthouse.Localisation/*.resx",
+
+ #
+ # Where translations will be placed
+ # e.g. "/resources/%two_letters_code%/%original_file_name%"
+ #
+ "translation": "/ProjectLighthouse.Localisation/%file_name%.%locale%.%file_extension%",
+
+ #
+ # Files or directories for ignore
+ # e.g. ["/**/?.txt", "/**/[0-9].txt", "/**/*\?*.txt"]
+ #
+ #"ignore" : [],
+
+ #
+ # The dest allows you to specify a file name in Crowdin
+ # e.g. "/messages.json"
+ #
+ #"dest" : "",
+
+ #
+ # File type
+ # e.g. "json"
+ #
+ #"type" : "",
+
+ #
+ # The parameter "update_option" is optional. If it is not set, after the files update the translations for changed strings will be removed. Use to fix typos and for minor changes in the source strings
+ # e.g. "update_as_unapproved" or "update_without_changes"
+ #
+ #"update_option" : "",
+
+ #
+ # Start block (for XML only)
+ #
+
+ #
+ # Defines whether to translate tags attributes.
+ # e.g. 0 or 1 (Default is 1)
+ #
+ # "translate_attributes" : 1,
+
+ #
+ # Defines whether to translate texts placed inside the tags.
+ # e.g. 0 or 1 (Default is 1)
+ #
+ # "translate_content" : 1,
+
+ #
+ # This is an array of strings, where each item is the XPaths to DOM element that should be imported
+ # e.g. ["/content/text", "/content/text[@value]"]
+ #
+ # "translatable_elements" : [],
+
+ #
+ # Defines whether to split long texts into smaller text segments
+ # e.g. 0 or 1 (Default is 1)
+ #
+ # "content_segmentation" : 1,
+
+ #
+ # End block (for XML only)
+ #
+
+ #
+ # Start .properties block
+ #
+
+ #
+ # Defines whether single quote should be escaped by another single quote or backslash in exported translations
+ # e.g. 0 or 1 or 2 or 3 (Default is 3)
+ # 0 - do not escape single quote;
+ # 1 - escape single quote by another single quote;
+ # 2 - escape single quote by backslash;
+ # 3 - escape single quote by another single quote only in strings containing variables ( {0} ).
+ #
+ # "escape_quotes" : 3,
+
+ #
+ # Defines whether any special characters (=, :, ! and #) should be escaped by backslash in exported translations.
+ # e.g. 0 or 1 (Default is 0)
+ # 0 - do not escape special characters
+ # 1 - escape special characters by a backslash
+ #
+ # "escape_special_characters": 0
+ #
+
+ #
+ # End .properties block
+ #
+
+ #
+ # Does the first line contain header?
+ # e.g. true or false
+ #
+ #"first_line_contains_header" : true,
+
+ #
+ # for spreadsheets
+ # e.g. "identifier,source_phrase,context,uk,ru,fr"
+ #
+ # "scheme" : "",
+ }
+]
\ No newline at end of file