From dee69ea1c679dd911b9ea90c9383411d1f697ef4 Mon Sep 17 00:00:00 2001 From: M M Arif Date: Mon, 27 Apr 2026 18:43:35 +0500 Subject: [PATCH] Add view files which app can render from attachments, strings clean up --- .../activities/IssueDetailActivity.java | 103 ++- .../activities/PullRequestDetailActivity.java | 104 ++- app/src/main/res/values/strings.xml | 647 +++--------------- 3 files changed, 295 insertions(+), 559 deletions(-) diff --git a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java index f235079b..4c1a7713 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -29,6 +29,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.google.android.material.card.MaterialCardView; import com.google.android.material.chip.ChipGroup; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.imageview.ShapeableImageView; @@ -1515,14 +1516,15 @@ public class IssueDetailActivity extends BaseActivity boolean isImage = Arrays.asList("bmp", "gif", "jpg", "jpeg", "png", "webp", "heic", "heif") .contains(extension); + AppUtil.FileType fileType = AppUtil.getFileTypeFromFileName(attachment.getName()); + boolean isViewable = isImage || fileType == AppUtil.FileType.TEXT; - int size = (int) (32 * getResources().getDisplayMetrics().density); + int size = (int) (30 * getResources().getDisplayMetrics().density); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(size, size); - params.setMargins(0, 0, (int) (12 * getResources().getDisplayMetrics().density), 0); + params.setMargins(0, 0, (int) (16 * getResources().getDisplayMetrics().density), 0); if (isImage) { - com.google.android.material.imageview.ShapeableImageView imageView = - new com.google.android.material.imageview.ShapeableImageView(this); + ShapeableImageView imageView = new ShapeableImageView(this); imageView.setLayoutParams(params); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); @@ -1541,19 +1543,23 @@ public class IssueDetailActivity extends BaseActivity .into(imageView); imageView.setOnClickListener(v -> openAttachmentPreview(attachment)); + imageView.setOnLongClickListener( + v -> { + downloadAttachment(attachment); + return true; + }); return imageView; } else { - com.google.android.material.card.MaterialCardView card = - new com.google.android.material.card.MaterialCardView(this); + MaterialCardView card = new MaterialCardView(this); card.setLayoutParams(params); - card.setRadius(12); + card.setRadius(0); card.setStrokeWidth(0); card.setClickable(false); card.setFocusable(false); card.setCardBackgroundColor(android.graphics.Color.TRANSPARENT); ImageView icon = new ImageView(this); - int iconSize = (int) (36 * getResources().getDisplayMetrics().density); + int iconSize = (int) (30 * getResources().getDisplayMetrics().density); FrameLayout.LayoutParams iconParams = new FrameLayout.LayoutParams(iconSize, iconSize); iconParams.gravity = Gravity.CENTER; icon.setLayoutParams(iconParams); @@ -1561,13 +1567,92 @@ public class IssueDetailActivity extends BaseActivity icon.setClickable(true); icon.setFocusable(true); - icon.setOnClickListener(v -> downloadAttachment(attachment)); + + if (isViewable) { + icon.setOnClickListener(v -> openFileViewer(attachment)); + icon.setOnLongClickListener( + v -> { + downloadAttachment(attachment); + return true; + }); + } else { + icon.setOnClickListener(v -> downloadAttachment(attachment)); + } card.addView(icon); return card; } } + private void openFileViewer(Attachment attachment) { + String fileUuid = attachment.getUuid(); + String fileName = attachment.getName(); + String extension = FilenameUtils.getExtension(fileName).toLowerCase(); + boolean isMarkdown = "md".equals(extension) || "markdown".equals(extension); + + new Thread( + () -> { + try { + Call call = + RetrofitClient.getWebInterface(this) + .getAttachment(fileUuid); + Response response = call.execute(); + + if (response.isSuccessful() && response.body() != null) { + String content = response.body().string(); + + runOnUiThread( + () -> { + BottomSheetContentViewer.Feature[] features; + if (isMarkdown) { + features = + new BottomSheetContentViewer.Feature[] { + BottomSheetContentViewer.Feature + .MARKDOWN_PREVIEW, + BottomSheetContentViewer.Feature + .START_IN_MARKDOWN, + BottomSheetContentViewer.Feature + .SHOW_TITLE, + BottomSheetContentViewer.Feature + .ALLOW_COPY, + BottomSheetContentViewer.Feature + .ALLOW_SHARE + }; + } else { + features = + new BottomSheetContentViewer.Feature[] { + BottomSheetContentViewer.Feature + .SYNTAX_HIGHLIGHT, + BottomSheetContentViewer.Feature + .SHOW_TITLE, + BottomSheetContentViewer.Feature + .ALLOW_COPY, + BottomSheetContentViewer.Feature + .ALLOW_SHARE + }; + } + + BottomSheetContentViewer.newInstance( + content, + fileName, + repositoryContext, + extension, + features) + .show( + getSupportFragmentManager(), + "FILE_VIEWER"); + }); + } else { + runOnUiThread( + () -> Toasty.show(this, R.string.image_load_error)); + } + } catch (Exception e) { + runOnUiThread(() -> Toasty.show(this, R.string.image_load_error)); + } + }) + .start(); + } + private void displayAttachments(List attachments) { binding.descriptionCard.attachmentsContainer.removeAllViews(); binding.descriptionCard.attachmentsContainer.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/mian/gitnex/activities/PullRequestDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/PullRequestDetailActivity.java index 7b8a7a1b..34833b51 100644 --- a/app/src/main/java/org/mian/gitnex/activities/PullRequestDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/PullRequestDetailActivity.java @@ -29,6 +29,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.google.android.material.card.MaterialCardView; import com.google.android.material.chip.ChipGroup; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.imageview.ShapeableImageView; @@ -1686,14 +1687,15 @@ public class PullRequestDetailActivity extends BaseActivity boolean isImage = Arrays.asList("bmp", "gif", "jpg", "jpeg", "png", "webp", "heic", "heif") .contains(extension); + AppUtil.FileType fileType = AppUtil.getFileTypeFromFileName(attachment.getName()); + boolean isViewable = isImage || fileType == AppUtil.FileType.TEXT; - int size = (int) (32 * getResources().getDisplayMetrics().density); + int size = (int) (30 * getResources().getDisplayMetrics().density); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(size, size); - params.setMargins(0, 0, (int) (12 * getResources().getDisplayMetrics().density), 0); + params.setMargins(0, 0, (int) (16 * getResources().getDisplayMetrics().density), 0); if (isImage) { - com.google.android.material.imageview.ShapeableImageView imageView = - new com.google.android.material.imageview.ShapeableImageView(this); + ShapeableImageView imageView = new ShapeableImageView(this); imageView.setLayoutParams(params); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); @@ -1712,20 +1714,23 @@ public class PullRequestDetailActivity extends BaseActivity .into(imageView); imageView.setOnClickListener(v -> openAttachmentPreview(attachment)); + imageView.setOnLongClickListener( + v -> { + downloadAttachment(attachment); + return true; + }); return imageView; - } else { - com.google.android.material.card.MaterialCardView card = - new com.google.android.material.card.MaterialCardView(this); + MaterialCardView card = new MaterialCardView(this); card.setLayoutParams(params); - card.setRadius(12); + card.setRadius(0); card.setStrokeWidth(0); card.setClickable(false); card.setFocusable(false); card.setCardBackgroundColor(android.graphics.Color.TRANSPARENT); ImageView icon = new ImageView(this); - int iconSize = (int) (36 * getResources().getDisplayMetrics().density); + int iconSize = (int) (30 * getResources().getDisplayMetrics().density); FrameLayout.LayoutParams iconParams = new FrameLayout.LayoutParams(iconSize, iconSize); iconParams.gravity = Gravity.CENTER; icon.setLayoutParams(iconParams); @@ -1733,13 +1738,92 @@ public class PullRequestDetailActivity extends BaseActivity icon.setClickable(true); icon.setFocusable(true); - icon.setOnClickListener(v -> downloadAttachment(attachment)); + + if (isViewable) { + icon.setOnClickListener(v -> openFileViewer(attachment)); + icon.setOnLongClickListener( + v -> { + downloadAttachment(attachment); + return true; + }); + } else { + icon.setOnClickListener(v -> downloadAttachment(attachment)); + } card.addView(icon); return card; } } + private void openFileViewer(Attachment attachment) { + String fileUuid = attachment.getUuid(); + String fileName = attachment.getName(); + String extension = FilenameUtils.getExtension(fileName).toLowerCase(); + boolean isMarkdown = "md".equals(extension) || "markdown".equals(extension); + + new Thread( + () -> { + try { + Call call = + RetrofitClient.getWebInterface(this) + .getAttachment(fileUuid); + Response response = call.execute(); + + if (response.isSuccessful() && response.body() != null) { + String content = response.body().string(); + + runOnUiThread( + () -> { + BottomSheetContentViewer.Feature[] features; + if (isMarkdown) { + features = + new BottomSheetContentViewer.Feature[] { + BottomSheetContentViewer.Feature + .MARKDOWN_PREVIEW, + BottomSheetContentViewer.Feature + .START_IN_MARKDOWN, + BottomSheetContentViewer.Feature + .SHOW_TITLE, + BottomSheetContentViewer.Feature + .ALLOW_COPY, + BottomSheetContentViewer.Feature + .ALLOW_SHARE + }; + } else { + features = + new BottomSheetContentViewer.Feature[] { + BottomSheetContentViewer.Feature + .SYNTAX_HIGHLIGHT, + BottomSheetContentViewer.Feature + .SHOW_TITLE, + BottomSheetContentViewer.Feature + .ALLOW_COPY, + BottomSheetContentViewer.Feature + .ALLOW_SHARE + }; + } + + BottomSheetContentViewer.newInstance( + content, + fileName, + repositoryContext, + extension, + features) + .show( + getSupportFragmentManager(), + "FILE_VIEWER"); + }); + } else { + runOnUiThread( + () -> Toasty.show(this, R.string.image_load_error)); + } + } catch (Exception e) { + runOnUiThread(() -> Toasty.show(this, R.string.image_load_error)); + } + }) + .start(); + } + private void displayAttachments(List attachments) { binding.descriptionCard.attachmentsContainer.removeAllViews(); binding.descriptionCard.attachmentsContainer.setVisibility(View.VISIBLE); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 783f1e4f..3892a0de 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,20 +1,14 @@ - GitNex hello@gitnex.com - Source code - https://codeberg.org/gitnex/GitNex https://gitnex.com/ Your Instance Version https://www.patreon.com/mmarif https://cloud.swatian.com/apps/forms/s/xe7KekTNKgrj58EK6WHQyJDf %s / %d - GitNex is a free, open-source Android client for Git repository management tools Forgejo and Gitea. GitNex is Licensed under GPLv3.\n\nThanks to all the contributors and donators for your generous work and donations. https://crowdin.com/project/gitnex [GitNex] - Crash Report #%1$d Crowdin - Translate - Support Patreon Feedback Access Token Help @@ -42,15 +36,12 @@ N/A main Discover More Apps - β€’ e.g., main, develop, or a commit SHA e.g., 1.26.1 (Gitea) or 15.0.0 (Forgejo) - My Repositories Starred Repositories Repositories - Profile Settings Organizations About @@ -61,16 +52,12 @@ Notes Account Settings Watched Repositories - - - New Repository Issues New Organization New Milestone New Issue New Label - Credits Select Branch Update Label Starred Repositories @@ -79,14 +66,7 @@ New File Explore Administration - New Pull Request Users - Add Repository - - - Demo repo - Demo description - Demo organization Create Repository Name Repository Description @@ -96,51 +76,32 @@ Advanced Default Make repository a template - Organization Name Organization Description - %1$s - %2$s - - Username - Password LOGIN Instance URL - Open Navigation Drawer - Close Navigation Drawer Protocol Couldn\'t connect to host. Please check your URL or port for any errors It is not recommended to use HTTP protocol unless you are testing on local network - Malformed JSON was received. Server response was not successful Instance URL is required - Username is required Name is required - Password is required Protocol is required Enter URL without http or https. Example: codeberg.org - Cannot access network, please check your Internet connection Network error Failed to load the diff No changes found for this file - Repository name is empty Repository name is not valid. [a–z A–Z 0–9 – _] Repository name is reserved Repository name contains reserved keywords - Repository description exceeds the max 255 characters limit Repository created successfully Repository of this name already exists under selected Owner Select owner for the repository The default branch must not be empty - - Organization name is empty - Organization name is not valid, [a–z A–Z 0–9 – _] - Organization description exceeds the max 255 characters limit Organization created successfully Organization already exists - %1$s addition(s) and %2$s deletion(s) - Star Stars @@ -161,82 +122,38 @@ Issue Issues - Instance has returned an error. Code %d - Details Files - Milestones Releases - Collaborators Pull Requests Pull Request - - Default branch %1$s - SSH URL - Clone URL - Repo URL - Created - Last updated %1$s - 0 - More Information - - at # #%1$d - Milestone %1$s - Due on %1$s - Assigned to: %1$s Assigned to Me Comment - Please write your comment Comment posted Created by Me - - This function will be removed in the future - 😱 - Image - - Commit author: %1$s - Downloads Pre-Release Stable Published by @%1$s Release notes are not provided by the publisher. - - Due Date - %1$d-%2$d-%3$d Milestone title is empty - Milestone description exceeds the max 255 characters limit Milestone created successfully - Please choose due date - No due date - No description - %1$d Open - %1$d Closed Select Milestone - - Select Assignees Select Labels - Title Assignees Due Date Labels Issue title is empty - Issue description is empty New issue created successfully - No milestone - No assignees found >Delete milestone Are you sure you want to delete milestone %1$s? You are about to close milestone %1$s. Press Close to continue. This action will reopen milestone %1$s. Press Open to continue. Milestone deleted - - - Translation System Security Delete Trusted Certificates @@ -250,38 +167,21 @@ Light Theme Switch Time Dark Theme Switch Time %s:%s - Choose Time Format Translate GitNex via Crowdin - Green - Black - Code Block Color - Code Block Color Selector Home Screen - My Repositories - Select Home Screen Font - Choose Font - Manrope - Select App Theme Theme - Dark - Counter Badges - Source Code Theme - Sublime - Data Cache Size Data Cache Size - Images Cache Size Images Cache Size API Request Timeout Maximum amount of time to wait for a server response. Clear Cache - 0 B Clear Cache? This will delete all the cache data including files and images.\n\nProceed with deletion? General Home screen, crash reports, custom tabs Default Link Handler Choose what screen should be loaded if the app cannot handle external links. It will redirect you automatically. - Select Default Link Handler Screen Biometric Support Labels With Text Support Enabling this will show labels with text in issues and pr lists, default are color dots @@ -289,106 +189,54 @@ Indentation Tabs Width System Default Font - Tabs Animation Fade Out Zoom Out %1$s / %2$s Backup Restore - The backup was successfully created An error occurred while creating a data backup - This action will backup your accounts, settings, notes, and data related to repositories.\n\nClick the Backup button to download the backup file. - You are about to restore from a GitNex-generated backup file. This will restore user accounts, settings, notes, and data related to repositories.\n\nPlease note this action will overwrite the current database data. Proceed with caution.\n\nClick Restore to start the process. An error occurred while restoring from the backup file. Restore from Backup + The backup was successfully created You are about to restore from a GitNex-generated backup file. This will restore user accounts, settings, notes, and data related to repositories.\n\nClick Restore to start the process. Set Email and Language as Private You can set your email and language to private to hide them on your profile screen Hide Email You can enable this option to hide your email in the app home dashboard screen - - - No more data available - - New Label - Repo Menu + Are you sure you want to delete label %1$s? Label Name Label Color Label name is empty - Label name is not valid Label created Label updated Delete label - Are you sure you want to delete label %1$s? - Desc Label deleted - Authorization Error It seems that the Access Token is revoked OR you are not allowed to see these contents.\n\nIn case of revoked Token, please update the account. - Do you really want to delete this label? - - - Teams - Members - Team name - Team desc Permissions Members of this team do not have any permissions. Members of this team can view team repositories. Members of this team can view and push to team repositories. Team members can push to and pull from team repositories and add collaborators to them. Members of this team have owner permissions. - show all - Org members - Organization team members - Remove %s Add %s - Do you want to add this user to the team? - Do you want to remove this user from the team? Member added to the team successfully Member removed from the team successfully Repository added to the team successfully Repository removed from the team successfully - Add repository %1$s to organization %2$s team %3$s - Remove repository %1$s from team %2$s - Add / Remove Member - - - Team Name Permission Access Controls - Members can view and clone team repositories - Members can read and push to team repositories - Members can pull from and push to team repositories and add collaborators to them - %1$s%2$s,\u0020 - %1$s%2$s,\u0020 Please enter team name Team name should contain only alphanumeric, dash (-), underscore (_) and dot (.) characters - Please select permission Team description have illegal characters Team description have more than 100 characters Team created successfully - - - - Edit Comment Comment updated - Share Comment Comment deleted successfully Copy Comment - - - - Search users - Username Remove %s? Do you want to remove this user from the repository? - User removed from the repository. - User added to the repository. - - - Followers Following \u0040%1$s @@ -396,19 +244,12 @@ Hide Activity from profile page Hide Email Profile updated - - - - Emails Email Address New email added successfully Email address is empty - Email address is not valid Email address is already in use Primary - SSH Keys This action will permanently delete email %s from your account. - Email deleted successfully Add SSH Key Read-only Access Read-write Access @@ -417,25 +258,11 @@ Invalid SSH key or SSH key already exists SSH key was deleted successfully Are you sure you want to delete %1$s SSH key? - - - - Add / Remove Labels - Labels updated - Close Issue Edit Issue - Reopen Issue Issue closed Issue reopened - Add / Remove Assignees - Assignees updated Subscribe Unsubscribe - - - Repository Meta - - New User System Users Admin @@ -445,9 +272,6 @@ Last Run Executions Task %1$s is initiated successfully - - - Full Name Email Username @@ -457,14 +281,7 @@ Invalid email New user added successfully User already exists - - - - Edit Issue #%1$s Issue updated - - - Tag Name Title Content @@ -484,24 +301,13 @@ Tap to select a branch Tap to select reviewers Create Release/Tag - - Open in Browser - - Stargazers - Watchers No website found No description found No bio found - No location found - No locale found Star - Watcher - Source code (ZIP) Source code (TAR.GZ) - - File Name New Branch Name File Content @@ -511,10 +317,6 @@ Invalid branch name, may only contain a–z, 0–9, hyphens (-), underscores (_), forward slashes (/), and periods (.) Commit message is too long New file created - Select or create a branch - Fields like filename, content and commit message are required - Leave blank to push to the default branch - New branch name cannot be empty if current branch is not selected Branch name and ref are required Reference (Branch/Commit) Branch created successfully @@ -526,225 +328,49 @@ Default Branch Commit message cannot be empty File content cannot be empty - Filter Markdown - - Copy Issue URL URL copied to clipboard - Comment copied to clipboard SHA copied to clipboard - - %1$d\uFF05 completed - - - Sorry this file cannot be viewed as API returned an error - \u0020:\u0020 Files of this type cannot be edited - Not supported - - - OK - Done - Cancel - Something went wrong, please try again - This request needs higher version than the one installed. Please upgrade your instance to the latest version. - 🌟 Nothing in here 🌟 - Add - Remove - You are not authorized to perform this action. - Menu - Edit - Delete - Copy - Quote & Reply - \u0020\u0020\u0020\u25CF\u0020\u0020\u0020 - edited - Save - README.md - README - Website - Location - Max 255 characters - All fields are required - Continue - Token - private - public - View in Browser - Open - Closed - We cannot reach the server at the moment, please check your server status and try again - Copy URL - Hold on β˜• - File - Issue - Label - Release - Collaborator - Unstar - Watch - Unwatch - Share - Repository - Team - Organization - Add / Remove - Download - Reopen - Open in Browser - Delete %s - Reset - BETA - None - main - License - Title - Description - Bio - Pin - Unpin - Branch - Branches - Timeline - Hours - Minutes - Sort - Name - ID - Newest - Oldest - Alphabetically - Size - Home - Personal - Activities - Refresh - Actions - Runners - Workflows - Variables - Forks - Remove - Processing - Search - Close - Add - Org - Repo - Pri - Busy - Idle - Value - Optional - Loading… - Migrations - LFS - Mirrors - Stars - Template - Accounts - Copied - Enabled - Disabled - Visibility - Limited - Clear - Updated - Created - Contributions - Write - Code - Topics - Merged - Milestone - Directory - Apply - State - Update - Select - Collapse - Fullscreen - Type - Reviewers - Change - Editor - Mode - Source - Collaborative - Mirror - Fork - Lock - - - Explore users - Explore issues - Explore repositories Repository added to starred list Repository removed from starred list Repository added to watch list Repository removed from watch list - Root - Unsupported old version(%1$s) of the server detected. Please update to latest stable version. If you continue, some features may not work. New server version detected! Please UPDATE GitNex! - No server detected! Unsupported Version of server - Instance has returned an error - Unauthorized. Check your credentials and try again Token is required - - Deleted Fork - Edit Pull Request #%1$s - Pull Request updated %1$s Files Changed %1$s File Changed - Update Pull Request Files & Commits - Merge Pull Request Branch deleted successfully - Could not delete branch Branch does not exist Merge Delete branch after merge - Merge may fail if you are not authorized to merge this Pull Request. Merge is not possible at this time. There are conflicts, WIP or other things to fix before Merge. This branch belongs to a forked repository Merge comment Pull Request was merged successfully Pull Request is not available for merge - Merge Pull Request Rebase and Merge - Rebase and Merge (--no-ff) Squash and Merge Merge Strategy Select merge strategy Not allowed to merge [Reason: Does not have enough approvals] Delete Branch - Switch Branch Allow maintainers to edit this pr Edit Pull Request - - Please wait for the file to load to memory File saved successfully - This file type/size is not supported in file viewer. You can download it from the menu. Delete This File Edit This File File is set for deletion by branch %1$s - Edit %1$s File is modified by branch %1$s - - Share Issue - Share Repository - Create Repository - Commits %1$s authored and %2$s committed on %3$s %1$s committed on %2$s %1$s authored and committed on %2$s - View Commits Changelog - - Certificate Verification Accept Unknown Certificate? The server certificate is not signed by a known Certificate Authority @@ -755,79 +381,47 @@ Certificate details: Trust Abort - Subscribed successfully - You have already subscribed - Subscription failed Unsubscribed successfully - You have already Unsubscribed Un-Subscription failed - Pinned successfully Unpinned successfully - Pinning failed - Unpinning failed - Close Milestone Open Milestone Milestone status updated successfully - - Crash Reports Enable Crash Reports GitNex has stopped :( Crash reports It is encouraged to open an issue at the project repository with how to reproduce this bug. It is easier to debug and fix the problem that way.\n\nTap the OK button to send the crash report by email instead. Additional content could be added in the email.\nThank you! - - Please sign in again - Due to some major changes regarding the internal functioning of the app, we require you to login again. These changes allow us to make the app more flexible in the future.\n\nThank you for your patience and sorry for the inconvenience. - Counter is reset successfully Do you want to reset counter for repository %s? This will reset all the counters for this account repositories. - Themes, fonts, badges, translation Biometric authentication, SSL certificates, cache - Languages - Crash reports If you like GitNex you can give it a thumbs up App version, build, user instance version Syntax color, indentation Backup and restore accounts, settings and more - Backup accounts, settings, notes and more - Restore accounts, settings, notes and more - Archived This repo is archived. You can view files, but cannot push or open issues/pull-requests. - Account deleted successfully Remove Account Are you sure you want to remove this account from the app?\n\nThis will remove all the data related to this account on the app only. New Account Add Account Update Account - Account already exists in the app - Account added successfully Switched to account : %1$s@%2$s - - Notifications - All caught up πŸš€ Notifications Polling Delay 15 Minutes 30 Minutes 45 Minutes 1 Hour - Select Polling Delay - Choose a minutely delay in which GitNex tries to poll new notifications Mark Read Mark Unread Pin - Successfully marked all notifications as read Polling delay Enable Notifications - Enable Light - Enable Vibration - Choose Color New messages for %s You\'ve got %d new notifications. Notifications @@ -838,10 +432,8 @@ You have %s new notifications To receive notifications, you must enable notifications for GitNex. Tap Open to access your phone settings and enable notifications. - Read Unread - Repository Settings Edit Properties Change name, description, visibility and features @@ -849,9 +441,7 @@ Be careful, this operation CANNOT be undone! Set as Template Enable Issues - External Issue Tracker Url Enable Wiki - External Wiki Url Enable Pull Requests Enable Time Tracker Enable Merge Commits @@ -865,20 +455,15 @@ Repository deleted successfully Transfer Ownership Transfer this repository to a user or to an organization for which you have administrator rights - Things to know before transfer:\n\n- You will lose access to the repository if you transfer it to an individual user.\n- You will keep access to the repository if you transfer it to an organization that you (co-)own.\n\nEnter the repository name as confirmation Perform Transfer New Owner Username Repository transferred successfully New owner is required There is a problem with the owner name. Make sure that the new owner exists - - Filter Repositories Search ONLY in Topic Search in Description Only Archived Repositories - Only Private Repositories Search in Template Repositories - Merge Into Pull From These branches are equal. There is no need to create a pull request @@ -889,52 +474,31 @@ A pull request between these branches already exists Pull Request closed Pull Request reopened - Pull Request Info - %1$s wants to merge branch %2$s into %3$s - It seems that the account for URI %1$s does not exist in the app. You can add one by tapping on the Add New Account button. Go to App GitNex cannot handle the requested resource. You can open an issue in the project repository for improvement, providing details of the work. Launch the default screen from the buttons below; it can be changed in settings. - Biometric Authentication Unlock using your biometric credentials No biometric features available on this device Biometric features are currently unavailable Enroll biometric from phone settings - Login ID \'%s\' copied to clipboard - Download manager Indicates the progress of ongoing downloads - Updated %s - Joined Follow Unfollow - Unfollowed @%s - You now follow @%s - Couldn\'t unfollow user - Couldn\'t follow user The pull request conflicts with the base branch. Please resolve the conflicts and try again. Pull Request updated successfully - Merge Rebase - Select Update Strategy - Avatar Tags - Releases/Tags Tag Only Tag created - Use as reference Do you really want to delete this tag? - Tag deleted - A tag attached to a release cannot be deleted directly Use Custom Tabs No application was found to open this link. SSH URLs and URLs with prefixes other than http:// or https:// are not supported by most browsers - - %s \u25CF not logged in Follow system (Light/Dark) Follow system (Light/Pitch Black) Dynamic colors - Follow system (Light/Dark) @@ -945,8 +509,6 @@ Unadopted Repositories - Adopt will add repository %1$s to organization/user %2$s.\n- Delete will remove it from the system. Commits - - Wiki %1$s updated %2$s Do you really want to delete %s? @@ -957,12 +519,7 @@ Wiki page created successfully A wiki page with this title already exists Edit Wiki Page - Code Editor - - - New Note - Edit Note Start taking your notes here Created %1$s Updated %s @@ -972,63 +529,10 @@ Notes deleted successfully This will delete all of your notes. This action cannot be undone. - Insert a Note No notes found - - - commits - commit - %1$s added %2$s %3$s - - %1$s added the | label %2$s - - %1$s removed the | label %2$s - %1$s removed their assignment %2$s - %1$s was unassigned by %2$s %3$s - %1$s self-assigned this %2$s - %1$s was assigned by %2$s %3$s - %1$s added this to the %2$s milestone %3$s - %1$s removed this from the %2$s milestone %3$s - %1$s added this to a deleted milestone %2$s - %1$s closed this issue %2$s - %1$s reopened this issue %2$s - %1$s reopened this pull request %2$s - %1$s closed this pull request %2$s - %1$s merged this pull request %2$s - %3$s %4$s]]> - %1$s requested review from %2$s %3$s - %1$s changed title from %2$s to %3$s %4$s - %1$s locked as %2$s and limited conversation to collaborators %3$s - %1$s unlocked this conversation %2$s - %1$s added a new dependency #%2$d %3$s - %1$s removed a dependency #%2$d %3$s - %1$s added this to a project %2$s - %1$s removed this from a project %2$s - %1$s added the due date %2$s %3$s - %1$s modified the due date to %2$s from %3$s %4$s - %1$s removed the due date %2$s %3$s - %1$s changed target branch from %2$s to %3$s %4$s - %1$s deleted branch %2$s %3$s - %1$s started working %2$s - %1$s stopped time tracking %2$s - %1$s canceled time tracking %2$s - %1$s added spent time %2$s %3$s - %1$s deleted spent time %2$s %3$s - %1$s added reference %2$s %3$s - %1$s referenced this issue in %2$s %3$s - %1$s referenced this pull request in %2$s %3$s - %3$s %4$s]]> - %1$s left a comment: %2$s %3$s - %1$s pinned this %2$s - Statuses This status has no linked target URL. - Language Statistics - %s%% - - Dashboard - created repository renamed repository from %1$s to starred transferred repository %1$s to @@ -1037,10 +541,8 @@ opened issue commented on issue closed issue - reopened issue created pull request closed pull request - reopened pull request merged pull request approved suggested changes for @@ -1048,42 +550,30 @@ automatically merged pull request deleted branch %1$s at pushed tag %1$s to - deleted tag %1$s from released %1$s at synced commits to %1$s at synced new reference %1$s to synced and deleted reference %1$s at - Attachment Attachments An issue was created but cannot process attachments at this time. Check the server logs for more details. Issue created with attachments File type .%s may not be supported by the server - - %1$d matches found - No matches found %1$d contributions on %2$s I\'m mentioned - Dependencies - No dependencies set Dependency removed Failed to remove dependency Dependency added Failed to add dependency - Search failed - No matching results found - Time Tracking Tracked Time - No time tracked yet Total: %1$dh %2$dm %3$ds Please enter some time Time added Time removed Failed to add time Failed to delete time - Recent update Least update Reverse alphabetically @@ -1092,14 +582,10 @@ Fewest stars Most forks Fewest forks - - Switch account Clear Cache (%1$s) Repository does not exist Select instance provider Please select an instance provider - - %1$s tasks, %2$s artifacts, and %3$s runners Create variable Variable name is required Value is required @@ -1109,50 +595,37 @@ Variables will be passed to certain actions and cannot be read otherwise. Case-insensitive, alphanumeric characters or underscores only, cannot start with GITEA_ or GITHUB_ Input any content. Whitespace at the start and end will be omitted. - - Add Topic Add New Topic Topic Name Topic added successfully Topic deleted successfully Error adding topic Error deleting topic - Error loading topics - Invalid topic name - HTTP Git - Reverse Proxy Credentials If your Gitea/Forgejo is behind a reverse proxy with HTTP Basic Authentication, enter the credentials here.\n\nGitNex sends these in the \'X-Proxy-Auth: Basic …\' header. Administrators needs to configure the proxy to read from this header. Proxy Username Proxy Password Setup Proxy Authorization Save Proxy Credentials - Skip Clear Credentials Proxy credentials saved Proxy credentials cleared Please provide both username and password or leave both empty - Show URL confirmation dialog Show a confirmation dialog before opening external links in Markdown rendered contents - Gitignore Template No template No license - Nothing here There is no data to display at the moment. - Good morning Good afternoon Good evening - View the repositories you visit most often Create and manage personal notes, and attach them to issues Explore public repositories, issues, organizations, and users forked repository - mirrored repository Copied to clipboard Manage all system accounts and users View and execute system scheduled maintenance tasks @@ -1187,7 +660,6 @@ Tap to add milestone Tap to assign assignees Tap to add due date - Tap to add attachments No attachments Maximum %d files allowed File exceeds %s limit @@ -1197,7 +669,6 @@ A file with this name already exists This will stage the file for deletion in the selected branch. Upload file - Binary file - will be uploaded as-is Commit File Commit Changes Commit Deletion @@ -1209,7 +680,6 @@ Please select a branch Create pull request with this branch Tap to select a file - Plain Text Ln %d, Col %d Could not load image Invalid user @@ -1230,22 +700,15 @@ %s downloaded successfully Download Failed Failed to download %s - Pull Request Actions Delete Comment Are you sure you want to delete this comment? Update Branch Merge when all checks pass - Branch unavailable - Branch already deleted - No permission - PR must be closed Nothing to update - branch is already up to date Invalid issue Timeline is empty Issue is locked for comments Pull request is locked for comments - - %s added the %s label β€’ %s %s added this to the %s milestone β€’ %s %s removed this from the milestone %s β€’ %s @@ -1257,7 +720,6 @@ %s pushed %d commits β€’ %s %s unassigned %s β€’ %s %s removed the %s label β€’ %s - in moments in %d minute in %d minutes @@ -1280,4 +742,109 @@ %d months ago %d year ago %d years ago + + + Done + Cancel + Something went wrong, please try again + This request needs higher version than the one installed. Please upgrade your instance to the latest version. + Add + Remove + You are not authorized to perform this action. + Menu + Edit + Delete + Copy + Quote & Reply + Save + README.md + Website + Location + All fields are required + Continue + Token + private + public + Open + Closed + We cannot reach the server at the moment, please check your server status and try again + Copy URL + File + Issue + Release + Collaborator + Unstar + Watch + Unwatch + Share + Organization + Download + Reopen + Open in Browser + Delete %s + Reset + None + License + Title + Description + Bio + Pin + Unpin + Branch + Branches + Hours + Minutes + Sort + Name + ID + Newest + Oldest + Size + Home + Activities + Actions + Forks + Search + Close + Repo + Busy + Value + Optional + Migrations + LFS + Mirrors + Stars + Template + Accounts + Copied + Enabled + Disabled + Visibility + Limited + Clear + Updated + Created + Contributions + Write + Code + Topics + Merged + Milestone + Directory + Apply + State + Update + Select + Collapse + Fullscreen + Type + Reviewers + Editor + Mode + Source + Collaborative + Mirror + Fork + Lock +