diff --git a/README.md b/README.md
index 85d6d8e..005692b 100644
--- a/README.md
+++ b/README.md
@@ -3,3 +3,126 @@
| Build | NuGet |
|--|--|
|![](https://github.com/dotnet-campus/dotnetCampus.SourceLocalizations/workflows/.NET%20Core/badge.svg)|[![](https://img.shields.io/nuget/v/dotnetCampus.SourceLocalizations.svg)](https://www.nuget.org/packages/dotnetCampus.SourceLocalizations)|
+
+dotnetCampus.SourceLocalizations is a source generator that can convert text localization files (e.g. .toml) into C# code and provide strong type support for localization keys.
+
+## Features
+
+```csharp
+static void Main()
+{
+ Console.WriteLine(LocalizedText.Current.App.Title); // "Hello, World!"
+ Console.WriteLine(LocalizedText.Current.App.Description); // "This is a sample application."
+ Console.WriteLine(LocalizedText.Current.Cli.Usage); // "Usage: dotnetCampus.SourceLocalizations [options]"
+ Console.WriteLine(LocalizedText.Current.PressAnyKeyToExit); // "Press any key to exit..."
+}
+```
+
+- Source Generators
+ - [x] Generate C# codes
+ - [ ] Generate properties for implementation types (so that reflections on types can get localized properties which is very important for WPF Bindings)
+ - [ ] Generate localized types for each language item which contains more than one arguments (This fixes different argument orders among different languages.)
+- File formats
+ - [x] TOML
+ - [x] YAML `🤡 Might be deprecated in the future.`
+- UI Frameworks Support
+ - [x] Avalonia `😉 We look forward to your better suggestions.`
+ - [ ] MAUI `😶🌫️ Not tested yet`
+ - [x] Uno Platform `😉 We look forward to your better suggestions.`
+ - [ ] Wpf `😶🌫️ Not tested yet`
+- Diagnostics Analyzers and Code Fixes
+ - [ ] Detect (and generate) missing localization keys
+ - [ ] Detect (and remove) unused localization keys
+ - [ ] Detect arguments mismatch among localized texts (e.g. `Hello, {name:string}` in en but `こんにちは、{errorCode:int}` in ja)
+ - [ ] Detect invalid IETF language tags and report errors
+
+## Installation
+
+[![](https://img.shields.io/nuget/v/dotnetCampus.SourceLocalizations.svg)](https://www.nuget.org/packages/dotnetCampus.SourceLocalizations)
+
+```shell
+dotnet add package dotnetCampus.SourceLocalizations
+```
+
+## Usage
+
+### 1. Create localization files
+
+```toml
+// Localizations/en.toml
+App.Title = "Hello, World!"
+App.Description = "This is a sample application."
+Cli.Usage = "Usage: dotnetCampus.SourceLocalizations [options]"
+PressAnyKeyToExit = "Press any key to exit..."
+```
+
+```toml
+// Localizations/zh-hans.toml
+App.Title = "你好,世界!"
+App.Description = "这是一个示例应用程序。"
+Cli.Usage = "用法:dotnetCampus.SourceLocalizations [选项]"
+PressAnyKeyToExit = "按任意键退出..."
+```
+
+The file name must conform to the [IETF BCP 47 standard](https://en.wikipedia.org/wiki/IETF_language_tag).
+
+Add these files to your project `csproj` file:
+
+```xml
+
+
+
+```
+
+### 2. Write a localization class
+
+```csharp
+// LocalizedText.cs
+using dotnetCampus.SourceLocalizations;
+
+namespace SampleApp;
+
+// The default language is used to generate localization interfaces, so it must be the most complete one.
+[LocalizedConfiguration(Default = "en", Current = "zh-hans")]
+public partial class LocalizedText;
+```
+
+### 3. Use the generated code
+
+```csharp
+// Program.cs
+static void Main()
+{
+ Console.WriteLine(LocalizedText.Current.App.Title); // "Hello, World!"
+ Console.WriteLine(LocalizedText.Current.App.Description); // "This is a sample application."
+ Console.WriteLine(LocalizedText.Current.Cli.Usage); // "Usage: dotnetCampus.SourceLocalizations [options]"
+ Console.WriteLine(LocalizedText.Current.PressAnyKeyToExit); // "Press any key to exit..."
+}
+```
+
+```xml
+
+
+
+```
+
+```xml
+
+
+
+```
+
+```csharp
+// Uno Platform MainPage.xaml.cs
+using dotnetCampus.Localizations;
+
+namespace dotnetCampus.SampleUnoApp;
+
+public sealed partial class MainPage : Page
+{
+ public MainPage() => InitializeComponent();
+
+ // IMPORTANT: The Lang property must be public.
+ public ILocalizedValues Lang => global::dotnetCampus.SampleUnoApp.Localizations.LocalizedText.Current;
+}
+```
diff --git a/dotnetCampus.SourceLocalizations.sln b/dotnetCampus.SourceLocalizations.sln
index 7f50212..011f78f 100644
--- a/dotnetCampus.SourceLocalizations.sln
+++ b/dotnetCampus.SourceLocalizations.sln
@@ -24,6 +24,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{6E0F9A76
build\Version.props = build\Version.props
EndProjectSection
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dotnetCampus.SourceLocalizations.PrivateGenerator", "src\dotnetCampus.SourceLocalizations.PrivateGenerator\dotnetCampus.SourceLocalizations.PrivateGenerator.csproj", "{452ACCD4-EB0A-46ED-A8F9-38B5AD57C9EB}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A585D7EF-916E-45B1-AFB8-025DE9FD1647}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -49,9 +53,14 @@ Global
{3170B151-6A25-4321-BF09-EFC516E32F8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3170B151-6A25-4321-BF09-EFC516E32F8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3170B151-6A25-4321-BF09-EFC516E32F8D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {452ACCD4-EB0A-46ED-A8F9-38B5AD57C9EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {452ACCD4-EB0A-46ED-A8F9-38B5AD57C9EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {452ACCD4-EB0A-46ED-A8F9-38B5AD57C9EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {452ACCD4-EB0A-46ED-A8F9-38B5AD57C9EB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{F330175F-FC20-4D42-921A-747AC296D1B9} = {E407F54C-8E41-4F4E-B9BF-9864B6178E5F}
{3170B151-6A25-4321-BF09-EFC516E32F8D} = {4239BEE3-D480-4874-83E1-353B35F1BD86}
+ {452ACCD4-EB0A-46ED-A8F9-38B5AD57C9EB} = {A585D7EF-916E-45B1-AFB8-025DE9FD1647}
EndGlobalSection
EndGlobal
diff --git a/samples/LocalizationSample/Program.cs b/samples/LocalizationSample/Program.cs
index 7ffbdf9..4fddb7f 100644
--- a/samples/LocalizationSample/Program.cs
+++ b/samples/LocalizationSample/Program.cs
@@ -15,13 +15,13 @@ public static void Main(string[] args)
internal partial class Lang;
[EditorBrowsable(EditorBrowsableState.Never)]
-public interface ILocalized_Root : ILocalizedStringProvider
+public interface ILocalizedValues : ILocalizedStringProvider
{
- ILocalized_Root_A A => (ILocalized_Root_A)this;
+ ILocalizedValues_A A => (ILocalizedValues_A)this;
}
[EditorBrowsable(EditorBrowsableState.Never)]
-public interface ILocalized_Root_A : ILocalizedStringProvider
+public interface ILocalizedValues_A : ILocalizedStringProvider
{
LocalizedString A1 => this.Get0("A.A1");
@@ -30,8 +30,8 @@ public interface ILocalized_Root_A : ILocalizedStringProvider
LocalizedString