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>
</Reference>
</ItemGroup>
<ItemGroup />
<PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
<VisualStudioVersion>14.0</VisualStudioVersion>
</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;
namespace FoxTube.Background
{
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)
{
XmlDocument template = new XmlDocument();
@@ -14,8 +43,8 @@ namespace FoxTube.Background
<binding template='ToastGeneric'>
<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'/>
<text>Changelog</text>
<text>See what's new in version {version}</text>
<text>{languagePack["changelog"]}</text>
<text>{languagePack["changelogHeader"]} {version}</text>
</binding>
</visual>
</toast>");
@@ -33,13 +62,13 @@ namespace FoxTube.Background
<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"}'/>
<text>{title}</text>
<text>{channel} uploaded a new video</text>
<text>{channel} {languagePack["videoContent"]}</text>
</binding>
</visual>
<actions>
<action content='Add to Watch later' activationType='background' arguments='later|{id}'/>
<action content='Go to channel' activationType='foreground' arguments='channel|{channelId}'/>
<action content='{languagePack["addLater"]}' activationType='background' arguments='later|{id}'/>
<action content='{languagePack["goChannel"]}' activationType='foreground' arguments='channel|{channelId}'/>
</actions>
</toast>");
+20 -2
View File
@@ -1,7 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<items>
<item time="2018-07-29T23:00:00-03" version="1.0.1">
<content>Announcement body (beware of special characters)</content>
<item time="2019-01-02T10:00:00-03" version="0.2.1901">
<content>### Что нового:
- По умолчанию для карточек загружается максимальное разрешение картинки
- Пофикшен рассинхрон и теперь поддерживаются все возможные разрешения
- Добавлена поддержка прямого эфира (включая чат и обновление зрителей в реальном времени)
- Пофикшен плеер
- Добавлен новый логотип
- Исправлен баг неправильного отображения оставшегося времени если осталось больше часа
- Обновлена локализация
- Контекстное меню карточек
- Мелкие багфиксы
- Обновлена система хранения настроек
- Теперь чейнджлоги будут здесь, а не в файле
### Что по-прежнему не работает:
- Страница рекомендованных видео и страница видео с подписок
- История
- Работа с плейлистами</content>
</item>
</items>
<!--<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.Xml;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Classes
{
@@ -13,6 +14,8 @@ namespace FoxTube.Classes
public string Subject { get; set; }
public string Content { get; set; }
public string Id { get; set; }
private ResourceLoader resources = ResourceLoader.GetForCurrentView("Inbox");
public string Icon
{
@@ -29,9 +32,9 @@ namespace FoxTube.Classes
get
{
if (Type == InboxItemType.PatchNote)
return "Patch note";
return resources.GetString("changelog");
else
return "Developer's message";
return resources.GetString("dev");
}
}
@@ -40,7 +43,7 @@ namespace FoxTube.Classes
get
{
if (Type == InboxItemType.PatchNote)
return $"What's new in v{Id}";
return $"{resources.GetString("whatsnew")}{Id}";
else
return Subject;
}
+40 -14
View File
@@ -10,6 +10,7 @@ using System.Web;
using System.Xml;
using Windows.ApplicationModel.Core;
using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.System;
@@ -24,6 +25,7 @@ namespace FoxTube
{
public static class Methods
{
private static ResourceLoader resources = ResourceLoader.GetForCurrentView("Methods");
public static CommentsPage CommentsPage { get; set; }
public static bool NeedToResponse { get; set; } = false;
@@ -42,6 +44,30 @@ namespace FoxTube
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)
{
array.ToList().ForEach(action);
@@ -94,31 +120,31 @@ namespace FoxTube
TimeSpan span = DateTime.Now - dateTime;
if (span.TotalMinutes < 1)
return "Just now";
return resources.GetString("/Methods/now");
else if (Math.Round(span.TotalMinutes) == 1)
return "1 minute ago";
return resources.GetString("/Methods/oneMinute");
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)
return "1 hour ago";
return resources.GetString("/Methods/oneHr");
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)
return "1 day ago";
return resources.GetString("/Methods/oneDay");
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)
return "1 week ago";
return resources.GetString("/Methods/oneWeek");
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)
return "1 month ago";
return resources.GetString("/Methods/oneMonth");
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)
return "1 year ago";
return resources.GetString("/Methods/oneYear");
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)
@@ -298,7 +324,7 @@ namespace FoxTube
{
DataRequest request = args.Request;
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.SetWebLink(url.ToUri());
+1 -1
View File
@@ -168,7 +168,7 @@ namespace FoxTube
}
//Settings storage
private static readonly ApplicationDataContainer storage = ApplicationData.Current.LocalSettings;
private static readonly ApplicationDataContainer storage = ApplicationData.Current.RoamingSettings;
//Predefined preferences
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"/>
<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="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>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
@@ -43,10 +43,10 @@
</StackPanel>
</Grid>
<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>
<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"/>
</Grid>
</Grid>
@@ -54,11 +54,11 @@
</Button>
<UserControl.ContextFlyout>
<MenuFlyout>
<MenuFlyoutItem Icon="Contact" Text="View channel" Click="Button_Click"/>
<MenuFlyoutItem x:Uid="/Cards/channel" Icon="Contact" Text="View channel" Click="Button_Click"/>
<MenuFlyoutSeparator/>
<MenuFlyoutItem Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/>
<MenuFlyoutItem Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/>
<MenuFlyoutItem Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/>
<MenuFlyoutItem x:Uid="/Cards/getLink" Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/>
<MenuFlyoutItem x:Uid="/Cards/openWeb" Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/>
<MenuFlyoutItem x:Uid="/Cards/share" Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/>
</MenuFlyout>
</UserControl.ContextFlyout>
</UserControl>
+8 -5
View File
@@ -2,6 +2,7 @@
using Google.Apis.YouTube.v3.Data;
using System;
using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
using Windows.System;
using Windows.UI;
using Windows.UI.Xaml;
@@ -16,6 +17,8 @@ namespace FoxTube.Controls
/// </summary>
public sealed partial class ChannelCard : UserControl
{
ResourceLoader resources = ResourceLoader.GetForCurrentView("Cards");
string channelId;
Channel item;
@@ -41,8 +44,8 @@ namespace FoxTube.Controls
title.Text = item.Snippet.Title;
subs.Text = $"{item.Statistics.SubscriberCount:0,0} subscribers";
uploads.Text = $"{item.Statistics.VideoCount:0,0} videos";
subs.Text = $"{item.Statistics.SubscriberCount:0,0} {resources.GetString("/Cards/subscribers")}";
uploads.Text = $"{item.Statistics.VideoCount:0,0} {resources.GetString("/Cards/videos")}";
if (live == "live")
liveTag.Visibility = Visibility.Visible;
@@ -55,7 +58,7 @@ namespace FoxTube.Controls
{
subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed";
subscribe.Content = resources.GetString("/Cards/unsubscribe");
}
}
subscriptionPane.Visibility = Visibility.Visible;
@@ -88,13 +91,13 @@ namespace FoxTube.Controls
{
subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed";
subscribe.Content = resources.GetString("/Cards/unsubscribe");
}
else
{
subscribe.Background = new SolidColorBrush(Colors.Red);
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 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"
Height="32" Width="32"
Margin="0,5,5,0" Padding="0"
@@ -37,10 +37,10 @@
</Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="5,0">
<PersonPicture Height="20" ProfilePicture="{Binding Path=Avatar}"/>
<FontIcon Glyph="&#xEC61;" ToolTipService.ToolTip="Verified" Margin="2,0" Visibility="{Binding Path=IsVerified}"/>
<FontIcon Glyph="&#xEC1B;" ToolTipService.ToolTip="Moderator" Margin="2,0" Visibility="{Binding Path=IsModerator}"/>
<FontIcon Glyph="&#xECA7;" ToolTipService.ToolTip="Chat owner" Margin="2,0" Visibility="{Binding Path=IsOwner}"/>
<FontIcon Glyph="&#xE735;" ToolTipService.ToolTip="Sponsor" Margin="2,0" Visibility="{Binding Path=IsSponsor}"/>
<FontIcon Glyph="&#xEC61;" ToolTipService.ToolTip="{Binding Path=verified}" Margin="2,0" Visibility="{Binding Path=IsVerified}"/>
<FontIcon Glyph="&#xEC1B;" ToolTipService.ToolTip="{Binding Path=moderator}" Margin="2,0" Visibility="{Binding Path=IsModerator}"/>
<FontIcon Glyph="&#xECA7;" ToolTipService.ToolTip="{Binding Path=owner}" Margin="2,0" Visibility="{Binding Path=IsOwner}"/>
<FontIcon Glyph="&#xE735;" ToolTipService.ToolTip="{Binding Path=sponsor}" Margin="2,0" Visibility="{Binding Path=IsSponsor}"/>
</StackPanel>
<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"/>
@@ -52,7 +52,7 @@
</DataTemplate>
</ListView.ItemTemplate>
<ListViewItem>
<TextBlock Text="Welcome to the chat room" Foreground="Gray"/>
<TextBlock x:Uid="/Chat/welcome" Text="Welcome to the chat room" Foreground="Gray"/>
</ListViewItem>
</ListView>
</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;
using Windows.UI;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Controls
{
@@ -60,6 +61,11 @@ namespace FoxTube.Controls
{
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
@@ -122,12 +128,17 @@ namespace FoxTube.Controls
}
};
LiveChatMessagesResource.InsertRequest request = SecretsVault.Service.LiveChatMessages.Insert(message, "snippet");
await request.ExecuteAsync();
LiveChatMessagesResource.InsertRequest request = SecretsVault.Service.LiveChatMessages.Insert(message, "snippet,authorDetails");
LiveChatMessage response = await request.ExecuteAsync();
if(response != null)
{
newMessage.Text = string.Empty;
list.Items.Add(new ChatMessage(response));
}
}
finally
{
newMessage.Text = string.Empty;
newMessage.IsEnabled = true;
send.IsEnabled = true;
}
+6 -6
View File
@@ -36,9 +36,9 @@
<StackPanel Grid.Row="2" Name="editor" Visibility="Collapsed">
<TextBox Name="editorText" Text="[Content]" AcceptsReturn="True" TextWrapping="Wrap" TextChanged="editorText_TextChanged"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,5,0,5">
<Button Content="Delete comment" Background="Red" Name="deleteComment" Click="DeleteComment_Click"/>
<Button Name="editorClose" Content="Cancel" Click="editorClose_Click" Margin="5, 0"/>
<Button Name="editorSend" Content="Submit" Click="editorSend_Click"/>
<Button x:Uid="/CommentsPage/editorDelete" Content="Delete comment" Background="Red" Name="deleteComment" Click="DeleteComment_Click"/>
<Button x:Uid="/CommentsPage/editorCancel" Name="editorClose" Content="Cancel" Click="editorClose_Click" Margin="5, 0"/>
<Button x:Uid="/CommentsPage/editorSubmit" Name="editorSend" Content="Submit" Click="editorSend_Click"/>
</StackPanel>
<ProgressBar Name="editorSending" Foreground="Red" IsIndeterminate="True" Visibility="Collapsed"/>
</StackPanel>
@@ -68,7 +68,7 @@
Height="35">
<StackPanel Orientation="Horizontal">
<TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xEE35;" FontSize="20"/>
<TextBlock Text="Reply"/>
<TextBlock x:Uid="/CommentsPage/reply" Text="Reply"/>
</StackPanel>
</Button>
@@ -77,7 +77,7 @@
Height="35">
<StackPanel Orientation="Horizontal">
<TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xE104;" FontSize="20"/>
<TextBlock Text="Edit"/>
<TextBlock x:Uid="/CommentsPage/edit" Text="Edit"/>
</StackPanel>
</Button>
</StackPanel>
@@ -85,7 +85,7 @@
</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"
PlaceholderText="Enter your reply..."/>
<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.Collections.Generic;
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.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 Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;
using Windows.UI.Xaml.Media.Imaging;
using Windows.System;
using Windows.UI.Popups;
// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
using Windows.ApplicationModel.Resources;
namespace FoxTube.Controls
{
public enum CommentType { TopLevel, Reply }
/// <summary>
/// Control represents video comment entity
/// </summary>
public sealed partial class CommentCard : UserControl
{
ResourceLoader resources = ResourceLoader.GetForCurrentView("CommentsPage");
Comment item;
CommentThread thread;
bool repliesLoaded = false;
@@ -33,7 +28,7 @@ namespace FoxTube.Controls
public CommentCard(CommentThread comment)
{
this.InitializeComponent();
InitializeComponent();
Initialize(comment);
}
@@ -72,7 +67,7 @@ namespace FoxTube.Controls
else
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);
try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.TopLevelComment.Snippet.AuthorProfileImageUrl)); }
@@ -118,7 +113,7 @@ namespace FoxTube.Controls
else
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);
try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.AuthorProfileImageUrl)); }
@@ -209,7 +204,7 @@ namespace FoxTube.Controls
}
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;
reply.IsEnabled = true;
@@ -251,7 +246,7 @@ namespace FoxTube.Controls
}
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;
@@ -277,9 +272,9 @@ namespace FoxTube.Controls
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
{
@@ -288,7 +283,7 @@ namespace FoxTube.Controls
}
catch { }
}));
dialog.Commands.Add(new UICommand("No"));
dialog.Commands.Add(new UICommand(resources.GetString("/CommentsPage/no")));
dialog.CancelCommandIndex = 1;
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">
<StackPanel>
<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>
</Button>
<Button Name="gotoOriginal" Click="gotoOriginal_Click" Width="80" Height="80" Padding="0" Background="Transparent">
<StackPanel>
<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>
</Button>
</StackPanel>
@@ -47,7 +47,7 @@
<TextBlock Name="status" Text="Downloading..." HorizontalAlignment="Left"/>
<ProgressBar Name="progressBar" Width="200" Maximum="1" IsIndeterminate="True" Foreground="Red"/>
<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>
</Grid>
</UserControl>
+21 -18
View File
@@ -15,11 +15,14 @@ using Windows.UI.Popups;
using Windows.UI.Notifications;
using Microsoft.Toolkit.Uwp.Notifications;
using System.Threading.Tasks;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Controls
{
public sealed partial class DownloadItem : UserControl
{
ResourceLoader resources = ResourceLoader.GetForCurrentView("Downloads");
public DownloadItemContainer Container { get; private set; }
public StorageFile file;
public bool InProgress { get; set; } = false;
@@ -62,10 +65,10 @@ namespace FoxTube.Controls
title.Text = Container.Title;
path.Text = file.Name;
thumbnail.Source = new BitmapImage(Container.Thumbnail);
quality.Text = $"Quality: {Container.Quality}";
duration.Text = $"Duration: {Container.Duration}";
channel.Text = $"Author: {Container.Channel}";
ext.Text = $"Extension: {Container.Extension}";
quality.Text = $"{resources.GetString("/Downloads/quality")}: {Container.Quality}";
duration.Text = $"{resources.GetString("/Downloads/duration")}: {Container.Duration}";
channel.Text = $"{resources.GetString("/Downloads/author")}: {Container.Channel}";
ext.Text = $"{resources.GetString("/Downloads/ext")}: {Container.Extension}";
progressPanel.Visibility = Visibility.Collapsed;
donePanel.Visibility = Visibility.Visible;
@@ -93,11 +96,11 @@ namespace FoxTube.Controls
{
Children =
{
new AdaptiveText() { Text = "Downloading a video" },
new AdaptiveText() { Text = resources.GetString("/Downloads/toastStartHeader") },
new AdaptiveProgressBar()
{
Title = meta.Snippet.Title,
Status = "Downloading...",
Status = resources.GetString("/Downloads/downloading/Text"),
Value = new BindableProgressBarValue("value")
}
}
@@ -108,7 +111,7 @@ namespace FoxTube.Controls
{
Buttons =
{
new ToastButton("Cancel", $"dcancel|{Container.Id}")
new ToastButton(resources.GetString("/Downloads/cancel/Content"), $"dcancel|{Container.Id}")
{
ActivationType = ToastActivationType.Background
}
@@ -131,10 +134,10 @@ namespace FoxTube.Controls
thumbnail.Source = new BitmapImage(new Uri(meta.Snippet.Thumbnails.Medium.Url));
title.Text = meta.Snippet.Title;
ext.Text = $"Extension: {info.Container.GetFileExtension()}";
quality.Text = $"Quality: {q}";
duration.Text = $"Duration: {XmlConvert.ToTimeSpan(meta.ContentDetails.Duration)}";
channel.Text = $"Author: {meta.Snippet.ChannelTitle}";
ext.Text = $"{resources.GetString("/Downloads/ext")}: {info.Container.GetFileExtension()}";
quality.Text = $"{resources.GetString("/Downloads/quality")}: {q}";
duration.Text = $"{resources.GetString("/Downloads/duration")}: {XmlConvert.ToTimeSpan(meta.ContentDetails.Duration)}";
channel.Text = $"{resources.GetString("/Downloads/author")}: {meta.Snippet.ChannelTitle}";
path.Text = file.Name;
progressPanel.Visibility = Visibility.Visible;
@@ -170,13 +173,13 @@ namespace FoxTube.Controls
template.LoadXml($@"<toast activationType='background' launch='download|{file.Path}'>
<visual>
<binding template='ToastGeneric'>
<text>Download complete</text>
<text>{resources.GetString("/Downloads/toastCompleteHeader")}</text>
<text>{Container.Title}</text>
</binding>
</visual>
<actions>
<action content='Go to original'
<action content='{resources.GetString("/Downloads/gotoOrign/Content")}'
activationType='foreground'
arguments='video|{Container.Id}'/>
</actions>
@@ -196,7 +199,7 @@ namespace FoxTube.Controls
public async void Cancel()
{
status.Text = "Cancelling...";
status.Text = resources.GetString("/Downloads/cancelling");
progressBar.IsIndeterminate = true;
cancel.IsEnabled = false;
cts.Cancel();
@@ -210,7 +213,7 @@ namespace FoxTube.Controls
template.LoadXml($@"<toast activationType='foreground' launch='download'>
<visual>
<binding template='ToastGeneric'>
<text>Download canceled</text>
<text>{resources.GetString("/Downloads/toastCanceledHeader")}</text>
<text>{Container.Title}</text>
</binding>
</visual>
@@ -224,10 +227,10 @@ namespace FoxTube.Controls
{
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("No"));
dialog.Commands.Add(new UICommand(resources.GetString("/Downloads/yes"), (command) => Cancel()));
dialog.Commands.Add(new UICommand(resources.GetString("/Downloads/no")));
dialog.DefaultCommandIndex = 1;
await dialog.ShowAsync();
+20 -24
View File
@@ -1,10 +1,8 @@
using FoxTube.Classes;
using System;
using System.Collections.Generic;
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using System.Xml;
using Windows.Media;
using YoutubeExplode.Models.ClosedCaptions;
namespace FoxTube.Controls
{
@@ -13,11 +11,18 @@ namespace FoxTube.Controls
/// </summary>
public sealed partial class LiveCaptions : UserControl
{
public double Size
{
get => text.FontSize;
set => text.FontSize = value;
}
public MediaTimelineController Player { get; set; }
private bool isClosed = false;
DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(10) };
List<Caption> captions = new List<Caption>();
Caption currentCaption = null;
ClosedCaption currentCaption = null;
ClosedCaptionTrack track = null;
public LiveCaptions()
{
@@ -31,11 +36,11 @@ namespace FoxTube.Controls
bool found = false;
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;
Visibility = Visibility.Visible;
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();
XmlDocument doc = new XmlDocument();
doc.Load(source);
track = await new YoutubeExplode.YoutubeClient().GetClosedCaptionTrackAsync(info);
if (!isAutoGenerated)
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) =>
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;
Visibility = Visibility.Visible;
}
@@ -77,7 +73,7 @@ namespace FoxTube.Controls
public void Close()
{
captions.Clear();
track = null;
currentCaption = null;
Visibility = Visibility.Collapsed;
timer.Stop();
+5 -5
View File
@@ -50,12 +50,12 @@
</Button>
<UserControl.ContextFlyout>
<MenuFlyout>
<MenuFlyoutItem Icon="List" Text="View playlist" Click="Button_Click"/>
<MenuFlyoutItem Icon="Contact" Text="View channel" Name="openChannel" Click="OpenChannel_Click"/>
<MenuFlyoutItem x:Uid="/Cards/playlist" Icon="List" Text="View playlist" Click="Button_Click"/>
<MenuFlyoutItem x:Uid="/Cards/channel" Icon="Contact" Text="View channel" Name="openChannel" Click="OpenChannel_Click"/>
<MenuFlyoutSeparator/>
<MenuFlyoutItem Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/>
<MenuFlyoutItem Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/>
<MenuFlyoutItem Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/>
<MenuFlyoutItem x:Uid="/Cards/getLink" Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/>
<MenuFlyoutItem x:Uid="/Cards/openWeb" Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/>
<MenuFlyoutItem x:Uid="/Cards/share" Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/>
</MenuFlyout>
</UserControl.ContextFlyout>
</Page>
+1 -1
View File
@@ -8,7 +8,7 @@
mc:Ignorable="d">
<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"/>
</Grid>
</UserControl>
+8 -8
View File
@@ -20,7 +20,7 @@
<Image Name="thumbnail" Source="/Assets/videoThumbSample.png" Stretch="Fill"/>
<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">
<TextBlock Text="Watched" Foreground="Gray" FontSize="12"/>
<TextBlock x:Uid="/Cards/watched" Text="Watched" Foreground="Gray" FontSize="12"/>
</StackPanel>
<ProgressBar VerticalAlignment="Bottom" Margin="54,0,0,0" Foreground="Red" Name="leftOn"/>
</Grid>
@@ -29,7 +29,7 @@
</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">
<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>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
@@ -53,17 +53,17 @@
</Button>
<UserControl.ContextFlyout>
<MenuFlyout>
<MenuFlyoutItem Icon="Play" Text="Play" Name="play" Click="Button_Click"/>
<MenuFlyoutItem Text="Play incognito" Visibility="Collapsed">
<MenuFlyoutItem x:Uid="/Cards/play" Icon="Play" Text="Play" Name="play" Click="Button_Click"/>
<MenuFlyoutItem x:Uid="/Cards/incognitoPlay" Text="Play incognito" Visibility="Collapsed">
<MenuFlyoutItem.Icon>
<FontIcon Glyph="&#xE727;"/>
</MenuFlyoutItem.Icon>
</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/>
<MenuFlyoutItem Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/>
<MenuFlyoutItem Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/>
<MenuFlyoutItem Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/>
<MenuFlyoutItem x:Uid="/Cards/getLink" Icon="Link" Text="Copy link" Name="getLink" Click="GetLink_Click"/>
<MenuFlyoutItem x:Uid="/Cards/openWeb" Icon="Globe" Text="Open in browser" Name="inBrowser" Click="InBrowser_Click"/>
<MenuFlyoutItem x:Uid="/Cards/share" Icon="Share" Text="Share" Name="share" Visibility="Collapsed"/>
<MenuFlyoutSeparator Visibility="Collapsed"/>
<MenuFlyoutItem Icon="Download" Text="Download" Visibility="Collapsed"/>
</MenuFlyout>
+10 -24
View File
@@ -5,8 +5,8 @@ using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;
using Windows.UI.Xaml.Media.Imaging;
using Windows.System;
using Windows.UI.Popups;
using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Controls
{
@@ -15,11 +15,12 @@ namespace FoxTube.Controls
/// </summary>
public sealed partial class VideoCard : UserControl
{
ResourceLoader resources = ResourceLoader.GetForCurrentView("Cards");
public string playlistId;
public string videoId;
Video item;
bool embed = false;
public VideoCard(string id, string playlist = null)
{
InitializeComponent();
@@ -45,7 +46,7 @@ namespace FoxTube.Controls
channelName.Text = item.Snippet.ChannelTitle;
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)
info.Text = $"{item.LiveStreamingDetails.ScheduledEndTime - item.LiveStreamingDetails.ScheduledStartTime} | {Methods.GetAgo(item.LiveStreamingDetails.ActualStartTime.Value)}";
else
@@ -62,14 +63,13 @@ namespace FoxTube.Controls
liveTag.Visibility = Visibility.Visible;
if (item.LiveStreamingDetails.ScheduledStartTime.HasValue && (item.LiveStreamingDetails.ScheduledStartTime - DateTime.Now).Value.TotalMilliseconds > 0)
liveContent.Text = $"Goes live in {item.LiveStreamingDetails.ScheduledStartTime}";
else liveContent.Text = "Upcoming";
liveContent.Text = $"{resources.GetString("/Cards/goesLive")} {item.LiveStreamingDetails.ScheduledStartTime}";
else liveContent.Text = resources.GetString("/Cards/upcoming");
}
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)}";
embed = false;
}
var request1 = SecretsVault.Service.Channels.List("snippet");
@@ -90,23 +90,9 @@ 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);
}
private void ViewChannel_Click(object sender, RoutedEventArgs e)
-10
View File
@@ -76,7 +76,6 @@
</StackPanel>
<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.ColumnDefinitions>
<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"/>
</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>
</UserControl>
+269 -284
View File
@@ -1,17 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Timers;
using Windows.Foundation;
using Windows.UI.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Google.Apis.YouTube.v3.Data;
using Windows.UI.Xaml.Media.Imaging;
using System.Diagnostics;
using Windows.Media;
using Windows.Storage.Streams;
using Windows.UI.ViewManagement;
@@ -26,11 +23,6 @@ using System.Globalization;
using FoxTube.Controls;
using Windows.System;
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;
namespace FoxTube
@@ -40,42 +32,26 @@ namespace FoxTube
public sealed partial class VideoPlayer : UserControl
{
public string videoId;
Video item;
public Video item;
public string avatar;
private bool miniview = false;
public bool MiniView
{
get { return miniview; }
set
{
miniview = value;
if (value)
captions?.Hide();
else
captions?.Show();
}
}
private bool fullScreen = false;
public PlayerLayout layout = PlayerLayout.Normal;
public bool pointerCaptured = false;
Point cursorBackup;
public event ObjectEventHandler SetFullSize;
public event ObjectEventHandler NextClicked;
public event Event NextClicked;
public Button Next => next;
CoreCursor cursorBackup = Window.Current.CoreWindow.PointerCursor;
Point cursorPositionBackup;
public TimeSpan Elapsed { get; set; } = TimeSpan.FromMilliseconds(0);
public TimeSpan Remaining => Total.Subtract(Elapsed);
public TimeSpan Total { get; set; }
public TimeSpan elapsed;
TimeSpan remaining;
TimeSpan total;
string avatar;
double timecodeBackup = 0;
bool needUpdateTimecode = false;
SystemMediaTransportControls systemControls;
LiveCaptions captions;
IReadOnlyList<ClosedCaptionTrackInfo> ccInfo;
MediaStreamInfoSet streamInfo;
@@ -85,6 +61,8 @@ namespace FoxTube
};
DispatcherTimer ctrlsFadeTimer = null;
LiveCaptions captions;
MediaPlayer videoPlayer;
MediaPlayer audioPlayer;
MediaTimelineController controller;
@@ -96,50 +74,43 @@ namespace FoxTube
public void Initialize(Video meta, string channelAvatar)
{
try
Visibility = Visibility.Collapsed;
item = meta;
avatar = channelAvatar;
videoId = item.Id;
if (item.ContentDetails.ContentRating != null)
{
Visibility = Visibility.Collapsed;
item = meta;
avatar = channelAvatar;
videoId = item.Id;
if (item.ContentDetails.ContentRating != null)
if (SecretsVault.IsAuthorized)
{
if(SecretsVault.IsAuthorized)
{
if (SettingsStorage.Mature == MatureState.AllowedOnce)
SettingsStorage.Mature = MatureState.Blocked;
else if(SettingsStorage.Mature == MatureState.Blocked)
{
Visibility = Visibility.Visible;
proceedMature.Visibility = Visibility.Visible;
matureBlock.Visibility = Visibility.Visible;
return;
}
}
else
if (SettingsStorage.Mature == MatureState.AllowedOnce)
SettingsStorage.Mature = MatureState.Blocked;
else if (SettingsStorage.Mature == MatureState.Blocked)
{
Visibility = Visibility.Visible;
signReq.Visibility = Visibility.Visible;
proceedMature.Visibility = Visibility.Visible;
matureBlock.Visibility = Visibility.Visible;
return;
}
}
if (item.Snippet.LiveBroadcastContent == "none")
LoadVideo();
else if (item.Snippet.LiveBroadcastContent == "live")
LoadStream();
else
LoadUpcoming();
{
Visibility = Visibility.Visible;
signReq.Visibility = Visibility.Visible;
matureBlock.Visibility = Visibility.Visible;
return;
}
}
Visibility = Visibility.Visible;
}
catch (Exception e)
{
RaiseError(e);
}
if (item.Snippet.LiveBroadcastContent == "none")
LoadVideo();
else if (item.Snippet.LiveBroadcastContent == "live")
LoadStream();
else
LoadUpcoming();
Visibility = Visibility.Visible;
}
public void InitializeContols()
@@ -150,10 +121,24 @@ namespace FoxTube
videoPlayer.TimelineController = controller;
controller.PositionChanged += UpdateSeek;
videoSource.SetMediaPlayer(videoPlayer);
videoPlayer.MediaOpened += (s, e) =>
videoPlayer.MediaOpened += async (s, e) =>
{
if (SettingsStorage.Autoplay)
controller.Resume();
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)
controller.Resume();
});
};
volume.Value = SettingsStorage.Volume;
@@ -190,7 +175,7 @@ namespace FoxTube
ctrlsFadeTimer = new DispatcherTimer();
ctrlsFadeTimer.Interval = TimeSpan.FromSeconds(5);
ctrlsFadeTimer.Tick += Elapsed;
ctrlsFadeTimer.Tick += ControlsFade;
}
public void LoadUpcoming()
@@ -238,16 +223,14 @@ namespace FoxTube
{
InitializeContols();
captions = grid.Children[2] as LiveCaptions;
captions.Player = controller;
total = XmlConvert.ToTimeSpan(item.ContentDetails.Duration);
seek.Maximum = total.TotalSeconds;
seekIndicator.Maximum = total.TotalSeconds;
Total = XmlConvert.ToTimeSpan(item.ContentDetails.Duration);
seek.Maximum = Total.TotalMilliseconds;
seekIndicator.Maximum = Total.TotalMilliseconds;
elapsed = TimeSpan.FromSeconds(seek.Value);
remaining = total.Subtract(elapsed);
elapsedTime.Text = elapsed.Hours > 0 ? $"{elapsed:hh\\:mm\\:ss}" : $"{elapsed:mm\\:ss}";
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
//Loading streams
@@ -265,16 +248,28 @@ namespace FoxTube
//Loading captions
ccInfo = await new YoutubeClient().GetVideoClosedCaptionTrackInfosAsync(videoId);
foreach (ClosedCaptionTrackInfo cc in ccInfo)
{
subsLang.Items.Add(new ComboBoxItem()
{
Content = string.Format("{0}{1}", CultureInfo.GetCultureInfo(cc.Language.Code).DisplayName, cc.IsAutoGenerated ? " (Auto-generated)" : ""),
Tag = cc
});
}
if (ccInfo.Count > 0)
subsLang.SelectedIndex = 0;
{
foreach (ClosedCaptionTrackInfo cc in ccInfo)
{
subsLang.Items.Add(new ComboBoxItem()
{
Content = string.Format("{0}{1}", CultureInfo.GetCultureInfo(cc.Language.Code).DisplayName, cc.IsAutoGenerated ? " (Auto-generated)" : ""),
Tag = cc
});
if (SettingsStorage.RelevanceLanguage.Contains(cc.Language.Code))
subsLang.SelectedItem = subsLang.Items.Last();
}
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;
}
else
captionsBtn.Visibility = Visibility.Collapsed;
#endregion
@@ -294,19 +289,11 @@ namespace FoxTube
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
seek.Value = controller.Position.TotalSeconds;
seek.Value = controller.Position.TotalMilliseconds;
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)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
@@ -322,29 +309,39 @@ namespace FoxTube
break;
case SystemMediaTransportControlsButton.Next:
NextClicked.Invoke(this, null);
NextClicked?.Invoke();
break;
}
});
}
void Elapsed(object sender, object e)
void ControlsFade(object sender, object e)
{
controls.Visibility = Visibility.Collapsed;
if (!MiniView)
if (layout != PlayerLayout.Minimized)
touchCentral.Visibility = Visibility.Collapsed;
if (pointerCaptured)
Window.Current.CoreWindow.PointerCursor = null;
seekIndicator.Visibility = Visibility.Collapsed;
ctrlsFadeTimer?.Stop();
ctrlsFadeTimer.Stop();
}
public void UpdateSize()
{
if(MiniView)
if(layout == PlayerLayout.Minimized)
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)
{
double v = volume.Value;
@@ -377,75 +374,87 @@ namespace FoxTube
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)
{
if (e.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch && ctrlsFadeTimer != null)
{
touchCentral.Visibility = Visibility.Visible;
if (ctrlsFadeTimer.IsEnabled)
Elapsed(this, null);
ControlsFade(this, null);
else
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)
{
try
{
SettingsStorage.RememberedQuality = ((ComboBoxItem)quality.SelectedItem).Content.ToString();
controller.Pause();
timecodeBackup = controller.Position.TotalSeconds;
if(streamInfo.Muxed.ToList().Exists(x => x.VideoQualityLabel == (quality.SelectedItem as ComboBoxItem).Content.ToString()))
controller.Pause();
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());
audioPlayer = null;
}
else
{
if(audioPlayer == null)
if (audioPlayer == null)
{
audioPlayer = new MediaPlayer();
audioPlayer.TimelineController = controller;
@@ -460,13 +469,9 @@ namespace FoxTube
audioPlayer.Source = MediaSource.CreateFromUri(audioInfo.Url.ToUri());
}
needUpdateTimecode = true;
controller.Resume();
}
catch
{
}
catch { }
}
private void subsSwitch_Toggled(object sender, RoutedEventArgs e)
@@ -482,19 +487,14 @@ namespace FoxTube
void LoadTrack()
{
if (subsSwitch.IsOn)
{
if (ccInfo[subsLang.SelectedIndex].IsAutoGenerated)
captions.Initialize(ccInfo[subsLang.SelectedIndex].Url.Replace("format=3", "format=0"), true);
else
captions.Initialize(ccInfo[subsLang.SelectedIndex].Url);
}
captions.Initialize((subsLang.SelectedItem as ComboBoxItem).Tag as ClosedCaptionTrackInfo);
else
captions?.Close();
}
private void fullscreen_Click(object sender, RoutedEventArgs e)
{
fullScreen = !fullScreen;
bool fullScreen = layout == PlayerLayout.Fullscreen ? false : true;
SetFullSize.Invoke(this, fullScreen);
Methods.MainPage.Fullscreen(fullScreen);
@@ -503,12 +503,14 @@ namespace FoxTube
ApplicationView.GetForCurrentView().TryEnterFullScreenMode();
fullscreen.Content = "\xE1D8";
Height = Methods.MainPage.Height;
layout = PlayerLayout.Fullscreen;
}
else
{
ApplicationView.GetForCurrentView().ExitFullScreenMode();
fullscreen.Content = "\xE1D9";
Height = double.NaN;
layout = PlayerLayout.Normal;
}
}
@@ -524,21 +526,9 @@ namespace FoxTube
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
if (controller.State == MediaTimelineControllerState.Running && needUpdateTimecode)
{
controller.Position = TimeSpan.FromSeconds(timecodeBackup);
needUpdateTimecode = false;
}
switch (controller.State)
switch (sender.State)
{
case MediaTimelineControllerState.Paused:
bufferingBar.Visibility = Visibility.Collapsed;
seek.IsEnabled = true;
play.IsEnabled = true;
touchPlay.IsEnabled = true;
play.Content = "\xE102";
touchPlay.Content = "\xE102";
@@ -546,12 +536,6 @@ namespace FoxTube
break;
case MediaTimelineControllerState.Running:
bufferingBar.Visibility = Visibility.Collapsed;
seek.IsEnabled = true;
play.IsEnabled = true;
touchPlay.IsEnabled = true;
play.Content = "\xE103";
touchPlay.Content = "\xE103";
@@ -559,7 +543,6 @@ namespace FoxTube
break;
default:
bufferingBar.Visibility = Visibility.Collapsed;
systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
break;
}
@@ -571,16 +554,13 @@ namespace FoxTube
private async void miniView_Click(object sender, RoutedEventArgs e)
{
ApplicationViewTitleBar titleBar = ApplicationView.GetForCurrentView().TitleBar;
MiniView = !MiniView;
bool MiniView = layout == PlayerLayout.Minimized ? false : true;
SetFullSize(this, MiniView);
if (MiniView)
{
if (fullScreen)
{
if (layout == PlayerLayout.Fullscreen)
fullscreen.Content = "\xE740";
fullScreen = false;
}
await ApplicationView.GetForCurrentView().TryEnterViewModeAsync(ApplicationViewMode.CompactOverlay);
pointerCaptured = false;
@@ -599,6 +579,11 @@ namespace FoxTube
touchBack10.FontSize = touchFwd30.FontSize = 20;
touchPlay.FontSize = 50;
Methods.MainPage.Fullscreen(true);
layout = PlayerLayout.Minimized;
if(captions != null)
captions.Size = 15;
}
else
{
@@ -615,38 +600,98 @@ namespace FoxTube
Methods.MainPage.Fullscreen(false);
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)
{
elapsed = TimeSpan.FromSeconds(seek.Value);
remaining = total.Subtract(elapsed);
Elapsed = TimeSpan.FromMilliseconds(seek.Value);
elapsedTime.Text = elapsed.Hours > 0 ? $"{elapsed:hh\\:mm\\:ss}" : $"{elapsed:mm\\:ss}";
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}";
}
private void seek_PointerCaptureLost(object sender, PointerRoutedEventArgs e)
{
controller.Position = elapsed;
controller.Position = Elapsed;
}
private void fwd30_Click(object sender, RoutedEventArgs e)
{
if(remaining.TotalSeconds >= 30)
controller.Position = elapsed.Add(TimeSpan.FromSeconds(30));
if(Remaining.TotalSeconds >= 30)
controller.Position = Elapsed.Add(TimeSpan.FromSeconds(30));
}
private void back10_Click(object sender, RoutedEventArgs e)
{
if (elapsed.TotalSeconds >= 10)
controller.Position = elapsed.Subtract(TimeSpan.FromSeconds(10));
if (Elapsed.TotalSeconds >= 10)
controller.Position = Elapsed.Subtract(TimeSpan.FromSeconds(10));
}
private void next_Click(object sender, RoutedEventArgs e)
{
NextClicked.Invoke(this, null);
NextClicked?.Invoke();
}
private void matureDismiss_Click(object sender, RoutedEventArgs e)
@@ -667,106 +712,39 @@ namespace FoxTube
{
controller.Pause();
}
public void minimize_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)
public void close_Click(object sender, RoutedEventArgs e)
{
systemControls.IsEnabled = false;
pointerCaptured = false;
Elapsed(this, null);
controller.Pause();
videoPlayer.Dispose();
audioPlayer?.Dispose();
ctrlsFadeTimer.Stop();
timer?.Stop();
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)
{
if(videoPlayer.Source != null)
if (videoPlayer.Source == null)
return;
controller.Pause();
CastingDevicePicker picker = new CastingDevicePicker();
picker.Filter.SupportsVideo = true;
picker.CastingDeviceSelected += async (s, args) =>
{
if (controller.State != MediaTimelineControllerState.Paused)
controller.Pause();
CastingDevicePicker picker = new CastingDevicePicker();
picker.Filter.SupportsVideo = true;
picker.CastingDeviceSelected += Picker_CastingDeviceSelected;
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);
}
}
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);
picker.Show(new Rect(positinon.X, positinon.Y, cast.ActualWidth, cast.ActualHeight), Windows.UI.Popups.Placement.Below);
}
public void KeyUpPressed(object sender, KeyRoutedEventArgs e)
@@ -774,8 +752,10 @@ namespace FoxTube
switch(e.Key)
{
case VirtualKey.Escape:
if (layout == PlayerLayout.Fullscreen)
fullscreen_Click(this, null);
break;
case VirtualKey.F11:
if (fullScreen)
fullscreen_Click(this, null);
break;
case VirtualKey.Space:
@@ -797,12 +777,17 @@ namespace FoxTube
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">
<DependentUpon>App.xaml</DependentUpon>
</Compile>
<Compile Include="Classes\Caption.cs" />
<Compile Include="Classes\DownloadItemContainer.cs" />
<Compile Include="Classes\InboxItem.cs" />
<Compile Include="Classes\Methods.cs" />
@@ -427,6 +426,25 @@
</ItemGroup>
<ItemGroup>
<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\ru-RU\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\About.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\About.resw" />
<PRIResource Include="Strings\en-US\General.resw" />
+15 -15
View File
@@ -17,7 +17,7 @@
</Grid.RowDefinitions>
<Pivot SelectedIndex="0" Name="content" IsHeaderItemsCarouselEnabled="False" SelectionChanged="content_SelectionChanged">
<PivotItem Header="Videos">
<PivotItem x:Uid="/Channel/videos" Header="Videos">
<ScrollViewer>
<StackPanel Name="videos">
<Image Name="channelCover" Stretch="Uniform" Source="/Assets/ChannelCoverTemplate.png"/>
@@ -35,11 +35,11 @@
<TextBlock Name="videosCount" Foreground="Gray" Text="563,000 videos"/>
</StackPanel>
<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>
<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>
<pages:VideoGrid/>
@@ -47,11 +47,11 @@
</StackPanel>
</ScrollViewer>
</PivotItem>
<PivotItem Header="Playlists">
<PivotItem x:Uid="/Channel/playlists" Header="Playlists">
<ScrollViewer>
<Grid Name="playlists">
<StackPanel Margin="10" Visibility="Visible">
<TextBlock FontSize="28" Text="Playlists"/>
<TextBlock x:Uid="/Channel/playlistTitle" FontSize="28" Text="Playlists"/>
<pages:VideoGrid/>
<controls:ShowMore Clicked="showMorePlaylists_Click"/>
</StackPanel>
@@ -59,10 +59,10 @@
</Grid>
</ScrollViewer>
</PivotItem>
<PivotItem Header="About channel">
<PivotItem x:Uid="/Channel/about" Header="About channel">
<ScrollViewer>
<StackPanel Margin="10">
<TextBlock FontSize="28" Text="About this channel"/>
<TextBlock x:Uid="/Channel/aboutTitle" FontSize="28" Text="About this channel"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
@@ -70,7 +70,7 @@
</Grid.ColumnDefinitions>
<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"/>
</StackPanel>
@@ -85,12 +85,12 @@
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</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="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"/>
</Grid>
</Grid>
@@ -99,14 +99,14 @@
</PivotItem>
<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>
<CommandBar Grid.Row="1" VerticalAlignment="Bottom" Name="commandBar">
<AppBarButton Icon="Globe" Label="Open in browser" Name="inBrowser" Click="inBrowser_Click"/>
<AppBarButton Icon="Refresh" Label="Refresh" Name="refresh" Click="refresh_Click"/>
<AppBarButton Icon="Share" Label="Share" Name="share" Click="share_Click"/>
<AppBarButton x:Uid="/Channel/openWeb" Icon="Globe" Label="Open in browser" Name="inBrowser" Click="inBrowser_Click"/>
<AppBarButton x:Uid="/Channel/refresh" Icon="Refresh" Label="Refresh" Name="refresh" Click="refresh_Click"/>
<AppBarButton x:Uid="/Channel/share" Icon="Share" Label="Share" Name="share" Click="share_Click"/>
</CommandBar>
<local:LoadingPage Grid.RowSpan="2" Visibility="Collapsed"/>
+9 -6
View File
@@ -12,6 +12,7 @@ using FoxTube.Controls;
using Windows.ApplicationModel.DataTransfer;
using Windows.System;
using Windows.UI;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Pages
{
@@ -20,6 +21,8 @@ namespace FoxTube.Pages
/// </summary>
public sealed partial class ChannelPage : Page
{
ResourceLoader resources = ResourceLoader.GetForCurrentView("Cards");
public string channelId;
public Channel item;
@@ -78,8 +81,8 @@ namespace FoxTube.Pages
item = (await request.ExecuteAsync()).Items[0];
title.Text = item.Snippet.Title;
subscribers.Text = $"{item.Statistics.SubscriberCount:0,0} subscribers";
videosCount.Text = $"{item.Statistics.VideoCount:0,0} videos";
subscribers.Text = $"{item.Statistics.SubscriberCount:0,0} {resources.GetString("/Cards/subscribers")}";
videosCount.Text = $"{item.Statistics.VideoCount:0,0} {resources.GetString("/Cards/videos")}";
try
{
@@ -121,7 +124,7 @@ namespace FoxTube.Pages
{
subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed";
subscribe.Content = resources.GetString("/Cards/unsubscribe");
}
subscriptionPane.Visibility = Visibility.Visible;
}
@@ -228,13 +231,13 @@ namespace FoxTube.Pages
{
subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed";
subscribe.Content = resources.GetString("/Cards/unsubscribe");
}
else
{
subscribe.Background = new SolidColorBrush(Colors.Red);
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.Title,
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"/>
<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"/>
<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>
<MenuFlyout>
@@ -44,7 +44,7 @@
<ScrollViewer Grid.Row="1" Name="scroll">
<StackPanel>
<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"/>
</StackPanel>
</ScrollViewer>
+7 -3
View File
@@ -5,6 +5,7 @@ using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;
using FoxTube.Controls;
using Windows.UI.Popups;
using Windows.ApplicationModel.Resources;
namespace FoxTube.Pages
{
@@ -13,6 +14,8 @@ namespace FoxTube.Pages
/// </summary>
public sealed partial class CommentsPage : Page
{
ResourceLoader resources = ResourceLoader.GetForCurrentView("CommentsPage");
string threadId;
string nextPageToken;
@@ -33,7 +36,8 @@ namespace FoxTube.Pages
else
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");
request.Order = order;
@@ -87,7 +91,7 @@ namespace FoxTube.Pages
moreLoading.Visibility = Visibility.Visible;
order = CommentThreadsResource.ListRequest.OrderEnum.Relevance;
orderBtn.Content = "Relevance";
orderBtn.Content = resources.GetString("/CommentsPage/relevance/Text");
placeholder.Children.Clear();
@@ -114,7 +118,7 @@ namespace FoxTube.Pages
moreLoading.Visibility = Visibility.Visible;
order = CommentThreadsResource.ListRequest.OrderEnum.Time;
orderBtn.Content = "Publish date";
orderBtn.Content = resources.GetString("/CommentsPage/publish");
placeholder.Children.Clear();
+3 -3
View File
@@ -21,17 +21,17 @@
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<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>
<ScrollViewer Grid.Row="1">
<StackPanel Name="stack"/>
</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">
<AppBarButton Label="Refresh" Icon="Refresh" Click="Refresh"/>
<AppBarButton x:Uid="/Downloads/refresh" Label="Refresh" Icon="Refresh" Click="Refresh"/>
</CommandBar>
</Grid>
</Page>
+4 -4
View File
@@ -16,12 +16,12 @@
</Grid.RowDefinitions>
<Pivot Name="pivot" SelectionChanged="pivot_SelectionChanged">
<PivotItem Header="Recommended" Name="recommended">
<PivotItem x:Uid="/Home/recommended" Header="Recommended" Name="recommended">
<ScrollViewer>
<StackPanel/>
</ScrollViewer>
</PivotItem>
<PivotItem Header="Trending" Name="trending">
<PivotItem x:Uid="/Home/trending" Header="Trending" Name="trending">
<ScrollViewer>
<StackPanel>
<pages:VideoGrid/>
@@ -29,7 +29,7 @@
</StackPanel>
</ScrollViewer>
</PivotItem>
<PivotItem Header="Subscriptions" Name="subscriptions">
<PivotItem x:Uid="/Home/subs" Header="Subscriptions" Name="subscriptions">
<ScrollViewer>
<StackPanel/>
</ScrollViewer>
@@ -37,7 +37,7 @@
</Pivot>
<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>
<local:LoadingPage Grid.RowSpan="2" Margin="0,50,0,0" Visibility="Visible" RefreshPage="refreshPage"/>
</Grid>
+10 -11
View File
@@ -2,7 +2,6 @@
x:Class="FoxTube.LoadingPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:FoxTube"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
@@ -12,25 +11,25 @@
<StackPanel Name="wifiTrouble" Visibility="Collapsed" VerticalAlignment="Center">
<FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xEB5E;" FontSize="100" HorizontalAlignment="Center"/>
<TextBlock 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/checkConnection" Text="Check your internet connection" FontSize="48" 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">
<Button 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/openWifi" Content="Open network settings" Margin="5" Name="openWifi" Click="openWifi_Click"/>
<Button x:Uid="/LoadingPage/openTroubleshooter" Content="Open troubleshooter" Background="Red" Foreground="White" Margin="5" Name="openTroubleshoot" Click="openTroubleshoot_Click"/>
</StackPanel>
<TextBlock Text="OR" FontSize="20" HorizontalAlignment="Center"/>
<Button Name="wifiRefresh" Click="wifiRefresh_Click" Content="Refresh page" HorizontalAlignment="Center" Background="Red" Foreground="White" Margin="5"/>
<TextBlock x:Uid="/LoadingPage/or" Text="OR" FontSize="20" HorizontalAlignment="Center"/>
<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="wifiMessage" Foreground="Gray" Text="Message:" HorizontalAlignment="Center" IsTextSelectionEnabled="True"/>
</StackPanel>
<StackPanel Name="trouble" Visibility="Collapsed" VerticalAlignment="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 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/err" Text="We are unable to display the page" FontSize="48" 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">
<Button 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/refresh" Name="refresh" Click="wifiRefresh_Click" Content="Refresh page" Margin="5"/>
<Button x:Uid="/LoadingPage/feedback" Content="Leave feedback" Background="Red" Foreground="White" Margin="5" Name="feedback" Click="feedback_Click"/>
</StackPanel>
<TextBlock Name="exception" Foreground="Gray" Text="Exception:" 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.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.ApplicationModel.Resources;
using Windows.UI.Xaml;
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
{
public enum LoadingState { Loadnig, Loaded, Error, Blocked }
/// <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>
public sealed partial class LoadingPage : Page
{
ResourceLoader resources = ResourceLoader.GetForCurrentView("LoadingPage");
public event RoutedEventHandler RefreshPage;
public LoadingState State { get; private set; } = LoadingState.Loadnig;
public LoadingPage()
{
this.InitializeComponent();
InitializeComponent();
}
public void Error(string exceptionId = "Unknown", string details = "N/A", bool isWifiTrouble = false)
@@ -41,15 +31,15 @@ namespace FoxTube
if (isWifiTrouble)
{
wifiException.Text = $"ID: {exceptionId}";
wifiMessage.Text = $"Details: {details}";
wifiException.Text = $"{resources.GetString("/LoadingPage/ex")}: {exceptionId}";
wifiMessage.Text = $"{resources.GetString("/LoadingPage/details")}: {details}";
wifiTrouble.Visibility = Visibility.Visible;
}
else
{
exception.Text = $"ID: {exceptionId}";
message.Text = $"Details: {details}";
exception.Text = $"{resources.GetString("/LoadingPage/ex")}: {exceptionId}";
message.Text = $"{resources.GetString("/LoadingPage/details")}: {details}";
trouble.Visibility = Visibility.Visible;
}
+53 -38
View File
@@ -21,8 +21,9 @@ using System.Net;
using Windows.UI.Popups;
using Windows.Networking.Connectivity;
using Windows.UI.Core;
using System.Threading;
using System.Threading.Tasks;
using Windows.ApplicationModel.Resources;
using Windows.Storage;
using System.IO;
namespace FoxTube
{
@@ -34,18 +35,35 @@ namespace FoxTube
public sealed partial class MainPage : Page
{
Sender s = Sender.None;
ResourceLoader resources = ResourceLoader.GetForCurrentView("Main");
public MainPage()
{
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;
if(SettingsStorage.Version != $"{ver.Major}.{ver.Minor}")
if (SettingsStorage.Version != $"{ver.Major}.{ver.Minor}")
{
try
{
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;
ToastNotificationManager.CreateToastNotifier().Show(FoxTube.Background.Notification.GetChangelogToast(e.GetAttribute("version")));
@@ -57,14 +75,6 @@ namespace FoxTube
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()
@@ -223,13 +233,13 @@ namespace FoxTube
}
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();
}));
dialog.Commands.Add(new UICommand("Quit", (command) =>
dialog.Commands.Add(new UICommand(resources.GetString("/Main/quit"), (command) =>
{
Methods.CloseApp();
}));
@@ -298,15 +308,15 @@ namespace FoxTube
var connection = NetworkInformation.GetInternetConnectionProfile().GetConnectionCost();
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,
CancelCommandIndex = 1
};
dialog.Commands.Add(new UICommand("Yes"));
dialog.Commands.Add(new UICommand("No", (command) => cancel = true));
dialog.Commands.Add(new UICommand(resources.GetString("/Main/yes")));
dialog.Commands.Add(new UICommand(resources.GetString("/Main/no"), (command) => cancel = true));
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
{
@@ -338,6 +348,9 @@ namespace FoxTube
catch { }
if (cancel)
return;
if (videoPlaceholder.Content != null)
(videoPlaceholder.Content as VideoPage).player.close_Click(this, null);
videoPlaceholder.Content = null;
Fullscreen(false);
@@ -396,14 +409,14 @@ namespace FoxTube
Dictionary<Type, Action> switchCase = new Dictionary<Type, Action>()
{
{ typeof(Settings), () => nav.Header = "Settings" },
{ typeof(ChannelPage), () => nav.Header = "Channel" },
{ typeof(PlaylistPage), () => nav.Header = "Playlist" },
{ typeof(Search), () => nav.Header = "Search" },
{ typeof(Subscriptions), () => nav.Header = "Subscriptions" },
{ typeof(History), () => nav.Header = "History" },
{ typeof(Home), () => nav.Header = "Home" },
{ typeof(Downloads), () => nav.Header = "Downloads" }
{ typeof(Settings), () => nav.Header = resources.GetString("/Main/settings/Content") },
{ typeof(ChannelPage), () => nav.Header = resources.GetString("/Main/channel") },
{ typeof(PlaylistPage), () => nav.Header = resources.GetString("/Main/playlist") },
{ typeof(Search), () => nav.Header = resources.GetString("/Main/searchPlaceholder/PlaceholderText") },
{ typeof(Subscriptions), () => nav.Header = resources.GetString("/Main/subscriptions/Content") },
{ typeof(History), () => nav.Header = resources.GetString("/Main/history/Content") },
{ typeof(Home), () => nav.Header = resources.GetString("/Main/home/Content") },
{ typeof(Downloads), () => nav.Header = resources.GetString("/Main/downloads/Content") }
};
if (content.SourcePageType == typeof(Home) || content.SourcePageType == typeof(Settings) || content.SourcePageType == typeof(Subscriptions))
@@ -431,7 +444,7 @@ namespace FoxTube
if (videoPlaceholder.Content != null)
{
nav.Header = "Video";
nav.Header = resources.GetString("/Main/video");
nav.ExpandedModeThresholdWidth = short.MaxValue;
nav.IsPaneOpen = false;
}
@@ -454,7 +467,10 @@ namespace FoxTube
nav.ExpandedModeThresholdWidth = 1008;
nav.Margin = new Thickness(0);
if (videoPlaceholder.Content != null && nav.IsPaneOpen)
{
nav.IsPaneOpen = true;
nav.IsPaneOpen = false;
}
else
{
nav.OpenPaneLength = 300;
@@ -471,7 +487,6 @@ namespace FoxTube
ApplicationView.GetForCurrentView().ExitFullScreenMode();
Fullscreen(false);
}
(videoPlaceholder.Content as VideoPage).player.pointerCaptured = false;
videoPlaceholder.Content = null;
Window.Current.CoreWindow.PointerCursor = new CoreCursor(CoreCursorType.Arrow, 0);
MaximizeVideo();
@@ -551,14 +566,14 @@ namespace FoxTube
{
Dictionary<Type, Action> switchCase = new Dictionary<Type, Action>()
{
{ typeof(Settings), () => nav.Header = "Settings" },
{ typeof(ChannelPage), () => nav.Header = "Channel" },
{ typeof(PlaylistPage), () => nav.Header = "Playlist" },
{ typeof(Search), () => nav.Header = "Search" },
{ typeof(Subscriptions), () => nav.Header = "Subscriptions" },
{ typeof(History), () => nav.Header = "History" },
{ typeof(Home), () => nav.Header = "Home" },
{ typeof(Downloads), () => nav.Header = "Downloads" }
{ typeof(Settings), () => nav.Header = resources.GetString("/Main/settings/Content") },
{ typeof(ChannelPage), () => nav.Header = resources.GetString("/Main/channel") },
{ typeof(PlaylistPage), () => nav.Header = resources.GetString("/Main/playlist") },
{ typeof(Search), () => nav.Header = resources.GetString("/Main/searchPlaceholder/PlaceholderText") },
{ typeof(Subscriptions), () => nav.Header = resources.GetString("/Main/subscriptions/Content") },
{ typeof(History), () => nav.Header = resources.GetString("/Main/history/Content") },
{ typeof(Home), () => nav.Header = resources.GetString("/Main/home/Content") },
{ typeof(Downloads), () => nav.Header = resources.GetString("/Main/downloads/Content") }
};
try { switchCase[e.SourcePageType](); }
+4 -4
View File
@@ -63,16 +63,16 @@
</ScrollViewer>
<CommandBar Grid.Row="2" Grid.ColumnSpan="2">
<AppBarButton Icon="Globe" Label="Open in browser" Name="inBrowser" Click="inBrowser_Click"/>
<AppBarButton Icon="Add" Label="Add to" IsEnabled="False">
<AppBarButton x:Uid="/Playlist/openWeb" Icon="Globe" Label="Open in browser" Name="inBrowser" Click="inBrowser_Click"/>
<AppBarButton x:Uid="/Playlist/addTo" Icon="Add" Label="Add to" IsEnabled="False">
<AppBarButton.Flyout>
<MenuFlyout>
</MenuFlyout>
</AppBarButton.Flyout>
</AppBarButton>
<AppBarButton Icon="Refresh" Label="Refresh" Name="refresh" Click="refresh_Click"/>
<AppBarButton Icon="Share" Label="Share" Name="share" Click="share_Click"/>
<AppBarButton x:Uid="/Playlist/refresh" Icon="Refresh" Label="Refresh" Name="refresh" Click="refresh_Click"/>
<AppBarButton x:Uid="/Playlist/share" Icon="Share" Label="Share" Name="share" Click="share_Click"/>
</CommandBar>
<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 System;
using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
using Windows.Foundation;
using Windows.System;
using Windows.UI.Xaml;
@@ -57,7 +58,7 @@ namespace FoxTube.Pages
item = (await request.ExecuteAsync()).Items[0];
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;
channelName.Text = item.Snippet.ChannelTitle;
@@ -129,7 +130,7 @@ namespace FoxTube.Pages
item.Snippet.Thumbnails.Medium.Url,
item.Snippet.Title,
$"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="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">
<GridView Padding="5" SelectionMode="None">
<ComboBox Name="order" Header="Sort by" Width="150" SelectedIndex="0">
<ComboBoxItem Content="Relevance"/>
<ComboBoxItem Content="Upload date"/>
<ComboBoxItem Content="View count"/>
<ComboBoxItem Content="Rating"/>
<ComboBoxItem Content="Title"/>
<ComboBox x:Uid="/Search/order" Name="order" Header="Sort by" Width="150" SelectedIndex="0">
<ComboBoxItem x:Uid="/Search/relevance" Content="Relevance"/>
<ComboBoxItem x:Uid="/Search/update" Content="Upload date"/>
<ComboBoxItem x:Uid="/Search/views" Content="View count"/>
<ComboBoxItem x:Uid="/Search/rating" Content="Rating"/>
<ComboBoxItem x:Uid="/Search/title" Content="Title"/>
</ComboBox>
<ComboBox Name="type" Header="Type" Width="150" SelectedIndex="0" SelectionChanged="type_SelectionChanged">
<ComboBoxItem Content="All"/>
<ComboBoxItem Content="Video"/>
<ComboBoxItem Content="Channel"/>
<ComboBoxItem Content="Playlist"/>
<ComboBox x:Uid="/Search/type" Name="type" Header="Type" Width="150" SelectedIndex="0" SelectionChanged="type_SelectionChanged">
<ComboBoxItem x:Uid="/Search/all" Content="All"/>
<ComboBoxItem x:Uid="/Search/video" Content="Video"/>
<ComboBoxItem x:Uid="/Search/channel" Content="Channel"/>
<ComboBoxItem x:Uid="/Search/playlist" Content="Playlist"/>
</ComboBox>
<ComboBox Name="date" Header="Upload date" Width="150" SelectedIndex="0">
<ComboBoxItem Content="Anytime"/>
<ComboBoxItem Content="Last hour"/>
<ComboBoxItem Content="Today"/>
<ComboBoxItem Content="This week"/>
<ComboBoxItem Content="This month"/>
<ComboBoxItem Content="This year"/>
<ComboBox x:Uid="/Search/updateHeader" Name="date" Header="Upload date" Width="150" SelectedIndex="0">
<ComboBoxItem x:Uid="/Search/anytime" Content="Anytime"/>
<ComboBoxItem x:Uid="/Search/lasthr" Content="Last hour"/>
<ComboBoxItem x:Uid="/Search/today" Content="Today"/>
<ComboBoxItem x:Uid="/Search/week" Content="This week"/>
<ComboBoxItem x:Uid="/Search/month" Content="This month"/>
<ComboBoxItem x:Uid="/Search/year" Content="This year"/>
</ComboBox>
<ComboBox Visibility="Collapsed" Name="duration" Header="Duration" Width="150" SelectedIndex="0">
<ComboBoxItem Content="Any"/>
<ComboBoxItem Content="Long (&#x3E; 20 minutes)"/>
<ComboBoxItem Content="Medium"/>
<ComboBoxItem Content="Short (&#x3C; 4 minutes)"/>
<ComboBox x:Uid="/Search/duration" Visibility="Collapsed" Name="duration" Header="Duration" Width="150" SelectedIndex="0">
<ComboBoxItem x:Uid="/Search/any" Content="Any"/>
<ComboBoxItem x:Uid="/Search/long" Content="Long (&#x3E; 20 minutes)"/>
<ComboBoxItem x:Uid="/Search/medium" Content="Medium"/>
<ComboBoxItem x:Uid="/Search/short" Content="Short (&#x3C; 4 minutes)"/>
</ComboBox>
</GridView>
<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>
<Flyout>
<ListView Name="features" SelectionMode="Multiple" Header="Features">
<ListView x:Uid="/Search/featuresHeader" Name="features" SelectionMode="Multiple" Header="Features">
<TextBlock Text="HD"/>
<TextBlock Text="3D"/>
<TextBlock Text="Subtitles/CC"/>
<TextBlock Text="Live"/>
<TextBlock Text="Creative Commons"/>
<TextBlock x:Uid="/Search/subs" Text="Subtitles/CC"/>
<TextBlock x:Uid="/Search/live" Text="Live"/>
<TextBlock x:Uid="/Search/cc" Text="Creative Commons"/>
</ListView>
</Flyout>
</Button.Flyout>
</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>
<pages:VideoGrid/>
+7 -5
View File
@@ -8,7 +8,7 @@ using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using Windows.System;
using System.Globalization;
using Windows.ApplicationModel.Resources;
namespace FoxTube
{
@@ -17,6 +17,8 @@ namespace FoxTube
/// </summary>
public sealed partial class Search : Page
{
ResourceLoader resources = ResourceLoader.GetForCurrentView("Search");
public SearchParameters Parameters;
SearchResource.ListRequest request;
string nextToken;
@@ -130,8 +132,8 @@ namespace FoxTube
features.SelectedItems.Add(features.Items[4]);
SearchListResponse response = await request.ExecuteAsync();
searchTerm.Text = $"Search results for: {Parameters.Term}";
resultsCount.Text = $"Found: {SetResults(response.PageInfo.TotalResults)} item(s)";
searchTerm.Text = $"{resources.GetString("/Search/header")} '{Parameters.Term}'";
resultsCount.Text = $"{resources.GetString("/Search/found")}: {SetResults(response.PageInfo.TotalResults)} {resources.GetString("/Search/items")}";
if (!string.IsNullOrWhiteSpace(response.NextPageToken))
nextToken = response.NextPageToken;
else
@@ -158,12 +160,12 @@ namespace FoxTube
if(filters.Visibility == Visibility.Collapsed)
{
filters.Visibility = Visibility.Visible;
toggleFilters.Content = "Hide filters \xE014";
toggleFilters.Content = resources.GetString("/Search/hideFilters");
}
else
{
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"/>
<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"/>
<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);
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.SelectedItem = quality.Items.ToList().Find(i => ((ComboBoxItem)i).Tag.ToString() == SettingsStorage.VideoQuality);
mobileWarning.IsOn = SettingsStorage.CheckConnection;
+7 -17
View File
@@ -2,44 +2,34 @@
using System.Collections.Generic;
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.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 System.Xml;
using Windows.Storage;
using System.Diagnostics;
using Windows.UI.Popups;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238
using System.Xml;
namespace FoxTube.Pages.SettingsPages
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// Page with changelogs and dev messages
/// </summary>
public sealed partial class Inbox : Page
{
List<InboxItem> items = new List<InboxItem>();
public Inbox()
{
this.InitializeComponent();
InitializeComponent();
}
public void LoadItems()
public async void LoadItems()
{
try
{
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)
items.Add(new InboxItem(
e.GetAttribute("version"),
+9 -9
View File
@@ -47,7 +47,7 @@
<StackPanel Orientation="Vertical" Grid.Column="1" Padding="5" VerticalAlignment="Center">
<TextBlock Name="channelName" Text="[Channel name]" FontSize="18"/>
<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>
</Button>
@@ -81,12 +81,12 @@
</ScrollViewer>
<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>
<MenuFlyout x:Name="downloadSelector"/>
</AppBarButton.Flyout>
</AppBarButton>
<AppBarButton Name="addTo" Label="Add to" Icon="Add">
<AppBarButton x:Uid="/VideoPage/addTo" Name="addTo" Label="Add to" Icon="Add">
<AppBarButton.Flyout>
<Flyout>
<ScrollViewer Margin="-12" MaxHeight="300">
@@ -127,14 +127,14 @@
</Flyout>
</AppBarButton.Flyout>
</AppBarButton>
<AppBarButton Name="refresh" Click="refresh_Click" Icon="Refresh" Label="Refresh page"/>
<AppBarButton 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/refresh" Name="refresh" Click="refresh_Click" Icon="Refresh" Label="Refresh page"/>
<AppBarButton x:Uid="/VideoPage/share" Name="share" Click="share_Click" Icon="Share" Label="Share"/>
<AppBarButton x:Uid="/VideoPage/openWeb" Name="openBrowser" Click="openBrowser_Click" Icon="Globe" Label="Open in browser"/>
</CommandBar>
<Grid Grid.Column="1" Name="tabsPlaceholder">
<Pivot Grid.Row="1" Name="pivot" SelectedIndex="0" IsHeaderItemsCarouselEnabled="False">
<PivotItem Header="Suggestions">
<PivotItem x:Uid="/VideoPage/related" Header="Suggestions">
<ScrollViewer>
<StackPanel>
<controls1:Advert/>
@@ -142,10 +142,10 @@
</StackPanel>
</ScrollViewer>
</PivotItem>
<PivotItem Header="Comments" Name="commentsPlaceholder">
<PivotItem x:Uid="/VideoPage/comments" Header="Comments" Name="commentsPlaceholder">
<pages:CommentsPage/>
</PivotItem>
<PivotItem Header="Playlist" Name="playlist">
<PivotItem x:Uid="/VideoPage/playlist" Header="Playlist" Name="playlist">
<ScrollViewer>
<StackPanel>
<StackPanel Padding="8" Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}">
+16 -15
View File
@@ -7,6 +7,7 @@ using System.Diagnostics;
using System.Globalization;
using System.Linq;
using Windows.ApplicationModel.DataTransfer;
using Windows.ApplicationModel.Resources;
using Windows.Foundation;
using Windows.Storage;
using Windows.System;
@@ -43,7 +44,7 @@ namespace FoxTube.Pages
/// </summary>
public sealed partial class VideoPage : Page
{
ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
ResourceLoader resources = ResourceLoader.GetForCurrentView("VideoPage");
public string videoId;
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)
playlistList.SelectedIndex++;
@@ -209,7 +210,7 @@ namespace FoxTube.Pages
channelAvatar.ProfilePicture = new BitmapImage(new Uri(item1.Snippet.Thumbnails.Medium.Url));
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
dislikes.Text = $"{item.Statistics.DislikeCount:0,0}";
@@ -242,7 +243,7 @@ namespace FoxTube.Pages
{
subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed";
subscribe.Content = resources.GetString("/Cards/unsubscribe");
}
}
subscribe.Visibility = Visibility.Visible;
@@ -271,7 +272,7 @@ namespace FoxTube.Pages
pivot.Items.Remove(commentsPlaceholder);
else
{
commentsPlaceholder.Header = "Chat";
commentsPlaceholder.Header = resources.GetString("/VideoPage/chat");
commentsPlaceholder.Content = new Chat(item.LiveStreamingDetails.ActiveLiveChatId);
pivot.SelectedItem = commentsPlaceholder;
}
@@ -284,12 +285,12 @@ namespace FoxTube.Pages
request.Id = videoId;
Video video = (await request.ExecuteAsync()).Items[0];
views.Text = $"{video.LiveStreamingDetails.ConcurrentViewers} viewers";
views.Text = $"{video.LiveStreamingDetails.ConcurrentViewers} {resources.GetString("/Cards/viewers")}";
}
void LoadStats()
{
views.Text = $"{item.Statistics.ViewCount:0,0} views";
views.Text = $"{item.Statistics.ViewCount:0,0} {resources.GetString("/Cards/views")}";
comments.Initialize(item);
LoadDownloads();
@@ -313,8 +314,8 @@ namespace FoxTube.Pages
MenuFlyoutItem audioItem = new MenuFlyoutItem()
{
Text = "Audio track",
Tag = new object[] { infoSet.Audio[0], "Audio only" }
Text = resources.GetString("/VideoPage/audio"),
Tag = new object[] { infoSet.Audio[0], resources.GetString("/Cards/audioOnly") }
};
audioItem.Click += downloadItemSelected;
downloadSelector.Items.Add(audioItem);
@@ -336,7 +337,7 @@ namespace FoxTube.Pages
request.RegionCode = SettingsStorage.Region;
request.RelevanceLanguage = SettingsStorage.RelevanceLanguage;
request.RelatedToVideoId = videoId;
request.SafeSearch = (SearchResource.ListRequest.SafeSearchEnum)(int)settings.Values["safeSearch"];
request.SafeSearch = (SearchResource.ListRequest.SafeSearchEnum)SettingsStorage.SafeSearch;
request.MaxResults = 20;
request.Type = "video";
@@ -380,8 +381,8 @@ namespace FoxTube.Pages
private async void openBrowser_Click(object sender, RoutedEventArgs e)
{
player.Pause();
string timecode = player.elapsed.TotalSeconds > 10 ?
"&t=" + (int)player.elapsed.TotalSeconds + "s" : string.Empty;
string timecode = player.Elapsed.TotalSeconds > 10 ?
"&t=" + (int)player.Elapsed.TotalSeconds + "s" : string.Empty;
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.Title,
$"https://www.youtube.com/watch?v={videoId}",
"video");
resources.GetString("/Cards/videoShare"));
}
private void share_Click(object sender, RoutedEventArgs e)
@@ -529,13 +530,13 @@ namespace FoxTube.Pages
{
subscribe.Background = new SolidColorBrush(Colors.Transparent);
subscribe.Foreground = new SolidColorBrush(Colors.Gray);
subscribe.Content = "Subscribed";
subscribe.Content = resources.GetString("/Cards/unsubscribe");
}
else
{
subscribe.Background = new SolidColorBrush(Colors.Red);
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">
<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>comments</value>
</data>
<data name="date.Text" xml:space="preserve">
<value>Date</value>
</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">
<value>Show more</value>
</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">
<value>Relevance</value>
</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">
<value>Sort by: </value>
</data>
<data name="textbox.PlaceholderText" xml:space="preserve">
<value>Add a public comment</value>
</data>
<data name="yes" xml:space="preserve">
<value>Yes</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>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">
<value>Close app</value>
</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>
+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">
<value>All</value>
</data>
<data name="changelog" xml:space="preserve">
<value>Changelog</value>
</data>
<data name="changelogs.Content" xml:space="preserve">
<value>Changelogs</value>
</data>
<data name="dev" xml:space="preserve">
<value>Developer's message</value>
</data>
<data name="filter.Header" xml:space="preserve">
<value>Filter</value>
</data>
@@ -132,4 +138,7 @@
<data name="select.Text" xml:space="preserve">
<value>Select item from the list</value>
</data>
<data name="whatsnew" xml:space="preserve">
<value>What's new in v</value>
</data>
</root>
+11 -11
View File
@@ -117,37 +117,37 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="checkConnection" xml:space="preserve">
<data name="checkConnection.Text" xml:space="preserve">
<value>Check your internet connection</value>
</data>
<data name="details" xml:space="preserve">
<value>Message:</value>
<value>Details</value>
</data>
<data name="err" xml:space="preserve">
<data name="err.Text" xml:space="preserve">
<value>We are unable to display the page</value>
</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>
</data>
<data name="ex" xml:space="preserve">
<value>Exception:</value>
<value>Exception</value>
</data>
<data name="feedback" xml:space="preserve">
<data name="feedback.Content" xml:space="preserve">
<value>Report problem</value>
</data>
<data name="openTroubeshooter" xml:space="preserve">
<data name="openTroubeshooter.Content" xml:space="preserve">
<value>Open troubleshooter</value>
</data>
<data name="openWifi" xml:space="preserve">
<data name="openWifi.Content" xml:space="preserve">
<value>Open network settings</value>
</data>
<data name="or" xml:space="preserve">
<data name="or.Text" xml:space="preserve">
<value>OR</value>
</data>
<data name="refresh" xml:space="preserve">
<data name="refresh.Content" xml:space="preserve">
<value>Refresh page</value>
</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>
</data>
</root>
+33
View File
@@ -117,9 +117,21 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="addLater" xml:space="preserve">
<value>Add to 'Watch later' playlist</value>
</data>
<data name="adsFree.Content" xml:space="preserve">
<value>Remove ads</value>
</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">
<value>Downloads</value>
</data>
@@ -138,6 +150,9 @@
<data name="liked.Content" xml:space="preserve">
<value>Liked videos</value>
</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">
<value>My account</value>
</data>
@@ -150,9 +165,18 @@
<data name="myLibrary.Content" xml:space="preserve">
<value>My library</value>
</data>
<data name="no" xml:space="preserve">
<value>No</value>
</data>
<data name="notifications.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Notifications</value>
</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">
<value>Search</value>
</data>
@@ -174,4 +198,13 @@
<data name="subscriptions.Content" xml:space="preserve">
<value>Subscriptions</value>
</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>
+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">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="description" 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>
<data name="addTo.Label" xml:space="preserve">
<value>Add to</value>
</data>
<data name="export" xml:space="preserve">
<value>Export to PC (.zip)</value>
<data name="audio" xml:space="preserve">
<value>Audio track</value>
</data>
<data name="guide0" xml:space="preserve">
<value>It's quite simple:</value>
<data name="audioOnly" xml:space="preserve">
<value>Audio only</value>
</data>
<data name="guide1" xml:space="preserve">
<value>1. Choose language you you want to translate on</value>
<data name="chat" xml:space="preserve">
<value>Chat</value>
</data>
<data name="guide2" xml:space="preserve">
<value>2. Import language pack to your PC</value>
<data name="comments.Header" xml:space="preserve">
<value>Comments</value>
</data>
<data name="header" xml:space="preserve">
<value>Help us translate this app</value>
<data name="desc" xml:space="preserve">
<value>Description</value>
</data>
<data name="langPlaceholder" xml:space="preserve">
<value>Choose language...</value>
<data name="download.Label" xml:space="preserve">
<value>Download video</value>
</data>
<data name="warning" 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>
<data name="openWeb.Label" xml:space="preserve">
<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>
</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">
<value>Закрыть приложение</value>
</data>
<data name="devNotifications.OffContent" xml:space="preserve">
<value>Получать уведомления от разработчиков</value>
</data>
<data name="devNotifications.OnContent" xml:space="preserve">
<value>Получать уведомления от разработчиков</value>
</data>
</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">
<value>Все</value>
</data>
<data name="changelog" xml:space="preserve">
<value>Список изменений</value>
</data>
<data name="changelogs.Content" xml:space="preserve">
<value>"Что нового?"</value>
</data>
<data name="dev" xml:space="preserve">
<value>Сообщение от разработчиков</value>
</data>
<data name="filter.Header" xml:space="preserve">
<value>Фильтр</value>
</data>
@@ -132,4 +138,7 @@
<data name="select.Text" xml:space="preserve">
<value>Выберите сообщение из списка</value>
</data>
<data name="whatsnew" xml:space="preserve">
<value>Что нового в версии </value>
</data>
</root>
+11 -11
View File
@@ -117,37 +117,37 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="checkConnection" xml:space="preserve">
<data name="checkConnection.Text" xml:space="preserve">
<value>Проверте интернет-соединение</value>
</data>
<data name="details" xml:space="preserve">
<value>Сообщение:</value>
<value>Сообщение</value>
</data>
<data name="err" xml:space="preserve">
<data name="err.Text" xml:space="preserve">
<value>Мы не можем отобразить страницу</value>
</data>
<data name="errDescription" xml:space="preserve">
<data name="errDescription.Text" xml:space="preserve">
<value>Это может происходить из-за проблем на серверах YouTube или из-за ошибок приложения. Пожалуйста, попробуйте позже</value>
</data>
<data name="ex" xml:space="preserve">
<value>Ошибка:</value>
<value>Ошибка</value>
</data>
<data name="feedback" xml:space="preserve">
<data name="feedback.Content" xml:space="preserve">
<value>Сообщить об ошибке</value>
</data>
<data name="openTroubeshooter" xml:space="preserve">
<data name="openTroubeshooter.Content" xml:space="preserve">
<value>Устранение неполадок</value>
</data>
<data name="openWifi" xml:space="preserve">
<data name="openWifi.Content" xml:space="preserve">
<value>Открыть настройки сети</value>
</data>
<data name="or" xml:space="preserve">
<data name="or.Text" xml:space="preserve">
<value>ИЛИ</value>
</data>
<data name="refresh" xml:space="preserve">
<data name="refresh.Content" xml:space="preserve">
<value>Обновить страницу</value>
</data>
<data name="wifiDescription" xml:space="preserve">
<data name="wifiDesc.Text" xml:space="preserve">
<value>Пожалуйста, убедитесь, что вы подключены к Интернету и попробуйте обновить страницу</value>
</data>
</root>
+33
View File
@@ -117,9 +117,21 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="addLater" xml:space="preserve">
<value>Добавить в плейлист 'Посмотреть позже'</value>
</data>
<data name="adsFree.Content" xml:space="preserve">
<value>Убрать рекламу</value>
</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">
<value>Загрузки</value>
</data>
@@ -138,6 +150,9 @@
<data name="liked.Content" xml:space="preserve">
<value>Понравившиеся</value>
</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">
<value>Мой аккаунт</value>
</data>
@@ -150,9 +165,18 @@
<data name="myLibrary.Content" xml:space="preserve">
<value>Библиотека</value>
</data>
<data name="no" xml:space="preserve">
<value>Нет</value>
</data>
<data name="notifications.[using:Windows.UI.Xaml.Controls]ToolTipService.ToolTip" xml:space="preserve">
<value>Уведомления</value>
</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">
<value>Поиск</value>
</data>
@@ -174,4 +198,13 @@
<data name="subscriptions.Content" xml:space="preserve">
<value>Подписки</value>
</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>
+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>