Implement incomplete i18n

This commit is contained in:
Victor Tran 2020-08-05 16:19:38 +10:00
parent fdc29c2094
commit d2dd56ca4e
11 changed files with 340 additions and 21 deletions

View file

@ -14,6 +14,9 @@ namespace FRESHMusicPlayer
{
void App_Startup(object sender, StartupEventArgs e )
{
//Force Viet for the time being
//System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("vi-VN");
MainWindow window = new MainWindow();
window.Show();
}

View file

@ -88,6 +88,11 @@
<Compile Include="Pages\TrackInfoPage.xaml.cs">
<DependentUpon>TrackInfoPage.xaml</DependentUpon>
</Compile>
<Compile Include="Properties\Resources.vi.Designer.cs">
<DependentUpon>Resources.vi.resx</DependentUpon>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="Resources\SkinResourceDictionary.cs" />
<Page Include="Handlers\Notifications\NotificationBox.xaml">
<SubType>Designer</SubType>
@ -185,8 +190,12 @@
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.vi.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.vi.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="app.manifest" />

View file

@ -3,6 +3,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:resx = "clr-namespace:FRESHMusicPlayer_WPF_UI_Test.Properties"
mc:Ignorable="d"
Title="FRESHMusicPlayer 8 Development" Height="512" Width="702" Closed="Window_Closed" PreviewKeyDown="Window_PreviewKeyDown" DragOver="Window_DragOver" Drop="Window_Drop" AllowDrop="True">
<Window.Resources>
@ -24,7 +25,7 @@
<DockPanel Background="#FF0C6C08">
<!--Menu-->
<DockPanel x:Name="MainBar" Height="25" DockPanel.Dock="Top" Background="{StaticResource NavBarColor}" >
<TextBlock x:Name="TracksTab" TextWrapping="NoWrap" Text="Tracks" FontSize="16" VerticalAlignment="Center" Foreground="{StaticResource PrimaryTextColor}" DockPanel.Dock="Left" Margin="10,0,10,0" MouseDown="TracksTab_MouseDown">
<TextBlock x:Name="TracksTab" TextWrapping="NoWrap" Text="{x:Static resx:Resources.MAINWINDOW_TRACKS}" FontSize="16" VerticalAlignment="Center" Foreground="{StaticResource PrimaryTextColor}" DockPanel.Dock="Left" Margin="10,0,10,0" MouseDown="TracksTab_MouseDown">
<!--<TextBlock.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
@ -47,7 +48,7 @@
</TextBlock.Triggers>-->
</TextBlock>
<Rectangle VerticalAlignment="Stretch" Width="1" Margin="2,5" Stroke="#FFDADADA" DockPanel.Dock="Left"/>
<TextBlock x:Name="ArtistsTab" TextWrapping="NoWrap" Text="Artists" FontSize="16" VerticalAlignment="Center" Foreground="{StaticResource PrimaryTextColor}" DockPanel.Dock="Left" Margin="10,0" MouseDown="ArtistsTab_MouseDown">
<TextBlock x:Name="ArtistsTab" TextWrapping="NoWrap" Text="{x:Static resx:Resources.MAINWINDOW_ARTISTS}" FontSize="16" VerticalAlignment="Center" Foreground="{StaticResource PrimaryTextColor}" DockPanel.Dock="Left" Margin="10,0" MouseDown="ArtistsTab_MouseDown">
<!--<TextBlock.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
@ -70,7 +71,7 @@
</TextBlock.Triggers>-->
</TextBlock>
<Rectangle VerticalAlignment="Stretch" Width="1" Margin="2,5" Stroke="#FFDADADA" DockPanel.Dock="Left"/>
<TextBlock x:Name="AlbumsTab" TextWrapping="NoWrap" Text="Albums" FontSize="16" VerticalAlignment="Center" Foreground="{StaticResource PrimaryTextColor}" DockPanel.Dock="Left" Margin="10,0" MouseDown="AlbumsTab_MouseDown">
<TextBlock x:Name="AlbumsTab" TextWrapping="NoWrap" Text="{x:Static resx:Resources.MAINWINDOW_ALBUMS}" FontSize="16" VerticalAlignment="Center" Foreground="{StaticResource PrimaryTextColor}" DockPanel.Dock="Left" Margin="10,0" MouseDown="AlbumsTab_MouseDown">
<!--<TextBlock.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
@ -93,7 +94,7 @@
</TextBlock.Triggers>-->
</TextBlock>
<Rectangle VerticalAlignment="Stretch" Width="1" Margin="2,5" Stroke="#FFDADADA" DockPanel.Dock="Left"/>
<TextBlock x:Name="ImportTab" TextWrapping="NoWrap" Text="Import" FontSize="16" VerticalAlignment="Center" Foreground="{StaticResource PrimaryTextColor}" DockPanel.Dock="Left" Margin="10,0" MouseDown="ImportTab_MouseDown">
<TextBlock x:Name="ImportTab" TextWrapping="NoWrap" Text="{x:Static resx:Resources.MAINWINDOW_IMPORT}" FontSize="16" VerticalAlignment="Center" Foreground="{StaticResource PrimaryTextColor}" DockPanel.Dock="Left" Margin="10,0" MouseDown="ImportTab_MouseDown">
<!--<TextBlock.Triggers>
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>

View file

@ -184,7 +184,7 @@ namespace FRESHMusicPlayer
Track track = new Track(Player.FilePath);
Title = $"{track.Artist} - {track.Title} | FRESHMusicPlayer 8 Development";
TitleLabel.Text = track.Title;
ArtistLabel.Text = track.Artist == "" ? "No Artist" : track.Artist;
ArtistLabel.Text = track.Artist == "" ? FRESHMusicPlayer_WPF_UI_Test.Properties.Resources.MAINWINDOW_NOARTIST : track.Artist;
ProgressBar.Maximum = Player.CurrentBackend.TotalTime.TotalSeconds;
ProgressIndicator2.Text = Player.CurrentBackend.TotalTime.ToString(@"mm\:ss");
@ -203,7 +203,7 @@ namespace FRESHMusicPlayer
}
private void player_songException(object sender, PlaybackExceptionEventArgs e)
{
NotificationHandler.Add(new NotificationBox(new NotificationInfo("A playback error occured", $"{e.Details}\nWe'll skip to the next track for you", true, true)));
NotificationHandler.Add(new NotificationBox(new NotificationInfo("A playback error occured", String.Format(FRESHMusicPlayer_WPF_UI_Test.Properties.Resources.MAINWINDOW_PLAYBACK_ERROR_DETAILS, e.Details), true, true)));
Player.NextSong();
}
#endregion

