热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Win10UWP开发系列:使用多语言工具包让应用支持多语言

原文:Win10UWP开发系列:使用多语言工具包让应用支持多语言之前我在一篇blog中写过如何使用多语言工具包,见http:www.cnblogs.co
原文:Win10 UWP 开发系列:使用多语言工具包让应用支持多语言

之前我在一篇blog中写过如何使用多语言工具包,见http://www.cnblogs.com/yanxiaodi/p/3800767.html

在WinEcos社区也发布过一篇详细的文章介绍多语言工具包的使用,但因社区改版那篇文章已经找不到了。

当时写的时候还没有出Win10的SDK,都是基于UAP框架写的。微软早已经发布了Win10的SDK,相应的项目结构也发生了变化,以前分为两个项目通过Share项目共享代码的方式被抛弃,改为合并为一个项目,真正实现了一套代码兼容PC和Mobile两个平台,我已经基于Win10 10586的SDK发布了Currency Exchanger的新版本,下载地址:https://www.microsoft.com/store/apps/9WZDNCRDQ91S  

在开发Currency Exchanger的过程中,我又整理了一下支持多语言的问题,记录于此。

一、安装多语言工具包

使用VS2015开发UWP不能再使用老版3.0的多语言工具包,而应该使用新版的V4.0beta,这个还不是正式版,所以兼容性有问题,无法与V3.0共存,安装之后也无法再用VS2013或VS2015打开WP8.1之前的项目,所以安装之前请慎重!请慎重!请慎重!重要的事情说三遍。

我们在开发者后台的下载栏目可以找到多语言工具包的下载页面:https://dev.windows.com/zh-cn/develop/multilingual-app-toolkit

但是!截至到2015年12月31日,这个页面所下载的中文多语言工具包仍然是V3.0,而不是最新的V4.0beta,就算安装了,也无法在UWP项目中应用。

最新版的下载地址在此:

https://visualstudiogallery.msdn.microsoft.com/6dab9154-a7e1-46e4-bbfa-18b5e81df520

这也是我一直吐槽MSDN的原因之一,找个东西累死了,官方的东西都不好找。

还有一种方式,直接在VS2015的扩展里搜索Multilingual App Toolkit,主要要有空格,不然搜不到:

要安装V4.0beta这个。下面那个是旧版的,这两个无法共存。

二、启用多语言工具包

还是做个例子吧。新建一个MultilingualDemo项目,VS2015工具菜单-Multilingual App Toolkit -启用选定内容

会收到提示:1>  未启用项目"MultilingualDemo"-没有可本地化的资源被发现。 

 这是因为没有发现咳本地化的资源,双击Package.appxmanifest打开,设置一个默认语言,如果在设计的时候就想支持多语言,最好默认语言设置为英语,输入en-US:

然后在项目中添加一个Strings文件夹,再在其下添加一个en-US文件夹,这个文件夹名字要和默认语言代码保持一致,如果默认语言是zh-CN,那就建一个zh-CN的文件夹。

在这个目录下添加一个Resources.resw资源文件,在这里面编辑所需要的字符串:

添加几个资源,注意,如果是要显示在界面上的,可以根据控件的属性来设置,如TextBlock的文字是Text属性,那资源的名字就命名为HelloWorld.Text,Button的文字是Content属性,所以命名为ClickMe.Content,另外我还加了一个AppName,用于在代码中使用。

 

再次 VS2015工具菜单-Multilingual App Toolkit -启用选定内容

 

这次可以正常启用了:

 

1> 项目"MultilingualDemo"已启用。 该项目的来源,文化是 'en-US' [英语(美国)]。

 

三、在XAML界面上使用语言资源

在Page中放一个 TextBlock,一个Button,一个ComboBox,设置其x:Uid(资源标识符,注意不是x:Name)属性,这样控件就可以根据资源找到其对应的内容:

<Grid Background&#61;"{ThemeResource ApplicationPageBackgroundThemeBrush}" DataContext&#61;"{StaticResource DesignVM}"><TextBlock x:Name&#61;"pageTitle" Grid.Column&#61;"1" Margin&#61;"100" Text&#61;"{Binding Title}" /><TextBlock x:Name&#61;"textBlock" x:Uid&#61;"HelloWorld" HorizontalAlignment&#61;"Left" Margin&#61;"100,156,0,0" TextWrapping&#61;"Wrap" VerticalAlignment&#61;"Top"/><Button x:Name&#61;"button" x:Uid&#61;"ClickMe" HorizontalAlignment&#61;"Left" Margin&#61;"100,181,0,0" VerticalAlignment&#61;"Top"/><ComboBox x:Name&#61;"comboBox" x:Uid&#61;"ChangeLanguage" HorizontalAlignment&#61;"Left" Margin&#61;"100,249,0,0" VerticalAlignment&#61;"Top" Width&#61;"120"/>Grid>

 

