Compare commits

...

10 commits

Author SHA1 Message Date
instant992
214b50e781 Premium screen button opens bot with quickreg; keep heart original colors
Some checks are pending
Release / build (push) Waiting to run
Release / release (push) Blocked by required conditions
2026-06-19 01:16:23 +04:00
instant992
7ad1c58901 Sponsor branding: orange title, shimmer heart, banknote icon, bot quickreg command 2026-06-19 00:49:00 +04:00
instant992
8c9895b99f Add Premium features button to Donate screen 2026-06-19 00:24:26 +04:00
instant992
2d473f33b9 Add FoxiGram Premium features screen with animated sticker header 2026-06-19 00:04:32 +04:00
instant992
660d2880bb Fix duplicate AppIconTurbo resource 2026-06-18 23:22:41 +04:00
instant992
7257b6b06c Rename Turbo to Sakura; make Premium icon sponsor-only with donate redirect 2026-06-18 23:06:08 +04:00
instant992
48bf925df9 Remove Nox icon (old Night) 2026-06-18 22:36:06 +04:00
instant992
9cdac58ebc Rename Rainbow icon to Night 2026-06-18 22:16:51 +04:00
instant992
07c37f6072 Restore Night icon 2026-06-18 13:56:14 +04:00
instant992
b357d06dc6 Remove Night icon completely 2026-06-17 09:36:15 +04:00
10 changed files with 257 additions and 35 deletions

View file

@ -190,22 +190,6 @@
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" /> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />
</activity-alias> </activity-alias>
<activity-alias
android:enabled="false"
android:name="org.telegram.messenger.NoxIcon"
android:targetActivity="org.telegram.ui.LaunchActivity"
android:icon="@mipmap/icon_2_launcher"
android:roundIcon="@mipmap/icon_2_launcher"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />
</activity-alias>
<activity-alias <activity-alias
android:enabled="false" android:enabled="false"
android:name="org.telegram.messenger.RainbowIcon" android:name="org.telegram.messenger.RainbowIcon"

View file

