Windows Phone 8简洁:本地化,Windows Phone应用商店和应用内购买

当我们谈论移动应用程序时,开发并不是我们需要考虑的唯一方面。 如果我们想成功,我们还必须分发和推广我们的应用程序。 在本教程中,我们将讨论本地化,Windows Phone商店和应用内购买。

试用版应用

Windows Phone应用程序的独特功能之一是它们支持试用模式,这使它们可以从Windows Phone Store中作为功能有限的试用版下载。 一旦用户决定购买完整的应用程序,就不必从头开始下载它了。 商店将仅下载更新的证书,该证书将解锁所有先前被阻止的功能。

从开发人员的角度来看,管理试验很简单。 Windows.ApplicationModel.Store命名空间包含一个名为LicenseInformation的类,该类提供了一个称为IsTrial的属性。 如果其值为true ,则表示该应用程序已以试用模式安装,因此我们必须锁定不需要启用的功能; 否则,用户已经购买了它,因此可以使用所有功能。

您可以根据自己的应用选择最佳的试用体验。 例如,您可以禁用某些功能,限制应用程序的执行次数,或者在游戏中选择要解锁的级别。

LicenseInformation info = new LicenseInformation();
if (info.IsTrial)
{
    MessageBox.Show("Application is running in trial mode");
}
else
{
    MessageBox.Show("Application is running in full mode!");
}

本土化

增加应用程序销量和下载次数的最佳方法之一就是支持多种语言。 Visual Studio中的默认Windows Phone 8模板已经通过包含名为Resources的文件夹来支持本地化。 它包含所有资源文件,它们是带有特殊.resx扩展名的简单XML文件。

资源文件只是与特定键相关联的值(转换后的文本)的集合,该特定键在应用程序中用于引用该文本。 根据用户的语言,应用程序将自动使用正确的资源文件。

标准模板在Resources文件夹内创建一个名为AppResources.resx的文件,该文件引用标准语言(通常为英语)。

