Archived
1
0

Refactored player. Refactored changelog system. Players isn't localized

Related Work Items: #161, #211, #238
This commit is contained in:
Michael Gordeev
2019-01-02 23:44:40 +03:00
parent cb5c3c7c7f
commit 088d85ddb9
69 changed files with 3871 additions and 707 deletions
@@ -136,6 +136,7 @@
<HintPath>..\..\..\..\..\..\Program Files (x86)\Microsoft SDKs\UWPNuGetPackages\microsoft.netcore.universalwindowsplatform\6.1.5\ref\uap10.0.15138\System.Net.WebClient.dll</HintPath> <HintPath>..\..\..\..\..\..\Program Files (x86)\Microsoft SDKs\UWPNuGetPackages\microsoft.netcore.universalwindowsplatform\6.1.5\ref\uap10.0.15138\System.Net.WebClient.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup />
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' "> <PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion> <VisualStudioVersion>14.0</VisualStudioVersion>
</PropertyGroup> </PropertyGroup>
+35 -6
View File
@@ -1,10 +1,39 @@
using Windows.Data.Xml.Dom; using Newtonsoft.Json;
using System.Collections.Generic;
using Windows.ApplicationModel.Resources;
using Windows.Data.Xml.Dom;
using Windows.Storage;
using Windows.UI.Notifications; using Windows.UI.Notifications;
namespace FoxTube.Background namespace FoxTube.Background
{ {
public static class Notification public static class Notification
{ {
private static Dictionary<string, string> languagePack = LoadPack();
private static Dictionary<string, string> LoadPack()
{
object[] saved = JsonConvert.DeserializeObject<object[]>(ApplicationData.Current.RoamingSettings.Values["settings"] as string);
if (saved[7] as string == "ru-RU")
return new Dictionary<string, string>()
{
{ "addLater", "Добавить в Посмотреть позже" },
{ "changelog", "Список изменений" },
{ "changelogHeader", "Что нового в версии" },
{ "videoContent", "загрузил новое видео" },
{ "goChannel", "Открыть канал" }
};
else
return new Dictionary<string, string>()
{
{ "addLater", "Add to Watch later" },
{ "changelog", "Changelog" },
{ "changelogHeader", "What's new in version" },
{ "videoContent", "uploaded a new video" },
{ "goChannel", "Go to channel" }
};
}
public static ToastNotification GetChangelogToast(string version) public static ToastNotification GetChangelogToast(string version)
{ {
XmlDocument template = new XmlDocument(); XmlDocument template = new XmlDocument();
@@ -14,8 +43,8 @@ namespace FoxTube.Background
<binding template='ToastGeneric'> <binding template='ToastGeneric'>
<image placement='hero' src='http://foxgame-studio.000webhostapp.com/FoxTubeAssets/WhatsNewThumb.png'/> <image placement='hero' src='http://foxgame-studio.000webhostapp.com/FoxTubeAssets/WhatsNewThumb.png'/>
<image placement='appLogoOverride' hint-crop='circle' src='http://foxgame-studio.000webhostapp.com/FoxTubeAssets/NewsAvatar.png'/> <image placement='appLogoOverride' hint-crop='circle' src='http://foxgame-studio.000webhostapp.com/FoxTubeAssets/NewsAvatar.png'/>
<text>Changelog</text> <text>{languagePack["changelog"]}</text>
<text>See what's new in version {version}</text> <text>{languagePack["changelogHeader"]} {version}</text>
</binding> </binding>
</visual> </visual>
</toast>"); </toast>");
@@ -33,13 +62,13 @@ namespace FoxTube.Background
<image placement='hero' src='{thumbnail.Replace("&", "%26")}'/> <image placement='hero' src='{thumbnail.Replace("&", "%26")}'/>
<image placement='appLogoOverride' hint-crop='circle' src='{avatar.Replace("&", "%26") ?? "http://foxgame-studio.000webhostapp.com/FoxTubeAssets/LogoAvatar.png"}'/> <image placement='appLogoOverride' hint-crop='circle' src='{avatar.Replace("&", "%26") ?? "http://foxgame-studio.000webhostapp.com/FoxTubeAssets/LogoAvatar.png"}'/>
<text>{title}</text> <text>{title}</text>
<text>{channel} uploaded a new video</text> <text>{channel} {languagePack["videoContent"]}</text>
</binding> </binding>
</visual> </visual>
<actions> <actions>
<action content='Add to Watch later' activationType='background' arguments='later|{id}'/> <action content='{languagePack["addLater"]}' activationType='background' arguments='later|{id}'/>
<action content='Go to channel' activationType='foreground' arguments='channel|{channelId}'/> <action content='{languagePack["goChannel"]}' activationType='foreground' arguments='channel|{channelId}'/>
</actions> </actions>
</toast>"); </toast>");
+20 -2
View File
@@ -1,7 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<items> <items>
<item time="2018-07-29T23:00:00-03" version="1.0.1"> <item time="2019-01-02T10:00:00-03" version="0.2.1901">
<content>Announcement body (beware of special characters)</content> <content>### Что нового:
- По умолчанию для карточек загружается максимальное разрешение картинки
- Пофикшен рассинхрон и теперь поддерживаются все возможные разрешения
- Добавлена поддержка прямого эфира (включая чат и обновление зрителей в реальном времени)
- Пофикшен плеер
- Добавлен новый логотип
- Исправлен баг неправильного отображения оставшегося времени если осталось больше часа
- Обновлена локализация
- Контекстное меню карточек
- Мелкие багфиксы
- Обновлена система хранения настроек
- Теперь чейнджлоги будут здесь, а не в файле
### Что по-прежнему не работает:
- Страница рекомендованных видео и страница видео с подписок
- История
- Работа с плейлистами</content>
</item> </item>
</items> </items>
<!--<item time="YYYY-MM-DDThh:mm:ss-03" version="1.0.1"> <!--<item time="YYYY-MM-DDThh:mm:ss-03" version="1.0.1">
-33
View File
@@ -1,33 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FoxTube.Classes
{
public class Caption
{
public TimeSpan Start { get; private set; }
public TimeSpan Duration { get; private set; }
public TimeSpan End
{
get { return Start + Duration; }
}
public string Text { get; private set; }
public Caption(int startTime, int duration, string text)
{
Start = TimeSpan.FromMilliseconds(startTime);
Duration = TimeSpan.FromMilliseconds(duration);
Text = text;
}
public Caption(double startTime, double duration, string text)
{
Start = TimeSpan.FromSeconds(startTime);
Duration = TimeSpan.FromSeconds(duration);
Text = text;
}
}
}
+6 -3
View File
@@ -1,5 +1,6 @@
using System; using System;
using System.Xml; using System.Xml;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Classes namespace FoxTube.Classes
{ {
@@ -14,6 +15,8 @@ namespace FoxTube.Classes
public string Content { get; set; } public string Content { get; set; }
public string Id { get; set; } public string Id { get; set; }
private ResourceLoader resources = ResourceLoader.GetForCurrentView("Inbox");
public string Icon public string Icon
{ {
get get
@@ -29,9 +32,9 @@ namespace FoxTube.Classes
get get
{ {
if (Type == InboxItemType.PatchNote) if (Type == InboxItemType.PatchNote)
return "Patch note"; return resources.GetString("changelog");
else else
return "Developer's message"; return resources.GetString("dev");
} }
} }
@@ -40,7 +43,7 @@ namespace FoxTube.Classes
get get
{ {
if (Type == InboxItemType.PatchNote) if (Type == InboxItemType.PatchNote)
return $"What's new in v{Id}"; return $"{resources.GetString("whatsnew")}{Id}";
else else
return Subject; return Subject;
} }
+40 -14
View File
@@ -10,6 +10,7 @@ using System.Web;
using System.Xml; using System.Xml;
using Windows.ApplicationModel.Core; using Windows.ApplicationModel.Core;
using Windows.ApplicationModel.DataTransfer; using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
using Windows.Storage; using Windows.Storage;
using Windows.Storage.Streams; using Windows.Storage.Streams;
using Windows.System; using Windows.System;
@@ -24,6 +25,7 @@ namespace FoxTube
{ {
public static class Methods public static class Methods
{ {
private static ResourceLoader resources = ResourceLoader.GetForCurrentView("Methods");
public static CommentsPage CommentsPage { get; set; } public static CommentsPage CommentsPage { get; set; }
public static bool NeedToResponse { get; set; } = false; public static bool NeedToResponse { get; set; } = false;
@@ -42,6 +44,30 @@ namespace FoxTube
return new Uri(url); return new Uri(url);
} }
public static string GetChars(this string str, int count)
{
try
{
string s = "";
for (int i = 0; i < count; i++)
s += str[i];
return s;
}
catch
{
return "";
}
}
public static List<object> ToReversedList(this Array array)
{
List<object> list = new List<object>();
foreach (object i in array)
list.Add(i);
list.Reverse();
return list;
}
public static void ForEach<T>(this IEnumerable<T> array, Action<T> action) public static void ForEach<T>(this IEnumerable<T> array, Action<T> action)
{ {
array.ToList().ForEach(action); array.ToList().ForEach(action);
@@ -94,31 +120,31 @@ namespace FoxTube
TimeSpan span = DateTime.Now - dateTime; TimeSpan span = DateTime.Now - dateTime;
if (span.TotalMinutes < 1) if (span.TotalMinutes < 1)
return "Just now"; return resources.GetString("/Methods/now");
else if (Math.Round(span.TotalMinutes) == 1) else if (Math.Round(span.TotalMinutes) == 1)
return "1 minute ago"; return resources.GetString("/Methods/oneMinute");
else if (span.TotalMinutes < 60) else if (span.TotalMinutes < 60)
return Math.Round(span.TotalMinutes) + " minutes ago"; return Math.Round(span.TotalMinutes) + " " + resources.GetString("/Methods/minutes");
else if (Math.Round(span.TotalHours) == 1) else if (Math.Round(span.TotalHours) == 1)
return "1 hour ago"; return resources.GetString("/Methods/oneHr");
else if (span.TotalHours < 24) else if (span.TotalHours < 24)
return Math.Round(span.TotalHours) + " hours ago"; return Math.Round(span.TotalHours) + " " + resources.GetString("/Methods/hrs");
else if (Math.Round(span.TotalDays) == 1) else if (Math.Round(span.TotalDays) == 1)
return "1 day ago"; return resources.GetString("/Methods/oneDay");
else if (span.TotalDays < 7) else if (span.TotalDays < 7)
return Math.Round(span.TotalDays) + " days ago"; return Math.Round(span.TotalDays) + " " + resources.GetString("/Methods/days");
else if (Math.Round(span.TotalDays) == 7) else if (Math.Round(span.TotalDays) == 7)
return "1 week ago"; return resources.GetString("/Methods/oneWeek");
else if (span.TotalDays < 30) else if (span.TotalDays < 30)
return Math.Round(span.TotalDays / 7) + " weeks ago"; return Math.Round(span.TotalDays / 7) + " " + resources.GetString("/Methods/weeks");
else if (Math.Round(span.TotalDays) == 30) else if (Math.Round(span.TotalDays) == 30)
return "1 month ago"; return resources.GetString("/Methods/oneMonth");
else if (Math.Round(span.TotalDays) < 365) else if (Math.Round(span.TotalDays) < 365)
return Math.Round(span.TotalDays / 30) + " months ago"; return Math.Round(span.TotalDays / 30) + " " + resources.GetString("/Methods/months");
else if (Math.Round(span.TotalDays / 365) == 365) else if (Math.Round(span.TotalDays / 365) == 365)
return "1 year ago"; return resources.GetString("/Methods/oneYear");
else else
return Math.Round(span.TotalDays / 365) + " years ago"; return Math.Round(span.TotalDays / 365) + " " + resources.GetString("/Methods/years");
} }
public static void FormatText(ref TextBlock block, string text) public static void FormatText(ref TextBlock block, string text)
@@ -298,7 +324,7 @@ namespace FoxTube
{ {
DataRequest request = args.Request; DataRequest request = args.Request;
request.Data.Properties.Title = title; request.Data.Properties.Title = title;
request.Data.Properties.Description = $"Sharing a {type}"; request.Data.Properties.Description = $"{resources.GetString("/Methods/sharing")} {type}";
request.Data.SetText(title + "\n" + "#YouTube #FoxTube #SharedWithFoxTube"); request.Data.SetText(title + "\n" + "#YouTube #FoxTube #SharedWithFoxTube");
request.Data.SetWebLink(url.ToUri()); request.Data.SetWebLink(url.ToUri());
+1 -1
View File
@@ -168,7 +168,7 @@ namespace FoxTube
} }
//Settings storage //Settings storage
private static readonly ApplicationDataContainer storage = ApplicationData.Current.LocalSettings; private static readonly ApplicationDataContainer storage = ApplicationData.Current.RoamingSettings;
//Predefined preferences //Predefined preferences
private static object[] settings = new object[] private static object[] settings = new object[]
+7 -7
View File
@@ -20,7 +20,7 @@
<Image Name="cover" Source="/Assets/ChannelCoverTemplate.png" Stretch="UniformToFill" VerticalAlignment="Center"/> <Image Name="cover" Source="/Assets/ChannelCoverTemplate.png" Stretch="UniformToFill" VerticalAlignment="Center"/>
<StackPanel Name="liveTag" Margin="5" Background="Red" BorderBrush="White" BorderThickness="1" VerticalAlignment="Bottom" HorizontalAlignment="Right" Padding="5,2,5,3" Orientation="Horizontal" Visibility="Collapsed"> <StackPanel Name="liveTag" Margin="5" Background="Red" BorderBrush="White" BorderThickness="1" VerticalAlignment="Bottom" HorizontalAlignment="Right" Padding="5,2,5,3" Orientation="Horizontal" Visibility="Collapsed">
<TextBlock Text="&#xEC44; " VerticalAlignment="Center" Foreground="White" FontSize="12" FontFamily="Segoe MDL2 Assets" FontWeight="Black"/> <TextBlock Text="&#xEC44; " VerticalAlignment="Center" Foreground="White" FontSize="12" FontFamily="Segoe MDL2 Assets" FontWeight="Black"/>
<TextBlock Text="LIVE" VerticalAlignment="Center" Foreground="White" FontSize="12" FontWeight="Bold"/> <TextBlock x:Uid="/Cards/live" Text="LIVE" VerticalAlignment="Center" Foreground="White" FontSize="12" FontWeight="Bold"/>
</StackPanel> </StackPanel>
<Grid Grid.Row="1"> <Grid Grid.Row="1">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@@ -43,10 +43,10 @@
</StackPanel> </StackPanel>
</Grid> </Grid>
<TextBlock Grid.Row="1" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Height="50" Margin="10" TextAlignment="Center" Padding="0,16,0,0" Foreground="Gray"> <TextBlock Grid.Row="1" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Height="50" Margin="10" TextAlignment="Center" Padding="0,16,0,0" Foreground="Gray">
<Hyperlink Click="Hyperlink_Click">Log in</Hyperlink> to manage your subscriptions <Hyperlink Click="Hyperlink_Click"><Run x:Uid="/Cards/login">Log in</Run></Hyperlink> <Run x:Uid="/Cards/tomanage">to manage your subscriptions</Run>
</TextBlock> </TextBlock>
<Grid Visibility="Collapsed" Grid.Row="1" VerticalAlignment="Bottom" Margin="10" Name="subscriptionPane" Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}"> <Grid Visibility="Collapsed" Grid.Row="1" VerticalAlignment="Bottom" Margin="10" Name="subscriptionPane" Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}">
<Button Click="subscribe_Click" Name="subscribe" HorizontalAlignment="Stretch" Height="50" Background="Red" Foreground="White" FontSize="18" FontWeight="SemiBold" Content="Subscirbe" Margin="0,0,0,0"/> <Button x:Uid="/Cards/subscribe" Click="subscribe_Click" Name="subscribe" HorizontalAlignment="Stretch" Height="50" Background="Red" Foreground="White" FontSize="18" FontWeight="SemiBold" Content="Subscirbe" Margin="0,0,0,0"/>
<ToggleButton Name="notify" Height="50" Width="50" Visibility="Collapsed" FontFamily="Segoe MDL2 Assets" FontSize="18" FontWeight="SemiBold" Content="&#xE7ED;" Foreground="White" Background="Red" HorizontalAlignment="Right"/> <ToggleButton Name="notify" Height="50" Width="50" Visibility="Collapsed" FontFamily="Segoe MDL2 Assets" FontSize="18" FontWeight="SemiBold" Content="&#xE7ED;" Foreground="White" Background="Red" HorizontalAlignment="Right"/>
</Grid> </Grid>
</Grid> </Grid>
@@ -54,11 +54,11 @@
</Button> </Button>
<UserControl.ContextFlyout> <UserControl.ContextFlyout>
<MenuFlyout> <MenuFlyout>
<MenuFlyoutItem Icon="Contact" Text="View channel" Click="Button_Click"/> <MenuFlyoutItem x:Uid="/Cards/channel" Icon="Contact" Text="View channel" Click="Button_Click"/>
<MenuFlyoutSeparator/> <MenuFlyoutSeparator/>
<MenuFlyoutItem Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/> <MenuFlyoutItem x:Uid="/Cards/getLink" Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/>
<MenuFlyoutItem Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/> <MenuFlyoutItem x:Uid="/Cards/openWeb" Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/>
<MenuFlyoutItem Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/> <MenuFlyoutItem x:Uid="/Cards/share" Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/>
</MenuFlyout> </MenuFlyout>
</UserControl.ContextFlyout> </UserControl.ContextFlyout>
</UserControl> </UserControl>
+8 -5
View File
@@ -2,6 +2,7 @@
using Google.Apis.YouTube.v3.Data; using Google.Apis.YouTube.v3.Data;
using System; using System;
using Windows.ApplicationModel.DataTransfer; using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
using Windows.System; using Windows.System;
using Windows.UI; using Windows.UI;
using Windows.UI.Xaml; using Windows.UI.Xaml;
@@ -16,6 +17,8 @@ namespace FoxTube.Controls
/// </summary> /// </summary>
public sealed partial class ChannelCard : UserControl public sealed partial class ChannelCard : UserControl
{ {
ResourceLoader resources = ResourceLoader.GetForCurrentView("Cards");
string channelId; string channelId;
Channel item; Channel item;
@@ -41,8 +44,8 @@ namespace FoxTube.Controls
title.Text = item.Snippet.Title; title.Text = item.Snippet.Title;
subs.Text = $"{item.Statistics.SubscriberCount:0,0} subscribers"; subs.Text = $"{item.Statistics.SubscriberCount:0,0} {resources.GetString("/Cards/subscribers")}";
uploads.Text = $"{item.Statistics.VideoCount:0,0} videos"; uploads.Text = $"{item.Statistics.VideoCount:0,0} {resources.GetString("/Cards/videos")}";
if (live == "live") if (live == "live")
liveTag.Visibility = Visibility.Visible; liveTag.Visibility = Visibility.Visible;
@@ -55,7 +58,7 @@ namespace FoxTube.Controls
{ {
subscribe.Background = new SolidColorBrush(Colors.Transparent); subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray); subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed"; subscribe.Content = resources.GetString("/Cards/unsubscribe");
} }
} }
subscriptionPane.Visibility = Visibility.Visible; subscriptionPane.Visibility = Visibility.Visible;
@@ -88,13 +91,13 @@ namespace FoxTube.Controls
{ {
subscribe.Background = new SolidColorBrush(Colors.Transparent); subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray); subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed"; subscribe.Content = resources.GetString("/Cards/unsubscribe");
} }
else else
{ {
subscribe.Background = new SolidColorBrush(Colors.Red); subscribe.Background = new SolidColorBrush(Colors.Red);
subscribe.Foreground = new SolidColorBrush(Colors.White); subscribe.Foreground = new SolidColorBrush(Colors.White);
subscribe.Content = "Subscribe"; subscribe.Content = resources.GetString("/Cards/subscribe/Content");
} }
} }
+6 -6
View File
@@ -15,7 +15,7 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid Name="inputField"> <Grid Name="inputField">
<TextBox Margin="5,5,42,5" PlaceholderText="Send a message" Name="newMessage" VerticalAlignment="Center" MinHeight="32" TextWrapping="Wrap" AcceptsReturn="True"/> <TextBox x:Uid="/Chat/box" Margin="5,5,42,5" PlaceholderText="Send a message" Name="newMessage" VerticalAlignment="Center" MinHeight="32" TextWrapping="Wrap" AcceptsReturn="True"/>
<Button HorizontalAlignment="Right" Name="send" Click="send_Click" VerticalAlignment="Top" <Button HorizontalAlignment="Right" Name="send" Click="send_Click" VerticalAlignment="Top"
Height="32" Width="32" Height="32" Width="32"
Margin="0,5,5,0" Padding="0" Margin="0,5,5,0" Padding="0"
@@ -37,10 +37,10 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="5,0"> <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="5,0">
<PersonPicture Height="20" ProfilePicture="{Binding Path=Avatar}"/> <PersonPicture Height="20" ProfilePicture="{Binding Path=Avatar}"/>
<FontIcon Glyph="&#xEC61;" ToolTipService.ToolTip="Verified" Margin="2,0" Visibility="{Binding Path=IsVerified}"/> <FontIcon Glyph="&#xEC61;" ToolTipService.ToolTip="{Binding Path=verified}" Margin="2,0" Visibility="{Binding Path=IsVerified}"/>
<FontIcon Glyph="&#xEC1B;" ToolTipService.ToolTip="Moderator" Margin="2,0" Visibility="{Binding Path=IsModerator}"/> <FontIcon Glyph="&#xEC1B;" ToolTipService.ToolTip="{Binding Path=moderator}" Margin="2,0" Visibility="{Binding Path=IsModerator}"/>
<FontIcon Glyph="&#xECA7;" ToolTipService.ToolTip="Chat owner" Margin="2,0" Visibility="{Binding Path=IsOwner}"/> <FontIcon Glyph="&#xECA7;" ToolTipService.ToolTip="{Binding Path=owner}" Margin="2,0" Visibility="{Binding Path=IsOwner}"/>
<FontIcon Glyph="&#xE735;" ToolTipService.ToolTip="Sponsor" Margin="2,0" Visibility="{Binding Path=IsSponsor}"/> <FontIcon Glyph="&#xE735;" ToolTipService.ToolTip="{Binding Path=sponsor}" Margin="2,0" Visibility="{Binding Path=IsSponsor}"/>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" Grid.Column="1" VerticalAlignment="Top" Margin="0,0,5,0"> <StackPanel Orientation="Horizontal" Grid.Column="1" VerticalAlignment="Top" Margin="0,0,5,0">
<HyperlinkButton Content="{Binding Path=Author}" Tag="{Binding Path=ChannelId}" Grid.Column="1" Margin="0,-6,0,0" FontWeight="Bold" Click="HyperlinkButton_Click"/> <HyperlinkButton Content="{Binding Path=Author}" Tag="{Binding Path=ChannelId}" Grid.Column="1" Margin="0,-6,0,0" FontWeight="Bold" Click="HyperlinkButton_Click"/>
@@ -52,7 +52,7 @@
</DataTemplate> </DataTemplate>
</ListView.ItemTemplate> </ListView.ItemTemplate>
<ListViewItem> <ListViewItem>
<TextBlock Text="Welcome to the chat room" Foreground="Gray"/> <TextBlock x:Uid="/Chat/welcome" Text="Welcome to the chat room" Foreground="Gray"/>
</ListViewItem> </ListViewItem>
</ListView> </ListView>
</ScrollViewer> </ScrollViewer>
+14 -3
View File
@@ -5,6 +5,7 @@ using Windows.UI.Xaml.Media;
using Google.Apis.YouTube.v3.Data; using Google.Apis.YouTube.v3.Data;
using Google.Apis.YouTube.v3; using Google.Apis.YouTube.v3;
using Windows.UI; using Windows.UI;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Controls namespace FoxTube.Controls
{ {
@@ -60,6 +61,11 @@ namespace FoxTube.Controls
{ {
message = item; message = item;
} }
string verified = ResourceLoader.GetForCurrentView("Chat").GetString("/Chat/verified");
string moderator = ResourceLoader.GetForCurrentView("Chat").GetString("/Chat/moder");
string owner = ResourceLoader.GetForCurrentView("Chat").GetString("/Chat/owner");
string sponsor = ResourceLoader.GetForCurrentView("Chat").GetString("/Chat/sponsor");
} }
public sealed partial class Chat : UserControl public sealed partial class Chat : UserControl
@@ -122,12 +128,17 @@ namespace FoxTube.Controls
} }
}; };
LiveChatMessagesResource.InsertRequest request = SecretsVault.Service.LiveChatMessages.Insert(message, "snippet"); LiveChatMessagesResource.InsertRequest request = SecretsVault.Service.LiveChatMessages.Insert(message, "snippet,authorDetails");
await request.ExecuteAsync(); LiveChatMessage response = await request.ExecuteAsync();
if(response != null)
{
newMessage.Text = string.Empty;
list.Items.Add(new ChatMessage(response));
}
} }
finally finally
{ {
newMessage.Text = string.Empty;
newMessage.IsEnabled = true; newMessage.IsEnabled = true;
send.IsEnabled = true; send.IsEnabled = true;
} }
+6 -6
View File
@@ -36,9 +36,9 @@
<StackPanel Grid.Row="2" Name="editor" Visibility="Collapsed"> <StackPanel Grid.Row="2" Name="editor" Visibility="Collapsed">
<TextBox Name="editorText" Text="[Content]" AcceptsReturn="True" TextWrapping="Wrap" TextChanged="editorText_TextChanged"/> <TextBox Name="editorText" Text="[Content]" AcceptsReturn="True" TextWrapping="Wrap" TextChanged="editorText_TextChanged"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,5,0,5"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,5,0,5">
<Button Content="Delete comment" Background="Red" Name="deleteComment" Click="DeleteComment_Click"/> <Button x:Uid="/CommentsPage/editorDelete" Content="Delete comment" Background="Red" Name="deleteComment" Click="DeleteComment_Click"/>
<Button Name="editorClose" Content="Cancel" Click="editorClose_Click" Margin="5, 0"/> <Button x:Uid="/CommentsPage/editorCancel" Name="editorClose" Content="Cancel" Click="editorClose_Click" Margin="5, 0"/>
<Button Name="editorSend" Content="Submit" Click="editorSend_Click"/> <Button x:Uid="/CommentsPage/editorSubmit" Name="editorSend" Content="Submit" Click="editorSend_Click"/>
</StackPanel> </StackPanel>
<ProgressBar Name="editorSending" Foreground="Red" IsIndeterminate="True" Visibility="Collapsed"/> <ProgressBar Name="editorSending" Foreground="Red" IsIndeterminate="True" Visibility="Collapsed"/>
</StackPanel> </StackPanel>
@@ -68,7 +68,7 @@
Height="35"> Height="35">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xEE35;" FontSize="20"/> <TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xEE35;" FontSize="20"/>
<TextBlock Text="Reply"/> <TextBlock x:Uid="/CommentsPage/reply" Text="Reply"/>
</StackPanel> </StackPanel>
</Button> </Button>
@@ -77,7 +77,7 @@
Height="35"> Height="35">
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xE104;" FontSize="20"/> <TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xE104;" FontSize="20"/>
<TextBlock Text="Edit"/> <TextBlock x:Uid="/CommentsPage/edit" Text="Edit"/>
</StackPanel> </StackPanel>
</Button> </Button>
</StackPanel> </StackPanel>
@@ -85,7 +85,7 @@
</Grid> </Grid>
</Grid> </Grid>
<TextBox Grid.Row="1" Name="reply" TextChanged="reply_TextChanged" TextWrapping="Wrap" BorderThickness="0" Background="{ThemeResource SystemControlBackgroundChromeMediumLowBrush}" AcceptsReturn="True" MaxLength="500" <TextBox x:Uid="/CommentsPage/replyBox" Grid.Row="1" Name="reply" TextChanged="reply_TextChanged" TextWrapping="Wrap" BorderThickness="0" Background="{ThemeResource SystemControlBackgroundChromeMediumLowBrush}" AcceptsReturn="True" MaxLength="500"
Padding="5" Margin="0,0,32,0" Padding="5" Margin="0,0,32,0"
PlaceholderText="Enter your reply..."/> PlaceholderText="Enter your reply..."/>
<Button Grid.Row="1" Name="send" Click="send_Click" IsEnabled="False" HorizontalAlignment="Right" VerticalAlignment="Top" <Button Grid.Row="1" Name="send" Click="send_Click" IsEnabled="False" HorizontalAlignment="Right" VerticalAlignment="Top"
+14 -19
View File
@@ -1,31 +1,26 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Google.Apis.YouTube.v3; using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data; using Google.Apis.YouTube.v3.Data;
using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Media.Imaging;
using Windows.System;
using Windows.UI.Popups; using Windows.UI.Popups;
using Windows.ApplicationModel.Resources;
// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
namespace FoxTube.Controls namespace FoxTube.Controls
{ {
public enum CommentType { TopLevel, Reply } public enum CommentType { TopLevel, Reply }
/// <summary>
/// Control represents video comment entity
/// </summary>
public sealed partial class CommentCard : UserControl public sealed partial class CommentCard : UserControl
{ {
ResourceLoader resources = ResourceLoader.GetForCurrentView("CommentsPage");
Comment item; Comment item;
CommentThread thread; CommentThread thread;
bool repliesLoaded = false; bool repliesLoaded = false;
@@ -33,7 +28,7 @@ namespace FoxTube.Controls
public CommentCard(CommentThread comment) public CommentCard(CommentThread comment)
{ {
this.InitializeComponent(); InitializeComponent();
Initialize(comment); Initialize(comment);
} }
@@ -72,7 +67,7 @@ namespace FoxTube.Controls
else else
author.Text = comment.Snippet.TopLevelComment.Snippet.AuthorDisplayName; author.Text = comment.Snippet.TopLevelComment.Snippet.AuthorDisplayName;
meta.Text = string.Format("{0} {1}", Methods.GetAgo(comment.Snippet.TopLevelComment.Snippet.PublishedAt.Value), comment.Snippet.TopLevelComment.Snippet.UpdatedAt != comment.Snippet.TopLevelComment.Snippet.PublishedAt ? "(edited)" : ""); meta.Text = string.Format("{0} {1}", Methods.GetAgo(comment.Snippet.TopLevelComment.Snippet.PublishedAt.Value), comment.Snippet.TopLevelComment.Snippet.UpdatedAt != comment.Snippet.TopLevelComment.Snippet.PublishedAt ? resources.GetString("/CommentsPage/edited") : "");
Methods.FormatText(ref text, comment.Snippet.TopLevelComment.Snippet.TextDisplay); Methods.FormatText(ref text, comment.Snippet.TopLevelComment.Snippet.TextDisplay);
try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.TopLevelComment.Snippet.AuthorProfileImageUrl)); } try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.TopLevelComment.Snippet.AuthorProfileImageUrl)); }
@@ -118,7 +113,7 @@ namespace FoxTube.Controls
else else
author.Text = comment.Snippet.AuthorDisplayName; author.Text = comment.Snippet.AuthorDisplayName;
meta.Text = string.Format("{0} {1}", Methods.GetAgo(comment.Snippet.PublishedAt.Value), comment.Snippet.UpdatedAt != comment.Snippet.PublishedAt ? "(edited)" : ""); meta.Text = string.Format("{0} {1}", Methods.GetAgo(comment.Snippet.PublishedAt.Value), comment.Snippet.UpdatedAt != comment.Snippet.PublishedAt ? resources.GetString("/CommentsPage/edited") : "");
Methods.FormatText(ref text, comment.Snippet.TextDisplay); Methods.FormatText(ref text, comment.Snippet.TextDisplay);
try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.AuthorProfileImageUrl)); } try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.AuthorProfileImageUrl)); }
@@ -209,7 +204,7 @@ namespace FoxTube.Controls
} }
catch catch
{ {
await new MessageDialog("Failed to send your reply. Please, try again later.", "Failed to send your reply").ShowAsync(); await new MessageDialog(resources.GetString("/CommentsPage/failedReply")).ShowAsync();
} }
send.IsEnabled = true; send.IsEnabled = true;
reply.IsEnabled = true; reply.IsEnabled = true;
@@ -251,7 +246,7 @@ namespace FoxTube.Controls
} }
catch catch
{ {
await new MessageDialog("Failed to edit your commentary. Please, try again later.", "Failed to edit your commentary").ShowAsync(); await new MessageDialog(resources.GetString("/CommentsPage/failedEdit")).ShowAsync();
} }
editorText.IsEnabled = true; editorText.IsEnabled = true;
@@ -277,9 +272,9 @@ namespace FoxTube.Controls
private async void DeleteComment_Click(object sender, RoutedEventArgs e) private async void DeleteComment_Click(object sender, RoutedEventArgs e)
{ {
MessageDialog dialog = new MessageDialog("Are you sure? This action cannot be undone", "Delete comment"); MessageDialog dialog = new MessageDialog(resources.GetString("/CommentsPage/deleteContent"), resources.GetString("/CommentsPage/deleteHeader"));
dialog.Commands.Add(new UICommand("Yes", async (command) => dialog.Commands.Add(new UICommand(resources.GetString("/CommentsPage/yes"), async (command) =>
{ {
try try
{ {
@@ -288,7 +283,7 @@ namespace FoxTube.Controls
} }
catch { } catch { }
})); }));
dialog.Commands.Add(new UICommand("No")); dialog.Commands.Add(new UICommand(resources.GetString("/CommentsPage/no")));
dialog.CancelCommandIndex = 1; dialog.CancelCommandIndex = 1;
dialog.DefaultCommandIndex = 0; dialog.DefaultCommandIndex = 0;
+3 -3
View File
@@ -33,13 +33,13 @@
<Button Name="open" Click="open_Click" Width="80" Height="80" Padding="0" Background="Transparent"> <Button Name="open" Click="open_Click" Width="80" Height="80" Padding="0" Background="Transparent">
<StackPanel> <StackPanel>
<TextBlock Text="&#xED25;" FontFamily="Segoe MDL2 Assets" FontSize="30" HorizontalAlignment="Center"/> <TextBlock Text="&#xED25;" FontFamily="Segoe MDL2 Assets" FontSize="30" HorizontalAlignment="Center"/>
<TextBlock Text="Open" TextWrapping="WrapWholeWords" HorizontalTextAlignment="Center"/> <TextBlock x:Uid="/Downloads/openFile" Text="Open" TextWrapping="WrapWholeWords" HorizontalTextAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
<Button Name="gotoOriginal" Click="gotoOriginal_Click" Width="80" Height="80" Padding="0" Background="Transparent"> <Button Name="gotoOriginal" Click="gotoOriginal_Click" Width="80" Height="80" Padding="0" Background="Transparent">
<StackPanel> <StackPanel>
<TextBlock Text="&#xE2B4;" FontFamily="Segoe MDL2 Assets" FontSize="30" HorizontalAlignment="Center"/> <TextBlock Text="&#xE2B4;" FontFamily="Segoe MDL2 Assets" FontSize="30" HorizontalAlignment="Center"/>
<TextBlock Text="Go to original" TextWrapping="WrapWholeWords" HorizontalTextAlignment="Center" HorizontalAlignment="Center"/> <TextBlock x:Uid="/Downloads/gotoOrign" Text="Go to original" TextWrapping="WrapWholeWords" HorizontalTextAlignment="Center" HorizontalAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
</StackPanel> </StackPanel>
@@ -47,7 +47,7 @@
<TextBlock Name="status" Text="Downloading..." HorizontalAlignment="Left"/> <TextBlock Name="status" Text="Downloading..." HorizontalAlignment="Left"/>
<ProgressBar Name="progressBar" Width="200" Maximum="1" IsIndeterminate="True" Foreground="Red"/> <ProgressBar Name="progressBar" Width="200" Maximum="1" IsIndeterminate="True" Foreground="Red"/>
<TextBlock Name="perc" Text="--%"/> <TextBlock Name="perc" Text="--%"/>
<Button Content="Cancel" Name="cancel" Click="CancelPrompt" HorizontalAlignment="Right"/> <Button x:Uid="/Downloads/cancel" Content="Cancel" Name="cancel" Click="CancelPrompt" HorizontalAlignment="Right"/>
</StackPanel> </StackPanel>
</Grid> </Grid>
</UserControl> </UserControl>
+21 -18
View File
@@ -15,11 +15,14 @@ using Windows.UI.Popups;
using Windows.UI.Notifications; using Windows.UI.Notifications;
using Microsoft.Toolkit.Uwp.Notifications; using Microsoft.Toolkit.Uwp.Notifications;
using System.Threading.Tasks; using System.Threading.Tasks;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Controls namespace FoxTube.Controls
{ {
public sealed partial class DownloadItem : UserControl public sealed partial class DownloadItem : UserControl
{ {
ResourceLoader resources = ResourceLoader.GetForCurrentView("Downloads");
public DownloadItemContainer Container { get; private set; } public DownloadItemContainer Container { get; private set; }
public StorageFile file; public StorageFile file;
public bool InProgress { get; set; } = false; public bool InProgress { get; set; } = false;
@@ -62,10 +65,10 @@ namespace FoxTube.Controls
title.Text = Container.Title; title.Text = Container.Title;
path.Text = file.Name; path.Text = file.Name;
thumbnail.Source = new BitmapImage(Container.Thumbnail); thumbnail.Source = new BitmapImage(Container.Thumbnail);
quality.Text = $"Quality: {Container.Quality}"; quality.Text = $"{resources.GetString("/Downloads/quality")}: {Container.Quality}";
duration.Text = $"Duration: {Container.Duration}"; duration.Text = $"{resources.GetString("/Downloads/duration")}: {Container.Duration}";
channel.Text = $"Author: {Container.Channel}"; channel.Text = $"{resources.GetString("/Downloads/author")}: {Container.Channel}";
ext.Text = $"Extension: {Container.Extension}"; ext.Text = $"{resources.GetString("/Downloads/ext")}: {Container.Extension}";
progressPanel.Visibility = Visibility.Collapsed; progressPanel.Visibility = Visibility.Collapsed;
donePanel.Visibility = Visibility.Visible; donePanel.Visibility = Visibility.Visible;
@@ -93,11 +96,11 @@ namespace FoxTube.Controls
{ {
Children = Children =
{ {
new AdaptiveText() { Text = "Downloading a video" }, new AdaptiveText() { Text = resources.GetString("/Downloads/toastStartHeader") },
new AdaptiveProgressBar() new AdaptiveProgressBar()
{ {
Title = meta.Snippet.Title, Title = meta.Snippet.Title,
Status = "Downloading...", Status = resources.GetString("/Downloads/downloading/Text"),
Value = new BindableProgressBarValue("value") Value = new BindableProgressBarValue("value")
} }
} }
@@ -108,7 +111,7 @@ namespace FoxTube.Controls
{ {
Buttons = Buttons =
{ {
new ToastButton("Cancel", $"dcancel|{Container.Id}") new ToastButton(resources.GetString("/Downloads/cancel/Content"), $"dcancel|{Container.Id}")
{ {
ActivationType = ToastActivationType.Background ActivationType = ToastActivationType.Background
} }
@@ -131,10 +134,10 @@ namespace FoxTube.Controls
thumbnail.Source = new BitmapImage(new Uri(meta.Snippet.Thumbnails.Medium.Url)); thumbnail.Source = new BitmapImage(new Uri(meta.Snippet.Thumbnails.Medium.Url));
title.Text = meta.Snippet.Title; title.Text = meta.Snippet.Title;
ext.Text = $"Extension: {info.Container.GetFileExtension()}"; ext.Text = $"{resources.GetString("/Downloads/ext")}: {info.Container.GetFileExtension()}";
quality.Text = $"Quality: {q}"; quality.Text = $"{resources.GetString("/Downloads/quality")}: {q}";
duration.Text = $"Duration: {XmlConvert.ToTimeSpan(meta.ContentDetails.Duration)}"; duration.Text = $"{resources.GetString("/Downloads/duration")}: {XmlConvert.ToTimeSpan(meta.ContentDetails.Duration)}";
channel.Text = $"Author: {meta.Snippet.ChannelTitle}"; channel.Text = $"{resources.GetString("/Downloads/author")}: {meta.Snippet.ChannelTitle}";
path.Text = file.Name; path.Text = file.Name;
progressPanel.Visibility = Visibility.Visible; progressPanel.Visibility = Visibility.Visible;
@@ -170,13 +173,13 @@ namespace FoxTube.Controls
template.LoadXml($@"<toast activationType='background' launch='download|{file.Path}'> template.LoadXml($@"<toast activationType='background' launch='download|{file.Path}'>
<visual> <visual>
<binding template='ToastGeneric'> <binding template='ToastGeneric'>
<text>Download complete</text> <text>{resources.GetString("/Downloads/toastCompleteHeader")}</text>
<text>{Container.Title}</text> <text>{Container.Title}</text>
</binding> </binding>
</visual> </visual>
<actions> <actions>
<action content='Go to original' <action content='{resources.GetString("/Downloads/gotoOrign/Content")}'
activationType='foreground' activationType='foreground'
arguments='video|{Container.Id}'/> arguments='video|{Container.Id}'/>
</actions> </actions>
@@ -196,7 +199,7 @@ namespace FoxTube.Controls
public async void Cancel() public async void Cancel()
{ {
status.Text = "Cancelling..."; status.Text = resources.GetString("/Downloads/cancelling");
progressBar.IsIndeterminate = true; progressBar.IsIndeterminate = true;
cancel.IsEnabled = false; cancel.IsEnabled = false;
cts.Cancel(); cts.Cancel();
@@ -210,7 +213,7 @@ namespace FoxTube.Controls
template.LoadXml($@"<toast activationType='foreground' launch='download'> template.LoadXml($@"<toast activationType='foreground' launch='download'>
<visual> <visual>
<binding template='ToastGeneric'> <binding template='ToastGeneric'>
<text>Download canceled</text> <text>{resources.GetString("/Downloads/toastCanceledHeader")}</text>
<text>{Container.Title}</text> <text>{Container.Title}</text>
</binding> </binding>
</visual> </visual>
@@ -224,10 +227,10 @@ namespace FoxTube.Controls
{ {
if(InProgress) if(InProgress)
{ {
MessageDialog dialog = new MessageDialog("Are you sure?", "Cancelling download"); MessageDialog dialog = new MessageDialog(resources.GetString("/Downloads/prompt"), resources.GetString("/Downloads/cancellingHeader"));
dialog.Commands.Add(new UICommand("Yes", (command) => Cancel())); dialog.Commands.Add(new UICommand(resources.GetString("/Downloads/yes"), (command) => Cancel()));
dialog.Commands.Add(new UICommand("No")); dialog.Commands.Add(new UICommand(resources.GetString("/Downloads/no")));
dialog.DefaultCommandIndex = 1; dialog.DefaultCommandIndex = 1;
await dialog.ShowAsync(); await dialog.ShowAsync();
+20 -24
View File
@@ -1,10 +1,8 @@
using FoxTube.Classes; using System;
using System;
using System.Collections.Generic;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using System.Xml;
using Windows.Media; using Windows.Media;
using YoutubeExplode.Models.ClosedCaptions;
namespace FoxTube.Controls namespace FoxTube.Controls
{ {
@@ -13,11 +11,18 @@ namespace FoxTube.Controls
/// </summary> /// </summary>
public sealed partial class LiveCaptions : UserControl public sealed partial class LiveCaptions : UserControl
{ {
public double Size
{
get => text.FontSize;
set => text.FontSize = value;
}
public MediaTimelineController Player { get; set; } public MediaTimelineController Player { get; set; }
private bool isClosed = false; private bool isClosed = false;
DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(10) }; DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(10) };
List<Caption> captions = new List<Caption>(); ClosedCaption currentCaption = null;
Caption currentCaption = null;
ClosedCaptionTrack track = null;
public LiveCaptions() public LiveCaptions()
{ {
@@ -31,11 +36,11 @@ namespace FoxTube.Controls
bool found = false; bool found = false;
if(!isClosed) if(!isClosed)
captions.ForEach((x) => track.Captions.ForEach(i =>
{ {
if (Player.Position >= x.Start && Player.Position <= x.End) if (Player.Position >= i.Offset && Player.Position <= i.Offset + i.Duration)
{ {
currentCaption = x; currentCaption = i;
text.Text = currentCaption.Text; text.Text = currentCaption.Text;
Visibility = Visibility.Visible; Visibility = Visibility.Visible;
found = true; found = true;
@@ -49,24 +54,15 @@ namespace FoxTube.Controls
} }
} }
public void Initialize(string source, bool isAutoGenerated = false) public async void Initialize(ClosedCaptionTrackInfo info)
{ {
captions.Clear(); track = await new YoutubeExplode.YoutubeClient().GetClosedCaptionTrackAsync(info);
XmlDocument doc = new XmlDocument();
doc.Load(source);
if (!isAutoGenerated) track.Captions.ForEach(i =>
foreach (XmlElement i in doc["timedtext"]["body"].ChildNodes)
captions.Add(new Caption(int.Parse(i.GetAttribute("t")), int.Parse(i.GetAttribute("d")), i.InnerText));
else
foreach (XmlElement i in doc["transcript"].ChildNodes)
captions.Add(new Caption(double.Parse(i.GetAttribute("start")), double.Parse(i.GetAttribute("dur")), i.InnerText.Replace("<font color=\"#E5E5E5\">", "").Replace("<font color=\"#CCCCCC\">", "").Replace("</font>", "").Replace("&#39;", "'")));
captions.ForEach((x) =>
{ {
if (Player.Position > x.Start && Player.Position < x.End) if (Player.Position > i.Offset && Player.Position < i.Offset + i.Duration)
{ {
currentCaption = x; currentCaption = i;
text.Text = currentCaption.Text; text.Text = currentCaption.Text;
Visibility = Visibility.Visible; Visibility = Visibility.Visible;
} }
@@ -77,7 +73,7 @@ namespace FoxTube.Controls
public void Close() public void Close()
{ {
captions.Clear(); track = null;
currentCaption = null; currentCaption = null;
Visibility = Visibility.Collapsed; Visibility = Visibility.Collapsed;
timer.Stop(); timer.Stop();
+5 -5
View File
@@ -50,12 +50,12 @@
</Button> </Button>
<UserControl.ContextFlyout> <UserControl.ContextFlyout>
<MenuFlyout> <MenuFlyout>
<MenuFlyoutItem Icon="List" Text="View playlist" Click="Button_Click"/> <MenuFlyoutItem x:Uid="/Cards/playlist" Icon="List" Text="View playlist" Click="Button_Click"/>
<MenuFlyoutItem Icon="Contact" Text="View channel" Name="openChannel" Click="OpenChannel_Click"/> <MenuFlyoutItem x:Uid="/Cards/channel" Icon="Contact" Text="View channel" Name="openChannel" Click="OpenChannel_Click"/>
<MenuFlyoutSeparator/> <MenuFlyoutSeparator/>
<MenuFlyoutItem Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/> <MenuFlyoutItem x:Uid="/Cards/getLink" Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/>
<MenuFlyoutItem Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/> <MenuFlyoutItem x:Uid="/Cards/openWeb" Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/>
<MenuFlyoutItem Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/> <MenuFlyoutItem x:Uid="/Cards/share" Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/>
</MenuFlyout> </MenuFlyout>
</UserControl.ContextFlyout> </UserControl.ContextFlyout>
</Page> </Page>
+1 -1
View File
@@ -8,7 +8,7 @@
mc:Ignorable="d"> mc:Ignorable="d">
<Grid> <Grid>
<HyperlinkButton Foreground="Red" HorizontalAlignment="Center" Content="Show more" Name="btn" Click="btn_Click"/> <HyperlinkButton x:Uid="/Cards/more" Foreground="Red" HorizontalAlignment="Center" Content="Show more" Name="btn" Click="btn_Click"/>
<ProgressBar Name="bar" IsIndeterminate="True" Foreground="Red" Visibility="Collapsed"/> <ProgressBar Name="bar" IsIndeterminate="True" Foreground="Red" Visibility="Collapsed"/>
</Grid> </Grid>
</UserControl> </UserControl>
+8 -8
View File
@@ -20,7 +20,7 @@
<Image Name="thumbnail" Source="/Assets/videoThumbSample.png" Stretch="Fill"/> <Image Name="thumbnail" Source="/Assets/videoThumbSample.png" Stretch="Fill"/>
<Grid Background="#7F000000" Name="watched" Visibility="Collapsed"> <Grid Background="#7F000000" Name="watched" Visibility="Collapsed">
<StackPanel Margin="5" Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}" VerticalAlignment="Top" HorizontalAlignment="Left" Padding="5,2,5,2" BorderBrush="Gray" BorderThickness="1"> <StackPanel Margin="5" Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}" VerticalAlignment="Top" HorizontalAlignment="Left" Padding="5,2,5,2" BorderBrush="Gray" BorderThickness="1">
<TextBlock Text="Watched" Foreground="Gray" FontSize="12"/> <TextBlock x:Uid="/Cards/watched" Text="Watched" Foreground="Gray" FontSize="12"/>
</StackPanel> </StackPanel>
<ProgressBar VerticalAlignment="Bottom" Margin="54,0,0,0" Foreground="Red" Name="leftOn"/> <ProgressBar VerticalAlignment="Bottom" Margin="54,0,0,0" Foreground="Red" Name="leftOn"/>
</Grid> </Grid>
@@ -29,7 +29,7 @@
</StackPanel> </StackPanel>
<StackPanel Name="liveTag" Margin="0,0,5,30" Background="Red" BorderBrush="White" BorderThickness="1" VerticalAlignment="Bottom" HorizontalAlignment="Right" Padding="5,2,5,3" Orientation="Horizontal" Visibility="Collapsed"> <StackPanel Name="liveTag" Margin="0,0,5,30" Background="Red" BorderBrush="White" BorderThickness="1" VerticalAlignment="Bottom" HorizontalAlignment="Right" Padding="5,2,5,3" Orientation="Horizontal" Visibility="Collapsed">
<TextBlock Text="&#xEC44; " VerticalAlignment="Center" Foreground="White" FontSize="12" FontFamily="Segoe MDL2 Assets" FontWeight="Black"/> <TextBlock Text="&#xEC44; " VerticalAlignment="Center" Foreground="White" FontSize="12" FontFamily="Segoe MDL2 Assets" FontWeight="Black"/>
<TextBlock Name="liveContent" Text="LIVE" VerticalAlignment="Center" Foreground="White" FontSize="12" FontWeight="Bold"/> <TextBlock x:Uid="/Cards/live" Name="liveContent" Text="LIVE" VerticalAlignment="Center" Foreground="White" FontSize="12" FontWeight="Bold"/>
</StackPanel> </StackPanel>
<Grid Grid.Row="1"> <Grid Grid.Row="1">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@@ -53,17 +53,17 @@
</Button> </Button>
<UserControl.ContextFlyout> <UserControl.ContextFlyout>
<MenuFlyout> <MenuFlyout>
<MenuFlyoutItem Icon="Play" Text="Play" Name="play" Click="Button_Click"/> <MenuFlyoutItem x:Uid="/Cards/play" Icon="Play" Text="Play" Name="play" Click="Button_Click"/>
<MenuFlyoutItem Text="Play incognito" Visibility="Collapsed"> <MenuFlyoutItem x:Uid="/Cards/incognitoPlay" Text="Play incognito" Visibility="Collapsed">
<MenuFlyoutItem.Icon> <MenuFlyoutItem.Icon>
<FontIcon Glyph="&#xE727;"/> <FontIcon Glyph="&#xE727;"/>
</MenuFlyoutItem.Icon> </MenuFlyoutItem.Icon>
</MenuFlyoutItem> </MenuFlyoutItem>
<MenuFlyoutItem Icon="Contact" Text="View channel" Name="viewChannel" Click="ViewChannel_Click"/> <MenuFlyoutItem x:Uid="/Cards/channel" Icon="Contact" Text="View channel" Name="viewChannel" Click="ViewChannel_Click"/>
<MenuFlyoutSeparator/> <MenuFlyoutSeparator/>
<MenuFlyoutItem Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/> <MenuFlyoutItem x:Uid="/Cards/getLink" Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/>
<MenuFlyoutItem Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/> <MenuFlyoutItem x:Uid="/Cards/openWeb" Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/>
<MenuFlyoutItem Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/> <MenuFlyoutItem x:Uid="/Cards/share" Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/>
<MenuFlyoutSeparator Visibility="Collapsed"/> <MenuFlyoutSeparator Visibility="Collapsed"/>
<MenuFlyoutItem Icon="Download" Text="Download" Visibility="Collapsed"/> <MenuFlyoutItem Icon="Download" Text="Download" Visibility="Collapsed"/>
</MenuFlyout> </MenuFlyout>
+8 -22
View File
@@ -5,8 +5,8 @@ using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data; using Google.Apis.YouTube.v3.Data;
using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Media.Imaging;
using Windows.System; using Windows.System;
using Windows.UI.Popups;
using Windows.ApplicationModel.DataTransfer; using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Controls namespace FoxTube.Controls
{ {
@@ -15,11 +15,12 @@ namespace FoxTube.Controls
/// </summary> /// </summary>
public sealed partial class VideoCard : UserControl public sealed partial class VideoCard : UserControl
{ {
ResourceLoader resources = ResourceLoader.GetForCurrentView("Cards");
public string playlistId; public string playlistId;
public string videoId; public string videoId;
Video item; Video item;
bool embed = false;
public VideoCard(string id, string playlist = null) public VideoCard(string id, string playlist = null)
{ {
InitializeComponent(); InitializeComponent();
@@ -45,7 +46,7 @@ namespace FoxTube.Controls
channelName.Text = item.Snippet.ChannelTitle; channelName.Text = item.Snippet.ChannelTitle;
if (item.Snippet.LiveBroadcastContent == "live") if (item.Snippet.LiveBroadcastContent == "live")
{ {
views.Text = $"{item.LiveStreamingDetails.ConcurrentViewers:0,0} viewers"; views.Text = $"{item.LiveStreamingDetails.ConcurrentViewers:0,0} {resources.GetString("/Cards/viewers")}";
if (item.LiveStreamingDetails.ScheduledStartTime.HasValue && item.LiveStreamingDetails.ScheduledEndTime.HasValue) if (item.LiveStreamingDetails.ScheduledStartTime.HasValue && item.LiveStreamingDetails.ScheduledEndTime.HasValue)
info.Text = $"{item.LiveStreamingDetails.ScheduledEndTime - item.LiveStreamingDetails.ScheduledStartTime} | {Methods.GetAgo(item.LiveStreamingDetails.ActualStartTime.Value)}"; info.Text = $"{item.LiveStreamingDetails.ScheduledEndTime - item.LiveStreamingDetails.ScheduledStartTime} | {Methods.GetAgo(item.LiveStreamingDetails.ActualStartTime.Value)}";
else else
@@ -62,14 +63,13 @@ namespace FoxTube.Controls
liveTag.Visibility = Visibility.Visible; liveTag.Visibility = Visibility.Visible;
if (item.LiveStreamingDetails.ScheduledStartTime.HasValue && (item.LiveStreamingDetails.ScheduledStartTime - DateTime.Now).Value.TotalMilliseconds > 0) if (item.LiveStreamingDetails.ScheduledStartTime.HasValue && (item.LiveStreamingDetails.ScheduledStartTime - DateTime.Now).Value.TotalMilliseconds > 0)
liveContent.Text = $"Goes live in {item.LiveStreamingDetails.ScheduledStartTime}"; liveContent.Text = $"{resources.GetString("/Cards/goesLive")} {item.LiveStreamingDetails.ScheduledStartTime}";
else liveContent.Text = "Upcoming"; else liveContent.Text = resources.GetString("/Cards/upcoming");
} }
else else
{ {
views.Text = $"{item.Statistics.ViewCount:0,0} views"; views.Text = $"{item.Statistics.ViewCount:0,0} {resources.GetString("/Cards/views")}";
info.Text = $"{item.ContentDetails.Duration.GetDuration()} | {Methods.GetAgo(item.Snippet.PublishedAt.Value)}"; info.Text = $"{item.ContentDetails.Duration.GetDuration()} | {Methods.GetAgo(item.Snippet.PublishedAt.Value)}";
embed = false;
} }
var request1 = SecretsVault.Service.Channels.List("snippet"); var request1 = SecretsVault.Service.Channels.List("snippet");
@@ -90,22 +90,8 @@ namespace FoxTube.Controls
}*/ }*/
} }
public async void Button_Click(object sender, RoutedEventArgs e) public void Button_Click(object sender, RoutedEventArgs e)
{ {
if (embed)
{
MessageDialog dialog = new MessageDialog("Unfortunately, at this stage of application development we don't support live steams. This issue will be fixed in the next update. Sorry. Would you like us to open this stream in browser?", "Open in browser");
dialog.Commands.Add(new UICommand("Yes", async (command) =>
{
await Launcher.LaunchUriAsync(new Uri($"https://www.youtube.com/watch?v={videoId}"));
}));
dialog.Commands.Add(new UICommand("No"));
dialog.DefaultCommandIndex = 0;
dialog.CancelCommandIndex = 1;
await dialog.ShowAsync();
}
else
Methods.MainPage.GoToVideo(videoId, playlistId); Methods.MainPage.GoToVideo(videoId, playlistId);
} }
-10
View File
@@ -76,7 +76,6 @@
</StackPanel> </StackPanel>
<Grid Grid.Row="2" Height="50" Name="mainControls" Background="#7F000000"> <Grid Grid.Row="2" Height="50" Name="mainControls" Background="#7F000000">
<ProgressBar Name="bufferingBar" VerticalAlignment="Top" Margin="0,-4,0,0" IsIndeterminate="True" Visibility="Visible"/>
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/> <ColumnDefinition Width="auto"/>
@@ -180,14 +179,5 @@
<Button Name="signin" Click="signin_Click" Content="Sign in now" Foreground="White" Background="Gray" HorizontalAlignment="Right" Grid.Column="1" Margin="0,0,10,0"/> <Button Name="signin" Click="signin_Click" Content="Sign in now" Foreground="White" Background="Gray" HorizontalAlignment="Right" Grid.Column="1" Margin="0,0,10,0"/>
</Grid> </Grid>
</Grid> </Grid>
<Grid Background="#E5000000" Visibility="Collapsed">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Name="errorPlate">
<TextBlock Text="Something went wrong..." HorizontalAlignment="Center" FontSize="20"/>
<TextBlock Text="Video ID: " HorizontalAlignment="Center" IsTextSelectionEnabled="True" FontSize="20"/>
<TextBlock Text="Error type: " HorizontalAlignment="Center" IsTextSelectionEnabled="True" FontSize="20"/>
<TextBlock Text="Message: " HorizontalAlignment="Center" IsTextSelectionEnabled="True" FontSize="20"/>
</StackPanel>
</Grid>
</Grid> </Grid>
</UserControl> </UserControl>
+227 -242
View File
@@ -1,17 +1,14 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Timers;
using Windows.Foundation; using Windows.Foundation;
using Windows.UI.Core; using Windows.UI.Core;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Google.Apis.YouTube.v3.Data; using Google.Apis.YouTube.v3.Data;
using Windows.UI.Xaml.Media.Imaging; using Windows.UI.Xaml.Media.Imaging;
using System.Diagnostics;
using Windows.Media; using Windows.Media;
using Windows.Storage.Streams; using Windows.Storage.Streams;
using Windows.UI.ViewManagement; using Windows.UI.ViewManagement;
@@ -26,11 +23,6 @@ using System.Globalization;
using FoxTube.Controls; using FoxTube.Controls;
using Windows.System; using Windows.System;
using Windows.Media.Core; using Windows.Media.Core;
using Windows.Media.MediaProperties;
using Windows.Storage;
using Windows.Storage.FileProperties;
using Windows.Media.Editing;
using Windows.Media.Streaming.Adaptive;
using Windows.Media.Playback; using Windows.Media.Playback;
namespace FoxTube namespace FoxTube
@@ -40,41 +32,25 @@ namespace FoxTube
public sealed partial class VideoPlayer : UserControl public sealed partial class VideoPlayer : UserControl
{ {
public string videoId; public string videoId;
Video item; public Video item;
public string avatar;
private bool miniview = false; public PlayerLayout layout = PlayerLayout.Normal;
public bool MiniView
{
get { return miniview; }
set
{
miniview = value;
if (value)
captions?.Hide();
else
captions?.Show();
}
}
private bool fullScreen = false;
public bool pointerCaptured = false; public bool pointerCaptured = false;
Point cursorBackup;
public event ObjectEventHandler SetFullSize; public event ObjectEventHandler SetFullSize;
public event ObjectEventHandler NextClicked; public event Event NextClicked;
public Button Next => next; public Button Next => next;
CoreCursor cursorBackup = Window.Current.CoreWindow.PointerCursor; public TimeSpan Elapsed { get; set; } = TimeSpan.FromMilliseconds(0);
Point cursorPositionBackup; public TimeSpan Remaining => Total.Subtract(Elapsed);
public TimeSpan Total { get; set; }
public TimeSpan elapsed;
TimeSpan remaining;
TimeSpan total;
string avatar;
double timecodeBackup = 0; double timecodeBackup = 0;
bool needUpdateTimecode = false; bool needUpdateTimecode = false;
SystemMediaTransportControls systemControls; SystemMediaTransportControls systemControls;
LiveCaptions captions;
IReadOnlyList<ClosedCaptionTrackInfo> ccInfo; IReadOnlyList<ClosedCaptionTrackInfo> ccInfo;
MediaStreamInfoSet streamInfo; MediaStreamInfoSet streamInfo;
@@ -85,6 +61,8 @@ namespace FoxTube
}; };
DispatcherTimer ctrlsFadeTimer = null; DispatcherTimer ctrlsFadeTimer = null;
LiveCaptions captions;
MediaPlayer videoPlayer; MediaPlayer videoPlayer;
MediaPlayer audioPlayer; MediaPlayer audioPlayer;
MediaTimelineController controller; MediaTimelineController controller;
@@ -95,8 +73,6 @@ namespace FoxTube
} }
public void Initialize(Video meta, string channelAvatar) public void Initialize(Video meta, string channelAvatar)
{
try
{ {
Visibility = Visibility.Collapsed; Visibility = Visibility.Collapsed;
@@ -106,11 +82,11 @@ namespace FoxTube
if (item.ContentDetails.ContentRating != null) if (item.ContentDetails.ContentRating != null)
{ {
if(SecretsVault.IsAuthorized) if (SecretsVault.IsAuthorized)
{ {
if (SettingsStorage.Mature == MatureState.AllowedOnce) if (SettingsStorage.Mature == MatureState.AllowedOnce)
SettingsStorage.Mature = MatureState.Blocked; SettingsStorage.Mature = MatureState.Blocked;
else if(SettingsStorage.Mature == MatureState.Blocked) else if (SettingsStorage.Mature == MatureState.Blocked)
{ {
Visibility = Visibility.Visible; Visibility = Visibility.Visible;
proceedMature.Visibility = Visibility.Visible; proceedMature.Visibility = Visibility.Visible;
@@ -136,11 +112,6 @@ namespace FoxTube
Visibility = Visibility.Visible; Visibility = Visibility.Visible;
} }
catch (Exception e)
{
RaiseError(e);
}
}
public void InitializeContols() public void InitializeContols()
{ {
@@ -150,10 +121,24 @@ namespace FoxTube
videoPlayer.TimelineController = controller; videoPlayer.TimelineController = controller;
controller.PositionChanged += UpdateSeek; controller.PositionChanged += UpdateSeek;
videoSource.SetMediaPlayer(videoPlayer); videoSource.SetMediaPlayer(videoPlayer);
videoPlayer.MediaOpened += (s, e) => videoPlayer.MediaOpened += async (s, e) =>
{ {
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
if (controller.State == MediaTimelineControllerState.Running && needUpdateTimecode)
{
controller.Position = TimeSpan.FromSeconds(timecodeBackup);
needUpdateTimecode = false;
controller.Resume();
}
seek.IsEnabled = true;
play.IsEnabled = true;
touchPlay.IsEnabled = true;
if (SettingsStorage.Autoplay) if (SettingsStorage.Autoplay)
controller.Resume(); controller.Resume();
});
}; };
volume.Value = SettingsStorage.Volume; volume.Value = SettingsStorage.Volume;
@@ -190,7 +175,7 @@ namespace FoxTube
ctrlsFadeTimer = new DispatcherTimer(); ctrlsFadeTimer = new DispatcherTimer();
ctrlsFadeTimer.Interval = TimeSpan.FromSeconds(5); ctrlsFadeTimer.Interval = TimeSpan.FromSeconds(5);
ctrlsFadeTimer.Tick += Elapsed; ctrlsFadeTimer.Tick += ControlsFade;
} }
public void LoadUpcoming() public void LoadUpcoming()
@@ -238,16 +223,14 @@ namespace FoxTube
{ {
InitializeContols(); InitializeContols();
captions = grid.Children[2] as LiveCaptions; captions = grid.Children[2] as LiveCaptions;
captions.Player = controller;
total = XmlConvert.ToTimeSpan(item.ContentDetails.Duration); Total = XmlConvert.ToTimeSpan(item.ContentDetails.Duration);
seek.Maximum = total.TotalSeconds; seek.Maximum = Total.TotalMilliseconds;
seekIndicator.Maximum = total.TotalSeconds; seekIndicator.Maximum = Total.TotalMilliseconds;
elapsed = TimeSpan.FromSeconds(seek.Value); elapsedTime.Text = Elapsed.Hours > 0 ? $"{Elapsed:hh\\:mm\\:ss}" : $"{Elapsed:mm\\:ss}";
remaining = total.Subtract(elapsed); remainingTime.Text = Remaining.Hours > 0 ? $"{Remaining:hh\\:mm\\:ss}" : $"{Remaining:mm\\:ss}";
elapsedTime.Text = elapsed.Hours > 0 ? $"{elapsed:hh\\:mm\\:ss}" : $"{elapsed:mm\\:ss}";
remainingTime.Text = remaining.Hours > 0 ? $"{remaining:hh\\:mm\\:ss}" : $"{remaining:mm\\:ss}";
#region Retrieving info for CC and Media streams #region Retrieving info for CC and Media streams
//Loading streams //Loading streams
@@ -265,6 +248,8 @@ namespace FoxTube
//Loading captions //Loading captions
ccInfo = await new YoutubeClient().GetVideoClosedCaptionTrackInfosAsync(videoId); ccInfo = await new YoutubeClient().GetVideoClosedCaptionTrackInfosAsync(videoId);
if (ccInfo.Count > 0)
{
foreach (ClosedCaptionTrackInfo cc in ccInfo) foreach (ClosedCaptionTrackInfo cc in ccInfo)
{ {
subsLang.Items.Add(new ComboBoxItem() subsLang.Items.Add(new ComboBoxItem()
@@ -272,9 +257,19 @@ namespace FoxTube
Content = string.Format("{0}{1}", CultureInfo.GetCultureInfo(cc.Language.Code).DisplayName, cc.IsAutoGenerated ? " (Auto-generated)" : ""), Content = string.Format("{0}{1}", CultureInfo.GetCultureInfo(cc.Language.Code).DisplayName, cc.IsAutoGenerated ? " (Auto-generated)" : ""),
Tag = cc Tag = cc
}); });
if (SettingsStorage.RelevanceLanguage.Contains(cc.Language.Code))
subsLang.SelectedItem = subsLang.Items.Last();
} }
if (ccInfo.Count > 0)
if (subsLang.SelectedItem == null)
if(ccInfo.ToList().Exists(i => i.Language.Code == "en"))
subsLang.SelectedItem = subsLang.Items.Find(i => (((ComboBoxItem)i).Tag as ClosedCaptionTrackInfo).Language.Code == "en");
else
subsLang.SelectedIndex = 0; subsLang.SelectedIndex = 0;
}
else else
captionsBtn.Visibility = Visibility.Collapsed; captionsBtn.Visibility = Visibility.Collapsed;
#endregion #endregion
@@ -294,19 +289,11 @@ namespace FoxTube
{ {
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{ {
seek.Value = controller.Position.TotalSeconds; seek.Value = controller.Position.TotalMilliseconds;
seekIndicator.Value = seek.Value; seekIndicator.Value = seek.Value;
}); });
} }
public void RaiseError(Exception e)
{
((TextBlock)errorPlate.Children[1]).Text = $"Video ID: {videoId}";
((TextBlock)errorPlate.Children[2]).Text = $"Error type: {e.GetType()}";
((TextBlock)errorPlate.Children[3]).Text = $"Message: {e.Message}";
((Grid)errorPlate.Parent).Visibility = Visibility.Visible;
}
private async void SystemControls_Engaged(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args) private async void SystemControls_Engaged(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args)
{ {
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
@@ -322,29 +309,39 @@ namespace FoxTube
break; break;
case SystemMediaTransportControlsButton.Next: case SystemMediaTransportControlsButton.Next:
NextClicked.Invoke(this, null); NextClicked?.Invoke();
break; break;
} }
}); });
} }
void Elapsed(object sender, object e) void ControlsFade(object sender, object e)
{ {
controls.Visibility = Visibility.Collapsed; controls.Visibility = Visibility.Collapsed;
if (!MiniView) if (layout != PlayerLayout.Minimized)
touchCentral.Visibility = Visibility.Collapsed; touchCentral.Visibility = Visibility.Collapsed;
if (pointerCaptured) if (pointerCaptured)
Window.Current.CoreWindow.PointerCursor = null; Window.Current.CoreWindow.PointerCursor = null;
seekIndicator.Visibility = Visibility.Collapsed; seekIndicator.Visibility = Visibility.Collapsed;
ctrlsFadeTimer?.Stop(); ctrlsFadeTimer.Stop();
} }
public void UpdateSize() public void UpdateSize()
{ {
if(MiniView) if(layout == PlayerLayout.Minimized)
Height = Window.Current.Bounds.Height; Height = Window.Current.Bounds.Height;
} }
void ShowControls()
{
if (ctrlsFadeTimer == null)
return;
controls.Visibility = Visibility.Visible;
Window.Current.CoreWindow.PointerCursor = new CoreCursor(CoreCursorType.Arrow, 0);
ctrlsFadeTimer.Start();
}
private void volume_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) private void volume_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{ {
double v = volume.Value; double v = volume.Value;
@@ -377,58 +374,68 @@ namespace FoxTube
else volume.Value = SettingsStorage.Volume; else volume.Value = SettingsStorage.Volume;
} }
private void UserControl_PointerMoved(object sender, PointerRoutedEventArgs e)
{
if (ctrlsFadeTimer == null)
return;
else if (cursorBackup != Window.Current.CoreWindow.PointerPosition)
ShowControls();
cursorBackup = Window.Current.CoreWindow.PointerPosition;
}
private void UserControl_PointerExited(object sender, PointerRoutedEventArgs e)
{
if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse && ctrlsFadeTimer != null)
{
pointerCaptured = false;
ControlsFade(this, null);
}
}
private void UserControl_PointerEntered(object sender, PointerRoutedEventArgs e)
{
if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse && ctrlsFadeTimer != null)
pointerCaptured = true;
}
private void playPauseArea_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
switch (layout)
{
case PlayerLayout.Minimized:
if (ApplicationView.GetForCurrentView().ViewMode == ApplicationViewMode.CompactOverlay)
miniView_Click(this, null);
else if (ApplicationView.GetForCurrentView().ViewMode == ApplicationViewMode.Default)
maximize_Click(this, null);
break;
case PlayerLayout.Fullscreen:
case PlayerLayout.Normal:
fullscreen_Click(this, null);
break;
}
}
private void playPauseArea_Tapped(object sender, TappedRoutedEventArgs e)
{
if (e.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse && layout != PlayerLayout.Minimized)
play_Click(this, null);
UserControl_Tapped(sender, e);
}
private void UserControl_Tapped(object sender, TappedRoutedEventArgs e) private void UserControl_Tapped(object sender, TappedRoutedEventArgs e)
{ {
if (e.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch && ctrlsFadeTimer != null) if (e.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch && ctrlsFadeTimer != null)
{ {
touchCentral.Visibility = Visibility.Visible; touchCentral.Visibility = Visibility.Visible;
if (ctrlsFadeTimer.IsEnabled) if (ctrlsFadeTimer.IsEnabled)
Elapsed(this, null); ControlsFade(this, null);
else else
ShowControls(); ShowControls();
} }
} }
private void UserControl_PointerMoved(object sender, PointerRoutedEventArgs e)
{
if (ctrlsFadeTimer == null)
return;
if (cursorPositionBackup == null)
cursorPositionBackup = Window.Current.CoreWindow.PointerPosition;
else if (cursorPositionBackup == Window.Current.CoreWindow.PointerPosition)
return;
ShowControls();
}
private void UserControl_PointerExited(object sender, PointerRoutedEventArgs e)
{
if (ctrlsFadeTimer.IsEnabled && e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse)
{
pointerCaptured = false;
Elapsed(this, null);
}
}
private void UserControl_PointerEntered(object sender, PointerRoutedEventArgs e)
{
if (e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse)
pointerCaptured = true;
}
void ShowControls()
{
if (ctrlsFadeTimer == null)
return;
controls.Visibility = Visibility.Visible;
if (MiniView)
seekIndicator.Visibility = Visibility.Visible;
Window.Current.CoreWindow.PointerCursor = new CoreCursor(CoreCursorType.Arrow, 0);
ctrlsFadeTimer?.Stop();
ctrlsFadeTimer?.Start();
}
private void quality_SelectionChanged(object sender, SelectionChangedEventArgs e) private void quality_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ {
try try
@@ -436,16 +443,18 @@ namespace FoxTube
SettingsStorage.RememberedQuality = ((ComboBoxItem)quality.SelectedItem).Content.ToString(); SettingsStorage.RememberedQuality = ((ComboBoxItem)quality.SelectedItem).Content.ToString();
controller.Pause(); controller.Pause();
timecodeBackup = controller.Position.TotalSeconds;
if(streamInfo.Muxed.ToList().Exists(x => x.VideoQualityLabel == (quality.SelectedItem as ComboBoxItem).Content.ToString())) timecodeBackup = controller.Position.TotalSeconds;
needUpdateTimecode = true;
if (streamInfo.Muxed.ToList().Exists(x => x.VideoQualityLabel == (quality.SelectedItem as ComboBoxItem).Content.ToString()))
{ {
videoPlayer.Source = MediaSource.CreateFromUri(streamInfo.Muxed.Find(x => x.VideoQualityLabel == (quality.SelectedItem as ComboBoxItem).Content as string).Url.ToUri()); videoPlayer.Source = MediaSource.CreateFromUri(streamInfo.Muxed.Find(x => x.VideoQualityLabel == (quality.SelectedItem as ComboBoxItem).Content as string).Url.ToUri());
audioPlayer = null; audioPlayer = null;
} }
else else
{ {
if(audioPlayer == null) if (audioPlayer == null)
{ {
audioPlayer = new MediaPlayer(); audioPlayer = new MediaPlayer();
audioPlayer.TimelineController = controller; audioPlayer.TimelineController = controller;
@@ -460,13 +469,9 @@ namespace FoxTube
audioPlayer.Source = MediaSource.CreateFromUri(audioInfo.Url.ToUri()); audioPlayer.Source = MediaSource.CreateFromUri(audioInfo.Url.ToUri());
} }
needUpdateTimecode = true;
controller.Resume(); controller.Resume();
} }
catch catch { }
{
}
} }
private void subsSwitch_Toggled(object sender, RoutedEventArgs e) private void subsSwitch_Toggled(object sender, RoutedEventArgs e)
@@ -482,19 +487,14 @@ namespace FoxTube
void LoadTrack() void LoadTrack()
{ {
if (subsSwitch.IsOn) if (subsSwitch.IsOn)
{ captions.Initialize((subsLang.SelectedItem as ComboBoxItem).Tag as ClosedCaptionTrackInfo);
if (ccInfo[subsLang.SelectedIndex].IsAutoGenerated)
captions.Initialize(ccInfo[subsLang.SelectedIndex].Url.Replace("format=3", "format=0"), true);
else
captions.Initialize(ccInfo[subsLang.SelectedIndex].Url);
}
else else
captions?.Close(); captions?.Close();
} }
private void fullscreen_Click(object sender, RoutedEventArgs e) private void fullscreen_Click(object sender, RoutedEventArgs e)
{ {
fullScreen = !fullScreen; bool fullScreen = layout == PlayerLayout.Fullscreen ? false : true;
SetFullSize.Invoke(this, fullScreen); SetFullSize.Invoke(this, fullScreen);
Methods.MainPage.Fullscreen(fullScreen); Methods.MainPage.Fullscreen(fullScreen);
@@ -503,12 +503,14 @@ namespace FoxTube
ApplicationView.GetForCurrentView().TryEnterFullScreenMode(); ApplicationView.GetForCurrentView().TryEnterFullScreenMode();
fullscreen.Content = "\xE1D8"; fullscreen.Content = "\xE1D8";
Height = Methods.MainPage.Height; Height = Methods.MainPage.Height;
layout = PlayerLayout.Fullscreen;
} }
else else
{ {
ApplicationView.GetForCurrentView().ExitFullScreenMode(); ApplicationView.GetForCurrentView().ExitFullScreenMode();
fullscreen.Content = "\xE1D9"; fullscreen.Content = "\xE1D9";
Height = double.NaN; Height = double.NaN;
layout = PlayerLayout.Normal;
} }
} }
@@ -524,21 +526,9 @@ namespace FoxTube
{ {
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{ {
if (controller.State == MediaTimelineControllerState.Running && needUpdateTimecode) switch (sender.State)
{
controller.Position = TimeSpan.FromSeconds(timecodeBackup);
needUpdateTimecode = false;
}
switch (controller.State)
{ {
case MediaTimelineControllerState.Paused: case MediaTimelineControllerState.Paused:
bufferingBar.Visibility = Visibility.Collapsed;
seek.IsEnabled = true;
play.IsEnabled = true;
touchPlay.IsEnabled = true;
play.Content = "\xE102"; play.Content = "\xE102";
touchPlay.Content = "\xE102"; touchPlay.Content = "\xE102";
@@ -546,12 +536,6 @@ namespace FoxTube
break; break;
case MediaTimelineControllerState.Running: case MediaTimelineControllerState.Running:
bufferingBar.Visibility = Visibility.Collapsed;
seek.IsEnabled = true;
play.IsEnabled = true;
touchPlay.IsEnabled = true;
play.Content = "\xE103"; play.Content = "\xE103";
touchPlay.Content = "\xE103"; touchPlay.Content = "\xE103";
@@ -559,7 +543,6 @@ namespace FoxTube
break; break;
default: default:
bufferingBar.Visibility = Visibility.Collapsed;
systemControls.PlaybackStatus = MediaPlaybackStatus.Closed; systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
break; break;
} }
@@ -571,16 +554,13 @@ namespace FoxTube
private async void miniView_Click(object sender, RoutedEventArgs e) private async void miniView_Click(object sender, RoutedEventArgs e)
{ {
ApplicationViewTitleBar titleBar = ApplicationView.GetForCurrentView().TitleBar; ApplicationViewTitleBar titleBar = ApplicationView.GetForCurrentView().TitleBar;
MiniView = !MiniView; bool MiniView = layout == PlayerLayout.Minimized ? false : true;
SetFullSize(this, MiniView); SetFullSize(this, MiniView);
if (MiniView) if (MiniView)
{ {
if (fullScreen) if (layout == PlayerLayout.Fullscreen)
{
fullscreen.Content = "\xE740"; fullscreen.Content = "\xE740";
fullScreen = false;
}
await ApplicationView.GetForCurrentView().TryEnterViewModeAsync(ApplicationViewMode.CompactOverlay); await ApplicationView.GetForCurrentView().TryEnterViewModeAsync(ApplicationViewMode.CompactOverlay);
pointerCaptured = false; pointerCaptured = false;
@@ -599,6 +579,11 @@ namespace FoxTube
touchBack10.FontSize = touchFwd30.FontSize = 20; touchBack10.FontSize = touchFwd30.FontSize = 20;
touchPlay.FontSize = 50; touchPlay.FontSize = 50;
Methods.MainPage.Fullscreen(true); Methods.MainPage.Fullscreen(true);
layout = PlayerLayout.Minimized;
if(captions != null)
captions.Size = 15;
} }
else else
{ {
@@ -615,38 +600,98 @@ namespace FoxTube
Methods.MainPage.Fullscreen(false); Methods.MainPage.Fullscreen(false);
Height = double.NaN; Height = double.NaN;
layout = PlayerLayout.Normal;
if(captions != null)
captions.Size = 24;
} }
} }
public void minimize_Click(object sender, RoutedEventArgs e)
{
if (layout == PlayerLayout.Fullscreen)
{
ApplicationView.GetForCurrentView().ExitFullScreenMode();
fullscreen.Content = "\xE740";
layout = PlayerLayout.Normal;
Methods.MainPage.Fullscreen(false);
}
else
SetFullSize?.Invoke(this, true);
Width = 432;
Height = 243;
layout = PlayerLayout.Minimized;
Methods.MainPage.MinimizeVideo();
mainControls.Visibility = Visibility.Collapsed;
header.Visibility = Visibility.Collapsed;
touchCentral.Visibility = Visibility.Visible;
maximize.Visibility = Visibility.Visible;
close.Visibility = Visibility.Visible;
touchBack10.FontSize = touchFwd30.FontSize = 20;
touchPlay.FontSize = 50;
if (captions != null)
captions.Size = 15;
}
private void maximize_Click(object sender, RoutedEventArgs e)
{
SetFullSize?.Invoke(this, false);
Width = double.NaN;
Height = double.NaN;
layout = PlayerLayout.Normal;
Methods.MainPage.MaximizeVideo();
mainControls.Visibility = Visibility.Visible;
header.Visibility = Visibility.Visible;
touchCentral.Visibility = Visibility.Collapsed;
maximize.Visibility = Visibility.Collapsed;
close.Visibility = Visibility.Collapsed;
touchBack10.FontSize = touchFwd30.FontSize = 40;
touchPlay.FontSize = 100;
if (captions != null)
captions.Size = 24;
}
private void seek_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) private void seek_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{ {
elapsed = TimeSpan.FromSeconds(seek.Value); Elapsed = TimeSpan.FromMilliseconds(seek.Value);
remaining = total.Subtract(elapsed);
elapsedTime.Text = elapsed.Hours > 0 ? $"{elapsed:hh\\:mm\\:ss}" : $"{elapsed:mm\\:ss}"; elapsedTime.Text = Elapsed.Hours > 0 ? $"{Elapsed:hh\\:mm\\:ss}" : $"{Elapsed:mm\\:ss}";
remainingTime.Text = remaining.Hours > 0 ? $"{remaining:hh\\:mm\\:ss}" : $"{remaining:mm\\:ss}"; remainingTime.Text = Remaining.Hours > 0 ? $"{Remaining:hh\\:mm\\:ss}" : $"{Remaining:mm\\:ss}";
} }
private void seek_PointerCaptureLost(object sender, PointerRoutedEventArgs e) private void seek_PointerCaptureLost(object sender, PointerRoutedEventArgs e)
{ {
controller.Position = elapsed; controller.Position = Elapsed;
} }
private void fwd30_Click(object sender, RoutedEventArgs e) private void fwd30_Click(object sender, RoutedEventArgs e)
{ {
if(remaining.TotalSeconds >= 30) if(Remaining.TotalSeconds >= 30)
controller.Position = elapsed.Add(TimeSpan.FromSeconds(30)); controller.Position = Elapsed.Add(TimeSpan.FromSeconds(30));
} }
private void back10_Click(object sender, RoutedEventArgs e) private void back10_Click(object sender, RoutedEventArgs e)
{ {
if (elapsed.TotalSeconds >= 10) if (Elapsed.TotalSeconds >= 10)
controller.Position = elapsed.Subtract(TimeSpan.FromSeconds(10)); controller.Position = Elapsed.Subtract(TimeSpan.FromSeconds(10));
} }
private void next_Click(object sender, RoutedEventArgs e) private void next_Click(object sender, RoutedEventArgs e)
{ {
NextClicked.Invoke(this, null); NextClicked?.Invoke();
} }
private void matureDismiss_Click(object sender, RoutedEventArgs e) private void matureDismiss_Click(object sender, RoutedEventArgs e)
@@ -668,114 +713,49 @@ namespace FoxTube
controller.Pause(); controller.Pause();
} }
public void minimize_Click(object sender, RoutedEventArgs e) public void close_Click(object sender, RoutedEventArgs e)
{
if(fullScreen)
{
ApplicationView.GetForCurrentView().ExitFullScreenMode();
fullscreen.Content = "\xE740";
fullScreen = false;
Methods.MainPage.Fullscreen(false);
}
else
SetFullSize.Invoke(this, true);
Width = 432;
Height = 243;
MiniView = true;
Methods.MainPage.MinimizeVideo();
mainControls.Visibility = Visibility.Collapsed;
header.Visibility = Visibility.Collapsed;
touchCentral.Visibility = Visibility.Visible;
maximize.Visibility = Visibility.Visible;
close.Visibility = Visibility.Visible;
touchBack10.FontSize = touchFwd30.FontSize = 20;
touchPlay.FontSize = 50;
}
private void close_Click(object sender, RoutedEventArgs e)
{ {
systemControls.IsEnabled = false; systemControls.IsEnabled = false;
pointerCaptured = false; pointerCaptured = false;
Elapsed(this, null);
controller.Pause(); controller.Pause();
videoPlayer.Dispose(); videoPlayer.Dispose();
audioPlayer?.Dispose(); audioPlayer?.Dispose();
ctrlsFadeTimer.Stop();
timer?.Stop();
Methods.MainPage.CloseVideo(); Methods.MainPage.CloseVideo();
} }
private void maximize_Click(object sender, RoutedEventArgs e)
{
SetFullSize.Invoke(this, false);
Width = double.NaN;
Height = double.NaN;
MiniView = false;
Methods.MainPage.MaximizeVideo();
mainControls.Visibility = Visibility.Visible;
header.Visibility = Visibility.Visible;
touchCentral.Visibility = Visibility.Collapsed;
maximize.Visibility = Visibility.Collapsed;
close.Visibility = Visibility.Collapsed;
touchBack10.FontSize = touchFwd30.FontSize = 40;
touchPlay.FontSize = 100;
}
private void cast_Click(object sender, RoutedEventArgs e) private void cast_Click(object sender, RoutedEventArgs e)
{ {
if(videoPlayer.Source != null) if (videoPlayer.Source == null)
{ return;
if (controller.State != MediaTimelineControllerState.Paused)
controller.Pause(); controller.Pause();
CastingDevicePicker picker = new CastingDevicePicker(); CastingDevicePicker picker = new CastingDevicePicker();
picker.Filter.SupportsVideo = true; picker.Filter.SupportsVideo = true;
picker.CastingDeviceSelected += Picker_CastingDeviceSelected; picker.CastingDeviceSelected += async (s, args) =>
{
CastingConnection connection = args.SelectedCastingDevice.CreateCastingConnection();
await connection.RequestStartCastingAsync(videoPlayer.GetAsCastingSource());
};
Point positinon = cast.TransformToVisual(Window.Current.Content).TransformPoint(new Point(0, 0)); Point positinon = cast.TransformToVisual(Window.Current.Content).TransformPoint(new Point(0, 0));
picker.Show(new Rect(positinon.X, positinon.Y, cast.ActualWidth, cast.ActualHeight), Windows.UI.Popups.Placement.Below); picker.Show(new Rect(positinon.X, positinon.Y, cast.ActualWidth, cast.ActualHeight), Windows.UI.Popups.Placement.Below);
} }
}
private async void Picker_CastingDeviceSelected(CastingDevicePicker sender, CastingDeviceSelectedEventArgs args)
{
CastingConnection connection = args.SelectedCastingDevice.CreateCastingConnection();
await connection.RequestStartCastingAsync(videoPlayer.GetAsCastingSource());
}
private void playPauseArea_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
if (MiniView && ApplicationView.GetForCurrentView().ViewMode == ApplicationViewMode.CompactOverlay)
miniView_Click(this, null);
else if (MiniView && ApplicationView.GetForCurrentView().ViewMode == ApplicationViewMode.Default)
maximize_Click(this, null);
else if (fullScreen)
fullscreen_Click(this, null);
else if (!MiniView && !fullScreen)
fullscreen_Click(this, null);
}
private void playPauseArea_Tapped(object sender, TappedRoutedEventArgs e)
{
if (e.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse && !MiniView)
play_Click(this, null);
}
public void KeyUpPressed(object sender, KeyRoutedEventArgs e) public void KeyUpPressed(object sender, KeyRoutedEventArgs e)
{ {
switch(e.Key) switch(e.Key)
{ {
case VirtualKey.Escape: case VirtualKey.Escape:
if (layout == PlayerLayout.Fullscreen)
fullscreen_Click(this, null);
break;
case VirtualKey.F11: case VirtualKey.F11:
if (fullScreen)
fullscreen_Click(this, null); fullscreen_Click(this, null);
break; break;
case VirtualKey.Space: case VirtualKey.Space:
@@ -797,12 +777,17 @@ namespace FoxTube
private void videoSource_BufferingProgressChanged(object sender, RoutedEventArgs e) private void videoSource_BufferingProgressChanged(object sender, RoutedEventArgs e)
{ {
bufferingLevel.Value = videoPlayer.PlaybackSession.BufferingProgress * 100; bufferingLevel.Value = videoPlayer.PlaybackSession.DownloadProgress * 100;
} }
private void GotoLive_Click(object sender, RoutedEventArgs e) private void GotoLive_Click(object sender, RoutedEventArgs e) //TODO: Refactor
{ {
controller.Position = controller.Duration.Value.Subtract(TimeSpan.FromMilliseconds(100)); try
{
MediaTimeRange range = videoPlayer.PlaybackSession.GetSeekableRanges().Last();
controller.Position = range.End.Subtract(TimeSpan.FromMilliseconds(100));
}
catch { }
} }
} }
} }
+19 -2
View File
@@ -103,7 +103,6 @@
<Compile Include="App.xaml.cs"> <Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon> <DependentUpon>App.xaml</DependentUpon>
</Compile> </Compile>
<Compile Include="Classes\Caption.cs" />
<Compile Include="Classes\DownloadItemContainer.cs" /> <Compile Include="Classes\DownloadItemContainer.cs" />
<Compile Include="Classes\InboxItem.cs" /> <Compile Include="Classes\InboxItem.cs" />
<Compile Include="Classes\Methods.cs" /> <Compile Include="Classes\Methods.cs" />
@@ -427,6 +426,25 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="FoxTube_TemporaryKey.pfx" /> <None Include="FoxTube_TemporaryKey.pfx" />
<PRIResource Include="Strings\ru-RU\VideoPage.resw" />
<PRIResource Include="Strings\en-US\VideoPage.resw" />
<PRIResource Include="Strings\ru-RU\Channel.resw" />
<PRIResource Include="Strings\en-US\Channel.resw" />
<PRIResource Include="Strings\ru-RU\Chat.resw" />
<PRIResource Include="Strings\en-US\Chat.resw" />
<PRIResource Include="Strings\ru-RU\Cards.resw" />
<PRIResource Include="Strings\en-US\Cards.resw" />
<PRIResource Include="Strings\ru-RU\Methods.resw" />
<PRIResource Include="Strings\en-US\Methods.resw" />
<PRIResource Include="Strings\ru-RU\Search.resw" />
<PRIResource Include="Strings\en-US\Search.resw" />
<PRIResource Include="Strings\ru-RU\Playlist.resw" />
<PRIResource Include="Strings\en-US\Playlist.resw" />
<PRIResource Include="Strings\ru-RU\Downloads.resw" />
<PRIResource Include="Strings\ru-RU\CommentsPage.resw" />
<PRIResource Include="Strings\en-US\Downloads.resw" />
<PRIResource Include="Strings\ru-RU\Home.resw" />
<PRIResource Include="Strings\en-US\Home.resw" />
<PRIResource Include="Strings\en-US\CommentsPage.resw" /> <PRIResource Include="Strings\en-US\CommentsPage.resw" />
<PRIResource Include="Strings\ru-RU\LoadingPage.resw" /> <PRIResource Include="Strings\ru-RU\LoadingPage.resw" />
<PRIResource Include="Strings\en-US\LoadingPage.resw" /> <PRIResource Include="Strings\en-US\LoadingPage.resw" />
@@ -434,7 +452,6 @@
<PRIResource Include="Strings\ru-RU\General.resw" /> <PRIResource Include="Strings\ru-RU\General.resw" />
<PRIResource Include="Strings\ru-RU\About.resw" /> <PRIResource Include="Strings\ru-RU\About.resw" />
<PRIResource Include="Strings\ru-RU\Settings.resw" /> <PRIResource Include="Strings\ru-RU\Settings.resw" />
<PRIResource Include="Strings\en-US\Translate.resw" />
<PRIResource Include="Strings\en-US\Inbox.resw" /> <PRIResource Include="Strings\en-US\Inbox.resw" />
<PRIResource Include="Strings\en-US\About.resw" /> <PRIResource Include="Strings\en-US\About.resw" />
<PRIResource Include="Strings\en-US\General.resw" /> <PRIResource Include="Strings\en-US\General.resw" />
+15 -15
View File
@@ -17,7 +17,7 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Pivot SelectedIndex="0" Name="content" IsHeaderItemsCarouselEnabled="False" SelectionChanged="content_SelectionChanged"> <Pivot SelectedIndex="0" Name="content" IsHeaderItemsCarouselEnabled="False" SelectionChanged="content_SelectionChanged">
<PivotItem Header="Videos"> <PivotItem x:Uid="/Channel/videos" Header="Videos">
<ScrollViewer> <ScrollViewer>
<StackPanel Name="videos"> <StackPanel Name="videos">
<Image Name="channelCover" Stretch="Uniform" Source="/Assets/ChannelCoverTemplate.png"/> <Image Name="channelCover" Stretch="Uniform" Source="/Assets/ChannelCoverTemplate.png"/>
@@ -35,11 +35,11 @@
<TextBlock Name="videosCount" Foreground="Gray" Text="563,000 videos"/> <TextBlock Name="videosCount" Foreground="Gray" Text="563,000 videos"/>
</StackPanel> </StackPanel>
<TextBlock Grid.Column="2" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Height="50" Margin="10" TextAlignment="Center" Padding="0,16,0,0" Foreground="Gray"> <TextBlock Grid.Column="2" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Height="50" Margin="10" TextAlignment="Center" Padding="0,16,0,0" Foreground="Gray">
<Hyperlink Click="Hyperlink_Click">Log in</Hyperlink> to manage your subscriptions <Hyperlink Click="Hyperlink_Click"><Run x:Uid="/Cards/login">Log in</Run></Hyperlink> <Run x:Uid="/Cards/tomanage">to manage your subscriptions</Run>
</TextBlock> </TextBlock>
<Grid Visibility="Collapsed" Grid.Column="2" VerticalAlignment="Bottom" Margin="10" Name="subscriptionPane" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid Visibility="Collapsed" Grid.Column="2" VerticalAlignment="Bottom" Margin="10" Name="subscriptionPane" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Button Click="subscribe_Click" Name="subscribe" Width="250" Height="50" Background="Red" Foreground="White" FontSize="18" FontWeight="SemiBold" Content="Subscirbe"/> <Button x:Uid="/Cards/subscribe" Click="subscribe_Click" Name="subscribe" Width="250" Height="50" Background="Red" Foreground="White" FontSize="18" FontWeight="SemiBold" Content="Subscirbe"/>
</Grid> </Grid>
</Grid> </Grid>
<pages:VideoGrid/> <pages:VideoGrid/>
@@ -47,11 +47,11 @@
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</PivotItem> </PivotItem>
<PivotItem Header="Playlists"> <PivotItem x:Uid="/Channel/playlists" Header="Playlists">
<ScrollViewer> <ScrollViewer>
<Grid Name="playlists"> <Grid Name="playlists">
<StackPanel Margin="10" Visibility="Visible"> <StackPanel Margin="10" Visibility="Visible">
<TextBlock FontSize="28" Text="Playlists"/> <TextBlock x:Uid="/Channel/playlistTitle" FontSize="28" Text="Playlists"/>
<pages:VideoGrid/> <pages:VideoGrid/>
<controls:ShowMore Clicked="showMorePlaylists_Click"/> <controls:ShowMore Clicked="showMorePlaylists_Click"/>
</StackPanel> </StackPanel>
@@ -59,10 +59,10 @@
</Grid> </Grid>
</ScrollViewer> </ScrollViewer>
</PivotItem> </PivotItem>
<PivotItem Header="About channel"> <PivotItem x:Uid="/Channel/about" Header="About channel">
<ScrollViewer> <ScrollViewer>
<StackPanel Margin="10"> <StackPanel Margin="10">
<TextBlock FontSize="28" Text="About this channel"/> <TextBlock x:Uid="/Channel/aboutTitle" FontSize="28" Text="About this channel"/>
<Grid> <Grid>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition/> <ColumnDefinition/>
@@ -70,7 +70,7 @@
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<StackPanel> <StackPanel>
<TextBlock FontSize="24" Text="Description"/> <TextBlock x:Uid="/Channel/desc" FontSize="24" Text="Description"/>
<TextBlock Name="description" Margin="0,10,0,0" TextWrapping="WrapWholeWords" IsTextSelectionEnabled="True"/> <TextBlock Name="description" Margin="0,10,0,0" TextWrapping="WrapWholeWords" IsTextSelectionEnabled="True"/>
</StackPanel> </StackPanel>
@@ -85,12 +85,12 @@
<RowDefinition Height="auto"/> <RowDefinition Height="auto"/>
<RowDefinition Height="auto"/> <RowDefinition Height="auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<TextBlock FontSize="24" Text="Statistics"/> <TextBlock x:Uid="/Channel/stats" FontSize="24" Text="Statistics"/>
<TextBlock Text="Registration date:" Grid.Row="1"/> <TextBlock x:Uid="/Channel/regDate" Text="Registration date:" Grid.Row="1"/>
<TextBlock Grid.Row="1" Grid.Column="2" Name="registration" Text="13-May-18" HorizontalAlignment="Right"/> <TextBlock Grid.Row="1" Grid.Column="2" Name="registration" Text="13-May-18" HorizontalAlignment="Right"/>
<TextBlock Grid.Row="2" Text="Views"/> <TextBlock x:Uid="/Channel/views" Grid.Row="2" Text="Views"/>
<TextBlock Grid.Row="2" Grid.Column="2" Name="views" Text="1885510485" HorizontalAlignment="Right"/> <TextBlock Grid.Row="2" Grid.Column="2" Name="views" Text="1885510485" HorizontalAlignment="Right"/>
</Grid> </Grid>
</Grid> </Grid>
@@ -99,14 +99,14 @@
</PivotItem> </PivotItem>
<Pivot.RightHeader> <Pivot.RightHeader>
<AutoSuggestBox VerticalAlignment="Center" Width="250" Margin="8" PlaceholderText="Search on channel" QueryIcon="Find" Name="search" QuerySubmitted="AutoSuggestBox_QuerySubmitted"/> <AutoSuggestBox x:Uid="/Channel/search" VerticalAlignment="Center" Width="250" Margin="8" PlaceholderText="Search on channel" QueryIcon="Find" Name="search" QuerySubmitted="AutoSuggestBox_QuerySubmitted"/>
</Pivot.RightHeader> </Pivot.RightHeader>
</Pivot> </Pivot>
<CommandBar Grid.Row="1" VerticalAlignment="Bottom" Name="commandBar"> <CommandBar Grid.Row="1" VerticalAlignment="Bottom" Name="commandBar">
<AppBarButton Icon="Globe" Label="Open in browser" Name="inBrowser" Click="inBrowser_Click"/> <AppBarButton x:Uid="/Channel/openWeb" Icon="Globe" Label="Open in browser" Name="inBrowser" Click="inBrowser_Click"/>
<AppBarButton Icon="Refresh" Label="Refresh" Name="refresh" Click="refresh_Click"/> <AppBarButton x:Uid="/Channel/refresh" Icon="Refresh" Label="Refresh" Name="refresh" Click="refresh_Click"/>
<AppBarButton Icon="Share" Label="Share" Name="share" Click="share_Click"/> <AppBarButton x:Uid="/Channel/share" Icon="Share" Label="Share" Name="share" Click="share_Click"/>
</CommandBar> </CommandBar>
<local:LoadingPage Grid.RowSpan="2" Visibility="Collapsed"/> <local:LoadingPage Grid.RowSpan="2" Visibility="Collapsed"/>
+9 -6
View File
@@ -12,6 +12,7 @@ using FoxTube.Controls;
using Windows.ApplicationModel.DataTransfer; using Windows.ApplicationModel.DataTransfer;
using Windows.System; using Windows.System;
using Windows.UI; using Windows.UI;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Pages namespace FoxTube.Pages
{ {
@@ -20,6 +21,8 @@ namespace FoxTube.Pages
/// </summary> /// </summary>
public sealed partial class ChannelPage : Page public sealed partial class ChannelPage : Page
{ {
ResourceLoader resources = ResourceLoader.GetForCurrentView("Cards");
public string channelId; public string channelId;
public Channel item; public Channel item;
@@ -78,8 +81,8 @@ namespace FoxTube.Pages
item = (await request.ExecuteAsync()).Items[0]; item = (await request.ExecuteAsync()).Items[0];
title.Text = item.Snippet.Title; title.Text = item.Snippet.Title;
subscribers.Text = $"{item.Statistics.SubscriberCount:0,0} subscribers"; subscribers.Text = $"{item.Statistics.SubscriberCount:0,0} {resources.GetString("/Cards/subscribers")}";
videosCount.Text = $"{item.Statistics.VideoCount:0,0} videos"; videosCount.Text = $"{item.Statistics.VideoCount:0,0} {resources.GetString("/Cards/videos")}";
try try
{ {
@@ -121,7 +124,7 @@ namespace FoxTube.Pages
{ {
subscribe.Background = new SolidColorBrush(Colors.Transparent); subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray); subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed"; subscribe.Content = resources.GetString("/Cards/unsubscribe");
} }
subscriptionPane.Visibility = Visibility.Visible; subscriptionPane.Visibility = Visibility.Visible;
} }
@@ -228,13 +231,13 @@ namespace FoxTube.Pages
{ {
subscribe.Background = new SolidColorBrush(Colors.Transparent); subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray); subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed"; subscribe.Content = resources.GetString("/Cards/unsubscribe");
} }
else else
{ {
subscribe.Background = new SolidColorBrush(Colors.Red); subscribe.Background = new SolidColorBrush(Colors.Red);
subscribe.Foreground = new SolidColorBrush(Colors.White); subscribe.Foreground = new SolidColorBrush(Colors.White);
subscribe.Content = "Subscribe"; subscribe.Content = resources.GetString("/Cards/subscribe/Content");
} }
} }
@@ -286,7 +289,7 @@ namespace FoxTube.Pages
item.Snippet.Thumbnails.Medium.Url, item.Snippet.Thumbnails.Medium.Url,
item.Snippet.Title, item.Snippet.Title,
string.IsNullOrWhiteSpace(item.Snippet.CustomUrl) ? $"https://www.youtube.com/channel/{item.Id}" : $"https://www.youtube.com/user/{item.Snippet.CustomUrl}", string.IsNullOrWhiteSpace(item.Snippet.CustomUrl) ? $"https://www.youtube.com/channel/{item.Id}" : $"https://www.youtube.com/user/{item.Snippet.CustomUrl}",
"channel"); resources.GetString("/Cards/channelShare"));
} }
} }
} }
+2 -2
View File
@@ -29,7 +29,7 @@
<TextBlock Name="counter" Grid.Row="1" Text="[Comments count] Comments" Margin="5,0,0,0" VerticalAlignment="Center" FontWeight="SemiBold"/> <TextBlock Name="counter" Grid.Row="1" Text="[Comments count] Comments" Margin="5,0,0,0" VerticalAlignment="Center" FontWeight="SemiBold"/>
<StackPanel Padding="0" Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,0,10,0"> <StackPanel Padding="0" Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,0,10,0">
<TextBlock x:Uid="/CommentsPage/sortBy" Text="Sort by: " VerticalAlignment="Center" Margin="0,0,5,0"/> <TextBlock x:Uid="/CommentsPage/sortBy" Text="Sort by: " VerticalAlignment="Center" Margin="0,0,5,0"/>
<Button Name="orderBtn" Background="Transparent" Content="Relevance" Foreground="Red" Padding="0" VerticalAlignment="Center"> <Button Name="orderBtn" Background="Transparent" Content="Relevance" Foreground="Red" Padding="0" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,0,0,3">
<Button.Flyout> <Button.Flyout>
<MenuFlyout> <MenuFlyout>
@@ -44,7 +44,7 @@
<ScrollViewer Grid.Row="1" Name="scroll"> <ScrollViewer Grid.Row="1" Name="scroll">
<StackPanel> <StackPanel>
<StackPanel Name="placeholder"/> <StackPanel Name="placeholder"/>
<HyperlinkButton Visibility="Collapsed" Name="more" Click="more_Click" HorizontalAlignment="Center" Foreground="Red" Content="Show more"/> <HyperlinkButton x:Uid="/CommentsPage/more" Visibility="Collapsed" Name="more" Click="more_Click" HorizontalAlignment="Center" Foreground="Red" Content="Show more"/>
<ProgressBar Name="moreLoading" Visibility="Collapsed" IsIndeterminate="True" Foreground="Red"/> <ProgressBar Name="moreLoading" Visibility="Collapsed" IsIndeterminate="True" Foreground="Red"/>
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
+7 -3
View File
@@ -5,6 +5,7 @@ using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data; using Google.Apis.YouTube.v3.Data;
using FoxTube.Controls; using FoxTube.Controls;
using Windows.UI.Popups; using Windows.UI.Popups;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Pages namespace FoxTube.Pages
{ {
@@ -13,6 +14,8 @@ namespace FoxTube.Pages
/// </summary> /// </summary>
public sealed partial class CommentsPage : Page public sealed partial class CommentsPage : Page
{ {
ResourceLoader resources = ResourceLoader.GetForCurrentView("CommentsPage");
string threadId; string threadId;
string nextPageToken; string nextPageToken;
@@ -33,7 +36,8 @@ namespace FoxTube.Pages
else else
grid.RowDefinitions[0].Height = GridLength.Auto; grid.RowDefinitions[0].Height = GridLength.Auto;
counter.Text = string.Format("{0:0,0} Comments", video.Statistics.CommentCount); counter.Text = $"{video.Statistics.CommentCount:0,0} {resources.GetString("/CommentsPage/comments")}";
orderBtn.Content = resources.GetString("/CommentsPage/relevance/Text");
var request = SecretsVault.Service.CommentThreads.List("snippet,replies"); var request = SecretsVault.Service.CommentThreads.List("snippet,replies");
request.Order = order; request.Order = order;
@@ -87,7 +91,7 @@ namespace FoxTube.Pages
moreLoading.Visibility = Visibility.Visible; moreLoading.Visibility = Visibility.Visible;
order = CommentThreadsResource.ListRequest.OrderEnum.Relevance; order = CommentThreadsResource.ListRequest.OrderEnum.Relevance;
orderBtn.Content = "Relevance"; orderBtn.Content = resources.GetString("/CommentsPage/relevance/Text");
placeholder.Children.Clear(); placeholder.Children.Clear();
@@ -114,7 +118,7 @@ namespace FoxTube.Pages
moreLoading.Visibility = Visibility.Visible; moreLoading.Visibility = Visibility.Visible;
order = CommentThreadsResource.ListRequest.OrderEnum.Time; order = CommentThreadsResource.ListRequest.OrderEnum.Time;
orderBtn.Content = "Publish date"; orderBtn.Content = resources.GetString("/CommentsPage/publish");
placeholder.Children.Clear(); placeholder.Children.Clear();
+3 -3
View File
@@ -21,17 +21,17 @@
<ColumnDefinition Width="auto"/> <ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<TextBlock Name="path" IsTextSelectionEnabled="True" TextWrapping="WrapWholeWords"/> <TextBlock Name="path" IsTextSelectionEnabled="True" TextWrapping="WrapWholeWords"/>
<Button Grid.Column="1" Content="Open folder" Name="open" Click="Open_Click" VerticalAlignment="Center"/> <Button Grid.Column="1" x:Uid="/Downloads/openFolder" Content="Open folder" Name="open" Click="Open_Click" VerticalAlignment="Center"/>
</Grid> </Grid>
<ScrollViewer Grid.Row="1"> <ScrollViewer Grid.Row="1">
<StackPanel Name="stack"/> <StackPanel Name="stack"/>
</ScrollViewer> </ScrollViewer>
<TextBlock Grid.Row="1" Name="empty" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="28" Text="You haven't downloaded anything yet" Margin="10" TextWrapping="WrapWholeWords" Foreground="Gray" FontWeight="SemiBold"/> <TextBlock x:Uid="/Downloads/noItems" Grid.Row="1" Name="empty" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="28" Text="You haven't downloaded anything yet" Margin="10" TextWrapping="WrapWholeWords" Foreground="Gray" FontWeight="SemiBold"/>
<CommandBar DefaultLabelPosition="Right" Grid.Row="2"> <CommandBar DefaultLabelPosition="Right" Grid.Row="2">
<AppBarButton Label="Refresh" Icon="Refresh" Click="Refresh"/> <AppBarButton x:Uid="/Downloads/refresh" Label="Refresh" Icon="Refresh" Click="Refresh"/>
</CommandBar> </CommandBar>
</Grid> </Grid>
</Page> </Page>
+4 -4
View File
@@ -16,12 +16,12 @@
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Pivot Name="pivot" SelectionChanged="pivot_SelectionChanged"> <Pivot Name="pivot" SelectionChanged="pivot_SelectionChanged">
<PivotItem Header="Recommended" Name="recommended"> <PivotItem x:Uid="/Home/recommended" Header="Recommended" Name="recommended">
<ScrollViewer> <ScrollViewer>
<StackPanel/> <StackPanel/>
</ScrollViewer> </ScrollViewer>
</PivotItem> </PivotItem>
<PivotItem Header="Trending" Name="trending"> <PivotItem x:Uid="/Home/trending" Header="Trending" Name="trending">
<ScrollViewer> <ScrollViewer>
<StackPanel> <StackPanel>
<pages:VideoGrid/> <pages:VideoGrid/>
@@ -29,7 +29,7 @@
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</PivotItem> </PivotItem>
<PivotItem Header="Subscriptions" Name="subscriptions"> <PivotItem x:Uid="/Home/subs" Header="Subscriptions" Name="subscriptions">
<ScrollViewer> <ScrollViewer>
<StackPanel/> <StackPanel/>
</ScrollViewer> </ScrollViewer>
@@ -37,7 +37,7 @@
</Pivot> </Pivot>
<CommandBar Grid.Row="1"> <CommandBar Grid.Row="1">
<AppBarButton Icon="Refresh" Label="Refresh page" Name="refresh" Click="refreshPage"/> <AppBarButton x:Uid="/Home/refresh" Icon="Refresh" Label="Refresh page" Name="refresh" Click="refreshPage"/>
</CommandBar> </CommandBar>
<local:LoadingPage Grid.RowSpan="2" Margin="0,50,0,0" Visibility="Visible" RefreshPage="refreshPage"/> <local:LoadingPage Grid.RowSpan="2" Margin="0,50,0,0" Visibility="Visible" RefreshPage="refreshPage"/>
</Grid> </Grid>
+10 -11
View File
@@ -2,7 +2,6 @@
x:Class="FoxTube.LoadingPage" x:Class="FoxTube.LoadingPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:FoxTube"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> mc:Ignorable="d">
@@ -12,25 +11,25 @@
<StackPanel Name="wifiTrouble" Visibility="Collapsed" VerticalAlignment="Center"> <StackPanel Name="wifiTrouble" Visibility="Collapsed" VerticalAlignment="Center">
<FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xEB5E;" FontSize="100" HorizontalAlignment="Center"/> <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xEB5E;" FontSize="100" HorizontalAlignment="Center"/>
<TextBlock Text="Check your internet connection" FontSize="48" HorizontalAlignment="Center"/> <TextBlock x:Uid="/LoadingPage/checkConnection" Text="Check your internet connection" FontSize="48" HorizontalAlignment="Center"/>
<TextBlock Text="Please, make sure you are connected to the internet and try again." HorizontalAlignment="Center"/> <TextBlock x:Uid="/LoadingPage/wifiDesc" Text="Please, make sure you are connected to the internet and try again." HorizontalAlignment="Center"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="Open network settings" Margin="5" Name="openWifi" Click="openWifi_Click"/> <Button x:Uid="/LoadingPage/openWifi" Content="Open network settings" Margin="5" Name="openWifi" Click="openWifi_Click"/>
<Button Content="Open troubleshooter" Background="Red" Foreground="White" Margin="5" Name="openTroubleshoot" Click="openTroubleshoot_Click"/> <Button x:Uid="/LoadingPage/openTroubleshooter" Content="Open troubleshooter" Background="Red" Foreground="White" Margin="5" Name="openTroubleshoot" Click="openTroubleshoot_Click"/>
</StackPanel> </StackPanel>
<TextBlock Text="OR" FontSize="20" HorizontalAlignment="Center"/> <TextBlock x:Uid="/LoadingPage/or" Text="OR" FontSize="20" HorizontalAlignment="Center"/>
<Button Name="wifiRefresh" Click="wifiRefresh_Click" Content="Refresh page" HorizontalAlignment="Center" Background="Red" Foreground="White" Margin="5"/> <Button x:Uid="/LoadingPage/refresh" Name="wifiRefresh" Click="wifiRefresh_Click" Content="Refresh page" HorizontalAlignment="Center" Background="Red" Foreground="White" Margin="5"/>
<TextBlock Name="wifiException" Foreground="Gray" Text="Exception:" HorizontalAlignment="Center" IsTextSelectionEnabled="True"/> <TextBlock Name="wifiException" Foreground="Gray" Text="Exception:" HorizontalAlignment="Center" IsTextSelectionEnabled="True"/>
<TextBlock Name="wifiMessage" Foreground="Gray" Text="Message:" HorizontalAlignment="Center" IsTextSelectionEnabled="True"/> <TextBlock Name="wifiMessage" Foreground="Gray" Text="Message:" HorizontalAlignment="Center" IsTextSelectionEnabled="True"/>
</StackPanel> </StackPanel>
<StackPanel Name="trouble" Visibility="Collapsed" VerticalAlignment="Center"> <StackPanel Name="trouble" Visibility="Collapsed" VerticalAlignment="Center">
<FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE7BA;" FontSize="100" HorizontalAlignment="Center"/> <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE7BA;" FontSize="100" HorizontalAlignment="Center"/>
<TextBlock Text="We are unable to display the page" FontSize="48" HorizontalAlignment="Center"/> <TextBlock x:Uid="/LoadingPage/err" Text="We are unable to display the page" FontSize="48" HorizontalAlignment="Center"/>
<TextBlock Text="It could be caused by YouTube internal server error or by application's bug. Please, try again later" HorizontalAlignment="Center"/> <TextBlock x:Uid="/LoadingPage/errDescription" Text="It could be caused by YouTube internal server error or by application's bug. Please, try again later" HorizontalAlignment="Center"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Name="refresh" Click="wifiRefresh_Click" Content="Refresh page" Margin="5"/> <Button x:Uid="/LoadingPage/refresh" Name="refresh" Click="wifiRefresh_Click" Content="Refresh page" Margin="5"/>
<Button Content="Leave feedback" Background="Red" Foreground="White" Margin="5" Name="feedback" Click="feedback_Click"/> <Button x:Uid="/LoadingPage/feedback" Content="Leave feedback" Background="Red" Foreground="White" Margin="5" Name="feedback" Click="feedback_Click"/>
</StackPanel> </StackPanel>
<TextBlock Name="exception" Foreground="Gray" Text="Exception:" HorizontalAlignment="Center" IsTextSelectionEnabled="True"/> <TextBlock Name="exception" Foreground="Gray" Text="Exception:" HorizontalAlignment="Center" IsTextSelectionEnabled="True"/>
<TextBlock Name="message" Foreground="Gray" Text="Message:" HorizontalAlignment="Center" IsTextSelectionEnabled="True"/> <TextBlock Name="message" Foreground="Gray" Text="Message:" HorizontalAlignment="Center" IsTextSelectionEnabled="True"/>
+9 -19
View File
@@ -1,35 +1,25 @@
using System; using System;
using System.Collections.Generic; using Windows.ApplicationModel.Resources;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
namespace FoxTube namespace FoxTube
{ {
public enum LoadingState { Loadnig, Loaded, Error, Blocked } public enum LoadingState { Loadnig, Loaded, Error, Blocked }
/// <summary> /// <summary>
/// An empty page that can be used on its own or navigated to within a Frame. /// Loading sreen. Represents loading ring or error
/// </summary> /// </summary>
public sealed partial class LoadingPage : Page public sealed partial class LoadingPage : Page
{ {
ResourceLoader resources = ResourceLoader.GetForCurrentView("LoadingPage");
public event RoutedEventHandler RefreshPage; public event RoutedEventHandler RefreshPage;
public LoadingState State { get; private set; } = LoadingState.Loadnig; public LoadingState State { get; private set; } = LoadingState.Loadnig;
public LoadingPage() public LoadingPage()
{ {
this.InitializeComponent(); InitializeComponent();
} }
public void Error(string exceptionId = "Unknown", string details = "N/A", bool isWifiTrouble = false) public void Error(string exceptionId = "Unknown", string details = "N/A", bool isWifiTrouble = false)
@@ -41,15 +31,15 @@ namespace FoxTube
if (isWifiTrouble) if (isWifiTrouble)
{ {
wifiException.Text = $"ID: {exceptionId}"; wifiException.Text = $"{resources.GetString("/LoadingPage/ex")}: {exceptionId}";
wifiMessage.Text = $"Details: {details}"; wifiMessage.Text = $"{resources.GetString("/LoadingPage/details")}: {details}";
wifiTrouble.Visibility = Visibility.Visible; wifiTrouble.Visibility = Visibility.Visible;
} }
else else
{ {
exception.Text = $"ID: {exceptionId}"; exception.Text = $"{resources.GetString("/LoadingPage/ex")}: {exceptionId}";
message.Text = $"Details: {details}"; message.Text = $"{resources.GetString("/LoadingPage/details")}: {details}";
trouble.Visibility = Visibility.Visible; trouble.Visibility = Visibility.Visible;
} }
+53 -38
View File
@@ -21,8 +21,9 @@ using System.Net;
using Windows.UI.Popups; using Windows.UI.Popups;
using Windows.Networking.Connectivity; using Windows.Networking.Connectivity;
using Windows.UI.Core; using Windows.UI.Core;
using System.Threading; using Windows.ApplicationModel.Resources;
using System.Threading.Tasks; using Windows.Storage;
using System.IO;
namespace FoxTube namespace FoxTube
{ {
@@ -34,18 +35,35 @@ namespace FoxTube
public sealed partial class MainPage : Page public sealed partial class MainPage : Page
{ {
Sender s = Sender.None; Sender s = Sender.None;
ResourceLoader resources = ResourceLoader.GetForCurrentView("Main");
public MainPage() public MainPage()
{ {
InitializeComponent(); InitializeComponent();
//Comparing current version with last recorded version. If doesn't match, poping up changelog notification CheckVersion();
SecretsVault.AuthorizationStateChanged += AuthorizationStateChanged;
SecretsVault.SubscriptionsChanged += SecretsVault_SubscriptionsChanged;
SecretsVault.NotPurchased += () => removeAds.Visibility = Visibility.Visible;
SecretsVault.CheckAuthorization();
SecretsVault.CheckAddons();
SetTitleBar();
}
/// <summary>
/// Comparing current version with last recorded version. If doesn't match, poping up changelog notification
/// </summary>
public async void CheckVersion()
{
PackageVersion ver = Package.Current.Id.Version; PackageVersion ver = Package.Current.Id.Version;
if(SettingsStorage.Version != $"{ver.Major}.{ver.Minor}") if (SettingsStorage.Version != $"{ver.Major}.{ver.Minor}")
{ {
try try
{ {
XmlDocument changelog = new XmlDocument(); XmlDocument changelog = new XmlDocument();
changelog.Load("http://foxgame-studio.000webhostapp.com/foxtube-changelog.xml"); StorageFile file = await (await Package.Current.InstalledLocation.GetFolderAsync(@"Assets\Data")).GetFileAsync("Patchnotes.xml");
changelog.Load(await file.OpenStreamForReadAsync());
XmlElement e = changelog["items"].ChildNodes[0] as XmlElement; XmlElement e = changelog["items"].ChildNodes[0] as XmlElement;
ToastNotificationManager.CreateToastNotifier().Show(FoxTube.Background.Notification.GetChangelogToast(e.GetAttribute("version"))); ToastNotificationManager.CreateToastNotifier().Show(FoxTube.Background.Notification.GetChangelogToast(e.GetAttribute("version")));
@@ -57,14 +75,6 @@ namespace FoxTube
Debug.WriteLine("Unable to retrieve changelog"); Debug.WriteLine("Unable to retrieve changelog");
} }
} }
SecretsVault.AuthorizationStateChanged += AuthorizationStateChanged;
SecretsVault.SubscriptionsChanged += SecretsVault_SubscriptionsChanged;
SecretsVault.NotPurchased += () => removeAds.Visibility = Visibility.Visible;
SecretsVault.CheckAuthorization();
SecretsVault.CheckAddons();
SetTitleBar();
} }
public Video GetCurrentItem() public Video GetCurrentItem()
@@ -223,13 +233,13 @@ namespace FoxTube
} }
else else
{ {
MessageDialog dialog = new MessageDialog("We were unabled to retrieve your account information due to weak internet connection or Google servers' problems. PLease, try again later", "Failed to connect"); MessageDialog dialog = new MessageDialog(resources.GetString("/Main/connectErrContent"), resources.GetString("/Main/connectErrHeader"));
dialog.Commands.Add(new UICommand("Try again", (command) => dialog.Commands.Add(new UICommand(resources.GetString("/Main/tryAgain"), (command) =>
{ {
SecretsVault.Authorize(); SecretsVault.Authorize();
})); }));
dialog.Commands.Add(new UICommand("Quit", (command) => dialog.Commands.Add(new UICommand(resources.GetString("/Main/quit"), (command) =>
{ {
Methods.CloseApp(); Methods.CloseApp();
})); }));
@@ -298,15 +308,15 @@ namespace FoxTube
var connection = NetworkInformation.GetInternetConnectionProfile().GetConnectionCost(); var connection = NetworkInformation.GetInternetConnectionProfile().GetConnectionCost();
if (SettingsStorage.CheckConnection && (connection.NetworkCostType == NetworkCostType.Fixed || connection.NetworkCostType == NetworkCostType.Variable)) if (SettingsStorage.CheckConnection && (connection.NetworkCostType == NetworkCostType.Fixed || connection.NetworkCostType == NetworkCostType.Variable))
{ {
MessageDialog dialog = new MessageDialog("You are on metered connection now. Additional charges may apply. Do you want to continue?") MessageDialog dialog = new MessageDialog(resources.GetString("/Main/metered"))
{ {
DefaultCommandIndex = 2, DefaultCommandIndex = 2,
CancelCommandIndex = 1 CancelCommandIndex = 1
}; };
dialog.Commands.Add(new UICommand("Yes")); dialog.Commands.Add(new UICommand(resources.GetString("/Main/yes")));
dialog.Commands.Add(new UICommand("No", (command) => cancel = true)); dialog.Commands.Add(new UICommand(resources.GetString("/Main/no"), (command) => cancel = true));
if(SecretsVault.IsAuthorized) if(SecretsVault.IsAuthorized)
dialog.Commands.Add(new UICommand("Add to 'Watch later' playlist", (command) => dialog.Commands.Add(new UICommand(resources.GetString("/Main/addLater"), (command) =>
{ {
try try
{ {
@@ -339,6 +349,9 @@ namespace FoxTube
if (cancel) if (cancel)
return; return;
if (videoPlaceholder.Content != null)
(videoPlaceholder.Content as VideoPage).player.close_Click(this, null);
videoPlaceholder.Content = null; videoPlaceholder.Content = null;
Fullscreen(false); Fullscreen(false);
@@ -396,14 +409,14 @@ namespace FoxTube
Dictionary<Type, Action> switchCase = new Dictionary<Type, Action>() Dictionary<Type, Action> switchCase = new Dictionary<Type, Action>()
{ {
{ typeof(Settings), () => nav.Header = "Settings" }, { typeof(Settings), () => nav.Header = resources.GetString("/Main/settings/Content") },
{ typeof(ChannelPage), () => nav.Header = "Channel" }, { typeof(ChannelPage), () => nav.Header = resources.GetString("/Main/channel") },
{ typeof(PlaylistPage), () => nav.Header = "Playlist" }, { typeof(PlaylistPage), () => nav.Header = resources.GetString("/Main/playlist") },
{ typeof(Search), () => nav.Header = "Search" }, { typeof(Search), () => nav.Header = resources.GetString("/Main/searchPlaceholder/PlaceholderText") },
{ typeof(Subscriptions), () => nav.Header = "Subscriptions" }, { typeof(Subscriptions), () => nav.Header = resources.GetString("/Main/subscriptions/Content") },
{ typeof(History), () => nav.Header = "History" }, { typeof(History), () => nav.Header = resources.GetString("/Main/history/Content") },
{ typeof(Home), () => nav.Header = "Home" }, { typeof(Home), () => nav.Header = resources.GetString("/Main/home/Content") },
{ typeof(Downloads), () => nav.Header = "Downloads" } { typeof(Downloads), () => nav.Header = resources.GetString("/Main/downloads/Content") }
}; };
if (content.SourcePageType == typeof(Home) || content.SourcePageType == typeof(Settings) || content.SourcePageType == typeof(Subscriptions)) if (content.SourcePageType == typeof(Home) || content.SourcePageType == typeof(Settings) || content.SourcePageType == typeof(Subscriptions))
@@ -431,7 +444,7 @@ namespace FoxTube
if (videoPlaceholder.Content != null) if (videoPlaceholder.Content != null)
{ {
nav.Header = "Video"; nav.Header = resources.GetString("/Main/video");
nav.ExpandedModeThresholdWidth = short.MaxValue; nav.ExpandedModeThresholdWidth = short.MaxValue;
nav.IsPaneOpen = false; nav.IsPaneOpen = false;
} }
@@ -454,7 +467,10 @@ namespace FoxTube
nav.ExpandedModeThresholdWidth = 1008; nav.ExpandedModeThresholdWidth = 1008;
nav.Margin = new Thickness(0); nav.Margin = new Thickness(0);
if (videoPlaceholder.Content != null && nav.IsPaneOpen) if (videoPlaceholder.Content != null && nav.IsPaneOpen)
{
nav.IsPaneOpen = true;
nav.IsPaneOpen = false; nav.IsPaneOpen = false;
}
else else
{ {
nav.OpenPaneLength = 300; nav.OpenPaneLength = 300;
@@ -471,7 +487,6 @@ namespace FoxTube
ApplicationView.GetForCurrentView().ExitFullScreenMode(); ApplicationView.GetForCurrentView().ExitFullScreenMode();
Fullscreen(false); Fullscreen(false);
} }
(videoPlaceholder.Content as VideoPage).player.pointerCaptured = false;
videoPlaceholder.Content = null; videoPlaceholder.Content = null;
Window.Current.CoreWindow.PointerCursor = new CoreCursor(CoreCursorType.Arrow, 0); Window.Current.CoreWindow.PointerCursor = new CoreCursor(CoreCursorType.Arrow, 0);
MaximizeVideo(); MaximizeVideo();
@@ -551,14 +566,14 @@ namespace FoxTube
{ {
Dictionary<Type, Action> switchCase = new Dictionary<Type, Action>() Dictionary<Type, Action> switchCase = new Dictionary<Type, Action>()
{ {
{ typeof(Settings), () => nav.Header = "Settings" }, { typeof(Settings), () => nav.Header = resources.GetString("/Main/settings/Content") },
{ typeof(ChannelPage), () => nav.Header = "Channel" }, { typeof(ChannelPage), () => nav.Header = resources.GetString("/Main/channel") },
{ typeof(PlaylistPage), () => nav.Header = "Playlist" }, { typeof(PlaylistPage), () => nav.Header = resources.GetString("/Main/playlist") },
{ typeof(Search), () => nav.Header = "Search" }, { typeof(Search), () => nav.Header = resources.GetString("/Main/searchPlaceholder/PlaceholderText") },
{ typeof(Subscriptions), () => nav.Header = "Subscriptions" }, { typeof(Subscriptions), () => nav.Header = resources.GetString("/Main/subscriptions/Content") },
{ typeof(History), () => nav.Header = "History" }, { typeof(History), () => nav.Header = resources.GetString("/Main/history/Content") },
{ typeof(Home), () => nav.Header = "Home" }, { typeof(Home), () => nav.Header = resources.GetString("/Main/home/Content") },
{ typeof(Downloads), () => nav.Header = "Downloads" } { typeof(Downloads), () => nav.Header = resources.GetString("/Main/downloads/Content") }
}; };
try { switchCase[e.SourcePageType](); } try { switchCase[e.SourcePageType](); }
+4 -4
View File
@@ -63,16 +63,16 @@
</ScrollViewer> </ScrollViewer>
<CommandBar Grid.Row="2" Grid.ColumnSpan="2"> <CommandBar Grid.Row="2" Grid.ColumnSpan="2">
<AppBarButton Icon="Globe" Label="Open in browser" Name="inBrowser" Click="inBrowser_Click"/> <AppBarButton x:Uid="/Playlist/openWeb" Icon="Globe" Label="Open in browser" Name="inBrowser" Click="inBrowser_Click"/>
<AppBarButton Icon="Add" Label="Add to" IsEnabled="False"> <AppBarButton x:Uid="/Playlist/addTo" Icon="Add" Label="Add to" IsEnabled="False">
<AppBarButton.Flyout> <AppBarButton.Flyout>
<MenuFlyout> <MenuFlyout>
</MenuFlyout> </MenuFlyout>
</AppBarButton.Flyout> </AppBarButton.Flyout>
</AppBarButton> </AppBarButton>
<AppBarButton Icon="Refresh" Label="Refresh" Name="refresh" Click="refresh_Click"/> <AppBarButton x:Uid="/Playlist/refresh" Icon="Refresh" Label="Refresh" Name="refresh" Click="refresh_Click"/>
<AppBarButton Icon="Share" Label="Share" Name="share" Click="share_Click"/> <AppBarButton x:Uid="/Playlist/share" Icon="Share" Label="Share" Name="share" Click="share_Click"/>
</CommandBar> </CommandBar>
<foxtube:LoadingPage Grid.RowSpan="2" Visibility="Collapsed"/> <foxtube:LoadingPage Grid.RowSpan="2" Visibility="Collapsed"/>
+3 -2
View File
@@ -3,6 +3,7 @@ using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data; using Google.Apis.YouTube.v3.Data;
using System; using System;
using Windows.ApplicationModel.DataTransfer; using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
using Windows.Foundation; using Windows.Foundation;
using Windows.System; using Windows.System;
using Windows.UI.Xaml; using Windows.UI.Xaml;
@@ -57,7 +58,7 @@ namespace FoxTube.Pages
item = (await request.ExecuteAsync()).Items[0]; item = (await request.ExecuteAsync()).Items[0];
title.Text = item.Snippet.Title; title.Text = item.Snippet.Title;
info.Text = $"{item.ContentDetails.ItemCount} videos"; info.Text = $"{item.ContentDetails.ItemCount} {ResourceLoader.GetForCurrentView("Playlist").GetString("/Playlist/videos")}";
description.Text = item.Snippet.Description; description.Text = item.Snippet.Description;
channelName.Text = item.Snippet.ChannelTitle; channelName.Text = item.Snippet.ChannelTitle;
@@ -129,7 +130,7 @@ namespace FoxTube.Pages
item.Snippet.Thumbnails.Medium.Url, item.Snippet.Thumbnails.Medium.Url,
item.Snippet.Title, item.Snippet.Title,
$"https://www.youtube.com/playlist?list={item.Id}", $"https://www.youtube.com/playlist?list={item.Id}",
"playlist"); ResourceLoader.GetForCurrentView("Cards").GetString("/Cards/playlistShare"));
} }
} }
} }
+30 -30
View File
@@ -19,52 +19,52 @@
<TextBlock Name="searchTerm" Text="Search results for: [searchTerm]" FontSize="28"/> <TextBlock Name="searchTerm" Text="Search results for: [searchTerm]" FontSize="28"/>
<TextBlock Name="resultsCount" Text="Found: [resultCount] item(s)" FontSize="14" Foreground="Gray"/> <TextBlock Name="resultsCount" Text="Found: [resultCount] item(s)" FontSize="14" Foreground="Gray"/>
<HyperlinkButton Name="toggleFilters" Click="toggleFilters_Click" Content="Show filters &#xE71C;" FontFamily="Default, Segoe MDL2 Assets" Visibility="Visible"/> <HyperlinkButton x:Uid="/Search/filters" Name="toggleFilters" Click="toggleFilters_Click" Content="Show filters &#xE71C;" FontFamily="Default, Segoe MDL2 Assets" Visibility="Visible"/>
<StackPanel Name="filters" Visibility="Collapsed"> <StackPanel Name="filters" Visibility="Collapsed">
<GridView Padding="5" SelectionMode="None"> <GridView Padding="5" SelectionMode="None">
<ComboBox Name="order" Header="Sort by" Width="150" SelectedIndex="0"> <ComboBox x:Uid="/Search/order" Name="order" Header="Sort by" Width="150" SelectedIndex="0">
<ComboBoxItem Content="Relevance"/> <ComboBoxItem x:Uid="/Search/relevance" Content="Relevance"/>
<ComboBoxItem Content="Upload date"/> <ComboBoxItem x:Uid="/Search/update" Content="Upload date"/>
<ComboBoxItem Content="View count"/> <ComboBoxItem x:Uid="/Search/views" Content="View count"/>
<ComboBoxItem Content="Rating"/> <ComboBoxItem x:Uid="/Search/rating" Content="Rating"/>
<ComboBoxItem Content="Title"/> <ComboBoxItem x:Uid="/Search/title" Content="Title"/>
</ComboBox> </ComboBox>
<ComboBox Name="type" Header="Type" Width="150" SelectedIndex="0" SelectionChanged="type_SelectionChanged"> <ComboBox x:Uid="/Search/type" Name="type" Header="Type" Width="150" SelectedIndex="0" SelectionChanged="type_SelectionChanged">
<ComboBoxItem Content="All"/> <ComboBoxItem x:Uid="/Search/all" Content="All"/>
<ComboBoxItem Content="Video"/> <ComboBoxItem x:Uid="/Search/video" Content="Video"/>
<ComboBoxItem Content="Channel"/> <ComboBoxItem x:Uid="/Search/channel" Content="Channel"/>
<ComboBoxItem Content="Playlist"/> <ComboBoxItem x:Uid="/Search/playlist" Content="Playlist"/>
</ComboBox> </ComboBox>
<ComboBox Name="date" Header="Upload date" Width="150" SelectedIndex="0"> <ComboBox x:Uid="/Search/updateHeader" Name="date" Header="Upload date" Width="150" SelectedIndex="0">
<ComboBoxItem Content="Anytime"/> <ComboBoxItem x:Uid="/Search/anytime" Content="Anytime"/>
<ComboBoxItem Content="Last hour"/> <ComboBoxItem x:Uid="/Search/lasthr" Content="Last hour"/>
<ComboBoxItem Content="Today"/> <ComboBoxItem x:Uid="/Search/today" Content="Today"/>
<ComboBoxItem Content="This week"/> <ComboBoxItem x:Uid="/Search/week" Content="This week"/>
<ComboBoxItem Content="This month"/> <ComboBoxItem x:Uid="/Search/month" Content="This month"/>
<ComboBoxItem Content="This year"/> <ComboBoxItem x:Uid="/Search/year" Content="This year"/>
</ComboBox> </ComboBox>
<ComboBox Visibility="Collapsed" Name="duration" Header="Duration" Width="150" SelectedIndex="0"> <ComboBox x:Uid="/Search/duration" Visibility="Collapsed" Name="duration" Header="Duration" Width="150" SelectedIndex="0">
<ComboBoxItem Content="Any"/> <ComboBoxItem x:Uid="/Search/any" Content="Any"/>
<ComboBoxItem Content="Long (&#x3E; 20 minutes)"/> <ComboBoxItem x:Uid="/Search/long" Content="Long (&#x3E; 20 minutes)"/>
<ComboBoxItem Content="Medium"/> <ComboBoxItem x:Uid="/Search/medium" Content="Medium"/>
<ComboBoxItem Content="Short (&#x3C; 4 minutes)"/> <ComboBoxItem x:Uid="/Search/short" Content="Short (&#x3C; 4 minutes)"/>
</ComboBox> </ComboBox>
</GridView> </GridView>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<Button Visibility="Collapsed" Content="Features" Name="featBtn" Margin="10,0,0,10"> <Button x:Uid="/Search/features" Visibility="Collapsed" Content="Features" Name="featBtn" Margin="10,0,0,10">
<Button.Flyout> <Button.Flyout>
<Flyout> <Flyout>
<ListView Name="features" SelectionMode="Multiple" Header="Features"> <ListView x:Uid="/Search/featuresHeader" Name="features" SelectionMode="Multiple" Header="Features">
<TextBlock Text="HD"/> <TextBlock Text="HD"/>
<TextBlock Text="3D"/> <TextBlock Text="3D"/>
<TextBlock Text="Subtitles/CC"/> <TextBlock x:Uid="/Search/subs" Text="Subtitles/CC"/>
<TextBlock Text="Live"/> <TextBlock x:Uid="/Search/live" Text="Live"/>
<TextBlock Text="Creative Commons"/> <TextBlock x:Uid="/Search/cc" Text="Creative Commons"/>
</ListView> </ListView>
</Flyout> </Flyout>
</Button.Flyout> </Button.Flyout>
</Button> </Button>
<Button Content="Apply" Margin="10,0,0,10" Name="apply" Click="apply_Click"/> <Button x:Uid="/Search/apply" Content="Apply" Margin="10,0,0,10" Name="apply" Click="apply_Click"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<pages:VideoGrid/> <pages:VideoGrid/>
+7 -5
View File
@@ -8,7 +8,7 @@ using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation; using Windows.UI.Xaml.Navigation;
using Windows.System; using Windows.System;
using System.Globalization; using Windows.ApplicationModel.Resources;
namespace FoxTube namespace FoxTube
{ {
@@ -17,6 +17,8 @@ namespace FoxTube
/// </summary> /// </summary>
public sealed partial class Search : Page public sealed partial class Search : Page
{ {
ResourceLoader resources = ResourceLoader.GetForCurrentView("Search");
public SearchParameters Parameters; public SearchParameters Parameters;
SearchResource.ListRequest request; SearchResource.ListRequest request;
string nextToken; string nextToken;
@@ -130,8 +132,8 @@ namespace FoxTube
features.SelectedItems.Add(features.Items[4]); features.SelectedItems.Add(features.Items[4]);
SearchListResponse response = await request.ExecuteAsync(); SearchListResponse response = await request.ExecuteAsync();
searchTerm.Text = $"Search results for: {Parameters.Term}"; searchTerm.Text = $"{resources.GetString("/Search/header")} '{Parameters.Term}'";
resultsCount.Text = $"Found: {SetResults(response.PageInfo.TotalResults)} item(s)"; resultsCount.Text = $"{resources.GetString("/Search/found")}: {SetResults(response.PageInfo.TotalResults)} {resources.GetString("/Search/items")}";
if (!string.IsNullOrWhiteSpace(response.NextPageToken)) if (!string.IsNullOrWhiteSpace(response.NextPageToken))
nextToken = response.NextPageToken; nextToken = response.NextPageToken;
else else
@@ -158,12 +160,12 @@ namespace FoxTube
if(filters.Visibility == Visibility.Collapsed) if(filters.Visibility == Visibility.Collapsed)
{ {
filters.Visibility = Visibility.Visible; filters.Visibility = Visibility.Visible;
toggleFilters.Content = "Hide filters \xE014"; toggleFilters.Content = resources.GetString("/Search/hideFilters");
} }
else else
{ {
filters.Visibility = Visibility.Collapsed; filters.Visibility = Visibility.Collapsed;
toggleFilters.Content = "Show filters \xE015"; toggleFilters.Content = resources.GetString("/Search/filters/Content");
} }
} }
+1 -1
View File
@@ -36,7 +36,7 @@
<TextBlock x:Uid="/General/notifications" Text="Notifications" FontSize="22"/> <TextBlock x:Uid="/General/notifications" Text="Notifications" FontSize="22"/>
<ToggleSwitch x:Uid="/General/newVideo" Name="newVideo" OnContent="Notify when someone of your subscriptions uploaded new video" OffContent="Notify when someone of your subscriptions uploaded new video" Toggled="notification_IsEnabledChanged"/> <ToggleSwitch x:Uid="/General/newVideo" Name="newVideo" OnContent="Notify when someone of your subscriptions uploaded new video" OffContent="Notify when someone of your subscriptions uploaded new video" Toggled="notification_IsEnabledChanged"/>
<ToggleSwitch Name="devNews" OnContent="Recieve messages from developers" OffContent="Recieve messages from developers" Toggled="devNews_Toggled"/> <ToggleSwitch x:Uid="/General/devNotifications" Name="devNews" OnContent="Recieve messages from developers" OffContent="Recieve messages from developers" Toggled="devNews_Toggled"/>
<TextBlock x:Uid="/General/color" Text="Color mode" FontSize="22"/> <TextBlock x:Uid="/General/color" Text="Color mode" FontSize="22"/>
<RadioButton x:Uid="/General/colorLight" Content="Light" Name="light" GroupName="color" Checked="RadioButton_Checked"/> <RadioButton x:Uid="/General/colorLight" Content="Light" Name="light" GroupName="color" Checked="RadioButton_Checked"/>
+1 -1
View File
@@ -23,7 +23,7 @@ namespace FoxTube.Pages.SettingsPages
language.SelectedItem = language.Items.Find(i => ((ComboBoxItem)i).Tag.ToString() == SettingsStorage.Language); language.SelectedItem = language.Items.Find(i => ((ComboBoxItem)i).Tag.ToString() == SettingsStorage.Language);
safeSearch.SelectedIndex = SettingsStorage.SafeSearch; safeSearch.SelectedIndex = SettingsStorage.SafeSearch;
foreach (VideoQuality i in Enum.GetValues(typeof(VideoQuality))) foreach (VideoQuality i in Enum.GetValues(typeof(VideoQuality)).ToReversedList())
quality.Items.Add(new ComboBoxItem() { Tag = i.GetVideoQualityLabel(), Content = i.GetVideoQualityLabel() }); quality.Items.Add(new ComboBoxItem() { Tag = i.GetVideoQualityLabel(), Content = i.GetVideoQualityLabel() });
quality.SelectedItem = quality.Items.ToList().Find(i => ((ComboBoxItem)i).Tag.ToString() == SettingsStorage.VideoQuality); quality.SelectedItem = quality.Items.ToList().Find(i => ((ComboBoxItem)i).Tag.ToString() == SettingsStorage.VideoQuality);
mobileWarning.IsOn = SettingsStorage.CheckConnection; mobileWarning.IsOn = SettingsStorage.CheckConnection;
+6 -16
View File
@@ -2,44 +2,34 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml; using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using FoxTube.Classes; using FoxTube.Classes;
using System.Xml;
using Windows.Storage; using Windows.Storage;
using System.Diagnostics; using System.Diagnostics;
using Windows.UI.Popups; using System.Xml;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
namespace FoxTube.Pages.SettingsPages namespace FoxTube.Pages.SettingsPages
{ {
/// <summary> /// <summary>
/// An empty page that can be used on its own or navigated to within a Frame. /// Page with changelogs and dev messages
/// </summary> /// </summary>
public sealed partial class Inbox : Page public sealed partial class Inbox : Page
{ {
List<InboxItem> items = new List<InboxItem>(); List<InboxItem> items = new List<InboxItem>();
public Inbox() public Inbox()
{ {
this.InitializeComponent(); InitializeComponent();
} }
public void LoadItems() public async void LoadItems()
{ {
try try
{ {
XmlDocument doc = new XmlDocument(); XmlDocument doc = new XmlDocument();
doc.Load("http://foxgame-studio.000webhostapp.com/foxtube-changelog.xml"); StorageFile file = await (await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(@"Assets\Data")).GetFileAsync("Patchnotes.xml");
doc.Load(await file.OpenStreamForReadAsync());
foreach (XmlElement e in doc["items"].ChildNodes) foreach (XmlElement e in doc["items"].ChildNodes)
items.Add(new InboxItem( items.Add(new InboxItem(
e.GetAttribute("version"), e.GetAttribute("version"),
+9 -9
View File
@@ -47,7 +47,7 @@
<StackPanel Orientation="Vertical" Grid.Column="1" Padding="5" VerticalAlignment="Center"> <StackPanel Orientation="Vertical" Grid.Column="1" Padding="5" VerticalAlignment="Center">
<TextBlock Name="channelName" Text="[Channel name]" FontSize="18"/> <TextBlock Name="channelName" Text="[Channel name]" FontSize="18"/>
<TextBlock Name="subscribers" Text="[subscribers]" Foreground="Gray" Margin="0,0,0,5"/> <TextBlock Name="subscribers" Text="[subscribers]" Foreground="Gray" Margin="0,0,0,5"/>
<Button Click="subscribe_Click" Grid.Column="2" Height="30" Width="200" Background="Red" Foreground="White" FontSize="14" FontWeight="SemiBold" Content="Subscirbe" Name="subscribe"/> <Button x:Uid="/Cards/subscribe" Click="subscribe_Click" Grid.Column="2" Height="30" Width="200" Background="Red" Foreground="White" FontSize="14" FontWeight="SemiBold" Content="Subscirbe" Name="subscribe"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</Button> </Button>
@@ -81,12 +81,12 @@
</ScrollViewer> </ScrollViewer>
<CommandBar VerticalAlignment="Bottom" Name="commandbar"> <CommandBar VerticalAlignment="Bottom" Name="commandbar">
<AppBarButton Icon="Download" Label="Download video" Name="download"> <AppBarButton x:Uid="/VideoPage/download" Icon="Download" Label="Download video" Name="download">
<AppBarButton.Flyout> <AppBarButton.Flyout>
<MenuFlyout x:Name="downloadSelector"/> <MenuFlyout x:Name="downloadSelector"/>
</AppBarButton.Flyout> </AppBarButton.Flyout>
</AppBarButton> </AppBarButton>
<AppBarButton Name="addTo" Label="Add to" Icon="Add"> <AppBarButton x:Uid="/VideoPage/addTo" Name="addTo" Label="Add to" Icon="Add">
<AppBarButton.Flyout> <AppBarButton.Flyout>
<Flyout> <Flyout>
<ScrollViewer Margin="-12" MaxHeight="300"> <ScrollViewer Margin="-12" MaxHeight="300">
@@ -127,14 +127,14 @@
</Flyout> </Flyout>
</AppBarButton.Flyout> </AppBarButton.Flyout>
</AppBarButton> </AppBarButton>
<AppBarButton Name="refresh" Click="refresh_Click" Icon="Refresh" Label="Refresh page"/> <AppBarButton x:Uid="/VideoPage/refresh" Name="refresh" Click="refresh_Click" Icon="Refresh" Label="Refresh page"/>
<AppBarButton Name="share" Click="share_Click" Icon="Share" Label="Share"/> <AppBarButton x:Uid="/VideoPage/share" Name="share" Click="share_Click" Icon="Share" Label="Share"/>
<AppBarButton Name="openBrowser" Click="openBrowser_Click" Icon="Globe" Label="Open in browser"/> <AppBarButton x:Uid="/VideoPage/openWeb" Name="openBrowser" Click="openBrowser_Click" Icon="Globe" Label="Open in browser"/>
</CommandBar> </CommandBar>
<Grid Grid.Column="1" Name="tabsPlaceholder"> <Grid Grid.Column="1" Name="tabsPlaceholder">
<Pivot Grid.Row="1" Name="pivot" SelectedIndex="0" IsHeaderItemsCarouselEnabled="False"> <Pivot Grid.Row="1" Name="pivot" SelectedIndex="0" IsHeaderItemsCarouselEnabled="False">
<PivotItem Header="Suggestions"> <PivotItem x:Uid="/VideoPage/related" Header="Suggestions">
<ScrollViewer> <ScrollViewer>
<StackPanel> <StackPanel>
<controls1:Advert/> <controls1:Advert/>
@@ -142,10 +142,10 @@
</StackPanel> </StackPanel>
</ScrollViewer> </ScrollViewer>
</PivotItem> </PivotItem>
<PivotItem Header="Comments" Name="commentsPlaceholder"> <PivotItem x:Uid="/VideoPage/comments" Header="Comments" Name="commentsPlaceholder">
<pages:CommentsPage/> <pages:CommentsPage/>
</PivotItem> </PivotItem>
<PivotItem Header="Playlist" Name="playlist"> <PivotItem x:Uid="/VideoPage/playlist" Header="Playlist" Name="playlist">
<ScrollViewer> <ScrollViewer>
<StackPanel> <StackPanel>
<StackPanel Padding="8" Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}"> <StackPanel Padding="8" Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}">
+16 -15
View File
@@ -7,6 +7,7 @@ using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using Windows.ApplicationModel.DataTransfer; using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
using Windows.Foundation; using Windows.Foundation;
using Windows.Storage; using Windows.Storage;
using Windows.System; using Windows.System;
@@ -43,7 +44,7 @@ namespace FoxTube.Pages
/// </summary> /// </summary>
public sealed partial class VideoPage : Page public sealed partial class VideoPage : Page
{ {
ApplicationDataContainer settings = ApplicationData.Current.LocalSettings; ResourceLoader resources = ResourceLoader.GetForCurrentView("VideoPage");
public string videoId; public string videoId;
public string playlistId = null; public string playlistId = null;
@@ -87,7 +88,7 @@ namespace FoxTube.Pages
} }
} }
private void Player_NextClicked(object sender, params object[] e) private void Player_NextClicked()
{ {
if (playlistId != null) if (playlistId != null)
playlistList.SelectedIndex++; playlistList.SelectedIndex++;
@@ -209,7 +210,7 @@ namespace FoxTube.Pages
channelAvatar.ProfilePicture = new BitmapImage(new Uri(item1.Snippet.Thumbnails.Medium.Url)); channelAvatar.ProfilePicture = new BitmapImage(new Uri(item1.Snippet.Thumbnails.Medium.Url));
channelName.Text = item.Snippet.ChannelTitle; channelName.Text = item.Snippet.ChannelTitle;
subscribers.Text = $"{item1.Statistics.SubscriberCount:0,0} subscribers"; subscribers.Text = $"{item1.Statistics.SubscriberCount:0,0} {resources.GetString("/Cards/subscribers")}";
//Setting ratings //Setting ratings
dislikes.Text = $"{item.Statistics.DislikeCount:0,0}"; dislikes.Text = $"{item.Statistics.DislikeCount:0,0}";
@@ -242,7 +243,7 @@ namespace FoxTube.Pages
{ {
subscribe.Background = new SolidColorBrush(Colors.Transparent); subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray); subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed"; subscribe.Content = resources.GetString("/Cards/unsubscribe");
} }
} }
subscribe.Visibility = Visibility.Visible; subscribe.Visibility = Visibility.Visible;
@@ -271,7 +272,7 @@ namespace FoxTube.Pages
pivot.Items.Remove(commentsPlaceholder); pivot.Items.Remove(commentsPlaceholder);
else else
{ {
commentsPlaceholder.Header = "Chat"; commentsPlaceholder.Header = resources.GetString("/VideoPage/chat");
commentsPlaceholder.Content = new Chat(item.LiveStreamingDetails.ActiveLiveChatId); commentsPlaceholder.Content = new Chat(item.LiveStreamingDetails.ActiveLiveChatId);
pivot.SelectedItem = commentsPlaceholder; pivot.SelectedItem = commentsPlaceholder;
} }
@@ -284,12 +285,12 @@ namespace FoxTube.Pages
request.Id = videoId; request.Id = videoId;
Video video = (await request.ExecuteAsync()).Items[0]; Video video = (await request.ExecuteAsync()).Items[0];
views.Text = $"{video.LiveStreamingDetails.ConcurrentViewers} viewers"; views.Text = $"{video.LiveStreamingDetails.ConcurrentViewers} {resources.GetString("/Cards/viewers")}";
} }
void LoadStats() void LoadStats()
{ {
views.Text = $"{item.Statistics.ViewCount:0,0} views"; views.Text = $"{item.Statistics.ViewCount:0,0} {resources.GetString("/Cards/views")}";
comments.Initialize(item); comments.Initialize(item);
LoadDownloads(); LoadDownloads();
@@ -313,8 +314,8 @@ namespace FoxTube.Pages
MenuFlyoutItem audioItem = new MenuFlyoutItem() MenuFlyoutItem audioItem = new MenuFlyoutItem()
{ {
Text = "Audio track", Text = resources.GetString("/VideoPage/audio"),
Tag = new object[] { infoSet.Audio[0], "Audio only" } Tag = new object[] { infoSet.Audio[0], resources.GetString("/Cards/audioOnly") }
}; };
audioItem.Click += downloadItemSelected; audioItem.Click += downloadItemSelected;
downloadSelector.Items.Add(audioItem); downloadSelector.Items.Add(audioItem);
@@ -336,7 +337,7 @@ namespace FoxTube.Pages
request.RegionCode = SettingsStorage.Region; request.RegionCode = SettingsStorage.Region;
request.RelevanceLanguage = SettingsStorage.RelevanceLanguage; request.RelevanceLanguage = SettingsStorage.RelevanceLanguage;
request.RelatedToVideoId = videoId; request.RelatedToVideoId = videoId;
request.SafeSearch = (SearchResource.ListRequest.SafeSearchEnum)(int)settings.Values["safeSearch"]; request.SafeSearch = (SearchResource.ListRequest.SafeSearchEnum)SettingsStorage.SafeSearch;
request.MaxResults = 20; request.MaxResults = 20;
request.Type = "video"; request.Type = "video";
@@ -380,8 +381,8 @@ namespace FoxTube.Pages
private async void openBrowser_Click(object sender, RoutedEventArgs e) private async void openBrowser_Click(object sender, RoutedEventArgs e)
{ {
player.Pause(); player.Pause();
string timecode = player.elapsed.TotalSeconds > 10 ? string timecode = player.Elapsed.TotalSeconds > 10 ?
"&t=" + (int)player.elapsed.TotalSeconds + "s" : string.Empty; "&t=" + (int)player.Elapsed.TotalSeconds + "s" : string.Empty;
await Launcher.LaunchUriAsync($"https://www.youtube.com/watch?v={videoId}{timecode}".ToUri()); await Launcher.LaunchUriAsync($"https://www.youtube.com/watch?v={videoId}{timecode}".ToUri());
} }
@@ -433,7 +434,7 @@ namespace FoxTube.Pages
item.Snippet.Thumbnails.Medium.Url, item.Snippet.Thumbnails.Medium.Url,
item.Snippet.Title, item.Snippet.Title,
$"https://www.youtube.com/watch?v={videoId}", $"https://www.youtube.com/watch?v={videoId}",
"video"); resources.GetString("/Cards/videoShare"));
} }
private void share_Click(object sender, RoutedEventArgs e) private void share_Click(object sender, RoutedEventArgs e)
@@ -529,13 +530,13 @@ namespace FoxTube.Pages
{ {
subscribe.Background = new SolidColorBrush(Colors.Transparent); subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray); subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed"; subscribe.Content = resources.GetString("/Cards/unsubscribe");
} }
else else
{ {
subscribe.Background = new SolidColorBrush(Colors.Red); subscribe.Background = new SolidColorBrush(Colors.Red);
subscribe.Foreground = new SolidColorBrush(Colors.White); subscribe.Foreground = new SolidColorBrush(Colors.White);
subscribe.Content = "Subscribe"; subscribe.Content = resources.GetString("/Cards/subscribe/Content");
} }
} }
} }
+189
View File
@@ -0,0 +1,189 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="channel.Text" xml:space="preserve">
<value>View channel</value>
</data>
<data name="channelShare" xml:space="preserve">
<value>channel</value>
</data>
<data name="getLink.Text" xml:space="preserve">
<value>Copy link</value>
</data>
<data name="goesLive" xml:space="preserve">
<value>Goes live in</value>
</data>
<data name="incognitoPlay.Text" xml:space="preserve">
<value>Play incognito</value>
</data>
<data name="live.Text" xml:space="preserve">
<value>LIVE</value>
</data>
<data name="login.Text" xml:space="preserve">
<value>Log in</value>
</data>
<data name="more.Content" xml:space="preserve">
<value>Show more</value>
</data>
<data name="openWeb.Text" xml:space="preserve">
<value>Open in browser</value>
</data>
<data name="play.Text" xml:space="preserve">
<value>Play</value>
</data>
<data name="playlist.Text" xml:space="preserve">
<value>View playlist</value>
</data>
<data name="playlistShare" xml:space="preserve">
<value>playlist</value>
</data>
<data name="share.Text" xml:space="preserve">
<value>Share</value>
</data>
<data name="subscribe.Content" xml:space="preserve">
<value>Subscribe</value>
</data>
<data name="subscribers" xml:space="preserve">
<value>subscribers</value>
</data>
<data name="tomanage.Text" xml:space="preserve">
<value>to manage your subscriptions</value>
</data>
<data name="unsubscribe" xml:space="preserve">
<value>Subscribed</value>
</data>
<data name="upcoming" xml:space="preserve">
<value>Upcoming</value>
</data>
<data name="videos" xml:space="preserve">
<value>videos</value>
</data>
<data name="videoShare" xml:space="preserve">
<value>video</value>
</data>
<data name="viewers" xml:space="preserve">
<value>viewers</value>
</data>
<data name="views" xml:space="preserve">
<value>views</value>
</data>
<data name="watched.Text" xml:space="preserve">
<value>Watched</value>
</data>
</root>
+159
View File
@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="about.Header" xml:space="preserve">
<value>About channel</value>
</data>
<data name="aboutTitle.Text" xml:space="preserve">
<value>About this channel</value>
</data>
<data name="desc.Text" xml:space="preserve">
<value>Description</value>
</data>
<data name="openWeb.Label" xml:space="preserve">
<value>Open in browser</value>
</data>
<data name="playlists.Header" xml:space="preserve">
<value>Playlists</value>
</data>
<data name="playlistTitle.Text" xml:space="preserve">
<value>Playlists</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Refresh</value>
</data>
<data name="regDate.Text" xml:space="preserve">
<value>Registration date:</value>
</data>
<data name="search.PlaceholderText" xml:space="preserve">
<value>Search on channel</value>
</data>
<data name="share.Label" xml:space="preserve">
<value>Share</value>
</data>
<data name="stats.Text" xml:space="preserve">
<value>Statistics</value>
</data>
<data name="videos.Header" xml:space="preserve">
<value>Videos</value>
</data>
<data name="views.Text" xml:space="preserve">
<value>Views:</value>
</data>
</root>
+138
View File
@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="box.PlaceholderText" xml:space="preserve">
<value>Send a message</value>
</data>
<data name="moder" xml:space="preserve">
<value>Moderator</value>
</data>
<data name="owner" xml:space="preserve">
<value>Chat owner</value>
</data>
<data name="sponsor" xml:space="preserve">
<value>Sponsor</value>
</data>
<data name="verified" xml:space="preserve">
<value>Verified</value>
</data>
<data name="welcome.Text" xml:space="preserve">
<value>Welcome to the chat room</value>
</data>
</root>
+45
View File
@@ -117,19 +117,64 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="comments" xml:space="preserve">
<value>comments</value>
</data>
<data name="date.Text" xml:space="preserve"> <data name="date.Text" xml:space="preserve">
<value>Date</value> <value>Date</value>
</data> </data>
<data name="deleteContent" xml:space="preserve">
<value>Are you sure? This action cannot be undone</value>
</data>
<data name="deleteHeader" xml:space="preserve">
<value>Delete comment</value>
</data>
<data name="edit.Text" xml:space="preserve">
<value>Edit</value>
</data>
<data name="edited" xml:space="preserve">
<value>(edited)</value>
</data>
<data name="editorCancel.Content" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="editorDelete.Content" xml:space="preserve">
<value>Delete comment</value>
</data>
<data name="editorSubmin.Content" xml:space="preserve">
<value>Submit</value>
</data>
<data name="failedEdit" xml:space="preserve">
<value>Failed to edit your commentary. Please, try again later.</value>
</data>
<data name="failedReply" xml:space="preserve">
<value>Failed to send your reply. Please, try again later.</value>
</data>
<data name="more.Content" xml:space="preserve"> <data name="more.Content" xml:space="preserve">
<value>Show more</value> <value>Show more</value>
</data> </data>
<data name="no" xml:space="preserve">
<value>No</value>
</data>
<data name="publish" xml:space="preserve">
<value>Publish date</value>
</data>
<data name="relevance.Text" xml:space="preserve"> <data name="relevance.Text" xml:space="preserve">
<value>Relevance</value> <value>Relevance</value>
</data> </data>
<data name="reply.Text" xml:space="preserve">
<value>Reply</value>
</data>
<data name="replyBox.PlaceholderText" xml:space="preserve">
<value>Enter your reply...</value>
</data>
<data name="sortBy.Text" xml:space="preserve"> <data name="sortBy.Text" xml:space="preserve">
<value>Sort by: </value> <value>Sort by: </value>
</data> </data>
<data name="textbox.PlaceholderText" xml:space="preserve"> <data name="textbox.PlaceholderText" xml:space="preserve">
<value>Add a public comment</value> <value>Add a public comment</value>
</data> </data>
<data name="yes" xml:space="preserve">
<value>Yes</value>
</data>
</root> </root>
+177
View File
@@ -0,0 +1,177 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="author" xml:space="preserve">
<value>Author</value>
</data>
<data name="cancel.Content" xml:space="preserve">
<value>Cancel</value>
</data>
<data name="cancelling" xml:space="preserve">
<value>Cancelling...</value>
</data>
<data name="cancellingHeader" xml:space="preserve">
<value>Cancelling download</value>
</data>
<data name="downloading.Text" xml:space="preserve">
<value>Downloading...</value>
</data>
<data name="duration" xml:space="preserve">
<value>Duration</value>
</data>
<data name="ext" xml:space="preserve">
<value>Extension</value>
</data>
<data name="gotoOrign.Content" xml:space="preserve">
<value>Go to original</value>
</data>
<data name="no" xml:space="preserve">
<value>No</value>
</data>
<data name="noItems.Text" xml:space="preserve">
<value>You haven't downloaded anything yet</value>
</data>
<data name="openFile.Content" xml:space="preserve">
<value>Open</value>
</data>
<data name="openFolder.Content" xml:space="preserve">
<value>Open folder</value>
</data>
<data name="prompt" xml:space="preserve">
<value>Are you sure?</value>
</data>
<data name="quality" xml:space="preserve">
<value>Quality</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Refresh</value>
</data>
<data name="toastCanceledHeader" xml:space="preserve">
<value>Download canceled</value>
</data>
<data name="toastCompleteHeader" xml:space="preserve">
<value>Download complete</value>
</data>
<data name="toastStartHeader" xml:space="preserve">
<value>Downloading a video</value>
</data>
<data name="yes" xml:space="preserve">
<value>Yes</value>
</data>
</root>
+6
View File
@@ -198,4 +198,10 @@
<data name="closeApp.Content" xml:space="preserve"> <data name="closeApp.Content" xml:space="preserve">
<value>Close app</value> <value>Close app</value>
</data> </data>
<data name="devNotifications.OffContent" xml:space="preserve">
<value>Recieve messages from developers</value>
</data>
<data name="devNotifications.OnContent" xml:space="preserve">
<value>Recieve messages from developers</value>
</data>
</root> </root>
+132
View File
@@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="recommended.Header" xml:space="preserve">
<value>Recommended</value>
</data>
<data name="refresh" xml:space="preserve">
<value>Refresh page</value>
</data>
<data name="subs.Header" xml:space="preserve">
<value>Subscriptions</value>
</data>
<data name="trending.Header" xml:space="preserve">
<value>Trending</value>
</data>
</root>
+9
View File
@@ -120,9 +120,15 @@
<data name="all.Content" xml:space="preserve"> <data name="all.Content" xml:space="preserve">
<value>All</value> <value>All</value>
</data> </data>
<data name="changelog" xml:space="preserve">
<value>Changelog</value>
</data>
<data name="changelogs.Content" xml:space="preserve"> <data name="changelogs.Content" xml:space="preserve">
<value>Changelogs</value> <value>Changelogs</value>
</data> </data>
<data name="dev" xml:space="preserve">
<value>Developer's message</value>
</data>
<data name="filter.Header" xml:space="preserve"> <data name="filter.Header" xml:space="preserve">
<value>Filter</value> <value>Filter</value>
</data> </data>
@@ -132,4 +138,7 @@
<data name="select.Text" xml:space="preserve"> <data name="select.Text" xml:space="preserve">
<value>Select item from the list</value> <value>Select item from the list</value>
</data> </data>
<data name="whatsnew" xml:space="preserve">
<value>What's new in v</value>
</data>
</root> </root>
+11 -11
View File
@@ -117,37 +117,37 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="checkConnection" xml:space="preserve"> <data name="checkConnection.Text" xml:space="preserve">
<value>Check your internet connection</value> <value>Check your internet connection</value>
</data> </data>
<data name="details" xml:space="preserve"> <data name="details" xml:space="preserve">
<value>Message:</value> <value>Details</value>
</data> </data>
<data name="err" xml:space="preserve"> <data name="err.Text" xml:space="preserve">
<value>We are unable to display the page</value> <value>We are unable to display the page</value>
</data> </data>
<data name="errDescription" xml:space="preserve"> <data name="errDescription.Text" xml:space="preserve">
<value>It could be caused by YouTube internal server error or by application's bug. Please, try again later</value> <value>It could be caused by YouTube internal server error or by application's bug. Please, try again later</value>
</data> </data>
<data name="ex" xml:space="preserve"> <data name="ex" xml:space="preserve">
<value>Exception:</value> <value>Exception</value>
</data> </data>
<data name="feedback" xml:space="preserve"> <data name="feedback.Content" xml:space="preserve">
<value>Report problem</value> <value>Report problem</value>
</data> </data>
<data name="openTroubeshooter" xml:space="preserve"> <data name="openTroubeshooter.Content" xml:space="preserve">
<value>Open troubleshooter</value> <value>Open troubleshooter</value>
</data> </data>
<data name="openWifi" xml:space="preserve"> <data name="openWifi.Content" xml:space="preserve">
<value>Open network settings</value> <value>Open network settings</value>
</data> </data>
<data name="or" xml:space="preserve"> <data name="or.Text" xml:space="preserve">
<value>OR</value> <value>OR</value>
</data> </data>
<data name="refresh" xml:space="preserve"> <data name="refresh.Content" xml:space="preserve">
<value>Refresh page</value> <value>Refresh page</value>
</data> </data>
<data name="wifiDescription" xml:space="preserve"> <data name="wifiDesc.Text" xml:space="preserve">
<value>Please, make sure you are connected to the internet and try again.</value> <value>Please, make sure you are connected to the internet and try again.</value>
</data> </data>
</root> </root>
+33
View File
@@ -117,9 +117,21 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="addLater" xml:space="preserve">
<value>Add to 'Watch later' playlist</value>
</data>
<data name="adsFree.Content" xml:space="preserve"> <data name="adsFree.Content" xml:space="preserve">
<value>Remove ads</value> <value>Remove ads</value>
</data> </data>
<data name="channel" xml:space="preserve">
<value>Channel</value>
</data>
<data name="connectErrContent" xml:space="preserve">
<value>We were unabled to retrieve your account information due to weak internet connection or Google servers' problems. PLease, try again later</value>
</data>
<data name="connectErrHeader" xml:space="preserve">
<value>Failed to connect</value>
</data>
<data name="downloads.Content" xml:space="preserve"> <data name="downloads.Content" xml:space="preserve">
<value>Downloads</value> <value>Downloads</value>
</data> </data>
@@ -138,6 +150,9 @@
<data name="liked.Content" xml:space="preserve"> <data name="liked.Content" xml:space="preserve">
<value>Liked videos</value> <value>Liked videos</value>
</data> </data>
<data name="metered" xml:space="preserve">
<value>"You are on metered connection now. Additional charges may apply. Do you want to continue?"</value>
</data>
<data name="myAccount.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve"> <data name="myAccount.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>My account</value> <value>My account</value>
</data> </data>
@@ -150,9 +165,18 @@
<data name="myLibrary.Content" xml:space="preserve"> <data name="myLibrary.Content" xml:space="preserve">
<value>My library</value> <value>My library</value>
</data> </data>
<data name="no" xml:space="preserve">
<value>No</value>
</data>
<data name="notifications.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve"> <data name="notifications.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Notifications</value> <value>Notifications</value>
</data> </data>
<data name="playlist" xml:space="preserve">
<value>Playlist</value>
</data>
<data name="quit" xml:space="preserve">
<value>Quit</value>
</data>
<data name="searchPlaceholder.PlaceholderText" xml:space="preserve"> <data name="searchPlaceholder.PlaceholderText" xml:space="preserve">
<value>Search</value> <value>Search</value>
</data> </data>
@@ -174,4 +198,13 @@
<data name="subscriptions.Content" xml:space="preserve"> <data name="subscriptions.Content" xml:space="preserve">
<value>Subscriptions</value> <value>Subscriptions</value>
</data> </data>
<data name="tryAgain" xml:space="preserve">
<value>Try again</value>
</data>
<data name="video" xml:space="preserve">
<value>Video</value>
</data>
<data name="yes" xml:space="preserve">
<value>Yes</value>
</data>
</root> </root>
+162
View File
@@ -0,0 +1,162 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="days" xml:space="preserve">
<value>days ago</value>
</data>
<data name="hrs" xml:space="preserve">
<value>hours ago</value>
</data>
<data name="minutes" xml:space="preserve">
<value>minutes ago</value>
</data>
<data name="months" xml:space="preserve">
<value>months ago</value>
</data>
<data name="now" xml:space="preserve">
<value>Just now</value>
</data>
<data name="oneDay" xml:space="preserve">
<value>1 day ago</value>
</data>
<data name="oneHr" xml:space="preserve">
<value>1 hour ago</value>
</data>
<data name="oneMinute" xml:space="preserve">
<value>1 minute ago</value>
</data>
<data name="oneMonth" xml:space="preserve">
<value>1 month ago</value>
</data>
<data name="oneWeek" xml:space="preserve">
<value>1 week ago</value>
</data>
<data name="oneYear" xml:space="preserve">
<value>1 year ago</value>
</data>
<data name="sharing" xml:space="preserve">
<value>Sharing a</value>
</data>
<data name="weeks" xml:space="preserve">
<value>weeks ago</value>
</data>
<data name="years" xml:space="preserve">
<value>years ago</value>
</data>
</root>
+135
View File
@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="addTo.Label" xml:space="preserve">
<value>Add to</value>
</data>
<data name="openWeb.Label" xml:space="preserve">
<value>Open in browser</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Refresh</value>
</data>
<data name="share.Label" xml:space="preserve">
<value>Share</value>
</data>
<data name="videos" xml:space="preserve">
<value>videos</value>
</data>
</root>
+228
View File
@@ -0,0 +1,228 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="all.Content" xml:space="preserve">
<value>All</value>
</data>
<data name="any.Content" xml:space="preserve">
<value>Any</value>
</data>
<data name="anytime.Content" xml:space="preserve">
<value>Anytime</value>
</data>
<data name="apply.Content" xml:space="preserve">
<value>Apply</value>
</data>
<data name="cc.Text" xml:space="preserve">
<value>Creative Commons</value>
</data>
<data name="channel.Content" xml:space="preserve">
<value>Channel</value>
</data>
<data name="duration.Header" xml:space="preserve">
<value>Duration</value>
</data>
<data name="features.Content" xml:space="preserve">
<value>Features</value>
</data>
<data name="featuresHeader.Header" xml:space="preserve">
<value>Features</value>
</data>
<data name="filters.Content" xml:space="preserve">
<value>Show filters </value>
</data>
<data name="found" xml:space="preserve">
<value>Found</value>
</data>
<data name="header" xml:space="preserve">
<value>Search results for:</value>
</data>
<data name="hideFilters" xml:space="preserve">
<value>Hide filters </value>
</data>
<data name="items" xml:space="preserve">
<value>item(s)</value>
</data>
<data name="lasthr.Content" xml:space="preserve">
<value>Last hour</value>
</data>
<data name="live.Text" xml:space="preserve">
<value>Live</value>
</data>
<data name="long.Content" xml:space="preserve">
<value>Long (&gt; 20 minutes)</value>
</data>
<data name="medium.Content" xml:space="preserve">
<value>Medium</value>
</data>
<data name="month.Content" xml:space="preserve">
<value>This month</value>
</data>
<data name="openWeb.Label" xml:space="preserve">
<value>Open in browser</value>
</data>
<data name="order.Header" xml:space="preserve">
<value>Sort by</value>
</data>
<data name="playlist.Content" xml:space="preserve">
<value>Playlist</value>
</data>
<data name="rating.Content" xml:space="preserve">
<value>Rating</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Refresh</value>
</data>
<data name="relevance.Content" xml:space="preserve">
<value>Relevance</value>
</data>
<data name="short.Content" xml:space="preserve">
<value>Short (&lt; 4 minutes)</value>
</data>
<data name="subs.Text" xml:space="preserve">
<value>Subtitles/CC</value>
</data>
<data name="title.Content" xml:space="preserve">
<value>Title</value>
</data>
<data name="today.Content" xml:space="preserve">
<value>Today</value>
</data>
<data name="type.Header" xml:space="preserve">
<value>Type</value>
</data>
<data name="update.Content" xml:space="preserve">
<value>Upload date</value>
</data>
<data name="updateHeader.Header" xml:space="preserve">
<value>Upload date</value>
</data>
<data name="video.Content" xml:space="preserve">
<value>Video</value>
</data>
<data name="views.Content" xml:space="preserve">
<value>View count</value>
</data>
<data name="week.Content" xml:space="preserve">
<value>This week</value>
</data>
<data name="year.Content" xml:space="preserve">
<value>This year</value>
</data>
</root>
@@ -117,28 +117,40 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="description" xml:space="preserve"> <data name="addTo.Label" xml:space="preserve">
<value>You can help us make this app even better by contributing to its development by translating this app. You can choose a brand new language to translate or edit mistakes in existing translations.</value> <value>Add to</value>
</data> </data>
<data name="export" xml:space="preserve"> <data name="audio" xml:space="preserve">
<value>Export to PC (.zip)</value> <value>Audio track</value>
</data> </data>
<data name="guide0" xml:space="preserve"> <data name="audioOnly" xml:space="preserve">
<value>It's quite simple:</value> <value>Audio only</value>
</data> </data>
<data name="guide1" xml:space="preserve"> <data name="chat" xml:space="preserve">
<value>1. Choose language you you want to translate on</value> <value>Chat</value>
</data> </data>
<data name="guide2" xml:space="preserve"> <data name="comments.Header" xml:space="preserve">
<value>2. Import language pack to your PC</value> <value>Comments</value>
</data> </data>
<data name="header" xml:space="preserve"> <data name="desc" xml:space="preserve">
<value>Help us translate this app</value> <value>Description</value>
</data> </data>
<data name="langPlaceholder" xml:space="preserve"> <data name="download.Label" xml:space="preserve">
<value>Choose language...</value> <value>Download video</value>
</data> </data>
<data name="warning" xml:space="preserve"> <data name="openWeb.Label" xml:space="preserve">
<value>Attention! This tool is used to help us to provide our app to more people from other countries. Please, don't send not done language packs. Thanks in advance ;)</value> <value>Open in browser</value>
</data>
<data name="playlist.Header" xml:space="preserve">
<value>Playlist</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Refresh page</value>
</data>
<data name="related.Header" xml:space="preserve">
<value>Suggestons</value>
</data>
<data name="share.Label" xml:space="preserve">
<value>Share</value>
</data> </data>
</root> </root>
+189
View File
@@ -0,0 +1,189 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="channel.Text" xml:space="preserve">
<value>Посмотреть канал</value>
</data>
<data name="channelShare" xml:space="preserve">
<value>каналом</value>
</data>
<data name="getLink.Text" xml:space="preserve">
<value>Скопировать ссылку</value>
</data>
<data name="goesLive" xml:space="preserve">
<value>Начало через</value>
</data>
<data name="incognitoPlay.Text" xml:space="preserve">
<value>Открыть в режиме инкогнито</value>
</data>
<data name="live.Text" xml:space="preserve">
<value>Прямой эфир</value>
</data>
<data name="login.Text" xml:space="preserve">
<value>Войдите</value>
</data>
<data name="more.Content" xml:space="preserve">
<value>Показать еще</value>
</data>
<data name="openWeb.Text" xml:space="preserve">
<value>Открыть в браузере</value>
</data>
<data name="play.Text" xml:space="preserve">
<value>Открыть</value>
</data>
<data name="playlist.Text" xml:space="preserve">
<value>Посмотреть плейлист</value>
</data>
<data name="playlistShare" xml:space="preserve">
<value>плейлистом</value>
</data>
<data name="share.Text" xml:space="preserve">
<value>Поделиться</value>
</data>
<data name="subscribe.Content" xml:space="preserve">
<value>Подписаться</value>
</data>
<data name="subscribers" xml:space="preserve">
<value>подписчиков</value>
</data>
<data name="tomanage.Text" xml:space="preserve">
<value>чтобы управлять подписками</value>
</data>
<data name="unsubscribe" xml:space="preserve">
<value>Вы подписаны</value>
</data>
<data name="upcoming" xml:space="preserve">
<value>Запланирован</value>
</data>
<data name="videos" xml:space="preserve">
<value>видео</value>
</data>
<data name="videoShare" xml:space="preserve">
<value>видео</value>
</data>
<data name="viewers" xml:space="preserve">
<value>зрителей</value>
</data>
<data name="views" xml:space="preserve">
<value>просмотров</value>
</data>
<data name="watched.Text" xml:space="preserve">
<value>Просмотрено</value>
</data>
</root>
+159
View File
@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="about.Header" xml:space="preserve">
<value>О канале</value>
</data>
<data name="aboutTitle.Text" xml:space="preserve">
<value>Об этом канале</value>
</data>
<data name="desc.Text" xml:space="preserve">
<value>Описание</value>
</data>
<data name="openWeb.Label" xml:space="preserve">
<value>Открыть в браузере</value>
</data>
<data name="playlists.Header" xml:space="preserve">
<value>Плейлисты</value>
</data>
<data name="playlistTitle.Text" xml:space="preserve">
<value>Плейлисты</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Обновить</value>
</data>
<data name="regDate.Text" xml:space="preserve">
<value>Дата регистрации:</value>
</data>
<data name="search.PlaceholderText" xml:space="preserve">
<value>Искать на канале</value>
</data>
<data name="share.Label" xml:space="preserve">
<value>Поделиться</value>
</data>
<data name="stats.Text" xml:space="preserve">
<value>Статистика</value>
</data>
<data name="videos.Header" xml:space="preserve">
<value>Видео</value>
</data>
<data name="views.Text" xml:space="preserve">
<value>Просмотры: </value>
</data>
</root>
+138
View File
@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="box.PlaceholderText" xml:space="preserve">
<value>Отправить сообщение</value>
</data>
<data name="moder" xml:space="preserve">
<value>Модератор</value>
</data>
<data name="owner" xml:space="preserve">
<value>Владелец чата</value>
</data>
<data name="sponsor" xml:space="preserve">
<value>Спонсор</value>
</data>
<data name="verified" xml:space="preserve">
<value>Подтвержден</value>
</data>
<data name="welcome.Text" xml:space="preserve">
<value>Добро пожаловать в чат!</value>
</data>
</root>
+180
View File
@@ -0,0 +1,180 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="comments" xml:space="preserve">
<value>комментариев</value>
</data>
<data name="date.Text" xml:space="preserve">
<value>Дате</value>
</data>
<data name="deleteContent" xml:space="preserve">
<value>Вы уверены? Это действие нельзя отменить</value>
</data>
<data name="deleteHeader" xml:space="preserve">
<value>Удалить комментарий</value>
</data>
<data name="edit.Text" xml:space="preserve">
<value>Редактировать</value>
</data>
<data name="edited" xml:space="preserve">
<value>(изменен)</value>
</data>
<data name="editorCancel.Content" xml:space="preserve">
<value>Отмена</value>
</data>
<data name="editorDelete.Content" xml:space="preserve">
<value>Удалить комментарий</value>
</data>
<data name="editorSubmin.Content" xml:space="preserve">
<value>Отправить</value>
</data>
<data name="failedEdit" xml:space="preserve">
<value>Не удалось изменить комментарий. Пожалуйста, попробуйте позже</value>
</data>
<data name="failedReply" xml:space="preserve">
<value>Не удалось отправить ответ. Пожалуйста, попробуйте позже</value>
</data>
<data name="more.Content" xml:space="preserve">
<value>Показать еще</value>
</data>
<data name="no" xml:space="preserve">
<value>Нет</value>
</data>
<data name="publish" xml:space="preserve">
<value>Дате публикации</value>
</data>
<data name="relevance.Text" xml:space="preserve">
<value>Популярности</value>
</data>
<data name="reply.Text" xml:space="preserve">
<value>Ответить</value>
</data>
<data name="replyBox.PlaceholderText" xml:space="preserve">
<value>Введите свой ответ...</value>
</data>
<data name="sortBy.Text" xml:space="preserve">
<value>Сортировать по:</value>
</data>
<data name="textbox.PlaceholderText" xml:space="preserve">
<value>Оставить комментарий</value>
</data>
<data name="yes" xml:space="preserve">
<value>Да</value>
</data>
</root>
+177
View File
@@ -0,0 +1,177 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="author" xml:space="preserve">
<value>Автор</value>
</data>
<data name="cancel.Content" xml:space="preserve">
<value>Отмена</value>
</data>
<data name="cancelling" xml:space="preserve">
<value>Отмена...</value>
</data>
<data name="cancellingHeader" xml:space="preserve">
<value>Отмена загрузки</value>
</data>
<data name="downloading.Text" xml:space="preserve">
<value>Загрузка...</value>
</data>
<data name="duration" xml:space="preserve">
<value>Длительность</value>
</data>
<data name="ext" xml:space="preserve">
<value>Расширение</value>
</data>
<data name="gotoOrign.Content" xml:space="preserve">
<value>Открыть оригинал</value>
</data>
<data name="no" xml:space="preserve">
<value>Нет</value>
</data>
<data name="noItems.Text" xml:space="preserve">
<value>Вы еще ничего не скачивали</value>
</data>
<data name="openFile.Content" xml:space="preserve">
<value>Открыть</value>
</data>
<data name="openFolder.Content" xml:space="preserve">
<value>Открыть папку</value>
</data>
<data name="prompt" xml:space="preserve">
<value>Вы уверены?</value>
</data>
<data name="quality" xml:space="preserve">
<value>Качество</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Обновить</value>
</data>
<data name="toastCanceledHeader" xml:space="preserve">
<value>Загрузка отменена</value>
</data>
<data name="toastCompleteHeader" xml:space="preserve">
<value>Загрузка завершена</value>
</data>
<data name="toastStartHeader" xml:space="preserve">
<value>Загрузка виде</value>
</data>
<data name="yes" xml:space="preserve">
<value>Да</value>
</data>
</root>
+6
View File
@@ -198,4 +198,10 @@
<data name="closeApp.Content" xml:space="preserve"> <data name="closeApp.Content" xml:space="preserve">
<value>Закрыть приложение</value> <value>Закрыть приложение</value>
</data> </data>
<data name="devNotifications.OffContent" xml:space="preserve">
<value>Получать уведомления от разработчиков</value>
</data>
<data name="devNotifications.OnContent" xml:space="preserve">
<value>Получать уведомления от разработчиков</value>
</data>
</root> </root>
+132
View File
@@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="recommended.Header" xml:space="preserve">
<value>Рекомендуемое</value>
</data>
<data name="refresh" xml:space="preserve">
<value>Обновить страницу</value>
</data>
<data name="subs.Header" xml:space="preserve">
<value>Подписки</value>
</data>
<data name="trending.Header" xml:space="preserve">
<value>Популярное</value>
</data>
</root>
+9
View File
@@ -120,9 +120,15 @@
<data name="all.Content" xml:space="preserve"> <data name="all.Content" xml:space="preserve">
<value>Все</value> <value>Все</value>
</data> </data>
<data name="changelog" xml:space="preserve">
<value>Список изменений</value>
</data>
<data name="changelogs.Content" xml:space="preserve"> <data name="changelogs.Content" xml:space="preserve">
<value>"Что нового?"</value> <value>"Что нового?"</value>
</data> </data>
<data name="dev" xml:space="preserve">
<value>Сообщение от разработчиков</value>
</data>
<data name="filter.Header" xml:space="preserve"> <data name="filter.Header" xml:space="preserve">
<value>Фильтр</value> <value>Фильтр</value>
</data> </data>
@@ -132,4 +138,7 @@
<data name="select.Text" xml:space="preserve"> <data name="select.Text" xml:space="preserve">
<value>Выберите сообщение из списка</value> <value>Выберите сообщение из списка</value>
</data> </data>
<data name="whatsnew" xml:space="preserve">
<value>Что нового в версии </value>
</data>
</root> </root>
+11 -11
View File
@@ -117,37 +117,37 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="checkConnection" xml:space="preserve"> <data name="checkConnection.Text" xml:space="preserve">
<value>Проверте интернет-соединение</value> <value>Проверте интернет-соединение</value>
</data> </data>
<data name="details" xml:space="preserve"> <data name="details" xml:space="preserve">
<value>Сообщение:</value> <value>Сообщение</value>
</data> </data>
<data name="err" xml:space="preserve"> <data name="err.Text" xml:space="preserve">
<value>Мы не можем отобразить страницу</value> <value>Мы не можем отобразить страницу</value>
</data> </data>
<data name="errDescription" xml:space="preserve"> <data name="errDescription.Text" xml:space="preserve">
<value>Это может происходить из-за проблем на серверах YouTube или из-за ошибок приложения. Пожалуйста, попробуйте позже</value> <value>Это может происходить из-за проблем на серверах YouTube или из-за ошибок приложения. Пожалуйста, попробуйте позже</value>
</data> </data>
<data name="ex" xml:space="preserve"> <data name="ex" xml:space="preserve">
<value>Ошибка:</value> <value>Ошибка</value>
</data> </data>
<data name="feedback" xml:space="preserve"> <data name="feedback.Content" xml:space="preserve">
<value>Сообщить об ошибке</value> <value>Сообщить об ошибке</value>
</data> </data>
<data name="openTroubeshooter" xml:space="preserve"> <data name="openTroubeshooter.Content" xml:space="preserve">
<value>Устранение неполадок</value> <value>Устранение неполадок</value>
</data> </data>
<data name="openWifi" xml:space="preserve"> <data name="openWifi.Content" xml:space="preserve">
<value>Открыть настройки сети</value> <value>Открыть настройки сети</value>
</data> </data>
<data name="or" xml:space="preserve"> <data name="or.Text" xml:space="preserve">
<value>ИЛИ</value> <value>ИЛИ</value>
</data> </data>
<data name="refresh" xml:space="preserve"> <data name="refresh.Content" xml:space="preserve">
<value>Обновить страницу</value> <value>Обновить страницу</value>
</data> </data>
<data name="wifiDescription" xml:space="preserve"> <data name="wifiDesc.Text" xml:space="preserve">
<value>Пожалуйста, убедитесь, что вы подключены к Интернету и попробуйте обновить страницу</value> <value>Пожалуйста, убедитесь, что вы подключены к Интернету и попробуйте обновить страницу</value>
</data> </data>
</root> </root>
+33
View File
@@ -117,9 +117,21 @@
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="addLater" xml:space="preserve">
<value>Добавить в плейлист 'Посмотреть позже'</value>
</data>
<data name="adsFree.Content" xml:space="preserve"> <data name="adsFree.Content" xml:space="preserve">
<value>Убрать рекламу</value> <value>Убрать рекламу</value>
</data> </data>
<data name="channel" xml:space="preserve">
<value>Канал</value>
</data>
<data name="connectErrContent" xml:space="preserve">
<value>Нам не удалось подключиться к серверу из-за плохого соединения или проблем на стороне YouTube. Пожалуйста, попробуйте позже</value>
</data>
<data name="connectErrHeader" xml:space="preserve">
<value>Не удалось подключиться</value>
</data>
<data name="downloads.Content" xml:space="preserve"> <data name="downloads.Content" xml:space="preserve">
<value>Загрузки</value> <value>Загрузки</value>
</data> </data>
@@ -138,6 +150,9 @@
<data name="liked.Content" xml:space="preserve"> <data name="liked.Content" xml:space="preserve">
<value>Понравившиеся</value> <value>Понравившиеся</value>
</data> </data>
<data name="metered" xml:space="preserve">
<value>"You are on metered connection now. Additional charges may apply. Do you want to continue?"</value>
</data>
<data name="myAccount.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve"> <data name="myAccount.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Мой аккаунт</value> <value>Мой аккаунт</value>
</data> </data>
@@ -150,9 +165,18 @@
<data name="myLibrary.Content" xml:space="preserve"> <data name="myLibrary.Content" xml:space="preserve">
<value>Библиотека</value> <value>Библиотека</value>
</data> </data>
<data name="no" xml:space="preserve">
<value>Нет</value>
</data>
<data name="notifications.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve"> <data name="notifications.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Уведомления</value> <value>Уведомления</value>
</data> </data>
<data name="playlist" xml:space="preserve">
<value>Плейлист</value>
</data>
<data name="quit" xml:space="preserve">
<value>Выйти</value>
</data>
<data name="searchPlaceholder.PlaceholderText" xml:space="preserve"> <data name="searchPlaceholder.PlaceholderText" xml:space="preserve">
<value>Поиск</value> <value>Поиск</value>
</data> </data>
@@ -174,4 +198,13 @@
<data name="subscriptions.Content" xml:space="preserve"> <data name="subscriptions.Content" xml:space="preserve">
<value>Подписки</value> <value>Подписки</value>
</data> </data>
<data name="tryAgain" xml:space="preserve">
<value>Попробовать снова</value>
</data>
<data name="video" xml:space="preserve">
<value>Видео</value>
</data>
<data name="yes" xml:space="preserve">
<value>Да</value>
</data>
</root> </root>
+162
View File
@@ -0,0 +1,162 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="days" xml:space="preserve">
<value>дней назад</value>
</data>
<data name="hrs" xml:space="preserve">
<value>часов назад</value>
</data>
<data name="minutes" xml:space="preserve">
<value>минут назад</value>
</data>
<data name="months" xml:space="preserve">
<value>месяцев назад</value>
</data>
<data name="now" xml:space="preserve">
<value>Только что</value>
</data>
<data name="oneDay" xml:space="preserve">
<value>1 день назад</value>
</data>
<data name="oneHr" xml:space="preserve">
<value>1 час назад</value>
</data>
<data name="oneMinute" xml:space="preserve">
<value>1 минуту назад</value>
</data>
<data name="oneMonth" xml:space="preserve">
<value>1 месяц назад</value>
</data>
<data name="oneWeek" xml:space="preserve">
<value>1 неделю назад</value>
</data>
<data name="oneYear" xml:space="preserve">
<value>1 год назад</value>
</data>
<data name="sharing" xml:space="preserve">
<value>Поделиться</value>
</data>
<data name="weeks" xml:space="preserve">
<value>недель назад</value>
</data>
<data name="years" xml:space="preserve">
<value>лет назад</value>
</data>
</root>
+135
View File
@@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="addTo.Label" xml:space="preserve">
<value>Добавить в</value>
</data>
<data name="openWeb.Label" xml:space="preserve">
<value>Открыть в браузере</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Обновить</value>
</data>
<data name="share.Label" xml:space="preserve">
<value>Поделиться</value>
</data>
<data name="videos" xml:space="preserve">
<value>видео</value>
</data>
</root>
+228
View File
@@ -0,0 +1,228 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="all.Content" xml:space="preserve">
<value>Все</value>
</data>
<data name="any.Content" xml:space="preserve">
<value>Любая</value>
</data>
<data name="anytime.Content" xml:space="preserve">
<value>Любое</value>
</data>
<data name="apply.Content" xml:space="preserve">
<value>Применить</value>
</data>
<data name="cc.Text" xml:space="preserve">
<value>Лицензия Creative Commons</value>
</data>
<data name="channel.Content" xml:space="preserve">
<value>Канал</value>
</data>
<data name="duration.Header" xml:space="preserve">
<value>Длительность</value>
</data>
<data name="features.Content" xml:space="preserve">
<value>Особенности</value>
</data>
<data name="featuresHeader.Header" xml:space="preserve">
<value>Особенности</value>
</data>
<data name="filters.Content" xml:space="preserve">
<value>Показать фильтры </value>
</data>
<data name="found" xml:space="preserve">
<value>Найдено</value>
</data>
<data name="header" xml:space="preserve">
<value>Результаты поиска по запросу</value>
</data>
<data name="hideFilters" xml:space="preserve">
<value>Скрыть фильтры </value>
</data>
<data name="items" xml:space="preserve">
<value>результатов</value>
</data>
<data name="lasthr.Content" xml:space="preserve">
<value>За последний час</value>
</data>
<data name="live.Text" xml:space="preserve">
<value>Прямой эфир</value>
</data>
<data name="long.Content" xml:space="preserve">
<value>Большая (&gt; 20 минут)</value>
</data>
<data name="medium.Content" xml:space="preserve">
<value>Средняя</value>
</data>
<data name="month.Content" xml:space="preserve">
<value>За этот месяц</value>
</data>
<data name="openWeb.Label" xml:space="preserve">
<value>Открыть в браузере</value>
</data>
<data name="order.Header" xml:space="preserve">
<value>Сортировать по</value>
</data>
<data name="playlist.Content" xml:space="preserve">
<value>Плейлист</value>
</data>
<data name="rating.Content" xml:space="preserve">
<value>Рейтингу</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Обновить</value>
</data>
<data name="relevance.Content" xml:space="preserve">
<value>Популярности</value>
</data>
<data name="short.Content" xml:space="preserve">
<value>Короткая (&lt; 4 минут)</value>
</data>
<data name="subs.Text" xml:space="preserve">
<value>Субтитры</value>
</data>
<data name="title.Content" xml:space="preserve">
<value>Названию</value>
</data>
<data name="today.Content" xml:space="preserve">
<value>Сегодня</value>
</data>
<data name="type.Header" xml:space="preserve">
<value>Тип</value>
</data>
<data name="update.Content" xml:space="preserve">
<value>Дате публикации</value>
</data>
<data name="updateHeader.Header" xml:space="preserve">
<value>Дата публикации</value>
</data>
<data name="video.Content" xml:space="preserve">
<value>Видео</value>
</data>
<data name="views.Content" xml:space="preserve">
<value>Количеству просмотров</value>
</data>
<data name="week.Content" xml:space="preserve">
<value>За эту неделю</value>
</data>
<data name="year.Content" xml:space="preserve">
<value>За этот год</value>
</data>
</root>
+156
View File
@@ -0,0 +1,156 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="addTo.Label" xml:space="preserve">
<value>Добавить в</value>
</data>
<data name="audio" xml:space="preserve">
<value>Аудио дорожка</value>
</data>
<data name="audioOnly" xml:space="preserve">
<value>Аудио дорожка</value>
</data>
<data name="chat" xml:space="preserve">
<value>Чат</value>
</data>
<data name="comments.Header" xml:space="preserve">
<value>Комментарии</value>
</data>
<data name="desc" xml:space="preserve">
<value>Описание</value>
</data>
<data name="download.Label" xml:space="preserve">
<value>Скачать видео</value>
</data>
<data name="openWeb.Label" xml:space="preserve">
<value>Открыть в браузере</value>
</data>
<data name="playlist.Header" xml:space="preserve">
<value>Плейлист</value>
</data>
<data name="refresh.Label" xml:space="preserve">
<value>Обновить страницу</value>
</data>
<data name="related.Header" xml:space="preserve">
<value>Похожее</value>
</data>
<data name="share.Label" xml:space="preserve">
<value>Поделиться</value>
</data>
</root>