View file

@ -4,6 +4,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:FRESHMusicPlayer_WPF_UI_Test.Pages"
xmlns:resx = "clr-namespace:FRESHMusicPlayer_WPF_UI_Test.Properties"
mc:Ignorable="d"
d:DesignHeight="372" d:DesignWidth="694"
Title="ImportPage">
@ -20,11 +21,11 @@
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock TextWrapping="Wrap" Text="Import" Foreground="{StaticResource PrimaryTextColor}" FontWeight="Bold" FontSize="30" Margin="15,15,5,0" VerticalAlignment="Top" Height="40"/>
<Button x:Name="BrowseTracksButton" Content="Browse for tracks" Margin="15,5,5,5" Grid.Row="1" TextBlock.FontSize="16" Click="BrowseTracksButton_Click"/>
<Button x:Name="BrowsePlaylistsButton" Content="Browse for playlist files" Margin="15,5,5,5" Grid.Row="2" TextBlock.FontSize="16" Click="BrowsePlaylistsButton_Click"/>
<Button x:Name="BrowseFoldersButton" Content="Browse for folders" Margin="15,5,5,5" Grid.Row="3" TextBlock.FontSize="16" Click="BrowseFoldersButton_Click"/>
<TextBlock Text="You can also drag and drop to this page." Foreground="{StaticResource PrimaryTextColor}" TextWrapping="Wrap" Margin="15,5,5,0" Grid.Row="4" VerticalAlignment="Top" FontSize="16" Height="43"/>
<TextBlock TextWrapping="Wrap" Text="{x:Static resx:Resources.MAINWINDOW_IMPORT}" Foreground="{StaticResource PrimaryTextColor}" FontWeight="Bold" FontSize="30" Margin="15,15,5,0" VerticalAlignment="Top" Height="40"/>
<Button x:Name="BrowseTracksButton" Content="{x:Static resx:Resources.IMPORT_BROWSE_TRACKS}" Margin="15,5,5,5" Grid.Row="1" TextBlock.FontSize="16" Click="BrowseTracksButton_Click"/>
<Button x:Name="BrowsePlaylistsButton" Content="{x:Static resx:Resources.IMPORT_BROWSE_PLAYLIST}" Margin="15,5,5,5" Grid.Row="2" TextBlock.FontSize="16" Click="BrowsePlaylistsButton_Click"/>
<Button x:Name="BrowseFoldersButton" Content="{x:Static resx:Resources.IMPORT_BROWSE_FOLDERS}" Margin="15,5,5,5" Grid.Row="3" TextBlock.FontSize="16" Click="BrowseFoldersButton_Click"/>
<TextBlock Text="{x:Static resx:Resources.IMPORT_DRAGDROP_PROMPT}" Foreground="{StaticResource PrimaryTextColor}" TextWrapping="Wrap" Margin="15,5,5,0" Grid.Row="4" VerticalAlignment="Top" FontSize="16" Height="43"/>
</Grid>
</Page>