支持一种新语言很容易。 只需在解决方案资源管理器中 右键单击您的项目,然后选择属性 。 支持的区域性框将显示所有可用的语言。 在列表中选择新语言后,Visual Studio会在“资源”文件夹中自动创建一个名为AppResources.xx-yy.resx的新AppResources文件,其中xx-yy是所选语言的区域性代码(例如,如果您添加了意大利语,它将创建一个名为AppResources.it-IT.resx的文件。

Visual Studio提供了一个有用的可视化编辑器来处理资源文件。 它在表中显示所有值,您可以在其中轻松定义键,键值和可选注释。 要访问它,只需在Resources文件夹中双击一个资源文件。

除了提供标准资源文件之外,Windows Phone模板还包括一个名为LocalizedStrings的类,该类充当本地化文件和XAML之间的包装。 您可以在App.xaml文件中找到定义为全局资源的文件:

<Application.Resources>
    <local:LocalizedStrings xmlns:local="clr-namespace:Localizzazione" x:Key="LocalizedStrings"/>
</Application.Resources>

借助此包装器,您将能够直接在XAML中访问资源。 您不必每次都需要在用户界面中显示文本时将其直接添加到XAML中。 相反,您将添加资源文件,然后使用以下语法将它们连接到XAML:

<TextBlock Text="{Binding Source={StaticResource LocalizedStrings}, Path=LocalizedResources.SampleText}" />

多亏了LocalizedStrings类,我们可以简单地使用LocalizedResources.MyKey语法访问资源文件中的每个值,其中MyKey是标识要显示的文本的键。

如果要直接从代码访问资源字符串,则必须使用AppResources单例类,如以下示例所示:

private void OnShowMessageClicked(object sender, RoutedEventArgs e)
{
    MessageBox.Show(AppResources.SampleText);
}

多语言应用程序工具包

Microsoft已经创建了一个有用的Visual Studio扩展,称为Multilingual App Toolkit,可以从Windows Dev Center下载。 该工具不会改变本地化的工作方式; 它将始终基于资源文件,应用程序可以使用LocalizedString类访问这些资源文件。

以下列表详细介绍了多语言应用工具包的一些主要优点:

  • 使用本地化最耗时的方面之一是手动将以基本语言添加的所有新值复制到所有其他资源文件中。 多语言应用工具包将为您完成此任务。 在生成过程中,它将把添加到AppResources.resx文件中的所有新密钥复制到所有其他资源文件中。
  • 它提供了更好的可视化界面来管理翻译。 您将能够立即识别要翻译的新键并设置其他翻译状态。
  • 它支持Bing服务以自动翻译句子。 显然,您不能完全依赖自动翻译,但是对于您的本地化过程而言,它们可以是一个很好的开始。
  • 它能够自动生成伪语言,这是一种立即识别未翻译资源并更好地了解UI中文本空间的方法。

安装工具箱后,必须通过选择“ 启用多语言应用程序工具箱”选项在Visual Studio的“ 工具”菜单中为项目启用它。 启用它之后,Visual Studio将使用.xlf文件而不是.resx文件(主要语言除外)。 在编译过程中,该工具包将为您生成所有必需的.resx文件。

要访问工具箱的可视界面,只需双击.xlf文件,您将看到完整的资源列表。 图标将通知您每种资源的状态。 如果资源尚未翻译,则会显示一个红色圆圈。 如果资源已翻译但需要修订,则会显示一个黄色圆圈。 如果翻译已被批准,则会显示一个绿色圆圈。

多语言应用程序工具包

强迫语言

Windows Phone将自动选择与手机语言匹配的资源文件。 如果缺少适当的资源文件(因为您的应用程序不支持电话的语言),将使用默认值。

例如,如果您想让用户选择自己喜欢的语言,而与电话的语言无关,则可以更改此行为。 为此,在创建App类(在App.xaml.cs文件中声明)时,您需要设置其他区域性代码:

public App()
{
    CultureInfo culture = new CultureInfo("it-IT");
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
}

通过将区域性代码作为参数传递来定义CultureInfo对象之后,可以将其分配给Thread.CurrentThread对象的两个不同属性:

  • CurrentCulture是应用程序的文化,用于定义日期和时间格式,货币等功能。
  • CurrentUICulture是用户界面区域性,用于了解选择哪个资源文件。

如果要在测试过程中使用Multilingual App Toolkit生成的伪语言,则也需要这种方法。 由于伪语言不是平台支持的官方语言,因此您必须使用qps-ploc区域性代码强制使用它,如以下示例所示:

public App()
{
    CultureInfo culture = new CultureInfo("qps-ploc");
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
}

使用伪语言是识别尚未翻译的文本并测试应用程序的布局是否能够管理长文本的好方法。 开发应用程序时通常会发生的情况是,您仅使用几种语言对其进行测试,而忘记了一个单词(例如,英语中看起来很短)在翻译成德语时可能会很长。

店铺体验

第一篇文章所述 ,除非您要进行企业分发,否则Windows Phone Store是将应用程序分发给用户的唯一方法。 您需要一个付费的开发人员帐户,该帐户可以从Windows Dev Center购买。 费用为每年19美元,除非您是订阅DreamSpark计划的学生,否则免费。 MSDN订户也获得了类似的好处:在好处页面中,您可以获得一个令牌,可以免费注册。

除了年费之外,Microsoft采取收益分享的方式:应用程序价格的30%由Microsoft保留,而其他70%则由开发人员支付。 当然,如果应用程序免费,则此共享不适用。

一旦您的开发人员帐户被激活并且您的应用程序准备就绪,您可以将其提交到位于dev.windowsphone.com的门户。 在此过程中,您必须定义应用程序营销功能,例如价格,元数据和分发类型。 此后,提交完成,认证过程开始。 应用程序不会自动发布到商店; 首先,他们需要通过认证流程,以从技术和内容两个角度对应用程序进行验证。

技术测试确保该应用程序可以为用户提供良好的体验:它不会崩溃,快速且响应Swift,并且用户界面不会引起混淆。

手动测试检查应用程序的内容。 禁止使用某些类型的内容,例如色情,过度暴力等,这将导致认证失败。

当您开始提交过程时,您将看到完成该过程要遵循的步骤列表。 让我们简要地看一下每个步骤。

第1步:应用信息

发布过程的第一步用于设置一些基本信息,例如应用程序的类别,价格等级和市场分布。 您的应用程序将按照您选择的价格自动分发到所有受支持的国家/地区。 价格将自动转换为每个国家的货币。

在此步骤中,您可以选择自动排除内容政策较为严格的国家(例如中国)。 认证过程还提供了可选的市场选择和自定义定价步骤,该步骤提供了更深入的自定义:您可以选择仅在特定国家/地区分发应用程序,并为每个国家/地区自定义价格。

在此步骤中要设置的另一个重要选项是分发渠道。 分发Windows Phone应用程序的三种方法:

  • 公用商店 :该应用可以被任何用户发现和下载。
  • 隐藏 :该应用仍可在公共商店中使用,但用户无法发现它。 找到它的唯一方法是使用发布应用程序时生成的直接链接。
  • Beta :用户无法发现该应用程序,此外,仅允许授权用户下载该应用程序。 用户已使用注册电话的Microsoft帐户获得授权。 在提交过程中,您最多可以包含10,000个用户。 创建此发行渠道是为了支持beta测试; 但是,在这种情况下,该应用程序实际上不会经过测试,但是在提交应用程序后的两个小时内将对选定的用户可用。 Beta应用程序在首次提交后的90天后会自动过期,无论以后的更新如何。

步骤2:上传并描述您的XAP

第二步需要花费更多时间才能完成,因为您必须提供将在Windows Phone应用商店中显示的所有应用程序信息。

第一步是上传XAP文件。 XAP是Visual Studio在编译项目时生成的软件包,其中包含运行该应用程序所需的所有文件。 您可以在Visual Studio项目的bin文件夹中找到它。 请记住,始终以发布模式编译应用程序; 否则将不被接受。

上载XAP后,门户将自动显示应用程序功能的摘要,例如支持的分辨率,所需的功能等等。 您还必须设置要上传的应用程序的版本号。

该门户网站还将自动检测您支持的语言,该语言将显示在名为Language details的下拉菜单中。 您必须为每种支持的语言设置应用程序的元数据(标题,描述和关键字)。 用户打开应用程序页面时,此信息将显示在商店中。

有关商店中显示的应用程序的信息

您还需要针对每种语言和支持的分辨率至少上传一个屏幕截图(允许八个),以及应用程序图标。 它们将显示在商店的屏幕截图部分。 要获取屏幕截图,您可以使用仿真器中提供的一种工具。

完成所有必需的步骤后,门户将向您显示提交摘要以供确认。

管理应用程序的生命周期

应用程序通过认证后,您将可以访问许多报告,这些报告将帮助您了解应用程序的性能。 有下载报告,销售报告和崩溃报告。

如果应用程序未通过认证过程,则您会在仪表板上找到包含完整报告的PDF文件。 它将详细告诉您出了什么问题以及应该如何解决已确定的问题。

最后,当然,您还可以更新您的应用程序。 在这种情况下,您将只需要重复所有提交步骤,尽管所有字段都已经充满了旧信息和元数据。 如果您只想更改价格,说明和屏幕截图等信息,则过程也相同。 仅当您更改了任何需要验证的信息时,才需要对提交进行认证。 如果仅更改价格,则会立即发布更新。

应用内购买

使用Windows Phone应用赚钱的另一种方式是支持应用内购买。 除了从商店购买应用程序外,用户还可以在应用程序本身内进行购买。

应用内购买一直被允许,但是Windows Phone 8引入了特定的API和Microsoft后端支持。 以前,开发人员负责创建服务器基础结构,管理付款并连接客户端。

现在,您只需依靠商店基础架构即可。 用户将使用从商店购买应用程序或音乐时使用的同一张信用卡付款,并且门户网站将允许您创建一种或多种产品以在该应用程序中购买。 同样在这种情况下,将采用收益分享方法。 如果您想避免这种情况,则可以自由实施自己的应用内购买基础架构; Microsoft不会强迫开发人员使用其服务。

重要的是要强调通过Microsoft服务进行的应用内购买仅适用于虚拟产品(如新功能,游戏级别等); 它不能用于购买有形商品。

Windows Phone支持两种产品:

  • 耐用性是只能购买一次的产品,例如应用程序功能,级别包等。
  • 消耗品是指在消费后可以再次购买的产品,例如虚拟硬币。

定义产品

产品在门户中定义。 在应用程序页面中,“ 产品”部分提供了添加新的应用程序内产品的选项。 定义产品类似于提交应用程序:您必须设置一些基本属性,例如名称,价格和元数据,然后提交。

有两个关键属性:

  • 产品标识符,这是您在应用程序中用来引用产品的唯一ID
  • 产品类型,可以是消耗性的也可以是耐用的

与产品互动

定义所有属性后,即可开始在应用程序中使用产品。 可能的第一个要求是显示用户可以购买的可用产品列表。 使用属于Windows.ApplicationModel.Store命名空间的CurrentApp类可以实现此目标。

private async void OnListStuffClicked(object sender, RoutedEventArgs e)
{
    ListingInformation listing = await CurrentApp.LoadListingInformationAsync();
    List<ProductListing> productListings = listing.ProductListings.Values.ToList();

    Purchases.ItemsSource = productListings;
}

CurrentApp类公开LoadListingInformationAsync()方法,该方法返回一个ListingInformation对象,该对象存储有关可用产品的所有信息。

产品存储在ProductListings集合内。 在上一个示例中,我们使用LongListSelector控件将其显示给用户,该控件具有以下定义:

<phone:LongListSelector x:Name="Purchases" SelectionChanged="OnSelectedPurchaseChanged">
    <phone:LongListSelector.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="15, 0, 0, 20">
                <TextBlock Text="{Binding Path=Name}" Margin="0, 0, 20, 0" />
                <TextBlock Text="{Binding Path=FormattedPrice}" />
            </StackPanel>
        </DataTemplate>
    </phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>

每个ProductListing对象都包含我们在商店中分配给产品的相同属性。 在前面的示例中,我们显示了产品的名称( Name )和价格( FormattedPrice )。

获得产品列表后,您必须管理购买过程。 同样,我们需要使用CurrentApp类,该类提供RequestProductPurchaseAsync()方法。 作为参数,我们将传递用户选择的ProductListing对象。

private async void OnSelectedPurchaseChanged(object sender, SelectionChangedEventArgs e)
{
    ProductListing selectedPurchase = Purchases.SelectedItem as ProductListing;
    await CurrentApp.RequestProductPurchaseAsync(selectedPurchase.ProductId, true);
}

购买产品后,可以使用CurrentApp.LicenseInformation.ProductLicenses集合检查其状态。 它包含具有相关许可证状态的所有受支持产品。 每个产品都由一个密钥标识,这是我们在门户网站中创建产品时分配的唯一标识符。

private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    if (CurrentApp.LicenseInformation.ProductLicenses.ContainsKey("CoolProduct"))
    {
        ProductLicense license = CurrentApp.LicenseInformation.ProductLicenses[“CoolProduct”];
        if (license.IsActive)
        {
            //Unlock the feature.
        }
        else
        {
            //Lock the feature.
        }
    }
}

