Add OWML mod skeleton and import English translation template

Phase 2 (mod skeleton) + Phase 3 (import English source):

- manifest.json / SlovakTranslation.cs / ILocalizationAPI.cs registering
  "Slovenčina" via xen.LocalizationUtility (Interplanetary Polyglot).
- SlovakTranslation.csproj / .sln building net48 against the OWML and
  OuterWildsGameLibs NuGet packages — no game install needed to compile.
- assets/Translation.xml: English source template (896 KB, 2424 entries,
  keys == values) to be translated into Slovak.
- Project docs (README/PLAN/CLAUDE) and .gitignore.

Build verified: dotnet build -c Release stages a loadable mod folder.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jaroslav Beneš
2026-07-20 10:12:10 +02:00
parent cec2cad2ce
commit 854eee4275
9 changed files with 16251 additions and 1 deletions
+11
View File
@@ -0,0 +1,11 @@
# Build output
bin/
obj/
# User-specific project files
*.user
# IDE
.vs/
.vscode/
.idea/
+42
View File
@@ -0,0 +1,42 @@
using OWML.ModHelper;
using System;
using System.Collections.Generic;
using UnityEngine;
// Interface copied from xen-42's Localization Utility (MIT), so this mod can
// resolve the utility's API through OWML's TryGetModApi<T>. Keep in sync with
// https://github.com/xen-42/outer-wilds-localization-utility.
namespace SlovakTranslation
{
public interface ILocalizationAPI
{
#region Add new language
void RegisterLanguage(ModBehaviour mod, string languageName, string translationPath);
void RegisterLanguage(ModBehaviour mod, string languageName, string translationPath, string languageToReplace);
void AddLanguageFont(ModBehaviour mod, string languageName, string assetBundlePath, string fontPath, out Font font);
void AddLanguageFixer(string languageName, Func<string, string> fixer);
void SetLanguageDefaultFontSpacing(string languageName, float defaultFontSpacing);
void SetLanguageFontSizeModifier(string languageName, float fontSizeModifier);
#endregion
#region Add translations to new/existing languages
void AddTranslation(ModBehaviour mod, string languageName, string translationPath);
void AddTranslation(string languageName, KeyValuePair<string, string>[] regularEntries, KeyValuePair<string, string>[] shipLogEntries, KeyValuePair<int, string>[] uiEntries);
void AddRegularTranslation(string languageName, string key, string value);
void AddRegularTranslation(string languageName, string commonKeyPrefix, params string[] entries);
void AddRegularTranslation(string languageName, params KeyValuePair<string, string>[] entries);
void AddShiplogTranslation(string languageName, string key, string value);
void AddShiplogTranslation(string languageName, string commonKeyPrefix, params string[] entries);
void AddShiplogTranslation(string languageName, params KeyValuePair<string, string>[] entries);
void AddUITranslation(string languageName, int key, string value);
void AddUITranslation(string languageName, params KeyValuePair<int, string>[] entries);
#endregion
#region obsolete
[Obsolete] void AddLanguageFont(ModBehaviour mod, string languageName, string assetBundlePath, string fontPath);
#endregion
}
}
+69 -1
View File
@@ -1,2 +1,70 @@
# Outer-Wilds-SK-Translation-Mod # Outer Wilds — Slovenský preklad / Slovak Translation Mod
> **Neoficiálny slovenský preklad hry Outer Wilds** (základná hra + rozšírenie
> *Echoes of the Eye*). Pridáva do hry jazyk **Slovenčina**.
>
> *An unofficial Slovak (slovenčina) translation mod for Outer Wilds, covering
> the base game and the Echoes of the Eye DLC.*
**Stav / Status:** 🚧 **Work in progress** — the mod scaffold and translation are
being built. See [`PLAN.md`](PLAN.md) for the roadmap.
Outer Wilds officially ships in 12 languages; Slovak is not one of them. This mod
adds it as a new selectable language using the community localization framework —
no changes to the game's own files are required.
---
## How it works
The mod is a small [OWML](https://github.com/ow-mods/owml) mod that registers a
new language through **[Interplanetary Polyglot / Localization Utility](https://outerwildsmods.com/mods/interplanetarypolyglot/)**
(`xen.LocalizationUtility`). All translated text lives in a single
`assets/Translation.xml`; the utility swaps the game's strings for the Slovak ones
at runtime.
## Installation
1. Install the **[Outer Wilds Mod Manager](https://outerwildsmods.com/mod-manager/)**.
2. Install this mod through the Mod Manager. Its dependency **Interplanetary
Polyglot** (`xen.LocalizationUtility`) will be pulled in automatically.
3. Launch the game via the Mod Manager.
4. In **Settings → Language**, choose **Slovenčina**.
- Tip: the optional [Language Swap](https://outerwildsmods.com/mods/languageswap/)
mod lets you switch language in-game with `Ctrl+L`.
> Until the first release is published, the mod is not yet in the Mod Manager
> database — see [`PLAN.md`](PLAN.md) for how to build it from source.
## Contributing / Prispievanie
Translation fixes are very welcome — the goal is natural, consistent Slovak.
- **Report** mistranslations or awkward phrasing as an issue.
- **Edit** only the `<value>` of each entry in `assets/Translation.xml`.
**Never change the `<key>`** — it is the English identifier the game matches on.
- Preserve all inline formatting exactly, e.g. `&lt;color=orange&gt;…&lt;/color&gt;`,
`&lt;i&gt;`, and speaker prefixes like `POKE:`.
- Follow the terminology in `docs/glossary.md` so names (Nomai, the Eye, Ash Twin
Project, …) stay consistent across the whole game.
See [`CLAUDE.md`](CLAUDE.md) for the full conventions and repo layout.
## License & disclaimer
The **original mod code and the Slovak translation** in this repository are
released under the [MIT License](LICENSE).
This is an **unofficial** fan project. It is **not affiliated with, approved by, or
endorsed by Mobius Digital or Annapurna Interactive.** *Outer Wilds*, its story,
dialogue, characters, and other assets are **© Mobius Digital / Annapurna
Interactive**; the underlying game text remains their property and is used here
under **Mobius Digital's Fan Content Policy**. The MIT license covers only this
project's own contributions, not the source material.
## Credits
- **Mobius Digital / Annapurna Interactive** — *Outer Wilds*.
- **[xen-42](https://github.com/xen-42)** — the Localization Utility /
Interplanetary Polyglot framework this mod is built on.
- The Outer Wilds modding community.
+35
View File
@@ -0,0 +1,35 @@
using OWML.Common;
using OWML.ModHelper;
namespace SlovakTranslation
{
/// <summary>
/// Registers Slovenčina as a selectable language via xen-42's Localization
/// Utility (xen.LocalizationUtility). All the heavy lifting lives in the
/// utility; this mod just points it at our translated strings.
/// </summary>
public class SlovakTranslation : ModBehaviour
{
public static SlovakTranslation Instance;
/// <summary>Path (relative to the mod folder) to the translated strings.</summary>
public static string translationFile = "assets/Translation.xml";
private void Start()
{
Instance = this;
var api = ModHelper.Interaction.TryGetModApi<ILocalizationAPI>("xen.LocalizationUtility");
if (api == null)
{
ModHelper.Console.WriteLine(
"Could not find xen.LocalizationUtility — is Interplanetary Polyglot installed?",
MessageType.Error);
return;
}
api.RegisterLanguage(this, "Slovenčina", translationFile);
ModHelper.Console.WriteLine("Registered language: Slovenčina", MessageType.Success);
}
}
}
+39
View File
@@ -0,0 +1,39 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<LangVersion>default</LangVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
<CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
<RootNamespace>SlovakTranslation</RootNamespace>
<AssemblyName>SlovakTranslation</AssemblyName>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DebugType>none</DebugType>
</PropertyGroup>
<ItemGroup>
<!-- Lets net48 build on machines without the .NET Framework targeting pack
(e.g. Linux / dotnet SDK only). Build-time only. -->
<PackageReference Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" PrivateAssets="all" />
<PackageReference Include="HarmonyX" Version="2.10.0" />
<PackageReference Include="OWML" Version="2.5.2" />
<!-- Provides the Outer Wilds / Unity reference DLLs from NuGet, so no game
install is needed to compile. -->
<PackageReference Include="OuterWildsGameLibs" Version="1.1.12.168" />
</ItemGroup>
<ItemGroup>
<None Update="manifest.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="default-config.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="assets/Translation.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
+22
View File
@@ -0,0 +1,22 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30114.105
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SlovakTranslation", "SlovakTranslation.csproj", "{227A7B9F-9B05-4AE7-BDB9-1DE031C15853}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{227A7B9F-9B05-4AE7-BDB9-1DE031C15853}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{227A7B9F-9B05-4AE7-BDB9-1DE031C15853}.Debug|Any CPU.Build.0 = Debug|Any CPU
{227A7B9F-9B05-4AE7-BDB9-1DE031C15853}.Release|Any CPU.ActiveCfg = Release|Any CPU
{227A7B9F-9B05-4AE7-BDB9-1DE031C15853}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
+16019
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
{
"enabled": true
}
+11
View File
@@ -0,0 +1,11 @@
{
"filename": "SlovakTranslation.dll",
"author": "Jaroslav Beneš",
"name": "Slovak Localization / Slovenčina",
"uniqueName": "Homer.SlovakTranslation",
"version": "0.1.0",
"owmlVersion": "2.5.2",
"dependencies": [
"xen.LocalizationUtility"
]
}