View file

@ -42,8 +42,8 @@ namespace FRESHMusicPlayer_WPF_UI_Test.Pages
{
if (!File.Exists(s))
{
MainWindow.NotificationHandler.Add(new NotificationBox(new NotificationInfo("Missing file",
$"One of the tracks in your playlist file could not be imported because one or more of the tracks could not be found.\nMissing File: {s}",
MainWindow.NotificationHandler.Add(new NotificationBox(new NotificationInfo(Properties.Resources.NOTIFICATION_COULD_NOT_IMPORT_PLAYLIST,
$"This playlist file could not be imported because one or more of the tracks could not be found.\nMissing File: {s}",
true,
true)));
continue;

View file

@ -4,6 +4,7 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:FRESHMusicPlayer_WPF_UI_Test.Pages"
xmlns:resx = "clr-namespace:FRESHMusicPlayer_WPF_UI_Test.Properties"
mc:Ignorable="d"
d:DesignHeight="372" d:DesignWidth="235"
Title="NotificationPage" Unloaded="Page_Unloaded">
@ -14,8 +15,8 @@
</Grid.RowDefinitions>
<ListBox x:Name="NotificationList" ScrollViewer.HorizontalScrollBarVisibility="Disabled" HorizontalContentAlignment="Stretch" VirtualizingPanel.IsVirtualizing="True" Background="{StaticResource SecondaryColor}" Grid.Row="1" BorderBrush="{x:Null}">
</ListBox>
<TextBlock TextWrapping="Wrap" Text="Notifications" Foreground="White" FontWeight="Bold" FontSize="18" Margin="5,5,116,5"/>
<TextBlock Text="Clear all" Foreground="White" FontSize="10" Margin="191,10,6,8" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>
<TextBlock TextWrapping="Wrap" Text="{x:Static resx:Resources.NOTIFICATIONS_TITLE}" Foreground="White" FontWeight="Bold" FontSize="18" Margin="5,5,116,5"/>
<TextBlock Text="{x:Static resx:Resources.NOTIFICATIONS_CLEAR_ALL}" Foreground="White" FontSize="10" Margin="0,10,6,8" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" HorizontalAlignment="Right"/>
</Grid>
</Page>

View file

@ -22,7 +22,7 @@ namespace FRESHMusicPlayer_WPF_UI_Test.Properties {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
public class Resources {
private static global::System.Resources.ResourceManager resourceMan;
@ -36,7 +36,7 @@ namespace FRESHMusicPlayer_WPF_UI_Test.Properties {
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("FRESHMusicPlayer_WPF_UI_Test.Properties.Resources", typeof(Resources).Assembly);
@ -51,7 +51,7 @@ namespace FRESHMusicPlayer_WPF_UI_Test.Properties {
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
@ -59,5 +59,123 @@ namespace FRESHMusicPlayer_WPF_UI_Test.Properties {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized string similar to Browse for folders.
/// </summary>
public static string IMPORT_BROWSE_FOLDERS {
get {
return ResourceManager.GetString("IMPORT_BROWSE_FOLDERS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Browse for playlist files.
/// </summary>
public static string IMPORT_BROWSE_PLAYLIST {
get {
return ResourceManager.GetString("IMPORT_BROWSE_PLAYLIST", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Browse for tracks.
/// </summary>
public static string IMPORT_BROWSE_TRACKS {
get {
return ResourceManager.GetString("IMPORT_BROWSE_TRACKS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to You can also drag and drop to this page..
/// </summary>
public static string IMPORT_DRAGDROP_PROMPT {
get {
return ResourceManager.GetString("IMPORT_DRAGDROP_PROMPT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Albums.
/// </summary>
public static string MAINWINDOW_ALBUMS {
get {
return ResourceManager.GetString("MAINWINDOW_ALBUMS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Artists.
/// </summary>
public static string MAINWINDOW_ARTISTS {
get {
return ResourceManager.GetString("MAINWINDOW_ARTISTS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Import.
/// </summary>
public static string MAINWINDOW_IMPORT {
get {
return ResourceManager.GetString("MAINWINDOW_IMPORT", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to No Artist.
/// </summary>
public static string MAINWINDOW_NOARTIST {
get {
return ResourceManager.GetString("MAINWINDOW_NOARTIST", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to {0}
///We&apos;ll skip to the next track for you.
/// </summary>
public static string MAINWINDOW_PLAYBACK_ERROR_DETAILS {
get {
return ResourceManager.GetString("MAINWINDOW_PLAYBACK_ERROR_DETAILS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Tracks.
/// </summary>
public static string MAINWINDOW_TRACKS {
get {
return ResourceManager.GetString("MAINWINDOW_TRACKS", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Missing File.
/// </summary>
public static string NOTIFICATION_COULD_NOT_IMPORT_PLAYLIST {
get {
return ResourceManager.GetString("NOTIFICATION_COULD_NOT_IMPORT_PLAYLIST", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Clear All.
/// </summary>
public static string NOTIFICATIONS_CLEAR_ALL {
get {
return ResourceManager.GetString("NOTIFICATIONS_CLEAR_ALL", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Notifications.
/// </summary>
public static string NOTIFICATIONS_TITLE {
get {
return ResourceManager.GetString("NOTIFICATIONS_TITLE", resourceCulture);
}
}
}
}

View file

@ -117,6 +117,44 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="IMPORT_BROWSE_FOLDERS" xml:space="preserve">
<value>Browse for folders</value>
</data>
<data name="IMPORT_BROWSE_PLAYLIST" xml:space="preserve">
<value>Browse for playlist files</value>
</data>
<data name="IMPORT_BROWSE_TRACKS" xml:space="preserve">
<value>Browse for tracks</value>
</data>
<data name="IMPORT_DRAGDROP_PROMPT" xml:space="preserve">
<value>You can also drag and drop to this page.</value>
</data>
<data name="MAINWINDOW_ALBUMS" xml:space="preserve">
<value>Albums</value>
</data>
<data name="MAINWINDOW_ARTISTS" xml:space="preserve">
<value>Artists</value>
</data>
<data name="MAINWINDOW_IMPORT" xml:space="preserve">
<value>Import</value>
</data>
<data name="MAINWINDOW_NOARTIST" xml:space="preserve">
<value>No Artist</value>
</data>
<data name="MAINWINDOW_PLAYBACK_ERROR_DETAILS" xml:space="preserve">
<value>{0}
We'll skip to the next track for you</value>
</data>
<data name="MAINWINDOW_TRACKS" xml:space="preserve">
<value>Tracks</value>
</data>
<data name="NOTIFICATIONS_CLEAR_ALL" xml:space="preserve">
<value>Clear All</value>
</data>
<data name="NOTIFICATIONS_TITLE" xml:space="preserve">
<value>Notifications</value>
</data>
<data name="NOTIFICATION_COULD_NOT_IMPORT_PLAYLIST" xml:space="preserve">
<value>Missing File</value>
</data>
</root>

View file

@ -0,0 +1,148 @@
<?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="MAINWINDOW_ALBUMS" xml:space="preserve">
<value>Đĩa</value>
</data>
<data name="MAINWINDOW_ARTISTS" xml:space="preserve">
<value>Nghệ Sĩ</value>
</data>
<data name="MAINWINDOW_IMPORT" xml:space="preserve">
<value>Nhập</value>
</data>
<data name="MAINWINDOW_NOARTIST" xml:space="preserve">
<value>Không có nghệ sĩ {0} {2} {1}</value>
</data>
<data name="MAINWINDOW_PLAYBACK_ERROR_DETAILS" xml:space="preserve">
<value>{0}
Chúng tôi sẽ nhảy tiếp cho bạn</value>
</data>
<data name="MAINWINDOW_TRACKS" xml:space="preserve">
<value>Bài Hát</value>
</data>
<data name="NOTIFICATIONS_CLEAR_ALL" xml:space="preserve">
<value>Xóa Tất Cả</value>
</data>
<data name="NOTIFICATIONS_TITLE" xml:space="preserve">
<value>Thông Báo</value>
</data>
<data name="NOTIFICATION_COULD_NOT_IMPORT_PLAYLIST" xml:space="preserve">
<value>Không thể nhập hàng phát</value>
</data>
</root>