在前面的示例中,我们可以通过检查IsActive属性的值来确定是否已购买带有CoolProduct标识符的产品。 该操作在页面加载时执行:如果已购买产品,则我们将解锁相关功能,否则我们将等待用户购买。

对于消耗品,购买过程是相同的。 唯一的区别是,在消耗掉它之后,我们需要报告它,以便可以“解锁”它以便再次购买。

我们可以通过调用CurrentApp类的ReportProductFullfillment()方法来报告它,该方法需要标识产品的ProductLicense对象作为参数。

private void OnConsumeButtonClicked(object sender, RoutedEventArgs e)
{
    var licenses = CurrentApp.LicenseInformation.ProductLicenses;
    if (licenses.ContainsKey(“CoolProductConsumable”))
    {
        ProductLicense productLicense = licenses[“CoolProductConsumable”];
        CurrentApp.ReportProductFulfillment(productLicense.ProductId);
    }
}

测试应用内购买

不幸的是,测试应用内购买并非易事。 由于必须在门户中定义产品,因此您必须提交您的应用程序才能测试购买过程。

一种解决方法是将应用程序发布为Beta。 由于该应用无需通过认证,因此将立即可以进行测试。 缺点是,如果出现问题,很难正确测试它,因为您无法像通常使用任何其他应用程序那样使用Visual Studio对其进行调试。