四、在代码中使用语言资源

添加一个

public static class AppResources{private static ResourceLoader CurrentResourceLoader{get { return _loader ?? (_loader &#61; ResourceLoader.GetForCurrentView("Resources")); }}private static ResourceLoader _loader;private static readonly Dictionary<string, string> ResourceCache &#61; new Dictionary<string, string>();public static string GetString(string key){string s;if (ResourceCache.TryGetValue(key, out s)){return s;}else{s &#61; CurrentResourceLoader.GetString(key);ResourceCache[key] &#61; s;return s;}}///

/// AppName/// public static string AppName{get{return CurrentResourceLoader.GetString("AppName");}}}

 打开MainPage_Model.cs&#xff0c;取消OnBindedViewLoad方法的注释&#xff0c;在里面添加以下代码&#xff1a;

///

/// This will be invoked by view when the view fires Load event and this viewmodel instance is already in view&#39;s ViewModel property/// /// View that firing Load event/// Task awaiterprotected override Task OnBindedViewLoad(MVVMSidekick.Views.IView view){this.Title &#61; AppResources.AppName;return base.OnBindedViewLoad(view);}

现在运行看看&#xff1a;

现在默认语言是en-US。

五、翻译成本地化资源

如果没安装多语言工具包的话&#xff0c;可以在Strings目录下手动添加对应语言的文件夹和资源文件&#xff0c;不过有多语言工具包的话这个工作就变得很容易了&#xff0c;在项目上右键&#xff0c;添加翻译语言&#xff1a;

在这里可以选择要添加什么语言&#xff0c;选择简体中文&#xff1a;

这里建议只选择zh-Hans就可以了&#xff0c;不用选择zh-CN&#xff0c;因为语言与资源的匹配非常复杂&#xff0c;语言标记存在多种可能影响匹配优先级的可选组件&#xff0c;建议让系统来选择&#xff0c;MSDN文档是这么说的&#xff1a;&#xff08;https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/mt607079.aspx&#xff09;

使用某个语言标记的可选组件的示例有&#xff1a;

  • 用于禁止脚本语言的脚本。例如&#xff0c;en-Latn-US 与 en-US 匹配。
  • 区域。例如&#xff0c;en-US 与 en 匹配。
  • 变体。例如&#xff0c;de-DE-1996 与 de-DE 匹配。
  • -x 和其他扩展名。例如&#xff0c;en-US-x-Pirate 与 en-US 匹配。

 

对于不采用 xx 或 xx-yy 形式的语言标记&#xff0c;也存在许多组件&#xff0c;且并非全部匹配。

  • zh-Hant 与 zh-Hans 不匹配。

 

Windows 以一个标准的易于理解的方式排定语言匹配的优先顺序。例如&#xff0c;按优先顺序&#xff0c;en-US 依次与 en-US、en、en-GB 等等匹配。

  • Windows 执行跨区域匹配。例如&#xff0c;en-US 与 en-US 匹配&#xff0c;然后依次与 en、en-* 匹配。
  • Windows 提供了一些额外数据&#xff0c;它们可用于区域内&#xff08;如某种语言的主要区域&#xff09;的相关性匹配。例如&#xff0c;fr-FR 比 fr-CA 更匹配 fr-BE。
  • 如果你使用 Windows API&#xff0c;则可以免费获取日后 Windows 在语言匹配方面的任何改进。

在与列表中的首个语言匹配之后才会与列表中第二个语言匹配&#xff0c;对于其他区域变体也是如此。例如&#xff0c;如果应用程序语言为 en-US&#xff0c;则会先于 fr-CA 资源选择用于 en-GB 的资源。仅当没有用于 en 形式的资源时才选择用于 fr-CA 的资源。

应用程序语言列表设置为用户的区域变体&#xff0c;尽管该变体不同于应用提供的区域变体。例如&#xff0c;如果用户使用 en-GB&#xff0c;但应用支持 en-US&#xff0c;则应用程序语言列表将包含 en-GB。这将确保日期、时间和数字的格式更接近用户的期望 (en-GB)&#xff0c;但仍然使用应用支持的语言 (en-US) 加载 UI 资源&#xff08;由于语言匹配&#xff09;。

除非想把本地化做的非常完善&#xff0c;为中国用户和新加坡用户都提供不同的语言资源&#xff0c;否则只提供一种中文简体就够了。

选择后&#xff0c;Strings目录下会自动添加中文简体资源文件&#xff1a;

但是中文的资源里还是空的&#xff0c;我们需要翻译一下英文资源。右键单击MultilingualDemo.zh-Hans.xlf&#xff0c;选择打开方式&#xff1a;

现在可以输入翻译了&#xff0c;如果懒的话就点击菜单翻译按钮调用Bing的翻译接口自动翻译一下&#xff0c;保存。

重新编译生成一下项目&#xff0c;多语言工具包会根据默认资源去填充其他语言的资源文件&#xff1a;

现在可以看到中文的资源文件里也已经有了。翻译的时候要注意&#xff0c;字符串有几种状态&#xff0c;新、翻译、需要评审、最终等&#xff0c;可以根据这几种状态灵活切换显示哪些字符串来处理。

重新运行项目&#xff0c;如果我们的电脑系统默认是中文语言&#xff0c;那app应该已经变成中文界面了。如果用户电脑或手机默认语言是英语&#xff0c;则会调用en-US&#xff0c;如果是其他语言&#xff0c;则会调用默认语言en-US。

六、更改首选语言

App应具有可更改语言的设置。为了保存用户的首选语言&#xff0c;需要使用Windows.Storage.ApplicationData.Current.LocalSettings来保存用户的设置&#xff0c;关于如何使用这个来保存配置网上有很多介绍&#xff0c;这里就不详细介绍了。

在MainPage.xaml里头部添加以下命名空间&#xff1a;

xmlns:Interactivity&#61;"using:Microsoft.Xaml.Interactivity" xmlns:Core&#61;"using:Microsoft.Xaml.Interactions.Core"

把ComboBox代码改成这样&#xff1a;

<ComboBox x:Name&#61;"comboBox" x:Uid&#61;"ChangeLanguage" HorizontalAlignment&#61;"Left" Margin&#61;"100,249,0,0" VerticalAlignment&#61;"Top" Width&#61;"120"ItemsSource&#61;"{Binding LanguageList}" SelectedIndex&#61;"{Binding LanguageCodeIndex, Mode&#61;TwoWay}" ><ComboBox.ItemTemplate><DataTemplate><TextBlock Text&#61;"{Binding DisplayName}" />DataTemplate>ComboBox.ItemTemplate><Interactivity:Interaction.Behaviors><Core:EventTriggerBehavior EventName&#61;"SelectionChanged"><Core:InvokeCommandAction Command&#61;"{Binding CommandLanguageChanged}" CommandParameter&#61;"{Binding LanguageCodeIndex}"/>Core:EventTriggerBehavior>Interactivity:Interaction.Behaviors>ComboBox>

 

这里我们主要使用了Windows.Globalization里面的类&#xff0c;Windows.Globalization 还具有作为帮助程序对象提供的 Language 对象。它帮助应用检查有关语言的详细信息&#xff0c;例如&#xff0c;语言的脚本、显示名称和本地名称。主要语言替代PrimaryLanguageOverride是一个简单的替代设置&#xff0c;它用于让用户独立选择语言的应用&#xff0c;或者有充分理由替代默认语言选择的应用。

相应的vm里添加以下代码&#xff1a;

public ObservableCollection LanguageList{get { return _LanguageListLocator(this).Value; }set { _LanguageListLocator(this).SetValueAndTryNotify(value); }}#region Property ObservableCollection LanguageList Setup protected Property> _LanguageList &#61; new Property> { LocatorFunc &#61; _LanguageListLocator };static Func>> _LanguageListLocator &#61; RegisterContainerLocator>("LanguageList", model &#61;> model.Initialize("LanguageList", ref model._LanguageList, ref _LanguageListLocator, _LanguageListDefaultValueFactory));static Func> _LanguageListDefaultValueFactory &#61; () &#61;> { return new ObservableCollection(); };#endregion///

/// 语言设置/// public int LanguageCodeIndex{get { return _LanguageCodeIndexLocator(this).Value; }set { _LanguageCodeIndexLocator(this).SetValueAndTryNotify(value); }}#region Property int LanguageCodeIndex Setup protected Property<int> _LanguageCodeIndex &#61; new Property<int> { LocatorFunc &#61; _LanguageCodeIndexLocator };static Funcint>> _LanguageCodeIndexLocator &#61; RegisterContainerLocator<int>("LanguageCodeIndex", model &#61;> model.Initialize("LanguageCodeIndex", ref model._LanguageCodeIndex, ref _LanguageCodeIndexLocator, _LanguageCodeIndexDefaultValueFactory));static Func<int> _LanguageCodeIndexDefaultValueFactory &#61; () &#61;> { return -1; };#endregionpublic CommandModel CommandLanguageChanged{get { return _CommandLanguageChangedLocator(this).Value; }set { _CommandLanguageChangedLocator(this).SetValueAndTryNotify(value); }}#region Property CommandModel CommandLanguageChanged Setup protected Property> _CommandLanguageChanged &#61; new Property> { LocatorFunc &#61; _CommandLanguageChangedLocator };static Func>> _CommandLanguageChangedLocator &#61; RegisterContainerLocator>("CommandLanguageChanged", model &#61;> model.Initialize("CommandLanguageChanged", ref model._CommandLanguageChanged, ref _CommandLanguageChangedLocator, _CommandLanguageChangedDefaultValueFactory));static Func> _CommandLanguageChangedDefaultValueFactory &#61;model &#61;>{var resource &#61; "CommandLanguageChanged"; // Command resource var commandId &#61; "CommandLanguageChanged";var vm &#61; CastToCurrentType(model);var cmd &#61; new ReactiveCommand(canExecute: true) { ViewModel &#61; model }; //New Command Core
cmd.DoExecuteUIBusyTask(vm,async e &#61;>{//Todo: Add LanguageChanged logic here, orawait MVVMSidekick.Utilities.TaskExHelper.Yield();string oldLan &#61; AppSettings.Instance.LanguageCode;if (vm.LanguageCodeIndex >&#61; 0){var lan &#61; vm.LanguageList[vm.LanguageCodeIndex];AppSettings.Instance.LanguageCode &#61; lan.LanguageTag;ApplicationLanguages.PrimaryLanguageOverride &#61; lan.LanguageTag;}}).DoNotifyDefaultEventRouter(vm, commandId).Subscribe().DisposeWith(vm);var cmdmdl &#61; cmd.CreateCommandModel(resource);cmdmdl.ListenToIsUIBusy(model: vm,canExecuteWhenBusy: false);return cmdmdl;};#endregion

属性可以用propvm代码段&#xff0c;命令用propcmd代码段来快速生成。

在MainPage的vm的load事件中初始化语言列表&#xff1a;

if (!LanguageList.Any()){var lanList &#61; ApplicationLanguages.ManifestLanguages;foreach (var lan in lanList){LanguageList.Add(new Language(lan));}}if (!string.IsNullOrEmpty(AppSettings.Instance.LanguageCode)){Language userLan &#61; LanguageList.FirstOrDefault(x &#61;> x.LanguageTag &#61;&#61; AppSettings.Instance.LanguageCode);LanguageCodeIndex &#61; LanguageList.IndexOf(userLan);}

如果用户更改语言后&#xff0c;在程序载入时应该按照用户选择的语言来调用&#xff0c;打开App.xaml.cs&#xff0c;在App构造 函数中添加以下代码&#xff1a;

public App(){//TODO 这里可以根据用户需要更改语言if (!string.IsNullOrEmpty(AppSettings.Instance.LanguageCode)){ApplicationLanguages.PrimaryLanguageOverride &#61; AppSettings.Instance.LanguageCode;}//ApplicationLanguages.PrimaryLanguageOverride &#61; "cs";//ResourceContext.GetForCurrentView().Reset();this.InitializeComponent();this.Suspending &#43;&#61; OnSuspending;}

现在一个具有基本多语言支持、可更改语言的app就完成了。用户选择不同的语言后&#xff0c;重新打开就会重新设置语言。

七、其他

这里是微软官方的一个例子&#xff0c;不过是win8平台的&#xff0c;可以参考&#xff1a;https://code.msdn.microsoft.com/windowsapps/Application-resources-and-cd0c6eaa/

还有一些特殊的情况需要考虑&#xff0c;如果非要做的那么完美的话&#xff1a;

  • 有可能有的语言字符数比较多&#xff0c;导致控件宽度不够&#xff0c;这就需要为每种语言设置控件的宽度&#xff0c;比如创建App_Name.Width的资源&#xff1b;
  • 有可能语言的排列方向不一致&#xff0c;比如阿拉伯语是右对齐&#xff0c;可以设置对齐属性&#xff1b;
  • 有可能图像也需要本地化&#xff0c;那就需要按照资源限定符的格式来定义图片路径&#xff1a;

    标准命名约定为foldername/qualifiername-value_qualifiername-value/filename.qualifiername-value_qualifiername-value.ext&#xff0c;当资源路径为Images/en-US/homeregion-USA/logo.scale-100_contrast-white.png时&#xff0c;应以Images/logo.png的方式来加载。

关于如何使用资源限定符&#xff0c;可参考&#xff1a;https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh965324.aspx

这个页面是一些本地化的最佳实践&#xff1a;https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/hh967762.aspx

CurrencyExchanger的本地化我也没有做的那么完善&#xff0c;基本就是只翻译了语言&#xff0c;没有考虑宽度啊排列方式这些&#xff0c;工作量太大了。

 

至于如何翻译这些文字&#xff0c;建议在app里留一个邮件&#xff0c;让志愿者来帮助翻译&#xff0c;可以将xlf文件上右键导出翻译&#xff0c;选择xlf格式或者csv格式&#xff0c;发送给翻译人员翻译&#xff0c;然后再导入进来即可。但这里又会遇到一个问题&#xff0c;导出的csv用excel打开的话&#xff0c;再另存&#xff0c;会丢失里面的双引号。

从xlf文件导出的csv格式是这样的&#xff1a;

除了表头&#xff0c;每个字段两边都有双引号。

这个文件用excel打开再另存后&#xff0c;再用文本编辑软件打开&#xff0c;会变成这样&#xff1a;

两边的引号没有了&#xff0c;导入的时候会提示错误&#xff0c;无法导入。

我想了个笨办法&#xff0c;在excel里编辑csv的时候&#xff0c;修改单元格属性&#xff0c;改为   !"&#64;!" 然后再保存&#xff0c;这样在文本编辑软件里打开会发现一个双引号变成了两个&#xff0c;然后再使用批量替换功能&#xff0c;把"""替换为"&#xff0c;同时别忘了把第一行表头的双引号去掉&#xff0c;才能正确导入。

其实如果直接把资源文件里的内容复制到excel里发送给翻译人员翻译&#xff0c;翻译好了再粘贴回来也行&#xff0c;但要是以后再增加修改默认语言的资源时&#xff0c;其他语言也得手动挨个改&#xff0c;不如用多语言工具包自动填充完整。各有利弊。

 

最后附上demo下载地址&#xff1a;

链接&#xff1a;http://pan.baidu.com/s/1i4jBn8L 密码&#xff1a;idpz



推荐阅读
  • 通过 NuGet 获取最新版本的 Rafy 框架及其详细文档
    为了帮助开发者更便捷地使用Rafy领域实体框架,我们已将最新版的Rafy框架程序集上传至nuget.org,并同步发布了最新版本的Rafy SDK至Visual Studio。此外,我们还提供了详尽的文档和示例,以确保开发者能够快速上手并充分利用该框架的强大功能。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 在Windows系统中安装TensorFlow GPU版的详细指南与常见问题解决
    在Windows系统中安装TensorFlow GPU版是许多深度学习初学者面临的挑战。本文详细介绍了安装过程中的每一个步骤,并针对常见的问题提供了有效的解决方案。通过本文的指导,读者可以顺利地完成安装并避免常见的陷阱。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • Composer 无法加载本地第三方库?如何解决这一常见问题 ... [详细]
  • 卓盟科技:动态资源加载技术的兼容性优化与升级 | Android 开发者案例分享
    随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
  • 在尝试为 Unity 编译一个简单的 Java 库时,运行 `ant jar` 命令后遇到了 Java I/O 异常。具体错误信息为“无法启动程序 ${aAPT},错误代码 2”,这通常表示指定的文件或目录不存在。此问题可能是由于环境配置不正确或路径设置有误导致的。建议检查相关路径和环境变量,确保所有依赖项都已正确安装和配置。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 应用链时代,详解 Avalanche 与 Cosmos 的差异 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • Vuforia 开发指南:第二章 环境配置与搭建
    本章节详细介绍了如何在Vuforia官网上完成账号注册及环境配置。首先,访问Vuforia官方网站并点击“Register”按钮,按照提示填写必要的个人信息。提交表单后,系统将验证信息并创建账户。接下来,用户需要下载并安装Vuforia开发工具,确保开发环境的顺利搭建。此外,还提供了详细的配置步骤和常见问题的解决方案,帮助开发者快速上手。 ... [详细]
author-avatar
宇中尘粒
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有