diff --git a/DotNetRu.App/App.xaml b/DotNetRu.App/App.xaml new file mode 100644 index 00000000..6856002b --- /dev/null +++ b/DotNetRu.App/App.xaml @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/DotNetRu.App/App.xaml.cs b/DotNetRu.App/App.xaml.cs new file mode 100644 index 00000000..a663a7fc --- /dev/null +++ b/DotNetRu.App/App.xaml.cs @@ -0,0 +1,14 @@ +namespace DotNetRu.App +{ + public partial class App : Application + { + public App() + { + InitializeComponent(); + + // DependencyService.Register(); + + MainPage = new AppShell(); + } + } +} diff --git a/DotNetRu.App/AppShell.xaml b/DotNetRu.App/AppShell.xaml new file mode 100644 index 00000000..625eeaf9 --- /dev/null +++ b/DotNetRu.App/AppShell.xaml @@ -0,0 +1,14 @@ + + + + + + diff --git a/DotNetRu.App/AppShell.xaml.cs b/DotNetRu.App/AppShell.xaml.cs new file mode 100644 index 00000000..066ca02a --- /dev/null +++ b/DotNetRu.App/AppShell.xaml.cs @@ -0,0 +1,10 @@ +namespace DotNetRu.App +{ + public partial class AppShell : Shell + { + public AppShell() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/DotNetRu.App/BasePages/AppPage.cs b/DotNetRu.App/BasePages/AppPage.cs new file mode 100644 index 00000000..178febb6 --- /dev/null +++ b/DotNetRu.App/BasePages/AppPage.cs @@ -0,0 +1,52 @@ +namespace DotNetRu.Clients.Portable.Model +{ + public class DeepLinkPage + { + public AppPage Page { get; set; } + + public string Id { get; set; } + } + + public enum AppPage + { + News, + + Meetup, + + Speakers, + + Meetups, + + Friends, + + Settings, + + Talk, + + Speaker, + + Friend, + + Event, + + Notification, + + SocialPostImage, + + Filter, + + Information, + + SocialPost, + + Feedback, + + ConferenceFeedback, + + SpeakerFace, + + Subscriptions + } +} + + diff --git a/DotNetRu.App/BasePages/BasePage.cs b/DotNetRu.App/BasePages/BasePage.cs new file mode 100644 index 00000000..14ff180d --- /dev/null +++ b/DotNetRu.App/BasePages/BasePage.cs @@ -0,0 +1,29 @@ +namespace DotNetRu.Clients.UI.Pages +{ + using System.Diagnostics; + using DotNetRu.Clients.Portable.Interfaces; + using DotNetRu.Clients.Portable.Model; + + public abstract class BasePage : ContentPage, IProvidePageInfo + { + private Stopwatch appeared; + + public abstract AppPage PageType { get; } + + protected string ItemId { get; set; } + + protected override void OnAppearing() + { + this.appeared = Stopwatch.StartNew(); + // App.Logger.TrackPage(this.PageType.ToString(), this.ItemId); + + base.OnAppearing(); + } + + protected override void OnDisappearing() + { + // App.Logger.TrackTimeSpent(this.PageType.ToString(), this.ItemId, TimeSpan.FromTicks(DateTime.UtcNow.Ticks).Subtract(this.appeared.Elapsed)); + base.OnDisappearing(); + } + } +} diff --git a/DotNetRu.App/BasePages/ILocalize.cs b/DotNetRu.App/BasePages/ILocalize.cs new file mode 100644 index 00000000..68657929 --- /dev/null +++ b/DotNetRu.App/BasePages/ILocalize.cs @@ -0,0 +1,11 @@ +namespace DotNetRu.Clients.Portable.Interfaces +{ + using System.Globalization; + + public interface ILocalize + { + CultureInfo GetCurrentCultureInfo(); + + void SetLocale(CultureInfo cultureInfo); + } +} diff --git a/DotNetRu.App/BasePages/IProvidePageInfo.cs b/DotNetRu.App/BasePages/IProvidePageInfo.cs new file mode 100644 index 00000000..58cff567 --- /dev/null +++ b/DotNetRu.App/BasePages/IProvidePageInfo.cs @@ -0,0 +1,10 @@ +using DotNetRu.Clients.Portable.Model; + +namespace DotNetRu.Clients.Portable.Interfaces +{ + public interface IProvidePageInfo + { + AppPage PageType { get; } + } +} + diff --git a/DotNetRu.App/BasePages/MenuItem.cs b/DotNetRu.App/BasePages/MenuItem.cs new file mode 100644 index 00000000..9326f895 --- /dev/null +++ b/DotNetRu.App/BasePages/MenuItem.cs @@ -0,0 +1,28 @@ +using System.Windows.Input; + +using MvvmHelpers; + +namespace DotNetRu.Clients.Portable.Model +{ + public class MenuItem : ObservableObject + { + private string name; + + public string Name + { + get => this.name; + set => this.SetProperty(ref this.name, value); + } + + public string Icon {get; set; } + + public ImageSource ImageSource { get; set; } + + public string Parameter {get; set; } + + public AppPage Page { get; set; } + + public ICommand Command {get; set; } + } +} + diff --git a/DotNetRu.App/BasePages/NavigationService.cs b/DotNetRu.App/BasePages/NavigationService.cs new file mode 100644 index 00000000..e3646b35 --- /dev/null +++ b/DotNetRu.App/BasePages/NavigationService.cs @@ -0,0 +1,45 @@ +namespace DotNetRu.Clients.UI.Helpers +{ + /// + /// Helper navigation service to use so we don't push multiple pages at the same time. + /// + public static class NavigationService + { + static bool navigating; + + /// + /// PUsh a page async + /// + /// awaitable task. + /// Navigation. + /// Page. + /// If set to true animate. + public static async Task PushAsync(INavigation navigation, Page page, bool animate = true) + { + if (navigating) + return; + + navigating = true; + await navigation.PushAsync(page, animate); + navigating = false; + } + + /// + /// Push a page modal async + /// + /// awaitable task. + /// Navigation. + /// Page. + /// If set to true animate. + public static async Task PushModalAsync(INavigation navigation, Page page, bool animate = true) + { + if (navigating) + return; + + navigating = true; + await navigation.PushModalAsync(page, animate); + navigating = false; + } + } +} + diff --git a/DotNetRu.App/DotNetRu.App.csproj b/DotNetRu.App/DotNetRu.App.csproj new file mode 100644 index 00000000..7dc217d6 --- /dev/null +++ b/DotNetRu.App/DotNetRu.App.csproj @@ -0,0 +1,72 @@ + + + + net7.0-android;net7.0-ios; + Exe + DotNetRu.App + true + true + enable + + + DotNetRu + + + com.pfedotovsky.dotnetru + c5ee66b3-443f-4a42-b8cb-934376c46de4 + + + 1.0 + 1 + + 11.0 + 21.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AppResources.resx + True + True + + + + + + AppResources.resx + AppResources.Designer.cs + PublicResXFileCodeGenerator + + + AppResources.ru.resx + + + + diff --git a/DotNetRu.App/Localization/AppResources.Designer.cs b/DotNetRu.App/Localization/AppResources.Designer.cs new file mode 100644 index 00000000..0c1e4064 --- /dev/null +++ b/DotNetRu.App/Localization/AppResources.Designer.cs @@ -0,0 +1,818 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DotNetRu.App.Localization { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class AppResources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal AppResources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DotNetRu.App.Localization.AppResources", typeof(AppResources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to About. + /// + public static string About { + get { + return ResourceManager.GetString("About", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to About App. + /// + public static string AboutApp { + get { + return ResourceManager.GetString("AboutApp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to About DotNetRu. + /// + public static string AboutDotNetRu { + get { + return ResourceManager.GetString("AboutDotNetRu", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Russian .NET community is a group of independent communities of .NET developers from Russia. We unite people around .Net platform to contribute to the experience and knowledge exchange. We hold meetings regularly to share news and best practices in software development! Find our more at . + /// + public static string AboutText { + get { + return ResourceManager.GetString("AboutText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abstract. + /// + public static string Abstract { + get { + return ResourceManager.GetString("Abstract", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Added to calendar. + /// + public static string AddedToCalendar { + get { + return ResourceManager.GetString("AddedToCalendar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add to Calendar. + /// + public static string AddToCalendar { + get { + return ResourceManager.GetString("AddToCalendar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All day. + /// + public static string AllDay { + get { + return ResourceManager.GetString("AllDay", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Biography. + /// + public static string Biography { + get { + return ResourceManager.GetString("Biography", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calendar. + /// + public static string Calendar { + get { + return ResourceManager.GetString("Calendar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + public static string Cancel { + get { + return ResourceManager.GetString("Cancel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Code from Session. + /// + public static string CodeFromSession { + get { + return ResourceManager.GetString("CodeFromSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copied. + /// + public static string Copied { + get { + return ResourceManager.GetString("Copied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copied to clipboard. + /// + public static string CopiedToClipboard { + get { + return ResourceManager.GetString("CopiedToClipboard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Created by DotNetRu Team with <3. + /// + public static string CreatedBy { + get { + return ResourceManager.GetString("CreatedBy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The DotNetRu mobile app was handcrafted by DotNetRu, based on the great work done by Xamarin. + /// + ///DotNetRu Team + /// + ///Pavel Fedotovsky + ///Anatoly Kulakov + ///Yury Belousov + ///Sergey Polezhaev + ///Nikolay Chebotov. + /// + public static string Credits { + get { + return ResourceManager.GetString("Credits", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DotNetRu. + /// + public static string DotNetRu { + get { + return ResourceManager.GetString("DotNetRu", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ekaterinburg. + /// + public static string EkbDotNet { + get { + return ResourceManager.GetString("EkbDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter search term. + /// + public static string Enter_search_term { + get { + return ResourceManager.GetString("Enter search term", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter speaker fullname. + /// + public static string Enter_speaker_fullname { + get { + return ResourceManager.GetString("Enter speaker fullname", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error occured. + /// + public static string ErrorOccured { + get { + return ResourceManager.GetString("ErrorOccured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Follow. + /// + public static string Follow { + get { + return ResourceManager.GetString("Follow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Friend. + /// + public static string Friend { + get { + return ResourceManager.GetString("Friend", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Friends. + /// + public static string Friends { + get { + return ResourceManager.GetString("Friends", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Report an issue. + /// + public static string IssueTracker { + get { + return ResourceManager.GetString("IssueTracker", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Krasnoyarsk. + /// + public static string Krasnoyarsk { + get { + return ResourceManager.GetString("Krasnoyarsk", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Krasnodar. + /// + public static string KrdDotNet { + get { + return ResourceManager.GetString("KrdDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Krasnoyarsk. + /// + public static string KryDotNet { + get { + return ResourceManager.GetString("KryDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Kazan. + /// + public static string KznDotNet { + get { + return ResourceManager.GetString("KznDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Language. + /// + public static string Language { + get { + return ResourceManager.GetString("Language", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Links. + /// + public static string Links { + get { + return ResourceManager.GetString("Links", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading Social Feed.... + /// + public static string Loading { + get { + return ResourceManager.GetString("Loading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading Friends.... + /// + public static string LoadingFriends { + get { + return ResourceManager.GetString("LoadingFriends", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading meetups.... + /// + public static string LoadingMeetups { + get { + return ResourceManager.GetString("LoadingMeetups", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading Speakers.... + /// + public static string LoadingSpeakers { + get { + return ResourceManager.GetString("LoadingSpeakers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading Subscriptions.... + /// + public static string LoadingSubscriptions { + get { + return ResourceManager.GetString("LoadingSubscriptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading talks.... + /// + public static string LoadingTalks { + get { + return ResourceManager.GetString("LoadingTalks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Materials. + /// + public static string Materials { + get { + return ResourceManager.GetString("Materials", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Meetup. + /// + public static string Meetup { + get { + return ResourceManager.GetString("Meetup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Meetups. + /// + public static string Meetups { + get { + return ResourceManager.GetString("Meetups", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Moscow. + /// + public static string MskDotNet { + get { + return ResourceManager.GetString("MskDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to News. + /// + public static string News { + get { + return ResourceManager.GetString("News", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nizhny Novgorod. + /// + public static string NnvDotNet { + get { + return ResourceManager.GetString("NnvDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No talks found. + /// + public static string NoTalksFound { + get { + return ResourceManager.GetString("NoTalksFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Novosibirsk. + /// + public static string NskDotNet { + get { + return ResourceManager.GetString("NskDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Omsk. + /// + public static string OmsDotNet { + get { + return ResourceManager.GetString("OmsDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open Source Notice. + /// + public static string OpenSourceNotice { + get { + return ResourceManager.GetString("OpenSourceNotice", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Our communities. + /// + public static string OurCommunities { + get { + return ResourceManager.GetString("OurCommunities", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Penza. + /// + public static string PnzDotNet { + get { + return ResourceManager.GetString("PnzDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Presentation Slides. + /// + public static string PresentationSlides { + get { + return ResourceManager.GetString("PresentationSlides", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Privacy Policy. + /// + public static string PrivacyPolicy { + get { + return ResourceManager.GetString("PrivacyPolicy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removed from calendar. + /// + public static string RemovedFromCalendar { + get { + return ResourceManager.GetString("RemovedFromCalendar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove from Calendar. + /// + public static string RemoveFromCalendar { + get { + return ResourceManager.GetString("RemoveFromCalendar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reset Subscriptions. + /// + public static string ResetSubscriptions { + get { + return ResourceManager.GetString("ResetSubscriptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Samara. + /// + public static string SamDotNet { + get { + return ResourceManager.GetString("SamDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Saratov. + /// + public static string SarDotNet { + get { + return ResourceManager.GetString("SarDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save Subscriptions. + /// + public static string SaveSubscriptions { + get { + return ResourceManager.GetString("SaveSubscriptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to See also. + /// + public static string SeeAlso { + get { + return ResourceManager.GetString("SeeAlso", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select a language. + /// + public static string SelectLanguage { + get { + return ResourceManager.GetString("SelectLanguage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Settings. + /// + public static string Settings { + get { + return ResourceManager.GetString("Settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Share. + /// + public static string Share { + get { + return ResourceManager.GetString("Share", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Social. + /// + public static string Social { + get { + return ResourceManager.GetString("Social", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Saint Petersburg. + /// + public static string SpbDotNet { + get { + return ResourceManager.GetString("SpbDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Speaker. + /// + public static string SpeakerInfo { + get { + return ResourceManager.GetString("SpeakerInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Speakers. + /// + public static string Speakers { + get { + return ResourceManager.GetString("Speakers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Submit. + /// + public static string Submit { + get { + return ResourceManager.GetString("Submit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Subscriptions. + /// + public static string Subscriptions { + get { + return ResourceManager.GetString("Subscriptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Here you can select a list of community groups from which you want to receive news. You can also specify how many news posts to display for each group (from 0 to 100).. + /// + public static string SubscriptionsLabel { + get { + return ResourceManager.GetString("SubscriptionsLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Community newsletter subscription options have been reseted.. + /// + public static string SubscriptionsResetedMessage { + get { + return ResourceManager.GetString("SubscriptionsResetedMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Community newsletter subscription options have been saved.. + /// + public static string SubscriptionsSavedMessage { + get { + return ResourceManager.GetString("SubscriptionsSavedMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Talk. + /// + public static string Talk { + get { + return ResourceManager.GetString("Talk", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Talk Recording. + /// + public static string TalkRecording { + get { + return ResourceManager.GetString("TalkRecording", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Talks. + /// + public static string Talks { + get { + return ResourceManager.GetString("Talks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Technology Used. + /// + public static string TechnologyUsed { + get { + return ResourceManager.GetString("TechnologyUsed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Terms of use. + /// + public static string TermsOfUse { + get { + return ResourceManager.GetString("TermsOfUse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Inspired by James Montemagno. + /// + public static string Thanks { + get { + return ResourceManager.GetString("Thanks", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to To be announced. + /// + public static string ToBeAnnounced { + get { + return ResourceManager.GetString("ToBeAnnounced", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Today. + /// + public static string Today { + get { + return ResourceManager.GetString("Today", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tomorrow. + /// + public static string Tomorrow { + get { + return ResourceManager.GetString("Tomorrow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ufa. + /// + public static string UfaDotNet { + get { + return ResourceManager.GetString("UfaDotNet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Venue. + /// + public static string Venue { + get { + return ResourceManager.GetString("Venue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version. + /// + public static string Version { + get { + return ResourceManager.GetString("Version", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yesterday. + /// + public static string Yesterday { + get { + return ResourceManager.GetString("Yesterday", resourceCulture); + } + } + } +} diff --git a/DotNetRu.App/Localization/AppResources.resx b/DotNetRu.App/Localization/AppResources.resx new file mode 100644 index 00000000..bfe0c240 --- /dev/null +++ b/DotNetRu.App/Localization/AppResources.resx @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + About + + + About App + + + About DotNetRu + + + Russian .NET community is a group of independent communities of .NET developers from Russia. We unite people around .Net platform to contribute to the experience and knowledge exchange. We hold meetings regularly to share news and best practices in software development! Find our more at + + + Abstract + + + Added to calendar + + + Add to Calendar + + + All day + + + Biography + + + Calendar + + + Cancel + + + Code from Session + + + Copied + + + Copied to clipboard + + + Created by DotNetRu Team with <3 + + + The DotNetRu mobile app was handcrafted by DotNetRu, based on the great work done by Xamarin. + +DotNetRu Team + +Pavel Fedotovsky +Anatoly Kulakov +Yury Belousov +Sergey Polezhaev +Nikolay Chebotov + + + DotNetRu + + + Ekaterinburg + + + Enter search term + + + Enter speaker fullname + + + Error occured + + + Follow + + + Friend + + + Friends + + + Report an issue + + + Krasnoyarsk + + + Krasnodar + + + Krasnoyarsk + + + Kazan + + + Language + + + Links + + + Loading Social Feed... + + + Loading Friends... + + + Loading meetups... + + + Loading Speakers... + + + Loading Subscriptions... + + + Loading talks... + + + Materials + + + Meetup + + + Meetups + + + Moscow + + + News + + + Nizhny Novgorod + + + No talks found + + + Novosibirsk + + + Omsk + + + Open Source Notice + + + Our communities + + + Penza + + + Presentation Slides + + + Privacy Policy + + + Removed from calendar + + + Remove from Calendar + + + Reset Subscriptions + + + Samara + + + Saratov + + + Save Subscriptions + + + See also + + + Select a language + + + Settings + + + Share + + + Social + + + Saint Petersburg + + + Speaker + + + Speakers + + + Submit + + + Subscriptions + + + Here you can select a list of community groups from which you want to receive news. You can also specify how many news posts to display for each group (from 0 to 100). + + + Community newsletter subscription options have been reseted. + + + Community newsletter subscription options have been saved. + + + Talk + + + Talk Recording + + + Talks + + + Technology Used + + + Terms of use + + + Inspired by James Montemagno + + + To be announced + + + Today + + + Tomorrow + + + Ufa + + + Venue + + + Version + + + Yesterday + + \ No newline at end of file diff --git a/DotNetRu.App/Localization/AppResources.ru.resx b/DotNetRu.App/Localization/AppResources.ru.resx new file mode 100644 index 00000000..56fe4892 --- /dev/null +++ b/DotNetRu.App/Localization/AppResources.ru.resx @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + О проекте + + + Всероссийское .NET сообщество DotNetRu - группа независимых сообществ .NET разработчиков со всей России. Мы объединяем людей вокруг .NET платформы, чтобы способствовать обмену опытом и знаниями. Проводим регулярные встречи, чтобы делиться новостями и лучшими практиками в разработке программных продуктов. Больше информации на сайте + + + Аннотация + + + О докладчике + + + Сделано командой DotNetRu + + + Подписаться + + + Друзья + + + Язык + + + Материалы + + + Встречи + + + Новости + + + Уведомление об Open Source + + + Слайды + + + Конфиденциальность + + + Социальные сети + + + Докладчики + + + Доклад + + + Видео + + + Используемые технологии + + + Правила использования + + + Огромный респект Джеймсу Монтемагно + + + Место проведения + + + Версия + + + Сообщить об ошибке + + + Партнер + + + Ссылки + + + Весь день + + + Будет аннонсировано позже + + + Сегодня + + + Завтра + + + Вчера + + + Загрузка... + + + Поделиться + + + Докладчик + + + Митап + + + Доклады + + + Загрузка встреч... + + + Загрузка докладов... + + + Доклады не найдены + + + Наши сообщества + + + Красноярск + + + Москва + + + Санкт-Петербург + + + Саратов + + + О приложении + + + О DotNetRu + + + Выберите язык + + + Примеры кода + + + Казань + + + Мобильное приложение DotNetRu App создано командой DotNetRu с помощью Xamarin.Forms. + +Команда DotNetRu + +Павел Федотовский +Анатолий Кулаков +Юрий Белоусов +Сергей Полежаев +Николай Чеботов + + + Настройки + + + Новосибирск + + + См. также + + + Скопировано в буфер обмена + + + Омск + + + Нижний Новгород + + + Самара + + + Уфа + + + Пенза + + + Подписки + + + Добавлено в календарь + + + Добавить в календарь + + + Календарь + + + Произошла ошибка + + + Удалено из календаря + + + Удалить из календаря + + + Отмена + + + Загрузка друзей... + + + Загрузка спикеров... + + + Подтвердить + + + Екатеринбург + + + Введите поисковый запрос + + + Введите имя спикера + + + Сохранить подписки + + + Параметры подписки на новости сообществ были сохранены. + + + Скопировано + + + Здесь вы можете выбрать список групп сообществ, из которых вы хотите получать новости. Также можно указать, сколько новостных постов выводить для каждой группы (от 0 до 100). + + + Сбросить подписки + + + Параметры подписки на новости сообществ были сброшены. + + + Загрузка подписок... + + + Краснодар + + + Красноярск + + + DotNetRu + + \ No newline at end of file diff --git a/DotNetRu.App/Localization/CultureChangedMessage.cs b/DotNetRu.App/Localization/CultureChangedMessage.cs new file mode 100644 index 00000000..43f4efc6 --- /dev/null +++ b/DotNetRu.App/Localization/CultureChangedMessage.cs @@ -0,0 +1,20 @@ +using System.Globalization; + +namespace DotNetRu.Clients.Portable.Helpers +{ + public class CultureChangedMessage + { + public CultureChangedMessage(string lngName) + : this(new CultureInfo(lngName)) + { + + } + + public CultureChangedMessage(CultureInfo newCultureInfo) + { + this.NewCultureInfo = newCultureInfo; + } + + public CultureInfo NewCultureInfo { get; } + } +} diff --git a/DotNetRu.App/Localization/LocalizedResources.cs b/DotNetRu.App/Localization/LocalizedResources.cs new file mode 100644 index 00000000..9e9af6c7 --- /dev/null +++ b/DotNetRu.App/Localization/LocalizedResources.cs @@ -0,0 +1,31 @@ +namespace DotNetRu.Clients.Portable.Helpers +{ + using System.ComponentModel; + using DotNetRu.App.Localization; + using DotNetRu.AppUtils; + using DotNetRu.Clients.Portable.Interfaces; + + public class LocalizedResources : INotifyPropertyChanged + { + public LocalizedResources() + { + // TODO Subscribe only once + MessagingCenter.Subscribe(this, string.Empty, this.OnCultureChanged); + } + + public event PropertyChangedEventHandler PropertyChanged; + + public string this[string key] => AppResources.ResourceManager.GetString(key, AppResources.Culture); + + private void OnCultureChanged(object s, CultureChangedMessage cultureChangedMessage) + { + AppResources.Culture = cultureChangedMessage.NewCultureInfo; + + // set for locale-aware methods + DependencyService.Get().SetLocale(cultureChangedMessage.NewCultureInfo); + + this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Item")); + MessagingCenter.Send(this, MessageKeys.LanguageChanged); + } + } +} diff --git a/DotNetRu.App/MainPage.xaml b/DotNetRu.App/MainPage.xaml new file mode 100644 index 00000000..ece9dc74 --- /dev/null +++ b/DotNetRu.App/MainPage.xaml @@ -0,0 +1,41 @@ + + + + + + + + +