因此,Microsoft提供了一个名为MockIAP的测试库。 其目的是“模拟”真正的应用程序内购买API,以便不针对真正的Microsoft服务执行操作,而是使用应用程序内定义的伪造产品。

可以从MSDN下载MockIAP并将其添加到您的解决方案中。 它提供的API与本机SDK公开的API相同; 唯一的区别是它们属于MockIAPLib命名空间而不是Windows.ApplicationModel.Store命名空间。

要开始使用MockIAP库,有两件事要做。 第一种是添加一些条件编译指令,以便在调试模式下(通常在测试期间)编译应用程序时,它将使用模拟库。 在发布模式下编译时,它将使用真正的Microsoft服务。

下面的代码示例显示了名称空间声明在页面中的外观:

#if DEBUG
    using MockIAPLib;
    using Store = MockIAPLib;
#else
    using Windows.ApplicationModel.Store;
#endif

第二步是定义我们需要使用的产品。 由于应用程序不会连接到真实的服务,因此我们需要在代码中复制在门户中定义的产品。

以下代码显示了初始化示例:

private void SetupMockIAP()
{
    MockIAP.Init();
    MockIAP.RunInMockMode(true);
    MockIAP.SetListingInformation(1, “en-US”, “This is a sample app”, “1”, “SampleApp”);
    ProductListing p = new ProductListing
    {
        Name = “Cool product”,
        ProductId = “CoolProduct”,
        ProductType = Windows.ApplicationModel.Store.ProductType.Durable,
        Description = “A cool product”,
        FormattedPrice = “10.00 €”,
        Tag = string.Empty
    };

    MockIAP.AddProductListing(“CoolProduct”, p);

    ProductListing p2 = new ProductListing
    {
        Name = “Cool product consumable”,
        ProductId = “CoolProductConsumable”,
        ProductType = Windows.ApplicationModel.Store.ProductType.Consumable,
        Description = “A cool consumable product”,
        FormattedPrice = “5.00 €”,
        Tag = string.Empty
    };

    MockIAP.AddProductListing(“CoolProductConsumable”, p2);
}

我们创建了两个产品:一个持久的由键标识CoolProduct和消耗品一个由键标识CoolProductConsumable 。 每个产品都由ProductListing类(与实际服务使用的类相同)标识,并且我们可以使用它来定义通常从Microsoft服务检索的所有产品属性,例如名称,类型,价格等。

我们使用MockIAP类的AddProductListing()方法添加每个产品。 添加产品后,我们可以使用标准API进行应用内购买。 操作将使用假冒产品而不是真实服务在本地执行,但是行为将完全相同。 我们将能够列出,购买和消费可用的产品。

结论

当我们谈论移动应用程序时,开发并不是我们需要考虑的唯一方面。 如果我们想成功,我们还必须分发和推广我们的应用程序。 在本教程中,我们讨论了:

本教程代表了Windows Phone 8 Succinctly的最后一章,这是Syncfusion团队提供的免费电子书。 我们希望您喜欢本系列有关为Windows Phone 8开发应用程序的文章!

翻译自: https://code.tutsplus.com/tutorials/windows-phone-8-succinctly-localization-windows-phone-store-in-app-purchases--cms-23333

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值