@ -44,6 +44,9 @@ import org.telegram.ui.Components.RecyclerListView;
import org.telegram.ui.LauncherIconController; import org.telegram.ui.LauncherIconController;
import org.telegram.ui.PremiumPreviewFragment; import org.telegram.ui.PremiumPreviewFragment;
import tw.nekomimi.nekogram.helpers.SponsorHelper;
import tw.nekomimi.nekogram.settings.FoxPremiumActivity;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
@ -109,8 +112,8 @@ public class AppIconsSelectorCell extends RecyclerListView implements Notificati
setOnItemClickListener((view, position) -> { setOnItemClickListener((view, position) -> {
IconHolderView holderView = (IconHolderView) view; IconHolderView holderView = (IconHolderView) view;
LauncherIconController.LauncherIcon icon = availableIcons.get(position); LauncherIconController.LauncherIcon icon = availableIcons.get(position);
if (icon.premium && !UserConfig.hasPremiumOnAccounts()) { if (icon.premium && !SponsorHelper.isCurrentUserSponsor()) {
fragment.showDialog(new PremiumFeatureBottomSheet(fragment, PremiumPreviewFragment.PREMIUM_FEATURE_APPLICATION_ICONS, true)); fragment.presentFragment(new FoxPremiumActivity());
return; return;
} }
@ -151,14 +154,6 @@ public class AppIconsSelectorCell extends RecyclerListView implements Notificati
private void updateIconsVisibility() { private void updateIconsVisibility() {
availableIcons.clear(); availableIcons.clear();
availableIcons.addAll(Arrays.asList(LauncherIconController.LauncherIcon.values())); availableIcons.addAll(Arrays.asList(LauncherIconController.LauncherIcon.values()));
if (MessagesController.getInstance(currentAccount).premiumFeaturesBlocked()) {
for (int i = 0; i < availableIcons.size(); i++) {
if (availableIcons.get(i).premium) {
availableIcons.remove(i);
i--;
}
}
}
getAdapter().notifyDataSetChanged(); getAdapter().notifyDataSetChanged();
invalidateItemDecorations(); invalidateItemDecorations();
@ -275,7 +270,7 @@ public class AppIconsSelectorCell extends RecyclerListView implements Notificati
iconView.setImageResource(icon.background); iconView.setImageResource(icon.background);
MarginLayoutParams params = (MarginLayoutParams) titleView.getLayoutParams(); MarginLayoutParams params = (MarginLayoutParams) titleView.getLayoutParams();
if (icon.premium && !UserConfig.hasPremiumOnAccounts()) { if (icon.premium && !SponsorHelper.isCurrentUserSponsor()) {
SpannableString str = new SpannableString("d " + LocaleController.getString(icon.title)); SpannableString str = new SpannableString("d " + LocaleController.getString(icon.title));
ColoredImageSpan span = new ColoredImageSpan(R.drawable.msg_mini_premiumlock); ColoredImageSpan span = new ColoredImageSpan(R.drawable.msg_mini_premiumlock);
span.setTopOffset(1); span.setTopOffset(1);

View file

@ -43,9 +43,8 @@ public class LauncherIconController {
DEFAULT("DefaultIcon", R.color.ic_launcher_background, R.drawable.ic_launcher_foreground, R.string.AppIconDefault), DEFAULT("DefaultIcon", R.color.ic_launcher_background, R.drawable.ic_launcher_foreground, R.string.AppIconDefault),
//VINTAGE("VintageIcon", R.drawable.icon_6_background_sa, R.drawable.ic_launcher_foreground, R.string.AppIconVintage), //VINTAGE("VintageIcon", R.drawable.icon_6_background_sa, R.drawable.ic_launcher_foreground, R.string.AppIconVintage),
AQUA("AquaIcon", R.drawable.icon_4_background_sa, R.mipmap.icon_4_launcher_foreground, R.string.AppIconAqua), AQUA("AquaIcon", R.drawable.icon_4_background_sa, R.mipmap.icon_4_launcher_foreground, R.string.AppIconAqua),
PREMIUM("PremiumIcon", R.drawable.icon_3_background_sa, R.mipmap.icon_3_launcher_foreground, R.string.AppIconPremium), PREMIUM("PremiumIcon", R.drawable.icon_3_background_sa, R.mipmap.icon_3_launcher_foreground, R.string.AppIconPremium, true),
TURBO("TurboIcon", R.drawable.icon_5_background_sa, R.mipmap.icon_5_launcher_foreground, R.string.AppIconTurbo), TURBO("TurboIcon", R.drawable.icon_5_background_sa, R.mipmap.icon_5_launcher_foreground, R.string.AppIconTurbo),
NOX("NoxIcon", R.drawable.icon_2_background_sa, R.drawable.ic_launcher_foreground, R.string.AppIconNox),
RAINBOW("RainbowIcon", R.drawable.icon_8_background_sa, R.mipmap.icon_8_launcher_foreground, R.string.AppIconRainbow), RAINBOW("RainbowIcon", R.drawable.icon_8_background_sa, R.mipmap.icon_8_launcher_foreground, R.string.AppIconRainbow),
SPACE("SpaceIcon", R.mipmap.icon_11_launcher_background, R.mipmap.icon_11_launcher_foreground, R.string.AppIconSpace), SPACE("SpaceIcon", R.mipmap.icon_11_launcher_background, R.mipmap.icon_11_launcher_foreground, R.string.AppIconSpace),
CLOUD("CloudIcon", R.color.ic_launcher_background, R.mipmap.icon_12_launcher_foreground, R.string.AppIconCloud); CLOUD("CloudIcon", R.color.ic_launcher_background, R.mipmap.icon_12_launcher_foreground, R.string.AppIconCloud);

View file

@ -206,7 +206,8 @@ public class ShimmerHeartDrawable extends Drawable {
@Override @Override
public void setColorFilter(ColorFilter colorFilter) { public void setColorFilter(ColorFilter colorFilter) {
bitmapPaint.setColorFilter(colorFilter); // Ignore external tint (e.g. TextCell's gray MULTIPLY filter) so the
// heart always keeps its original artwork colors.
} }
@Override @Override

View file

@ -0,0 +1,152 @@
package tw.nekomimi.nekogram.settings;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ApplicationLoader;
import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.R;
import org.telegram.messenger.SendMessagesHelper;
import org.telegram.messenger.UserConfig;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ChatActivity;
import org.telegram.ui.Components.AnimatedFileDrawable;
import org.telegram.ui.Components.BackupImageView;
import org.telegram.ui.Components.LayoutHelper;
import org.telegram.ui.Components.UItem;
import org.telegram.ui.Components.UniversalAdapter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import tw.nekomimi.nekogram.helpers.ShimmerHeartDrawable;
public class FoxPremiumActivity extends BaseNekoSettingsActivity {
private final int serversRow = rowId++;
private final int sponsorRow = rowId++;
private final int iconsRow = rowId++;
private final int buttonRow = rowId++;
private FrameLayout topView;
private BackupImageView stickerView;
private AnimatedFileDrawable stickerDrawable;
@Override
public View createView(Context context) {
topView = new FrameLayout(context);
stickerView = new BackupImageView(context);
topView.addView(stickerView, LayoutHelper.createFrame(130, 130, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 0, 16, 0, 0));
var titleView = new TextView(context);
titleView.setTextSize(android.util.TypedValue.COMPLEX_UNIT_DIP, 22);
titleView.setTypeface(AndroidUtilities.bold());
titleView.setGravity(Gravity.CENTER);
titleView.setText(LocaleController.getString(R.string.FoxPremiumTitle));
titleView.setTextColor(0xFFFF8C00);
topView.addView(titleView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 16, 158, 16, 0));
var subtitleView = new TextView(context);
subtitleView.setTextSize(android.util.TypedValue.COMPLEX_UNIT_DIP, 14);
subtitleView.setGravity(Gravity.CENTER);
subtitleView.setText(LocaleController.getString(R.string.FoxPremiumSubtitle));
subtitleView.setTextColor(getThemedColor(Theme.key_windowBackgroundWhiteGrayText));
topView.addView(subtitleView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, LayoutHelper.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL | Gravity.TOP, 24, 192, 24, 0));
var fragmentView = super.createView(context);
loadSticker();
return fragmentView;
}
private void loadSticker() {
try {
File cacheFile = new File(AndroidUtilities.getCacheDir(), "foxi_premium.webm");
if (!cacheFile.exists() || cacheFile.length() == 0) {
try (InputStream in = ApplicationLoader.applicationContext.getResources().openRawResource(R.raw.foxi_premium);
FileOutputStream out = new FileOutputStream(cacheFile)) {
byte[] buffer = new byte[16 * 1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
}
}
stickerDrawable = new AnimatedFileDrawable(cacheFile, true, 0, 0, null, null, null, 0, UserConfig.selectedAccount, true, 260, 260, null);
stickerView.setImageDrawable(stickerDrawable);
stickerView.getImageReceiver().setAutoRepeat(1);
stickerDrawable.start();
stickerView.setOnClickListener(v -> {
if (stickerDrawable != null) {
stickerDrawable.start();
}
});
} catch (Throwable ignore) {
}
}
@Override
protected boolean needActionBarPadding() {
return false;
}
@Override
protected void fillItems(ArrayList<UItem> items, UniversalAdapter adapter) {
items.add(UItem.asCustomShadow(topView, 240));
items.add(UItem.asButtonSubtext(serversRow, R.drawable.msg2_devices, LocaleController.getString(R.string.FoxPremiumFeatureServersTitle), LocaleController.getString(R.string.FoxPremiumFeatureServersAbout)));
UItem sponsorItem = UItem.asButton(sponsorRow, new ShimmerHeartDrawable(AndroidUtilities.dp(24)), LocaleController.getString(R.string.FoxPremiumFeatureSponsorTitle));
sponsorItem.subtext = LocaleController.getString(R.string.FoxPremiumFeatureSponsorAbout);
items.add(sponsorItem);
items.add(UItem.asButtonSubtext(iconsRow, R.drawable.msg_emoji_smiles, LocaleController.getString(R.string.FoxPremiumFeatureIconsTitle), LocaleController.getString(R.string.FoxPremiumFeatureIconsAbout)));
items.add(UItem.asShadow(null));
items.add(UItem.asButton(buttonRow, R.drawable.msg_input_like, LocaleController.getString(R.string.FoxPremiumButton)));
items.add(UItem.asShadow(null));
}
@Override
protected void onItemClick(UItem item, View view, int position, float x, float y) {
if (item.id == buttonRow) {
openBotWithCommand("vpnghostbot", "/quickreg");
}
}
private void openBotWithCommand(String username, String command) {
int account = UserConfig.selectedAccount;
MessagesController mc = MessagesController.getInstance(account);
mc.getUserNameResolver().resolve(username, peerId -> {
if (peerId == null || peerId == 0) {
return;
}
AndroidUtilities.runOnUIThread(() -> {
Bundle args = new Bundle();
args.putLong("user_id", peerId);
presentFragment(new ChatActivity(args));
AndroidUtilities.runOnUIThread(() ->
SendMessagesHelper.getInstance(account).sendMessage(
SendMessagesHelper.SendMessageParams.of(command, peerId)), 150);
});
});
}
@Override
protected String getActionBarTitle() {
return LocaleController.getString(R.string.FoxPremiumTitle);
}
@Override
public void onFragmentDestroy() {
super.onFragmentDestroy();
if (stickerDrawable != null) {
stickerDrawable.recycle();
stickerDrawable = null;
}
}
}

View file

@ -3,6 +3,10 @@ package tw.nekomimi.nekogram.settings;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Outline; import android.graphics.Outline;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.view.Gravity; import android.view.Gravity;
import android.view.View; import android.view.View;
import android.view.ViewOutlineProvider; import android.view.ViewOutlineProvider;
@ -17,11 +21,15 @@ import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.telegram.messenger.AndroidUtilities; import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.FileLog; import org.telegram.messenger.FileLog;
import org.telegram.messenger.LocaleController; import org.telegram.messenger.LocaleController;
import org.telegram.messenger.MessagesController;
import org.telegram.messenger.R; import org.telegram.messenger.R;
import org.telegram.messenger.SendMessagesHelper;
import org.telegram.messenger.UserConfig;
import org.telegram.messenger.browser.Browser; import org.telegram.messenger.browser.Browser;
import org.telegram.ui.ActionBar.BaseFragment; import org.telegram.ui.ActionBar.BaseFragment;
import org.telegram.ui.ActionBar.BottomSheet; import org.telegram.ui.ActionBar.BottomSheet;
import org.telegram.ui.ActionBar.Theme; import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.ChatActivity;
import org.telegram.ui.Components.BulletinFactory; import org.telegram.ui.Components.BulletinFactory;
import org.telegram.ui.Components.ItemOptions; import org.telegram.ui.Components.ItemOptions;
import org.telegram.ui.Components.LayoutHelper; import org.telegram.ui.Components.LayoutHelper;
@ -34,12 +42,14 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import tw.nekomimi.nekogram.helpers.ShimmerHeartDrawable;
import tw.nekomimi.nekogram.helpers.remote.ConfigHelper; import tw.nekomimi.nekogram.helpers.remote.ConfigHelper;
public class NekoDonateActivity extends BaseNekoSettingsActivity { public class NekoDonateActivity extends BaseNekoSettingsActivity {
private final List<ConfigHelper.Crypto> cryptos = ConfigHelper.getCryptos(); private final List<ConfigHelper.Crypto> cryptos = ConfigHelper.getCryptos();
private final int supportProjectRow = 1; private final int supportProjectRow = 1;
private final int premiumRow = 3;
private final int topSponsorsRow = 2; private final int topSponsorsRow = 2;
private final int cryptoRow = 200; private final int cryptoRow = 200;
@ -52,7 +62,12 @@ public class NekoDonateActivity extends BaseNekoSettingsActivity {
@Override @Override
protected void fillItems(ArrayList<UItem> items, UniversalAdapter adapter) { protected void fillItems(ArrayList<UItem> items, UniversalAdapter adapter) {
items.add(UItem.asButtonSubtext(supportProjectRow, R.drawable.msg_input_like, LocaleController.getString(R.string.FoxSupportProject), LocaleController.getString(R.string.FoxSupportProjectAbout))); items.add(UItem.asButtonSubtext(supportProjectRow, R.drawable.msg_payment_card, LocaleController.getString(R.string.FoxSupportProject), LocaleController.getString(R.string.FoxSupportProjectAbout)));
SpannableString premiumTitle = new SpannableString(LocaleController.getString(R.string.FoxPremiumTitle));
premiumTitle.setSpan(new ForegroundColorSpan(0xFFFF8C00), 0, premiumTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
UItem premiumItem = UItem.asButton(premiumRow, new ShimmerHeartDrawable(AndroidUtilities.dp(24)), premiumTitle);
premiumItem.subtext = LocaleController.getString(R.string.FoxPremiumSubtitle);
items.add(premiumItem);
items.add(UItem.asButtonSubtext(topSponsorsRow, R.drawable.msg_premium_liststar, LocaleController.getString(R.string.FoxTopSponsors), LocaleController.getString(R.string.FoxTopSponsorsAbout))); items.add(UItem.asButtonSubtext(topSponsorsRow, R.drawable.msg_premium_liststar, LocaleController.getString(R.string.FoxTopSponsors), LocaleController.getString(R.string.FoxTopSponsorsAbout)));
items.add(UItem.asShadow(null)); items.add(UItem.asShadow(null));
@ -70,7 +85,9 @@ public class NekoDonateActivity extends BaseNekoSettingsActivity {
protected void onItemClick(UItem item, View view, int position, float x, float y) { protected void onItemClick(UItem item, View view, int position, float x, float y) {
var id = item.id; var id = item.id;
if (id == supportProjectRow) { if (id == supportProjectRow) {
Browser.openUrl(getParentActivity(), "https://t.me/vpnghostbot"); openBotWithCommand("vpnghostbot", "/quickreg");
} else if (id == premiumRow) {
presentFragment(new FoxPremiumActivity());
} else if (id == topSponsorsRow) { } else if (id == topSponsorsRow) {
presentFragment(new FoxSponsorsActivity()); presentFragment(new FoxSponsorsActivity());
} else if (id >= cryptoRow) { } else if (id >= cryptoRow) {
@ -79,6 +96,25 @@ public class NekoDonateActivity extends BaseNekoSettingsActivity {
} }
} }
private void openBotWithCommand(String username, String command) {
int account = UserConfig.selectedAccount;
MessagesController mc = MessagesController.getInstance(account);
mc.getUserNameResolver().resolve(username, peerId -> {
if (peerId == null || peerId == 0) {
return;
}
AndroidUtilities.runOnUIThread(() -> {
Bundle args = new Bundle();
args.putLong("user_id", peerId);
ChatActivity chatActivity = new ChatActivity(args);
presentFragment(chatActivity);
AndroidUtilities.runOnUIThread(() ->
SendMessagesHelper.getInstance(account).sendMessage(
SendMessagesHelper.SendMessageParams.of(command, peerId)), 150);
});
});
}
@Override @Override
protected boolean onItemLongClick(UItem item, View view, int position, float x, float y) { protected boolean onItemLongClick(UItem item, View view, int position, float x, float y) {
var id = item.id; var id = item.id;

Binary file not shown.

View file

@ -218,8 +218,9 @@
<string name="MarkdownAbout">Изменяйте текст сообщений, используя markdown: ^1**жирный**^1, ^2__курсив__^2, ^3~~зачёркнутый~~^3, ^4`моноширинный`^4, ^5||скрытый||^5, ^6текст^7url^8.</string> <string name="MarkdownAbout">Изменяйте текст сообщений, используя markdown: ^1**жирный**^1, ^2__курсив__^2, ^3~~зачёркнутый~~^3, ^4`моноширинный`^4, ^5||скрытый||^5, ^6текст^7url^8.</string>
<string name="MarkdownAbout2">Изменяйте текст сообщений, используя markdown: ^1**жирный**^1, ^2__курсив__^2, ^3~~зачёркнутый~~^3, ^4`моноширинный`^4, ^5||скрытый||^5.</string> <string name="MarkdownAbout2">Изменяйте текст сообщений, используя markdown: ^1**жирный**^1, ^2__курсив__^2, ^3~~зачёркнутый~~^3, ^4`моноширинный`^4, ^5||скрытый||^5.</string>
<string name="AppIconOldSchool">Old School</string> <string name="AppIconOldSchool">Old School</string>
<string name="AppIconTurbo">Сакура</string>
<string name="AppIconMerio">Мерио</string> <string name="AppIconMerio">Мерио</string>
<string name="AppIconRainbow">Радуга</string> <string name="AppIconRainbow">Ночь</string>
<string name="AppIconMusheen">Мушин</string> <string name="AppIconMusheen">Мушин</string>
<string name="AppIconSpace">Космос</string> <string name="AppIconSpace">Космос</string>
<string name="AppIconCloud">Облако</string> <string name="AppIconCloud">Облако</string>
@ -324,6 +325,15 @@
<!-- Accessibility --> <!-- Accessibility -->
<string name="AccessibilitySettings">Настройки специальных возможностей</string> <string name="AccessibilitySettings">Настройки специальных возможностей</string>
<string name="FoxSponsorBadge">Спонсор GhostCloud</string> <string name="FoxSponsorBadge">Спонсор GhostCloud</string>
<string name="FoxPremiumTitle">Спонсор FoxiGram</string>
<string name="FoxPremiumSubtitle">Поддержите проект и откройте эксклюзивные возможности</string>
<string name="FoxPremiumFeatureServersTitle">Больше LTE и Wi-Fi серверов</string>
<string name="FoxPremiumFeatureServersAbout">Доступ к дополнительным быстрым LTE и Wi-Fi серверам</string>
<string name="FoxPremiumFeatureSponsorTitle">Сердечко спонсора</string>
<string name="FoxPremiumFeatureSponsorAbout">Значок сердечка рядом с вашим именем в чатах</string>
<string name="FoxPremiumFeatureIconsTitle">Эксклюзивные иконки приложения</string>
<string name="FoxPremiumFeatureIconsAbout">Иконки приложения Premium, Космос и Облако</string>
<string name="FoxPremiumButton">Поддержать FoxiGram</string>
<string name="FoxSponsorBadgeInfo">Эта отметка выдана за поддержание проекта на 444+ рублей.</string> <string name="FoxSponsorBadgeInfo">Эта отметка выдана за поддержание проекта на 444+ рублей.</string>
<string name="FoxSupportProject">Поддержать проект</string> <string name="FoxSupportProject">Поддержать проект</string>
<string name="FoxSupportProjectAbout">Оформите GhostCloud через нашего бота</string> <string name="FoxSupportProjectAbout">Оформите GhostCloud через нашего бота</string>
@ -341,4 +351,19 @@
<string name="HidePhoneNumberShow">Показывать</string> <string name="HidePhoneNumberShow">Показывать</string>
<string name="HidePhoneNumberBlur">Размыть</string> <string name="HidePhoneNumberBlur">Размыть</string>
<string name="HidePhoneNumberHide">Скрыть</string> <string name="HidePhoneNumberHide">Скрыть</string>
<string name="CenterChatTitle">Центрировать название чата</string>
<string name="UseSystemFont">Системный шрифт</string>
<string name="EmojiPacksAvailable">Доступные наборы</string>
<string name="EmojiPackDownload">Скачать</string>
<string name="EmojiPackDownloadError">Не удалось скачать набор эмодзи. Проверьте подключение к интернету и попробуйте ещё раз.</string>
<string name="FontSettings">Шрифт</string>
<string name="FontSelectTitle">Выбор шрифта</string>
<string name="FontSelectHint">Выбранный шрифт применяется к полужирному и среднему тексту во всём приложении. Все шрифты поддерживают латиницу и кириллицу.</string>
<string name="FontAddTitle">Добавить шрифт</string>
<string name="FontAddFile">Установить из файла (TTF/OTF)</string>
<string name="FontAddGoogleFonts">Скачать с Google Fonts</string>
<string name="FontGoogleFontsHint">Введите название семейства шрифта точно как на fonts.google.com (например: &#171;Open Sans&#187;, &#171;Nunito&#187;, &#171;Roboto Slab&#187;).</string>
<string name="FontDownloadError">Не удалось скачать шрифт.</string>
<string name="UseNewLayout">Новый макет FoxiGram</string>
<string name="UseNewLayoutHint">Заголовок по центру, аватар справа, кнопки звонка внутри меню ⋮. После переключения может потребоваться перезапуск.</string>
</resources> </resources>

View file

@ -5702,7 +5702,7 @@
<string name="AppIconVintage">Vintage</string> <string name="AppIconVintage">Vintage</string>
<string name="AppIconAqua">Aqua</string> <string name="AppIconAqua">Aqua</string>
<string name="AppIconPremium">Premium</string> <string name="AppIconPremium">Premium</string>
<string name="AppIconTurbo">Turbo</string> <string name="AppIconTurbo">Sakura</string>
<string name="AppIconNox">Nox</string> <string name="AppIconNox">Nox</string>
<string name="AppIconChangedTo">App icon has been changed to %1$s</string> <string name="AppIconChangedTo">App icon has been changed to %1$s</string>
<string name="FileTooLarge">File Too Large</string> <string name="FileTooLarge">File Too Large</string>

View file

@ -155,6 +155,15 @@
<string name="NekogramVersion">FoxiGram %1$s\nBased on Telegram %2$s\nDesigned by %3$s</string> <string name="NekogramVersion">FoxiGram %1$s\nBased on Telegram %2$s\nDesigned by %3$s</string>
<string name="UpdateInstalling">Installing update...</string> <string name="UpdateInstalling">Installing update...</string>
<string name="FoxSponsorBadge">Sponsor GhostCloud</string> <string name="FoxSponsorBadge">Sponsor GhostCloud</string>
<string name="FoxPremiumTitle">Спонсор FoxiGram</string>
<string name="FoxPremiumSubtitle">Support the project and unlock exclusive perks</string>
<string name="FoxPremiumFeatureServersTitle">More LTE and Wi-Fi servers</string>
<string name="FoxPremiumFeatureServersAbout">Get access to additional fast LTE and Wi-Fi servers</string>
<string name="FoxPremiumFeatureSponsorTitle">Sponsor heart</string>
<string name="FoxPremiumFeatureSponsorAbout">A heart badge next to your name in chats</string>
<string name="FoxPremiumFeatureIconsTitle">Exclusive app icons</string>
<string name="FoxPremiumFeatureIconsAbout">Premium, Space and Cloud app icons</string>
<string name="FoxPremiumButton">Support FoxiGram</string>
<string name="FoxSponsorBadgeInfo">This badge is granted for supporting the project with 444+ rubles.</string> <string name="FoxSponsorBadgeInfo">This badge is granted for supporting the project with 444+ rubles.</string>
<string name="FoxSupportProject">Support the project</string> <string name="FoxSupportProject">Support the project</string>
<string name="FoxSupportProjectAbout">Subscribe to GhostCloud via our bot</string> <string name="FoxSupportProjectAbout">Subscribe to GhostCloud via our bot</string>
@ -242,7 +251,7 @@
<string name="MarkdownAbout2">Edit text in messages using markdown: ^1**bold**^1, ^2__italic__^2, ^3~~strikethrough~~^3, ^4`monospace`^4, ^5||spoiler||^5.</string> <string name="MarkdownAbout2">Edit text in messages using markdown: ^1**bold**^1, ^2__italic__^2, ^3~~strikethrough~~^3, ^4`monospace`^4, ^5||spoiler||^5.</string>
<string name="AppIconOldSchool">Old School</string> <string name="AppIconOldSchool">Old School</string>
<string name="AppIconMerio">Merio</string> <string name="AppIconMerio">Merio</string>
<string name="AppIconRainbow">Rainbow</string> <string name="AppIconRainbow">Night</string>
<string name="AppIconMusheen">Musheen</string> <string name="AppIconMusheen">Musheen</string>
<string name="AppIconSpace">Space</string> <string name="AppIconSpace">Space</string>
<string name="AppIconCloud">Cloud</string> <string name="AppIconCloud">Cloud</string>
@ -351,4 +360,25 @@
<!-- Accessibility --> <!-- Accessibility -->
<string name="AccessibilitySettings">Accessibility settings</string> <string name="AccessibilitySettings">Accessibility settings</string>
<!-- Appearance extras -->
<string name="CenterChatTitle">Center chat title</string>
<string name="UseSystemFont">Use system font</string>
<string name="UseNewLayout">New FoxiGram layout</string>
<string name="UseNewLayoutHint">Centered title, avatar on the right, call buttons inside the ⋮ menu. Restart may be needed after switching.</string>
<!-- Font settings -->
<string name="FontSettings">Font</string>
<string name="FontSelectTitle">Select font</string>
<string name="FontSelectHint">The selected font is applied to bold and medium text throughout the app. All fonts support Latin and Cyrillic (Russian).</string>
<string name="FontAddTitle">Add font</string>
<string name="FontAddFile">Install from file (TTF/OTF)</string>
<string name="FontAddGoogleFonts">Download from Google Fonts</string>
<string name="FontGoogleFontsHint">Enter the font family name exactly as it appears on fonts.google.com (e.g. "Open Sans", "Nunito", "Roboto Slab").</string>
<string name="FontDownloadError">Failed to download font.</string>
<!-- Built-in emoji packs -->
<string name="EmojiPacksAvailable">Available packs</string>
<string name="EmojiPackDownload">Download</string>
<string name="EmojiPackDownloadError">Failed to download emoji pack. Check your internet connection and try again.</string>
</resources> </resources>