1
0
mirror of https://github.com/XFox111/GUTSchedule.git synced 2026-04-22 06:58:01 +03:00

Added English localization, updated changelog

Renamed menu layout file to match naming rules
This commit is contained in:
Michael Gordeev
2020-02-05 22:54:53 +03:00
parent d75c851280
commit 16cc7bc301
16 changed files with 540 additions and 123 deletions
+3 -3
View File
@@ -15,9 +15,9 @@ Global
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.ActiveCfg = Release|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.Build.0 = Release|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.Deploy.0 = Release|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.ActiveCfg = Release (APK)|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.Build.0 = Release (APK)|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release (APK)|Any CPU.Deploy.0 = Release (APK)|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|Any CPU.Build.0 = Release|Any CPU
{A0471165-37F5-4309-8A92-42F1A6589EEE}.Release|Any CPU.Deploy.0 = Release|Any CPU
@@ -10,32 +10,31 @@ using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
namespace GUT.Schedule.Activities
{
[Activity(Label = "О приложениии")]
[Activity(Label = "@string/aboutTitle")]
public class AboutActivity : AppCompatActivity
{
private readonly (string name, string handle, string link)[] contacts = new (string, string, string)[]
{
("Веб-сайт", "https://xfox111.net", "https://xfox111.net"),
("Twitter", "@xfox111", "https://twitter.com/xfox111"),
("ВКонтакте", "@xfox.mike", "https://vk.com/xfox.mike"),
("LinkedIn", "@xfox", "https://linkedin.com/in/xfox"),
("GitHub", "@xfox111", "https://github.com/xfox111"),
};
private readonly (string name, string link)[] links = new (string, string)[]
{
("Политика конфиденциальности", "https://xfox111.net/Projects/GUTSchedule/PrivacyPolicy.txt"),
("General Public License v3", "https://www.gnu.org/licenses/gpl-3.0"),
("Репозиторий GitHub", "https://github.com/xfox111/gutschedule"),
("НОЦ \"ТИОС\"", "http://tios.spbgut.ru/index.php"),
("СПбГУТ", "https://sut.ru"),
};
protected override async void OnCreate(Bundle savedInstanceState)
{
(string name, string handle, string link)[] contacts = new (string, string, string)[]
{
(Resources.GetText(Resource.String.websiteContact), "https://xfox111.net", "https://xfox111.net"),
(Resources.GetText(Resource.String.twitterContact), "@xfox111", "https://twitter.com/xfox111"),
(Resources.GetText(Resource.String.vkontakteContact), "@xfox.mike", "https://vk.com/xfox.mike"),
("LinkedIn", "@xfox", "https://linkedin.com/in/xfox"),
("GitHub", "@xfox111", "https://github.com/xfox111"),
};
(string name, string link)[] links = new (string, string)[]
{
(Resources.GetText(Resource.String.privacyPolicyLink), "https://xfox111.net/Projects/GUTSchedule/PrivacyPolicy.txt"),
("General Public License v3", "https://www.gnu.org/licenses/gpl-3.0"),
(Resources.GetText(Resource.String.repositoryLink), "https://github.com/xfox111/gutschedule"),
(Resources.GetText(Resource.String.notsLink), "http://tios.spbgut.ru/index.php"),
(Resources.GetText(Resource.String.sutLink), "https://sut.ru"),
};
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.About);
PackageInfo version = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.MatchAll);
@@ -32,9 +32,9 @@ namespace GUT.Schedule.Activities
try
{
if(Data.DataSet.IsProfessor == true)
status.Text = "Загрузка расписания с картофельных серверов Бонча";
status.Text = Resources.GetText(Resource.String.potatoLoadingStatus); // For some reason professors' schedule loads much slower
else
status.Text = "Загрузка расписания";
status.Text = Resources.GetText(Resource.String.loadingStatus);
if (Data.DataSet.HttpClient != null)
{
@@ -49,7 +49,7 @@ namespace GUT.Schedule.Activities
schedule = schedule.FindAll(i => i.StartTime.Date >= Data.StartDate && i.StartTime.Date <= Data.EndDate); // Filtering schedule according to export range
status.Text = "Экспортирование в календарь";
status.Text = Resources.GetText(Resource.String.calendarExportStatus);
Calendar.Export(schedule);
}
else
@@ -58,20 +58,20 @@ namespace GUT.Schedule.Activities
schedule = schedule.FindAll(i => i.StartTime.Date >= Data.StartDate && i.StartTime.Date <= Data.EndDate); // Filtering schedule according to export range
status.Text = "Экспортирование в календарь";
status.Text = Resources.GetText(Resource.String.calendarExportStatus);
Calendar.Export(schedule);
}
status.Text = "Готово";
status.Text = Resources.GetText(Resource.String.doneStatus);
await Task.Delay(1000);
}
catch (HttpRequestException e)
{
Android.Support.V7.App.AlertDialog.Builder builder = new Android.Support.V7.App.AlertDialog.Builder(this);
builder.SetMessage("Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже")
builder.SetMessage(Resources.GetText(Resource.String.connectionFailMessage))
.SetTitle(e.Message)
.SetPositiveButton("ОК", (s, e) => base.OnBackPressed())
.SetNegativeButton("Повторить", (s, e) => Export());
.SetNegativeButton(Resources.GetText(Resource.String.repeat), (s, e) => Export());
Android.Support.V7.App.AlertDialog dialog = builder.Create();
dialog.Show();
@@ -55,10 +55,10 @@ namespace GUT.Schedule.Activities
// Settings spinners' dropdown lists content
reminder.SetList(this, new[]
{
"Нет",
"Во время начала",
"За 5 мин",
"За 10 мин"
Resources.GetText(Resource.String.noReminderOption),
Resources.GetText(Resource.String.inTimeReminderOption),
Resources.GetText(Resource.String.fiveMinuteReminderOption),
Resources.GetText(Resource.String.tenMinuteReminderOption)
});
reminder.SetSelection(prefs.GetInt("Reminder", 0));
@@ -82,7 +82,7 @@ namespace GUT.Schedule.Activities
if (Data.StartDate > Data.EndDate)
{
error.Text = "Ошибка: Неправильный диапазон дат";
error.Text = Resources.GetText(Resource.String.invalidDateRangeError);
error.Visibility = ViewStates.Visible;
return;
}
@@ -91,10 +91,10 @@ namespace GUT.Schedule.Activities
bool? isProf = null;
if(authorize.Checked)
{
Toast.MakeText(ApplicationContext, "Авторизация...", ToastLength.Short).Show();
Toast.MakeText(ApplicationContext, Resources.GetText(Resource.String.authorizationState), ToastLength.Short).Show();
if (string.IsNullOrWhiteSpace(email.Text) || string.IsNullOrWhiteSpace(password.Text))
{
error.Text = "Ошибка: Введите корректные учетные данные";
error.Text = Resources.GetText(Resource.String.invalidAuthorizationError);
error.Visibility = ViewStates.Visible;
return;
}
@@ -115,14 +115,14 @@ namespace GUT.Schedule.Activities
if (!response.IsSuccessStatusCode)
{
error.Text = $"Ошибка авторизации: {response.StatusCode}: {responseContent}";
error.Text = $"{Resources.GetText(Resource.String.authorizationError)}: {response.StatusCode}: {responseContent}";
error.Visibility = ViewStates.Visible;
return;
}
if (!responseContent.StartsWith("1", StringComparison.OrdinalIgnoreCase))
{
error.Text = $"Ошибка авторизации: Неверный e-mail и/или пароль ({string.Join("; ", responseContent.Replace("error=", "", StringComparison.OrdinalIgnoreCase).Split('|'))})";
error.Text = $"{Resources.GetText(Resource.String.invalidCredentialError)} ({string.Join("; ", responseContent.Replace("error=", "", StringComparison.OrdinalIgnoreCase).Split('|'))})";
error.Visibility = ViewStates.Visible;
return;
}
@@ -152,7 +152,7 @@ namespace GUT.Schedule.Activities
{
if(Data.Groups.Count < 1)
{
error.Text = "Ошибка: Не выбрана группа";
error.Text = Resources.GetText(Resource.String.groupSelectionError);
error.Visibility = ViewStates.Visible;
return;
}
@@ -290,7 +290,7 @@ namespace GUT.Schedule.Activities
#region Menu stuff
public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.menu_main, menu);
MenuInflater.Inflate(Resource.Menu.MainContextMenu, menu);
return true;
}
@@ -298,9 +298,9 @@ namespace GUT.Schedule.Activities
{
try
{
Toast.MakeText(ApplicationContext, "Очистка...", ToastLength.Short).Show();
Toast.MakeText(ApplicationContext, Resources.GetText(Resource.String.clearingStatus), ToastLength.Short).Show();
Calendar.Clear(keepPrevious);
Toast.MakeText(ApplicationContext, "Готово!", ToastLength.Short).Show();
Toast.MakeText(ApplicationContext, Resources.GetText(Resource.String.doneStatus), ToastLength.Short).Show();
}
catch (Exception e)
{
@@ -329,14 +329,11 @@ namespace GUT.Schedule.Activities
case Resource.Id.clear:
builder = new Android.Support.V7.App.AlertDialog.Builder(this);
builder.SetMessage("Это действие удалит экспортированное расписание из всех доступных календарей.\n" +
"Данное действие затронет только расписание, экспортированное этим приложением\n" +
"'Все' - удалит все события расписания, включая прошедшие\n" +
"'Только новые' - удалит будущие события расписания")
.SetTitle("Очистка календарей")
.SetPositiveButton("Только новые", (s, e) => Clear())
.SetNegativeButton("Все", (s, e) => Clear(false))
.SetNeutralButton("Отмена", (IDialogInterfaceOnClickListener)null);
builder.SetMessage(Resources.GetText(Resource.String.clearScheduleMessage))
.SetTitle(Resources.GetText(Resource.String.clearScheduleTitle))
.SetPositiveButton(Resources.GetText(Resource.String.clearUpcomingOption), (s, e) => Clear())
.SetNegativeButton(Resources.GetText(Resource.String.clearAllOption), (s, e) => Clear(false))
.SetNeutralButton(Resources.GetText(Resource.String.cancelOption), (IDialogInterfaceOnClickListener)null);
dialog = builder.Create();
dialog.Show();
@@ -31,12 +31,12 @@ namespace GUT.Schedule.Activities
PackageInfo version = PackageManager.GetPackageInfo(PackageName, PackageInfoFlags.MatchAll);
FindViewById<TextView>(Resource.Id.version).Text = $"v{version.VersionName} (ci-id #{version.VersionCode})";
status.Text = "Проверка наличия разрешений";
status.Text = Resources.GetText(Resource.String.permissionsCheckStatus);
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.WriteCalendar) != Permission.Granted)
{
if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.WriteCalendar))
ShowDialog("Доступ к календарю", "Разрешите приложению получать доступ к календарю. Без этого разрешения приложение не сможет добавлять расписание в ваш календарь", RequestPermissions);
ShowDialog(Resources.GetText(Resource.String.calendarAccessTitle), Resources.GetText(Resource.String.calendarAccessRationale), RequestPermissions);
else
RequestPermissions();
}
@@ -48,24 +48,24 @@ namespace GUT.Schedule.Activities
{
try
{
status.Text = "Загрузка списка календарей";
status.Text = Resources.GetText(Resource.String.calendarLoadingStatus);
Calendar.LoadCalendars();
if (Calendar.Calendars.Count == 0)
{
ShowDialog("Создайте новый календарь", "На вашем устройстве нет календарей пригодных для записи расписания");
ShowDialog(Resources.GetText(Resource.String.createCalendarTitle), Resources.GetText(Resource.String.createCalendarMessage));
return;
}
status.Text = "Загрузка списка факультетов";
status.Text = Resources.GetText(Resource.String.facultiesLoadingStatus);
await Parser.LoadFaculties();
status.Text = "Загрузка дат смещения";
status.Text = Resources.GetText(Resource.String.offsetDatesLoadingStatus);
using HttpClient client = new HttpClient();
Data.FirstWeekDay = int.Parse(await client.GetStringAsync("https://xfox111.net/schedule_offset.txt"));
}
catch(HttpRequestException e)
{
ShowDialog(e.Message, "Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже", Proceed, FinishAndRemoveTask, "Повторить", "Выйти");
ShowDialog(e.Message, Resources.GetText(Resource.String.connectionFailMessage), Proceed, FinishAndRemoveTask, Resources.GetText(Resource.String.repeat), Resources.GetText(Resource.String.quit));
return;
}
catch (Exception e)
@@ -83,7 +83,7 @@ namespace GUT.Schedule.Activities
if (grantResults.All(i => i == Permission.Granted))
Proceed();
else
ShowDialog("Доступ к календарю", "Разрешите приложению получать доступ к календарю. Без этого разрешения приложение не сможет добавлять расписание в ваш календарь", RequestPermissions);
ShowDialog(Resources.GetText(Resource.String.calendarAccessTitle), Resources.GetText(Resource.String.calendarAccessRationale), RequestPermissions);
}
private void RequestPermissions() =>
@@ -101,7 +101,7 @@ namespace GUT.Schedule.Activities
.SetTitle(title).SetPositiveButton(posActionLabel ?? "OK", (s, e) => posAction?.Invoke());
if (negAction != null)
builder.SetNegativeButton(negActionLabel ?? "Close", (s, e) => negAction.Invoke());
builder.SetNegativeButton(negActionLabel ?? Resources.GetText(Resource.String.close), (s, e) => negAction.Invoke());
Android.Support.V7.App.AlertDialog dialog = builder.Create();
dialog.Show();
@@ -77,6 +77,7 @@
<AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
<BundleAssemblies>false</BundleAssemblies>
<AndroidSupportedAbis>armeabi-v7a;x86;x86_64;arm64-v8a</AndroidSupportedAbis>
<AndroidPackageFormat>apk</AndroidPackageFormat>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
@@ -152,7 +153,7 @@
</AndroidResource>
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\menu\menu_main.xml" />
<AndroidResource Include="Resources\menu\MainContextMenu.xml" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\layout\Export.xml">
@@ -173,6 +174,12 @@
<ItemGroup>
<Folder Include="Assets\" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\values\strings.xml" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\values-en\strings.xml" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="0-development-test" package="com.xfox111.gut.schedule" android:installLocation="auto">
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="28" />
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="ГУТ.Расписание" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme.Light"></application>
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/appName" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme.Light"></application>
<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<uses-permission android:name="android.permission.INTERNET" />
+236 -20
View File
@@ -4149,7 +4149,7 @@ namespace GUT.Schedule
{
// aapt resource value: 0x7F0C0000
public const int menu_main = 2131492864;
public const int MainContextMenu = 2131492864;
static Menu()
{
@@ -4304,49 +4304,265 @@ namespace GUT.Schedule
public const int abc_toolbar_collapse_description = 2131623974;
// aapt resource value: 0x7F0E0027
public const int appbar_scrolling_view_behavior = 2131623975;
public const int aboutTitle = 2131623975;
// aapt resource value: 0x7F0E0028
public const int bottom_sheet_behavior = 2131623976;
public const int addGroupToTitleCheckbox = 2131623976;
// aapt resource value: 0x7F0E0029
public const int character_counter_content_description = 2131623977;
// aapt resource value: 0x7F0E002A
public const int character_counter_pattern = 2131623978;
// aapt resource value: 0x7F0E002B
public const int fab_transformation_scrim_behavior = 2131623979;
public const int addScheduleButton = 2131623977;
// aapt resource value: 0x7F0E002C
public const int fab_transformation_sheet_behavior = 2131623980;
public const int appbar_scrolling_view_behavior = 2131623980;
// aapt resource value: 0x7F0E002A
public const int appDescription = 2131623978;
// aapt resource value: 0x7F0E002B
public const int appName = 2131623979;
// aapt resource value: 0x7F0E002D
public const int hide_bottom_view_on_scroll_behavior = 2131623981;
public const int authorizationError = 2131623981;
// aapt resource value: 0x7F0E002E
public const int mtrl_chip_close_icon_content_description = 2131623982;
public const int authorizationState = 2131623982;
// aapt resource value: 0x7F0E002F
public const int password_toggle_content_description = 2131623983;
public const int authorizeCheckbox = 2131623983;
// aapt resource value: 0x7F0E0030
public const int path_password_eye = 2131623984;
public const int bottom_sheet_behavior = 2131623984;
// aapt resource value: 0x7F0E0031
public const int path_password_eye_mask_strike_through = 2131623985;
public const int calendarAccessRationale = 2131623985;
// aapt resource value: 0x7F0E0032
public const int path_password_eye_mask_visible = 2131623986;
public const int calendarAccessTitle = 2131623986;
// aapt resource value: 0x7F0E0033
public const int path_password_strike_through = 2131623987;
public const int calendarExportStatus = 2131623987;
// aapt resource value: 0x7F0E0034
public const int search_menu_title = 2131623988;
public const int calendarLoadingStatus = 2131623988;
// aapt resource value: 0x7F0E0035
public const int status_bar_notification_info_overflow = 2131623989;
public const int cancelOption = 2131623989;
// aapt resource value: 0x7F0E0036
public const int character_counter_content_description = 2131623990;
// aapt resource value: 0x7F0E0037
public const int character_counter_pattern = 2131623991;
// aapt resource value: 0x7F0E0038
public const int clearAllOption = 2131623992;
// aapt resource value: 0x7F0E0039
public const int clearCalendarOption = 2131623993;
// aapt resource value: 0x7F0E003D
public const int clearingStatus = 2131623997;
// aapt resource value: 0x7F0E003A
public const int clearScheduleMessage = 2131623994;
// aapt resource value: 0x7F0E003B
public const int clearScheduleTitle = 2131623995;
// aapt resource value: 0x7F0E003C
public const int clearUpcomingOption = 2131623996;
// aapt resource value: 0x7F0E003E
public const int close = 2131623998;
// aapt resource value: 0x7F0E003F
public const int connectionFailMessage = 2131623999;
// aapt resource value: 0x7F0E0040
public const int contactsTitle = 2131624000;
// aapt resource value: 0x7F0E0041
public const int contributorsTitle = 2131624001;
// aapt resource value: 0x7F0E0042
public const int copyrights = 2131624002;
// aapt resource value: 0x7F0E0043
public const int courseSpinner = 2131624003;
// aapt resource value: 0x7F0E0044
public const int createCalendarMessage = 2131624004;
// aapt resource value: 0x7F0E0045
public const int createCalendarTitle = 2131624005;
// aapt resource value: 0x7F0E0046
public const int dateRange = 2131624006;
// aapt resource value: 0x7F0E0047
public const int destinationCalendarSpinner = 2131624007;
// aapt resource value: 0x7F0E0048
public const int developedBy = 2131624008;
// aapt resource value: 0x7F0E0049
public const int doneStatus = 2131624009;
// aapt resource value: 0x7F0E004A
public const int exportParametersTitle = 2131624010;
// aapt resource value: 0x7F0E004B
public const int fab_transformation_scrim_behavior = 2131624011;
// aapt resource value: 0x7F0E004C
public const int fab_transformation_sheet_behavior = 2131624012;
// aapt resource value: 0x7F0E004D
public const int facultiesLoadingStatus = 2131624013;
// aapt resource value: 0x7F0E004E
public const int facultySpinner = 2131624014;
// aapt resource value: 0x7F0E004F
public const int feedbackButton = 2131624015;
// aapt resource value: 0x7F0E0050
public const int fiveMinuteReminderOption = 2131624016;
// aapt resource value: 0x7F0E0051
public const int forDayButton = 2131624017;
// aapt resource value: 0x7F0E0052
public const int forMonthButton = 2131624018;
// aapt resource value: 0x7F0E0053
public const int forSemesterButton = 2131624019;
// aapt resource value: 0x7F0E0054
public const int forWeekButton = 2131624020;
// aapt resource value: 0x7F0E0055
public const int groupSelectionError = 2131624021;
// aapt resource value: 0x7F0E0056
public const int groupSpinner = 2131624022;
// aapt resource value: 0x7F0E0057
public const int hide_bottom_view_on_scroll_behavior = 2131624023;
// aapt resource value: 0x7F0E0059
public const int initializationStatus = 2131624025;
// aapt resource value: 0x7F0E0058
public const int inTimeReminderOption = 2131624024;
// aapt resource value: 0x7F0E005A
public const int invalidAuthorizationError = 2131624026;
// aapt resource value: 0x7F0E005B
public const int invalidCredentialError = 2131624027;
// aapt resource value: 0x7F0E005C
public const int invalidDateRangeError = 2131624028;
// aapt resource value: 0x7F0E005D
public const int linksTitle = 2131624029;
// aapt resource value: 0x7F0E005E
public const int loadingStatus = 2131624030;
// aapt resource value: 0x7F0E005F
public const int mtrl_chip_close_icon_content_description = 2131624031;
// aapt resource value: 0x7F0E0060
public const int noReminderOption = 2131624032;
// aapt resource value: 0x7F0E0061
public const int notsLink = 2131624033;
// aapt resource value: 0x7F0E0062
public const int offsetDatesLoadingStatus = 2131624034;
// aapt resource value: 0x7F0E0063
public const int passwordField = 2131624035;
// aapt resource value: 0x7F0E0064
public const int password_toggle_content_description = 2131624036;
// aapt resource value: 0x7F0E0065
public const int path_password_eye = 2131624037;
// aapt resource value: 0x7F0E0066
public const int path_password_eye_mask_strike_through = 2131624038;
// aapt resource value: 0x7F0E0067
public const int path_password_eye_mask_visible = 2131624039;
// aapt resource value: 0x7F0E0068
public const int path_password_strike_through = 2131624040;
// aapt resource value: 0x7F0E0069
public const int permissionsCheckStatus = 2131624041;
// aapt resource value: 0x7F0E006A
public const int potatoLoadingStatus = 2131624042;
// aapt resource value: 0x7F0E006B
public const int privacyPolicyLink = 2131624043;
// aapt resource value: 0x7F0E006C
public const int quit = 2131624044;
// aapt resource value: 0x7F0E006D
public const int reminderNote = 2131624045;
// aapt resource value: 0x7F0E006E
public const int reminderSpinner = 2131624046;
// aapt resource value: 0x7F0E006F
public const int repeat = 2131624047;
// aapt resource value: 0x7F0E0070
public const int reportErrorOption = 2131624048;
// aapt resource value: 0x7F0E0071
public const int repositoryLink = 2131624049;
// aapt resource value: 0x7F0E0072
public const int scheduleLoadingStatus = 2131624050;
// aapt resource value: 0x7F0E0073
public const int scheduleParametersTitle = 2131624051;
// aapt resource value: 0x7F0E0074
public const int search_menu_title = 2131624052;
// aapt resource value: 0x7F0E0075
public const int specialThanksPeople = 2131624053;
// aapt resource value: 0x7F0E0076
public const int specialThanksTitle = 2131624054;
// aapt resource value: 0x7F0E0077
public const int status_bar_notification_info_overflow = 2131624055;
// aapt resource value: 0x7F0E0078
public const int sutLink = 2131624056;
// aapt resource value: 0x7F0E0079
public const int tenMinuteReminderOption = 2131624057;
// aapt resource value: 0x7F0E007A
public const int titleNote = 2131624058;
// aapt resource value: 0x7F0E007B
public const int twitterContact = 2131624059;
// aapt resource value: 0x7F0E007C
public const int vkontakteContact = 2131624060;
// aapt resource value: 0x7F0E007D
public const int websiteContact = 2131624061;
static String()
{
@@ -14,7 +14,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/TextAppearance.AppCompat.Headline"
android:text="ГУТ.Расписание"/>
android:text="@string/appName"/>
<TextView
android:id="@+id/version"
android:layout_width="match_parent"
@@ -28,13 +28,13 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Приложение для экспорта перподавательского и учебного расписаний Санкт-Петербургского Государственного Университета Телекоммуникаций им. проф. М.А. Бонч-Бруевича"/>
android:text="@string/appDescription"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="Разработано Михаилом Гордеевым, ИКТ-907, ИКСС в Научно-образовательном центре &#x22;Технологии информационных образовательных систем&#x22;"/>
android:text="@string/developedBy"/>
<TextView
android:id="@+id/contributorsTitle"
@@ -43,7 +43,7 @@
android:layout_marginTop="10dp"
style="@style/TextAppearance.AppCompat.Subhead"
android:visibility="gone"
android:text="Свой вклад в разработку внесли"/>
android:text="@string/contributorsTitle"/>
<TextView
android:id="@+id/contributors"
@@ -56,19 +56,19 @@
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
style="@style/TextAppearance.AppCompat.Subhead"
android:text="Особые благодарности"/>
android:text="@string/specialThanksTitle"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Виталий Мошков, Анастасия Годунова"/>
android:text="@string/specialThanksPeople"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
style="@style/TextAppearance.AppCompat.Subhead"
android:text="Контакты"/>
android:text="@string/contactsTitle"/>
<TextView
android:id="@+id/contacts"
@@ -80,7 +80,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
style="@style/TextAppearance.AppCompat.Subhead"
android:text="Полезные ссылки"/>
android:text="@string/linksTitle"/>
<TextView
android:id="@+id/links"
@@ -97,6 +97,6 @@
android:id="@+id/feedback"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Оставить отзыв"/>
android:text="@string/feedbackButton"/>
</LinearLayout>
</ScrollView>
@@ -22,7 +22,7 @@
android:id="@+id/status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Загрузка"
android:text="@string/loadingStatus"
android:textColor="#fff"
android:layout_gravity="center_horizontal"
/>
@@ -13,7 +13,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Параметры расписания"
android:text="@string/scheduleParametersTitle"
android:textStyle="bold"
android:textSize="16dp"/>
@@ -21,7 +21,7 @@
android:id="@+id/authorization"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Авторизоваться через Личный кабинет"/>
android:text="@string/authorizeCheckbox"/>
<LinearLayout
android:id="@+id/studentParams"
@@ -32,7 +32,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Факультет"/>
android:text="@string/facultySpinner"/>
<Spinner
android:id="@+id/faculty"
@@ -42,7 +42,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Курс"/>
android:text="@string/courseSpinner"/>
<Spinner
android:id="@+id/course"
@@ -52,7 +52,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Группа"/>
android:text="@string/groupSpinner"/>
<Spinner
android:id="@+id/group"
@@ -81,7 +81,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Пароль"/>
android:text="@string/passwordField"/>
<EditText
android:id="@+id/password"
@@ -93,14 +93,14 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Параметры экспорта"
android:text="@string/exportParametersTitle"
android:textStyle="bold"
android:textSize="16dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Диапазон экспорта"/>
android:text="@string/dateRange"/>
<TableLayout
android:layout_width="match_parent"
@@ -139,12 +139,12 @@
android:id="@+id/forDay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="На день"/>
android:text="@string/forDayButton"/>
<Button
android:id="@+id/forWeek"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="На неделю"/>
android:text="@string/forWeekButton"/>
</LinearLayout>
<LinearLayout
@@ -156,12 +156,12 @@
android:id="@+id/forMonth"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="На месяц"/>
android:text="@string/forMonthButton"/>
<Button
android:id="@+id/forSemester"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="На семестр"/>
android:text="@string/forSemesterButton"/>
</LinearLayout>
</TableRow>
</TableLayout>
@@ -169,7 +169,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Напоминать за"/>
android:text="@string/reminderSpinner"/>
<Spinner
android:id="@+id/reminder"
@@ -179,24 +179,24 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="(i) При экспорте расписания в Google календарь (не локальный) с отключенными уведомлениями, Google автоматически поставит уведомление за 30 минут"/>
android:text="@string/reminderNote"/>
<CheckBox
android:id="@+id/groupTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Добавить номер группы в заголовок"/>
android:text="@string/addGroupToTitleCheckbox"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="(i) Не касается расписания преподавателя"/>
android:text="@string/titleNote"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Конечный календарь"/>
android:text="@string/destinationCalendarSpinner"/>
<Spinner
android:id="@+id/calendar"
@@ -216,12 +216,12 @@
android:id="@+id/export"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Добавить расписание"/>
android:text="@string/addScheduleButton"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="©2020 Михаил Гордеев ИКСС, ИКТ-907"/>
android:text="@string/copyrights"/>
<TextView
android:id="@+id/version"
android:layout_width="match_parent"
@@ -20,7 +20,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ГУТ.Расписание"
android:text="@string/appName"
android:layout_gravity="center_horizontal"
android:textSize="36dp"/>
@@ -35,7 +35,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="Инициализация"
android:text="@string/initializationStatus"
android:textSize="20dp"/>
</LinearLayout>
@@ -4,14 +4,14 @@
<item
android:id="@+id/clear"
android:title="Очистить расписание"
android:title="@string/clearCalendarOption"
android:showAsAction="never"/>
<item
android:id="@+id/email"
android:title="Сообщить об ошибке"
android:title="@string/reportErrorOption"
app:showAsAction="never" />
<item
android:id="@+id/about"
android:title="О приложении"
android:title="@string/aboutTitle"
app:showAsAction="never" />
</menu>
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<string name="appName">ГУТ.Расписание</string>
<!-- StartActivity -->
<string name="initializationStatus">Инициализация</string>
<string name="permissionsCheckStatus">Проверка наличия разрешений</string>
<string name="calendarLoadingStatus">Загрузка списка календарей</string>
<string name="facultiesLoadingStatus">Загрузка списка факультативов</string>
<string name="offsetDatesLoadingStatus">Загрузка дат смещения</string>
<string name="calendarAccessTitle">Доступ к календарю</string>
<string name="calendarAccessRationale">Разрешите приложению получать доступ к календарю. Без этого разрешения приложение не сможет добавлять расписание в ваш календарь</string>
<string name="createCalendarTitle">Создайте новый календарь</string>
<string name="createCalendarMessage">На вашем устройстве нет календарей пригодных для записи расписания</string>
<string name="connectionFailMessage">Невозможно загрузить расписание. Проверьте интернет-соединение или попробуйте позже</string>
<string name="repeat">Повторить</string>
<string name="quit">Выйти</string>
<string name="close">Закрыть</string>
<!-- MainActivity -->
<string name="scheduleParametersTitle">Параметры расписания</string>
<string name="authorizeCheckbox">Авторизоваться через Личный кабинет</string>
<string name="facultySpinner">Факультет</string>
<string name="courseSpinner">Курс</string>
<string name="groupSpinner">Группа</string>
<string name="passwordField">Пароль</string>
<string name="exportParametersTitle">Параметры экспорта</string>
<string name="dateRange">Диапазон экспорта</string>
<string name="forDayButton">На день</string>
<string name="forWeekButton">На неделю</string>
<string name="forMonthButton">На месяц</string>
<string name="forSemesterButton">На семестр</string>
<string name="reminderSpinner">Напоминать за</string>
<string name="reminderNote">(i) Внимание, при экспорте в облачный Google-календарь, Google автоматически ставит уведомление за пол часа, если его не поставил пользователь</string>
<string name="noReminderOption">Нет</string>
<string name="inTimeReminderOption">Во время начала</string>
<string name="fiveMinuteReminderOption">За 5 минут</string>
<string name="tenMinuteReminderOption">За 10 минут</string>
<string name="addGroupToTitleCheckbox">Добавить номер группы в заголовок</string>
<string name="titleNote">(i) Не касается преподавательского расписания</string>
<string name="destinationCalendarSpinner">Конечый календарь</string>
<string name="addScheduleButton">Добавить расписание</string>
<string name="copyrights">©2020 Михаил Гордеев, ИКСС, ИКТ-907</string>
<string name="clearCalendarOption">Очистить расписание</string>
<string name="reportErrorOption">Сообщить об ошибке</string>
<string name="invalidDateRangeError">Ошибка: Неправильный диапазон дат</string>
<string name="authorizationState">Авторизация...</string>
<string name="invalidAuthorizationError">Ошибка: Введите корректные учетные данные</string>
<string name="authorizationError">Ошибка авторизации</string>
<string name="invalidCredentialError">Ошибка авторизации: Неверный e-mail и/или пароль</string>
<string name="groupSelectionError">Ошибка: Не выбрана группа</string>
<string name="clearScheduleTitle">Очистка расписания</string>
<string name="clearScheduleMessage">Это действие удалит экспортированное расписание из всех доступных календарей. \nДанное действие затронет только расписание, экспортированное этим приложением \n\'Все\' - удалит все события расписания, включая прошедшие \n\'Только новые\' - удалит будущие события расписания
</string>
<string name="clearAllOption">Все</string>
<string name="clearUpcomingOption">Только новые</string>
<string name="cancelOption">Отмена</string>
<string name="clearingStatus">Очистка...</string>
<!-- ExportActivity -->
<string name="loadingStatus">Загрузка</string>
<string name="potatoLoadingStatus">Загрузка расписания с картофельных серверов Бонча</string>
<string name="scheduleLoadingStatus">Загрузка расписания</string>
<string name="calendarExportStatus">Экспортирование в календарь</string>
<string name="doneStatus">Готово</string>
<!-- AboutActivity -->
<string name="aboutTitle">О приложении</string>
<string name="appDescription">Приложение для экспорта перподавательского и учебного расписаний Санкт-Петербургского Государственного Университета Телекоммуникаций им. проф. М.А. Бонч-Бруевича</string>
<string name="developedBy">Разработано Михаилом Гордеевым, ИКТ-907, ИКСС в Научно-образовательном центре \"Технологии информационных образовательных систем\"</string>
<string name="contributorsTitle">Свой вклад в разработку внесли</string>
<string name="specialThanksTitle">Особые благодарности</string>
<string name="specialThanksPeople">Виталий Мошков, Анастасия Годунова</string>
<string name="contactsTitle">Контакты</string>
<string name="websiteContact">Веб-сайт</string>
<string name="twitterContact">Твиттер</string>
<string name="vkontakteContact">ВКонтакте</string>
<string name="linksTitle">Полезные ссылки</string>
<string name="privacyPolicyLink">Политика конфиденциальности</string>
<string name="repositoryLink">Репозиторий GitHub</string>
<string name="notsLink">НОЦ \"ТИОС\"</string>
<string name="sutLink">СПбГУТ</string>
<string name="feedbackButton">Оставить отзыв</string>
</resources>
@@ -0,0 +1,100 @@
<?xml version="1.0" encoding="utf-8" ?>
<resources>
<string name="appName">GUT.Schedule</string>
<string name="initializationStatus">Initialization</string>
<string name="permissionsCheckStatus">Checking permissions</string>
<string name="calendarLoadingStatus">Loading calendars list</string>
<string name="facultiesLoadingStatus">Loading faculties list</string>
<string name="offsetDatesLoadingStatus">Loading offset dates</string>
<string name="calendarAccessTitle">Calendar access</string>
<string name="calendarAccessRationale">Grant permission to the app to access calendar. Without it the app will not be able to add schedule to your calendar</string>
<string name="createCalendarTitle">Create new calendar</string>
<string name="createCalendarMessage">There\'s no calendars on your device we can write schedule to</string>
<string name="connectionFailMessage">Unable to load schedule. Check your internet connection or try again later</string>
<string name="repeat">Try again</string>
<string name="quit">Quit</string>
<string name="close">Close</string>
<!-- MainActivity -->
<string name="scheduleParametersTitle">Schedule parameters</string>
<string name="authorizeCheckbox">Authorize via Personal cabinet</string>
<string name="facultySpinner">Faculty</string>
<string name="courseSpinner">Course</string>
<string name="groupSpinner">Group</string>
<string name="passwordField">Password</string>
<string name="exportParametersTitle">Export parameters</string>
<string name="dateRange">Export range</string>
<string name="forDayButton">For day</string>
<string name="forWeekButton">For week</string>
<string name="forMonthButton">For month</string>
<string name="forSemesterButton">For semester</string>
<string name="reminderSpinner">Set reminders for</string>
<string name="reminderNote">(i) Attention, for cloud-based Google calendars Google automatically sets reminders for 30 minutes if there\'s no reminder set by user</string>
<string name="noReminderOption">None</string>
<string name="inTimeReminderOption">At the start of event</string>
<string name="fiveMinuteReminderOption">5 minutes</string>
<string name="tenMinuteReminderOption">10 minutes</string>
<string name="addGroupToTitleCheckbox">Add group number to event title</string>
<string name="titleNote">(i) This doesn\'t affect professors\' schedule</string>
<string name="destinationCalendarSpinner">Destination calendar</string>
<string name="addScheduleButton">Add schedule</string>
<string name="copyrights">©2020 Michael Gordeev, INS, IS-907</string>
<string name="clearCalendarOption">Clear schedule</string>
<string name="reportErrorOption">Report error</string>
<string name="invalidDateRangeError">Error: Invalid date range</string>
<string name="authorizationState">Authorization...</string>
<string name="invalidAuthorizationError">Error: Invalid credential</string>
<string name="authorizationError">Authorization error</string>
<string name="invalidCredentialError">Authorization error: Invalid e-mail and/or password</string>
<string name="groupSelectionError">Error: no group was selected</string>
<string name="clearScheduleTitle">Clear schedule</string>
<string name="clearScheduleMessage">This action will purge exported schedule from all available calendars. \nIt will affect only events created by the app. \n\'All\' - will purge all timetable events including the past ones \n\'Upcoming\' - will affect only upcoming timetable events</string>
<string name="clearAllOption">All</string>
<string name="clearUpcomingOption">Upcoming</string>
<string name="cancelOption">Cancel</string>
<string name="clearingStatus">Clearing...</string>
<!-- ExportActivity -->
<string name="loadingStatus">Loading</string>
<string name="potatoLoadingStatus">Loading schedule from SPbSUT potato servers</string>
<string name="scheduleLoadingStatus">Loading schedule</string>
<string name="calendarExportStatus">Exporting to calendar</string>
<string name="doneStatus">Done</string>
<!-- AboutActivity -->
<string name="aboutTitle">About application</string>
<string name="appDescription">Application for SPbSUT professors\' and students\' schedule export</string>
<string name="developedBy">Developed by Michael Gordeev (IS-907, INS) in the \"Technologies of Informational and Educational Systems\" Research Facility</string>
<string name="contributorsTitle">Contributors</string>
<string name="specialThanksTitle">Special thanks</string>
<string name="specialThanksPeople">Vitaliy Moshkov, Anastasiya Godunova</string>
<string name="contactsTitle">Contacts</string>
<string name="websiteContact">Website</string>
<string name="twitterContact">Twitter</string>
<string name="vkontakteContact">Vkontakte</string>
<string name="linksTitle">Useful links</string>
<string name="privacyPolicyLink">Privacy policy</string>
<string name="repositoryLink">GitHub Repository</string>
<string name="notsLink">\"TIES\" RF</string>
<string name="sutLink">SPbSUT</string>
<string name="feedbackButton">Leave feedback</string>
</resources>
+4 -8
View File
@@ -1,8 +1,4 @@
Version 1.0.8
- Student now can authorize with SPbSUT Cabinet credential
- Introduced both work and study schedule export for PhD students
- Duplicating schedule entries (when group splits in two) are now mergeg into one
- Fixed cases when app crashes on the second launch after entered credentials
- Fixed export errors
- Professors' schedule is now marked with 📚
- You can now add your group number to event title when using cabinet authorization
- Added version number to loading screen and main page
- Updated "About" page
- Changed version numbering system
- Added English localization