是否有一种语法适用于所有平台以使用存储在 uno 跨平台库项目中的 .resw 文件中的本地化资源
Is there one syntax for all platforms to use localized resources from .resw files stored in uno cross-platform library project
我尝试将现有的通用 Windows Class 库项目迁移到 Uno 跨平台库项目。在 Universal Windows 库中,我有带有本地化字符串的资源文件 (.resw)。我将它们复制到 Uno Library 项目。
我找到了使用 Uno 库中的字符串资源的方法。但是 UWP 和 Android 或 iOS 的语法不同。因此,我必须使用特定于平台的 C# 代码和 XAML 标记。它应该是一种语法,用于在所有平台上使用相同的库中的资源。我正在寻找它。
这是我现在拥有的:
我已经创建了演示解决方案,以了解如何在 XAML 和代码中使用本地化字符串,包括存储在 Uno App 项目和 Uno 库中的资源文件 (.resw) (link to demo solution on GitHub).
我有 Uno Cross-Platform App 项目 'ReswUseApplication',其中包含两个资源文件:'Resources.resw' 和 'Custom.resw'。我在每个密钥中存储了两个密钥:
SomeLabel.Text
SomeText
我使用下一个语法从这个文件中按键获取字符串资源:
XAML:
x:Uid="SomeLabel" //from Resources.resw
x:Uid="/Custom/SomeLabel" //from Custom.resw
在代码中:
var resourceLoader = ResourceLoader.GetForCurrentView();
DefaultText = resourceLoader.GetString("SomeText"); //from Resources.resw
CustomText = resourceLoader.GetString("/Custom/SomeText"); //from Custom.resw
它适用于我测试过的所有平台(UWP、Android、iOS)
我还有 Uno 跨平台库项目 'LibraryWithResw' 和资源文件 'Library.resw'。我无法在 Uno 库项目中创建新的 (.resw) 文件,所以我使用了一个现有的 (.resw) 文件并粘贴了它。我无法在属性中将其标记为 PRIResource,因此我不得不将其作为 PRIResource 手动写入库项目文件中:
<ItemGroup>
<PRIResource Include="$(MSBuildThisFileDirectory)Resources\en\Library.resw" />
</ItemGroup>
然后在 'ReswUseApplication' 中为所有需要的头(UWP、Android 和 iOS)添加了对这个库项目的引用。
我找到了一种用于 UWP 的语法,另一种用于 Android 和 iOS。
UWP XAML:
x:Uid="ms-resource:///LibraryWithResw/Library/SomeLabel"
代码中的 UWP:
var resourceLoader = ResourceLoader.GetForCurrentView("LibraryWithResw");
TextFromLibrary = resourceLoader.GetString("Library/SomeText");
或
var resourceLoader = ResourceLoader.GetForCurrentView("LibraryWithResw/Library");
TextFromLibrary = resourceLoader.GetString("SomeText");
Android, iOS XAML:
x:Uid="/Library/SomeLabel"
Android, iOS 代码:
var resourceLoader = ResourceLoader.GetForCurrentView();
TextFromLibrary = resourceLoader.GetString("/Library/SomeText");
或
var resourceLoader = ResourceLoader.GetForCurrentView("Library");
TextFromLibrary = resourceLoader.GetString("SomeText");
正如我发现的:对于 Android 和 iOS 资源文件位于何处并不重要。当前项目中的资源文件或库中的文件的语法相同。但是在UWP中,如果项目不是当前的,我必须指出资源文件所在的项目名称。
感谢提问。这确实是一个 Uno 问题,缺少对 ms-resource:///
的支持。
这是相关的 Uno 问题:https://github.com/unoplatform/uno/issues/3346
我尝试将现有的通用 Windows Class 库项目迁移到 Uno 跨平台库项目。在 Universal Windows 库中,我有带有本地化字符串的资源文件 (.resw)。我将它们复制到 Uno Library 项目。
我找到了使用 Uno 库中的字符串资源的方法。但是 UWP 和 Android 或 iOS 的语法不同。因此,我必须使用特定于平台的 C# 代码和 XAML 标记。它应该是一种语法,用于在所有平台上使用相同的库中的资源。我正在寻找它。
这是我现在拥有的:
我已经创建了演示解决方案,以了解如何在 XAML 和代码中使用本地化字符串,包括存储在 Uno App 项目和 Uno 库中的资源文件 (.resw) (link to demo solution on GitHub).
我有 Uno Cross-Platform App 项目 'ReswUseApplication',其中包含两个资源文件:'Resources.resw' 和 'Custom.resw'。我在每个密钥中存储了两个密钥:
SomeLabel.Text
SomeText
我使用下一个语法从这个文件中按键获取字符串资源:
XAML:
x:Uid="SomeLabel" //from Resources.resw
x:Uid="/Custom/SomeLabel" //from Custom.resw
在代码中:
var resourceLoader = ResourceLoader.GetForCurrentView();
DefaultText = resourceLoader.GetString("SomeText"); //from Resources.resw
CustomText = resourceLoader.GetString("/Custom/SomeText"); //from Custom.resw
它适用于我测试过的所有平台(UWP、Android、iOS)
我还有 Uno 跨平台库项目 'LibraryWithResw' 和资源文件 'Library.resw'。我无法在 Uno 库项目中创建新的 (.resw) 文件,所以我使用了一个现有的 (.resw) 文件并粘贴了它。我无法在属性中将其标记为 PRIResource,因此我不得不将其作为 PRIResource 手动写入库项目文件中:
<ItemGroup>
<PRIResource Include="$(MSBuildThisFileDirectory)Resources\en\Library.resw" />
</ItemGroup>
然后在 'ReswUseApplication' 中为所有需要的头(UWP、Android 和 iOS)添加了对这个库项目的引用。
我找到了一种用于 UWP 的语法,另一种用于 Android 和 iOS。
UWP XAML:
x:Uid="ms-resource:///LibraryWithResw/Library/SomeLabel"
代码中的 UWP:
var resourceLoader = ResourceLoader.GetForCurrentView("LibraryWithResw");
TextFromLibrary = resourceLoader.GetString("Library/SomeText");
或
var resourceLoader = ResourceLoader.GetForCurrentView("LibraryWithResw/Library");
TextFromLibrary = resourceLoader.GetString("SomeText");
Android, iOS XAML:
x:Uid="/Library/SomeLabel"
Android, iOS 代码:
var resourceLoader = ResourceLoader.GetForCurrentView();
TextFromLibrary = resourceLoader.GetString("/Library/SomeText");
或
var resourceLoader = ResourceLoader.GetForCurrentView("Library");
TextFromLibrary = resourceLoader.GetString("SomeText");
正如我发现的:对于 Android 和 iOS 资源文件位于何处并不重要。当前项目中的资源文件或库中的文件的语法相同。但是在UWP中,如果项目不是当前的,我必须指出资源文件所在的项目名称。
感谢提问。这确实是一个 Uno 问题,缺少对 ms-resource:///
的支持。
这是相关的 Uno 问题:https://github.com/unoplatform/uno/issues/3346