Skip to content

Commit

Permalink
Merge branch 'roothide:main' into main
Browse files Browse the repository at this point in the history
bankm1 authored Feb 21, 2024
2 parents 658a1d8 + 130867f commit 568da93
Showing 68 changed files with 2,803 additions and 481 deletions.
64 changes: 64 additions & 0 deletions .github/ISSUE_TEMPLATE/bootstrap-bug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Bootstrap Bug
description: A bug while using the roothide Bootstrap
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for using the roothide Bootstap! If your issue can be solved with simple troubleshooting, check out these resources:
[Bootstrap README.md](https://github.com/roothide/Bootstrap/blob/main/README.md)
[Bootstrap FAQ](https://github.com/dleovl/Bootstrap/blob/faq/README.md)
[roothide Discord server](https://discord.com/invite/scqCkumAYp) (with support channels)
- type: input
id: device-model
attributes:
label: Device Model
description: What device model are you using? (Device, Chipset)
placeholder: ex. iPhone 11, A13
validations:
required: true
- type: input
id: ios-version
attributes:
label: iOS Version
description: What iOS version are you using?
placeholder: ex. 17.0
validations:
required: true
- type: input
id: bootstrap-version
attributes:
label: Bootstrap Version
description: What version of the roothide Bootstrap are you using?
placeholder: ex. 1.0
validations:
required: true
- type: input
id: serotonin-version
attributes:
label: Serotonin Version
description: What version of Serotonin are you using? (if applicable)
placeholder: ex. 1.0.1
- type: textarea
id: bugs
attributes:
label: What happened
description: Also, what did you expect to happen? How can we reproduce this?
placeholder: I did ..., but ... was supposed to happen. ... doesn't work!
validations:
required: true
- type: textarea
id: logs
attributes:
label: Log output
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
- type: checkboxes
id: acknowledgement
attributes:
label: Acknowledgement of README and FAQ
description: By submitting this issue, you acknowledge you have read both the [README](https://github.com/roothide/Bootstrap/blob/main/README.md) and the [FAQ](https://github.com/dleovl/Bootstrap/blob/faq/README.md), and neither solve the issue (nor should it be written).
options:
- label: I have read both the README and the FAQ.
required: true
4 changes: 1 addition & 3 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
.theos/
packages/
.DS_Store
/basebin/
/layout/
*.xcuserstate
Bootstrap.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate
Bootstrap.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate
/Bootstrap.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/UserInterfaceState.xcuserstate
*.xcuserstate
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "basebin"]
path = basebin
url = https://github.com/roothide/Bootstrap-basebin
162 changes: 156 additions & 6 deletions Bootstrap.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
{
"pins" : [
{
"identity" : "fluidgradient",
"kind" : "remoteSourceControl",
"location" : "https://github.com/Cindori/FluidGradient.git",
"state" : {
"revision" : "9ddda4cf23671ef0228e88681ec6210cb3e0d7f7",
"version" : "1.0.0"
}
},
{
"identity" : "zstd",
"kind" : "remoteSourceControl",
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
uuid = "EFE94600-8EE3-4753-ACB3-301BC523BB0D"
type = "1"
version = "2.0">
</Bucket>
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Bootstrap.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>
1 change: 0 additions & 1 deletion Bootstrap/AppDelegate.h
Original file line number Diff line number Diff line change
@@ -13,7 +13,6 @@
+ (void)showMesage:(NSString*)msg title:(NSString*)title;

+ (void)addLogText:(NSString*)text;
+ (void)registerLogView:(UITextView*)view;

@end

34 changes: 16 additions & 18 deletions Bootstrap/AppDelegate.m
Original file line number Diff line number Diff line change
@@ -8,23 +8,9 @@ @interface AppDelegate ()

@implementation AppDelegate

UITextView* logView=nil;

+ (void)registerLogView:(UITextView*)view
{
dispatch_async(dispatch_get_main_queue(), ^{
logView = view;
logView.layoutManager.allowsNonContiguousLayout = NO;
});
}

+ (void)addLogText:(NSString*)text
{
dispatch_async(dispatch_get_main_queue(), ^{
[logView setText:[logView.text stringByAppendingString:[NSString stringWithFormat:@"%@\n",text]]];
if(logView.contentSize.height >= logView.bounds.size.height)
[logView setContentOffset:CGPointMake(0, logView.contentSize.height - logView.bounds.size.height) animated:YES];
});
[NSNotificationCenter.defaultCenter postNotificationName:@"LogMsgNotification" object:text];
}

MBProgressHUD *switchHud=nil;
@@ -64,11 +50,23 @@ + (void)showAlert:(UIAlertController*)alert {
});

dispatch_async(alertQueue, ^{

__block UIViewController* availableVC=nil;
while(!availableVC) {
dispatch_async(dispatch_get_main_queue(), ^{
UIViewController* vc = UIApplication.sharedApplication.keyWindow.rootViewController;
while(vc.presentedViewController){
vc = vc.presentedViewController;
if(vc.isBeingDismissed) return;
}
availableVC = vc;
});
if(!availableVC) usleep(1000*100);
}

__block BOOL presented = NO;
dispatch_async(dispatch_get_main_queue(), ^{
UIViewController* vc = UIApplication.sharedApplication.keyWindow.rootViewController;
while(vc.presentedViewController) vc = vc.presentedViewController;
[vc presentViewController:alert animated:YES completion:^{ presented=YES; }];
[availableVC presentViewController:alert animated:YES completion:^{ presented=YES; }];
});

while(!presented) usleep(100*1000);
50 changes: 43 additions & 7 deletions Bootstrap/AppEnabler.m
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#import <Foundation/Foundation.h>
#include <sys/stat.h>
#include "AppList.h"
#include "common.h"

@@ -135,6 +136,7 @@ int backupApp(NSString* bundlePath)
return 0;
}

//if the app package is changed/upgraded, the directory structure may change and some paths may become invalid.
int restoreApp(NSString* bundlePath)
{
SYSLOG("restoreApp=%@", bundlePath);
@@ -200,24 +202,39 @@ int enableForApp(NSString* bundlePath)

ASSERT([fm createSymbolicLinkAtPath:[jbroot(bundlePath) stringByAppendingString:@"/.jbroot"] withDestinationPath:jbroot(@"/") error:nil]);

ASSERT(spawnBootstrap((char*[]){"/usr/bin/uicache","-p", bundlePath.UTF8String, NULL}, nil, nil) == 0);
NSString* log=nil;
NSString* err=nil;
if(spawnBootstrap((char*[]){"/usr/bin/uicache","-p", bundlePath.UTF8String, NULL}, &log, &err) != 0) {
STRAPLOG("%@\nERR:%@", log, err);
ABORT();
}
}
else if([appInfo[@"CFBundleIdentifier"] hasPrefix:@"com.apple."]
|| [NSFileManager.defaultManager fileExistsAtPath:[bundlePath stringByAppendingString:@"/../_TrollStore"]])
{
ASSERT(backupApp(bundlePath) == 0);

ASSERT([fm createSymbolicLinkAtPath:[bundlePath stringByAppendingString:@"/.jbroot"] withDestinationPath:jbroot(@"/") error:nil]);

ASSERT(spawnBootstrap((char*[]){"/usr/bin/uicache","-s","-p", rootfsPrefix(bundlePath).UTF8String, NULL}, nil, nil) == 0);

NSString* log=nil;
NSString* err=nil;
if(spawnBootstrap((char*[]){"/usr/bin/uicache","-s","-p", rootfsPrefix(bundlePath).UTF8String, NULL}, &log, &err) != 0) {
STRAPLOG("%@\nERR:%@", log, err);
ABORT();
}
}
else
{
ASSERT(backupApp(bundlePath) == 0);

ASSERT([fm createSymbolicLinkAtPath:[bundlePath stringByAppendingString:@"/.jbroot"] withDestinationPath:jbroot(@"/") error:nil]);

ASSERT(spawnBootstrap((char*[]){"/usr/bin/uicache","-s","-p", rootfsPrefix(bundlePath).UTF8String, NULL}, nil, nil) == 0);
NSString* log=nil;
NSString* err=nil;
if(spawnBootstrap((char*[]){"/usr/bin/uicache","-s","-p", rootfsPrefix(bundlePath).UTF8String, NULL}, &log, &err) != 0) {
STRAPLOG("%@\nERR:%@", log, err);
ABORT();
}
}

return 0;
@@ -242,17 +259,36 @@ int disableForApp(NSString* bundlePath)
else if([appInfo[@"CFBundleIdentifier"] hasPrefix:@"com.apple."]
|| [NSFileManager.defaultManager fileExistsAtPath:[bundlePath stringByAppendingString:@"/../_TrollStore"]])
{

struct stat st;
if(lstat([bundlePath stringByAppendingString:@"/.jbroot"].fileSystemRepresentation, &st)==0)
ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.jbroot"] error:nil]);
if(lstat([bundlePath stringByAppendingString:@"/.prelib"].fileSystemRepresentation, &st)==0)
ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.prelib"] error:nil]);
if(lstat([bundlePath stringByAppendingString:@"/.preload"].fileSystemRepresentation, &st)==0)
ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.preload"] error:nil]);
if(lstat([bundlePath stringByAppendingString:@"/.rebuild"].fileSystemRepresentation, &st)==0)
ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.rebuild"] error:nil]);

ASSERT(restoreApp(bundlePath) == 0);
ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.jbroot"] error:nil]);

ASSERT(spawnBootstrap((char*[]){"/usr/bin/uicache","-s","-p", rootfsPrefix(bundlePath).UTF8String, NULL}, nil, nil) == 0);
}
else
{
//should be an appstored app

ASSERT(restoreApp(bundlePath) == 0);
struct stat st;
if(lstat([bundlePath stringByAppendingString:@"/.jbroot"].fileSystemRepresentation, &st)==0)
ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.jbroot"] error:nil]);
if(lstat([bundlePath stringByAppendingString:@"/.prelib"].fileSystemRepresentation, &st)==0)
ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.prelib"] error:nil]);
if(lstat([bundlePath stringByAppendingString:@"/.preload"].fileSystemRepresentation, &st)==0)
ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.preload"] error:nil]);
if(lstat([bundlePath stringByAppendingString:@"/.rebuild"].fileSystemRepresentation, &st)==0)
ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.rebuild"] error:nil]);

ASSERT([fm removeItemAtPath:[bundlePath stringByAppendingString:@"/.jbroot"] error:nil]);
ASSERT(restoreApp(bundlePath) == 0);

//unregister or respring to keep app's icon on home screen
ASSERT(spawnBootstrap((char*[]){"/usr/bin/uicache","-u", rootfsPrefix(bundlePath).UTF8String, NULL}, nil, nil) == 0);
45 changes: 35 additions & 10 deletions Bootstrap/AppViewController.m
Original file line number Diff line number Diff line change
@@ -76,7 +76,7 @@ - (void)viewDidLoad {
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleInsetGrouped];
self.tableView.tableFooterView = [[UIView alloc] init];

[self setTitle:Localized(@"Tweak Enabler")];
[self setTitle:Localized(@"Enable Tweak for App")];

isFiltered = false;

@@ -127,6 +127,28 @@ - (void)viewWillAppear:(BOOL)animated {
[self.tableView.refreshControl endRefreshing];
}

-(BOOL)tweakEnabled:(AppList*)app {
struct stat st;
if(lstat([app.bundleURL.path stringByAppendingPathComponent:@".jbroot"].fileSystemRepresentation, &st)==0) {
return YES;
}

if(!isDefaultInstallationPath(app.bundleURL.path)) {
return NO;
}

NSString* uuidPath = [app.bundleURL.path stringByDeletingLastPathComponent];
NSString* backupFlag = [uuidPath stringByAppendingPathComponent:@".appbackup"];
NSString* backupPath = [[uuidPath stringByAppendingPathComponent:app.bundleURL.path.lastPathComponent] stringByAppendingPathExtension:@"appbackup"];
SYSLOG("uuidPath=%@, backupFlag=%@, backupPath=%@", uuidPath, backupFlag, backupPath);
if([NSFileManager.defaultManager fileExistsAtPath:backupFlag] && [NSFileManager.defaultManager fileExistsAtPath:backupPath]) {
//if the app has been successfully backed up but failed to enable tweak injection for some reason, or the app bundle is overwritten, we will still show that tweak injection has been enabled so that the user will have the chance to restore the app in appenabler
return YES;
}

return NO;
}

- (void)updateData:(BOOL)sort {
NSMutableArray* applications = [NSMutableArray new];
PrivateApi_LSApplicationWorkspace* _workspace = [NSClassFromString(@"LSApplicationWorkspace") new];
@@ -155,6 +177,10 @@ - (void)updateData:(BOOL)sort {
[app.bundleURL.path stringByAppendingString:@"/.TrollStorePresistenceHelper"]])
continue;

if([NSFileManager.defaultManager fileExistsAtPath:
[app.bundleURL.path stringByAppendingString:@"/.Bootstrap"]])
continue;

if([app.bundleURL.path.lastPathComponent isEqualToString:@"TrollStore.app"])
continue;

@@ -171,15 +197,16 @@ - (void)updateData:(BOOL)sort {
if(sort)
{
NSArray *appsSortedByName = [applications sortedArrayUsingComparator:^NSComparisonResult(AppList *app1, AppList *app2) {
struct stat st;
BOOL enabled1 = lstat([app1.bundleURL.path stringByAppendingPathComponent:@".jbroot"].fileSystemRepresentation, &st)==0;
BOOL enabled2 = lstat([app2.bundleURL.path stringByAppendingPathComponent:@".jbroot"].fileSystemRepresentation, &st)==0;
if(enabled1 || enabled2) {

BOOL enabled1 = [self tweakEnabled:app1];
BOOL enabled2 = [self tweakEnabled:app2];

if((enabled1&&!enabled2) || (!enabled1&&enabled2)) {
return [@(enabled2) compare:@(enabled1)];
}

if(app1.isHiddenApp || app2.isHiddenApp) {
return [@(app1.isHiddenApp) compare:@(app2.isHiddenApp)];
return (enabled1&&enabled2) ? [@(app2.isHiddenApp) compare:@(app1.isHiddenApp)] : [@(app1.isHiddenApp) compare:@(app2.isHiddenApp)];
}

return [app1.name localizedStandardCompare:app2.name];
@@ -281,9 +308,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N
if([unsupportedBundleIDs containsObject:app.bundleIdentifier])
theSwitch.enabled = NO;

struct stat st;
BOOL enabled = lstat([app.bundleURL.path stringByAppendingPathComponent:@".jbroot"].fileSystemRepresentation, &st)==0;
[theSwitch setOn:enabled];
[theSwitch setOn:[self tweakEnabled:app]];
[theSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];

cell.accessoryView = theSwitch;
@@ -320,7 +345,7 @@ - (void)switchChanged:(id)sender {
}

if(status != 0) {
[AppDelegate showMesage:[NSString stringWithFormat:@"%@\n\nstderr:\n%@",log,err] title:[NSString stringWithFormat:@"code(%d)",status]];
[AppDelegate showMesage:[NSString stringWithFormat:@"%@\nstderr:\n%@",log,err] title:[NSString stringWithFormat:@"error(%d)",status]];
}

killAllForApp(app.bundleURL.path.UTF8String);
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 21 additions & 0 deletions Bootstrap/Assets.xcassets/Bootstrap.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "Bootstrap.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
131 changes: 2 additions & 129 deletions Bootstrap/Base.lproj/Main.storyboard
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21507" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina4_0" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21505"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
@@ -17,144 +16,18 @@
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="LQX-IC-Eof">
<rect key="frame" x="101" y="538" width="114" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="tintColor" systemColor="systemRedColor"/>
<buttonConfiguration key="configuration" style="filled" image="trash" catalog="system" title="Uninstall"/>
<connections>
<action selector="unbootstrap:" destination="BYZ-38-t0r" eventType="touchUpInside" id="MGa-od-jOL"/>
</connections>
</button>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="bPU-Gp-wbI">
<rect key="frame" x="179.5" y="504" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="tintColor" name="AccentColor"/>
<color key="onTintColor" name="AccentColor"/>
<color key="thumbTintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<connections>
<action selector="openssh:" destination="BYZ-38-t0r" eventType="valueChanged" id="E5z-3d-Y5B"/>
</connections>
</switch>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="L3N-5g-U7l">
<rect key="frame" x="18" y="408" width="137" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonConfiguration key="configuration" style="tinted" image="arrow.clockwise" catalog="system" title="Respring"/>
<connections>
<action selector="respring:" destination="BYZ-38-t0r" eventType="touchUpInside" id="lbu-go-Y79"/>
</connections>
</button>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="OpenSSH" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZIf-Su-8xG">
<rect key="frame" x="88.5" y="508" width="83" height="23"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="19"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="248" fixedFrame="YES" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="Bootstrap(beta 4.2)" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="mHC-UO-Fsn">
<rect key="frame" x="14" y="34" width="300" height="51"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="42"/>
<textInputTraits key="textInputTraits"/>
</textField>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="a00-Is-meU">
<rect key="frame" x="76" y="310" width="177" height="45"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonConfiguration key="configuration" style="filled" image="terminal" catalog="system" title="Bootstrapped"/>
<connections>
<action selector="bootstrap:" destination="BYZ-38-t0r" eventType="touchUpInside" id="4t4-gT-m0w"/>
</connections>
</button>
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" editable="NO" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="vAH-eh-yux">
<rect key="frame" x="3" y="93" width="312" height="215"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" systemColor="secondarySystemBackgroundColor"/>
<string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.</string>
<color key="textColor" systemColor="labelColor"/>
<fontDescription key="fontDescription" name="Menlo-Regular" family="Menlo" pointSize="14"/>
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="8"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
</userDefinedRuntimeAttributes>
</textView>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="EZ0-Bd-3hy">
<rect key="frame" x="89" y="360" width="152" height="34"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonConfiguration key="configuration" style="tinted" image="checkmark.seal" catalog="system" title="AppEnabler"/>
<connections>
<action selector="appenabler:" destination="BYZ-38-t0r" eventType="touchUpInside" id="xRE-YA-IhT"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Qyj-sw-Fdy">
<rect key="frame" x="163" y="408" width="152" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonConfiguration key="configuration" style="tinted" image="arrow.clockwise" catalog="system" title="RebuildApps"/>
<connections>
<action selector="rebuildapps:" destination="BYZ-38-t0r" eventType="touchUpInside" id="eln-8N-ArQ"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="fMY-Su-mQL">
<rect key="frame" x="16" y="450" width="139" height="45"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonConfiguration key="configuration" style="tinted" image="arrow.clockwise" catalog="system" title="Reinstall Sileo+Zebra"/>
<connections>
<action selector="reinstallPackageManager:" destination="BYZ-38-t0r" eventType="touchUpInside" id="egA-SC-xt5"/>
</connections>
</button>
<button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ocj-vU-eoB">
<rect key="frame" x="163" y="450" width="152" height="45"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<buttonConfiguration key="configuration" style="tinted" image="arrow.clockwise" catalog="system" title="Rebuild Icon Cache"/>
<connections>
<action selector="rebuildIconCache:" destination="BYZ-38-t0r" eventType="touchUpInside" id="WQs-ju-vYv"/>
</connections>
</button>
</subviews>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
</view>
<connections>
<outlet property="appEnablerBtn" destination="EZ0-Bd-3hy" id="k9y-cw-Yfn"/>
<outlet property="bootstraBtn" destination="a00-Is-meU" id="chJ-cA-4pr"/>
<outlet property="logView" destination="vAH-eh-yux" id="XVQ-B0-Whq"/>
<outlet property="opensshLabel" destination="ZIf-Su-8xG" id="kqm-4V-SI1"/>
<outlet property="opensshState" destination="bPU-Gp-wbI" id="AD0-vT-lfL"/>
<outlet property="rebuildIconCacheBtn" destination="Ocj-vU-eoB" id="pUg-zo-HAd"/>
<outlet property="rebuildappsBtn" destination="Qyj-sw-Fdy" id="3LT-9H-8bm"/>
<outlet property="reinstallPackageManagerBtn" destination="fMY-Su-mQL" id="E3R-GV-oLX"/>
<outlet property="respringBtn" destination="L3N-5g-U7l" id="lIx-4D-zVr"/>
<outlet property="unbootstrapBtn" destination="LQX-IC-Eof" id="isZ-rT-6Gz"/>
<outlet property="uninstallBtn" destination="LQX-IC-Eof" id="u0Z-hU-k5W"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-16.875" y="-31.690140845070424"/>
</scene>
</scenes>
<resources>
<image name="arrow.clockwise" catalog="system" width="113" height="128"/>
<image name="checkmark.seal" catalog="system" width="128" height="124"/>
<image name="terminal" catalog="system" width="128" height="93"/>
<image name="trash" catalog="system" width="117" height="128"/>
<namedColor name="AccentColor">
<color red="0.0" green="0.46000000000000002" blue="0.89000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
<systemColor name="labelColor">
<color red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="secondarySystemBackgroundColor">
<color red="0.94901960784313721" green="0.94901960784313721" blue="0.96862745098039216" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
<systemColor name="systemRedColor">
<color red="1" green="0.23137254901960785" blue="0.18823529411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</systemColor>
</resources>
</document>
9 changes: 9 additions & 0 deletions Bootstrap/Bootstrap-Bridging-Header.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#include <Foundation/Foundation.h>
#include "credits.h"
#include "utils.h"
#include "bootstrap.h"
#include "ViewController.h"
#include "AppViewController.h"
1 change: 1 addition & 0 deletions Bootstrap/Classes/Log.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

1 change: 1 addition & 0 deletions Bootstrap/Extensions/ButtonStyles.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

14 changes: 14 additions & 0 deletions Bootstrap/Extensions/VisualEffectView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// VisualEffectView.swift
// BootstrapUI
//
// Created by haxi0 on 29.12.2023.
//

import SwiftUI

struct VisualEffectView: UIViewRepresentable {
var effect: UIVisualEffect?
func makeUIView(context: UIViewRepresentableContext<Self>) -> UIVisualEffectView { UIVisualEffectView() }
func updateUIView(_ uiView: UIVisualEffectView, context: UIViewRepresentableContext<Self>) { uiView.effect = effect }
}
13 changes: 11 additions & 2 deletions Bootstrap/ViewController.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end

void initFromSwiftUI();
void respringAction();
void rebuildappsAction();
void reinstallPackageManager();
void rebuildIconCacheAction();
void tweaEnableAction(BOOL enable);
BOOL opensshAction(BOOL enable);
void bootstrapAction();
void unbootstrapAction();
BOOL updateOpensshStatus(BOOL notify);
void resetMobilePassword();
503 changes: 241 additions & 262 deletions Bootstrap/ViewController.m

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions Bootstrap/Views/AppViewControllerWrapper.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// AppViewControllerWrapper.swift
// Bootstrap
//
// Created by haxi0 on 02.01.2024.
//

import SwiftUI
import UIKit

struct AppViewControllerWrapper: UIViewControllerRepresentable {
class Coordinator: NSObject {}

func makeCoordinator() -> Coordinator {
return Coordinator()
}

func makeUIViewController(context: Context) -> UIViewController {
let navigationController = UINavigationController(rootViewController: AppViewController.sharedInstance())
return navigationController
}

func updateUIViewController(_ uiViewController: UIViewController, context: Context) {}
}
265 changes: 265 additions & 0 deletions Bootstrap/Views/ContentView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,265 @@
//
// ContentView.swift
// BootstrapUI
//
// Created by haxi0 on 21.12.2023.
//

import SwiftUI
import FluidGradient

@objc class SwiftUIViewWrapper: NSObject {
@objc static func createSwiftUIView() -> UIViewController {
let viewController = UIHostingController(rootView: ContentView())
return viewController
}
}

struct ContentView: View {
@State var LogItems: [String.SubSequence] = {
return [""]
}()

@State private var showOptions = false
@State private var showCredits = false
@State private var showAppView = false
@State private var strapButtonDisabled = false
@State private var newVersionAvailable = false
@State private var newVersionReleaseURL:String = ""
@State private var tweakEnable: Bool = !isSystemBootstrapped() || FileManager.default.fileExists(atPath: jbroot("/var/mobile/.tweakenabled"))

let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String

var body: some View {
ZStack {
FluidGradient(blobs: [.red, .orange],
highlights: [.red, .yellow],
speed: 0.5,
blur: 0.95)
.background(.quaternary)
.ignoresSafeArea()

VStack {
HStack(spacing: 15) {
Image("Bootstrap")
.resizable()
.frame(width: 80, height: 80)
.cornerRadius(18)

VStack(alignment: .leading, content: {
Text("Bootstrap")
.bold()
.font(Font.system(size: 35))
Text("Version \(appVersion!)")
.font(Font.system(size: 20))
.opacity(0.5)
})
}
.padding(20)

if newVersionAvailable {
Button {
UIApplication.shared.open(URL(string: newVersionReleaseURL)!)
} label: {
Label(
title: { Text("New Version Available") },
icon: { Image(systemName: "arrow.down.app.fill") }
)
}
.frame(height:20)
.padding(.top, -20)
.padding(10)
}

VStack {
Button {
UIImpactFeedbackGenerator(style: .light).impactOccurred()
bootstrapAction()
} label: {
if isSystemBootstrapped() {
if checkBootstrapVersion() {
Label(
title: { Text("Bootstrapped").bold() },
icon: { Image(systemName: "chair.fill") }
)
.frame(maxWidth: .infinity)
.padding(25)
.onAppear() {
strapButtonDisabled = true
}
} else {
Label(
title: { Text("Update").bold() },
icon: { Image(systemName: "chair") }
)
.frame(maxWidth: .infinity)
.padding(25)
}
} else if isBootstrapInstalled() {
Label(
title: { Text("Bootstrap").bold() },
icon: { Image(systemName: "chair") }
)
.frame(maxWidth: .infinity)
.padding(25)
} else if ProcessInfo.processInfo.operatingSystemVersion.majorVersion>=15 {
Label(
title: { Text("Install").bold() },
icon: { Image(systemName: "chair") }
)
.frame(maxWidth: .infinity)
.padding(25)
} else {
Label(
title: { Text("Unsupported").bold() },
icon: { Image(systemName: "chair") }
)
.frame(maxWidth: .infinity)
.padding(25)
.onAppear() {
strapButtonDisabled = true
}
}
}
.frame(width: 295)
.background {
Color(UIColor.systemBackground)
.cornerRadius(20)
.opacity(0.5)
}
.disabled(strapButtonDisabled)

HStack {

Button {
showAppView.toggle()
UIImpactFeedbackGenerator(style: .light).impactOccurred()
} label: {
Label(
title: { Text("App List") },
icon: { Image(systemName: "checklist") }
)
.frame(width: 145, height: 65)
}
.background {
Color(UIColor.systemBackground)
.cornerRadius(20)
.opacity(0.5)
}
.disabled(!isSystemBootstrapped() || !checkBootstrapVersion())

Button {
withAnimation {
UIImpactFeedbackGenerator(style: .light).impactOccurred()
showOptions.toggle()
}
} label: {
Label(
title: { Text("Settings") },
icon: { Image(systemName: "gear") }
)
.frame(width: 145, height: 65)
}
.background {
Color(UIColor.systemBackground)
.cornerRadius(20)
.opacity(0.5)
}

}

VStack {
ScrollView {
ScrollViewReader { scroll in
VStack(alignment: .leading) {
ForEach(0..<LogItems.count, id: \.self) { LogItem in
Text("\(String(LogItems[LogItem]))")
.textSelection(.enabled)
.font(.custom("Menlo", size: 15))
.foregroundColor(.white)
}
}
.onReceive(NotificationCenter.default.publisher(for: Notification.Name("LogMsgNotification"))) { obj in
DispatchQueue.global(qos: .utility).async {
LogItems.append((obj.object as! NSString) as String.SubSequence)
scroll.scrollTo(LogItems.count - 1)
}
}
}
}
.frame(maxHeight: 200)
}
.frame(width: 253)
.padding(20)
.background {
Color(.black)
.cornerRadius(20)
.opacity(0.5)
}

Text("UI made with love by haxi0. ♡")
.font(Font.system(size: 13))
.opacity(0.5)
}
}
}
.safeAreaInset(edge: .bottom, spacing: 0) {
Button {
withAnimation {
UIImpactFeedbackGenerator(style: .light).impactOccurred()
showCredits.toggle()
}
} label: {
Label(
title: { Text("Credits") },
icon: { Image(systemName: "person") }
)
}
.frame(height:30, alignment: .bottom)
.padding(10)

}
.overlay {
if showCredits {
CreditsView(showCredits: $showCredits)
}

if showOptions {
OptionsView(showOptions: $showOptions, tweakEnable: $tweakEnable)
}
}
.onAppear {
initFromSwiftUI()
Task {
do {
try await checkForUpdates()
} catch {

}
}
}
.sheet(isPresented: $showAppView) {
AppViewControllerWrapper()
}
}

func checkForUpdates() async throws {
if let currentAppVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
let owner = "roothide"
let repo = "Bootstrap"

// Get the releases
let releasesURL = URL(string: "https://api.github.com/repos/\(owner)/\(repo)/releases")!
let releasesRequest = URLRequest(url: releasesURL)
let (releasesData, _) = try await URLSession.shared.data(for: releasesRequest)
guard let releasesJSON = try JSONSerialization.jsonObject(with: releasesData, options: []) as? [[String: Any]] else {
return
}

if let latestTag = releasesJSON.first?["tag_name"] as? String, latestTag != currentAppVersion {
newVersionAvailable = true
newVersionReleaseURL = "https://github.com/\(owner)/\(repo)/releases/tag/\(latestTag)"
}
}
}
}
75 changes: 75 additions & 0 deletions Bootstrap/Views/CreditsView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
//
// CreditsView.swift
// Bootstrap
//
// Created by haxi0 on 31.12.2023.
//

import SwiftUI

struct CreditsView: View {
@Binding var showCredits: Bool

let credits: [String: String] = CREDITS as! Dictionary

var body: some View {
ZStack {
VisualEffectView(effect: UIBlurEffect(style: .regular))
.ignoresSafeArea()

VStack {
HStack {
Text("Credits")
.bold()
.frame(maxWidth: 250, alignment: .leading)
.font(Font.system(size: 35))
Button {
withAnimation {
showCredits.toggle()
}
} label: {
Image(systemName: "xmark.circle")
.resizable()
.foregroundColor(.red)
.frame(width: 25, height: 25)
}
}

ScrollView {
VStack {

VStack {
ForEach(credits.sorted(by: { $0.key < $1.key }), id: \.key) { (name, link) in
creditStack(name: name, link: link)
}
}
}
.frame(width: 253)
.padding(20)
.background {
Color(UIColor.systemBackground)
.cornerRadius(20)
.opacity(0.5)
}
}
.frame(maxHeight: 550)
}
}
}

private func creditStack(name: String, link: String) -> some View {
HStack {
Text(name)
.bold()
Spacer()
Button {
if let url = URL(string: link) {
UIApplication.shared.open(url)
}
} label: {
Image(systemName: "link")
}
}
.padding(5)
}
}
225 changes: 225 additions & 0 deletions Bootstrap/Views/OptionsView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,225 @@
//
// OptionsView.swift
// Bootstrap
//
// Created by haxi0 on 31.12.2023.
//

import SwiftUI

class toggleState: ObservableObject {
@Published var state:Bool
init(state: Bool) {
self.state = state
}
}

struct OptionsView: View {
@Binding var showOptions: Bool
@Binding var tweakEnable: Bool
@StateObject var opensshStatus = toggleState(state: updateOpensshStatus(false))

var body: some View {
ZStack {
VisualEffectView(effect: UIBlurEffect(style: .regular))
.ignoresSafeArea()

VStack {
HStack {
Text("Settings")
.bold()
.frame(maxWidth: 250, alignment: .leading)
.font(Font.system(size: 35))

Button {
withAnimation {
showOptions.toggle()
}
} label: {
Image(systemName: "xmark.circle")
.resizable()
.foregroundColor(.red)
.frame(width: 30, height: 30)
}
}

//ScrollView {
VStack {
VStack {

Toggle(isOn: $tweakEnable, label: {
Label(
title: { Text("Tweak Enable") },
icon: { Image(systemName: "wrench.and.screwdriver") }
)
}).padding(5)
.onChange(of: tweakEnable) { newValue in
tweaEnableAction(newValue)
}

Toggle(isOn: Binding(get: {opensshStatus.state}, set: {
opensshStatus.state = opensshAction($0)
}), label: {
Label(
title: { Text("OpenSSH") },
icon: { Image(systemName: "terminal") }
)
})
.onReceive(NotificationCenter.default.publisher(for: Notification.Name("opensshStatusNotification"))) { obj in
DispatchQueue.global(qos: .utility).async {
let newStatus = (obj.object as! NSNumber).boolValue
opensshStatus.state = newStatus
}
}
.padding(5)


Divider().padding(10)

VStack(alignment: .leading, spacing: 12, content: {

Button {
UIImpactFeedbackGenerator(style: .light).impactOccurred()
respringAction()
} label: {
Label(
title: { Text("Respring") },
icon: { Image(systemName: "arrow.clockwise") }
)
.frame(maxWidth: .infinity)
.padding(.vertical, 10)
.foregroundColor((!isSystemBootstrapped() || !checkBootstrapVersion()) ? Color.accentColor : Color.init(uiColor: UIColor.label))
}
.frame(width: 250)
.background(Color.clear)
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(.gray, lineWidth: 1)
.opacity(0.3)
)
.disabled(!isSystemBootstrapped() || !checkBootstrapVersion())

Button {
UIImpactFeedbackGenerator(style: .light).impactOccurred()
rebuildappsAction()
} label: {
Label(
title: { Text("Rebuild Apps") },
icon: { Image(systemName: "arrow.clockwise") }
)
.frame(maxWidth: .infinity)
.padding(.vertical, 10)
.foregroundColor((!isSystemBootstrapped() || !checkBootstrapVersion()) ? Color.accentColor : Color.init(uiColor: UIColor.label))
}
.frame(width: 250)
.background(Color.clear)
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(.gray, lineWidth: 1)
.opacity(0.3)
)
.disabled(!isSystemBootstrapped() || !checkBootstrapVersion())

Button {
UIImpactFeedbackGenerator(style: .light).impactOccurred()
rebuildIconCacheAction()
} label: {
Label(
title: { Text("Rebuild Icon Cache") },
icon: { Image(systemName: "arrow.clockwise") }
)
.frame(maxWidth: .infinity)
.padding(.vertical, 10)
.foregroundColor((!isSystemBootstrapped() || !checkBootstrapVersion()) ? Color.accentColor : Color.init(uiColor: UIColor.label))
}
.frame(width: 250)
.background(Color.clear)
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(.gray, lineWidth: 1)
.opacity(0.3)
)
.disabled(!isSystemBootstrapped() || !checkBootstrapVersion())

Button {
UIImpactFeedbackGenerator(style: .light).impactOccurred()
resetMobilePassword()
} label: {
Label(
title: { Text("Reset Mobile Password") },
icon: { Image(systemName: "key") }
)
.frame(maxWidth: .infinity)
.padding(.vertical, 10)
.foregroundColor((!isSystemBootstrapped() || !checkBootstrapVersion()) ? Color.accentColor : Color.init(uiColor: UIColor.label))
}
.frame(width: 250)
.background(Color.clear)
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(.gray, lineWidth: 1)
.opacity(0.3)
)
.disabled(!isSystemBootstrapped() || !checkBootstrapVersion())

Button {
UIImpactFeedbackGenerator(style: .light).impactOccurred()
reinstallPackageManager()
} label: {
Label(
title: { Text("Reinstall Sileo & Zebra") },
icon: { Image(systemName: "shippingbox") }
)
.frame(maxWidth: .infinity)
.padding(.vertical, 10)
.foregroundColor((!isSystemBootstrapped() || !checkBootstrapVersion()) ? Color.accentColor : Color.init(uiColor: UIColor.label))
}
.frame(width: 250)
.background(Color.clear)
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(.gray, lineWidth: 1)
.opacity(0.3)
)
.disabled(!isSystemBootstrapped() || !checkBootstrapVersion())

if isBootstrapInstalled() {
Button {
UIImpactFeedbackGenerator(style: .light).impactOccurred()
unbootstrapAction()
} label: {
Label(
title: { Text("Uninstall") },
icon: { Image(systemName: "trash") }
)
.frame(maxWidth: .infinity)
.padding(.vertical, 10)
.foregroundColor(isSystemBootstrapped() ? Color.accentColor : Color.init(uiColor: UIColor.label))
}
.frame(width: 250)
.background(Color.clear)
.overlay(
RoundedRectangle(cornerRadius: 10)
.stroke(.gray, lineWidth: 1)
.opacity(0.3)
)
.disabled(isSystemBootstrapped())
}
})
}
.frame(width: 253)
.padding(20)
.background {
Color(UIColor.systemBackground)
.cornerRadius(20)
.opacity(0.5)
}
}
//}
}
.frame(maxHeight: 550)
}
}
}


70 changes: 70 additions & 0 deletions Bootstrap/ar.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"Settings" = "الإعدادات";
"Tweak Enable" = "تفعيل الأدوات";
"OpenSSH" = "OpenSSH";
"Respring" = "إعادة التشغيل السريع";
"Rebuild Apps" = "إعادة بناء التطبيقات";
"Rebuild Icon Cache" = "إعادة بناء ذاكرة الأيقونات المؤقتة";
"Reinstall Sileo & Zebra" = "إعادة تثبيت Sileo و Zebra";
"Uninstall" = "إلغاء التثبيت";
"Credits" = "الاعتمادات";
"New Version Available" = "إصدار جديد متاح";
"Bootstrapped" = "تم التمهيد";
"Update" = "تحديث";
"Install" = "تثبيت";
"Unsupported" = "غير مدعوم";
"App List" = "قائمة التطبيقات";


"OK" = "حسنًا";
"Error" = "خطأ";
"Warning" = "تحذير";
"Applying" = "جارِ التطبيق";
"Cancel" = "إلغاء";
"Bootstrapping" = "جارِ التمهيد";
"Uninstalling" = "جارِ إلغاء التثبيت";
"bootstrap uninstalled" = "تم إزالة التمهيد";

"Enable Tweak for App" = "تفعيل الأدوات للتطبيقات";
"name or identifier" = "الاسم أو المعرف";

"Server Not Running" = "الخادم لا يعمل";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "خادم التمهيد لا يعمل لأسباب غير واضحة، الشيء الوحيد الذي يمكن عمله الآن هو إعادة تشغيله.";

"Restart Server" = "إعادة تشغيل الخادم";
"bootstrap server restart successful" = "نجح إعادة تشغيل خادم التمهيد";

"Rebuilding" = "إعادة البناء";
"Don't exit Bootstrap app until show the lock screen" = "لا تخرج من تطبيق Bootstrap حتى تظهر شاشة القفل";

"bootstrap installed" = "تم تثبيت التمهيد";
"bootstrap not installed" = "التمهيد غير مثبت";
"system bootstrapped" = "تم تمهيد النظام";
"system not bootstrapped" = "لم يتم تمهيد النظام";
"bootstrap server check successful" = "نجح التحقق من خادم التمهيد";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "يبدو أن تطبيق Filza مثبت لديك، يمكن اكتشاف وتمييز هذا التطبيق لاحقًا على أنه جيلبريك. يمكنك تفعيل الأدوات له لإخفائه.";

"Status: Rebuilding Apps" = "الحالة: إعادة بناء التطبيقات";
"Status: Reinstalling Sileo" = "الحالة: إعادة تثبيت Sileo";
"Status: Reinstalling Zebra" = "الحالة: إعادة تثبيت Zebra";
"Sileo and Zebra reinstalled!" = "تم إعادة تثبيت Sileo و Zebra!";
"Status: Rebuilding Icon Cache" = "الحالة: إعادة بناء الذاكرة المؤقتة للأيقونات";

"openssh package is not installed" = "حزمة OpenSSH غير مثبتة";

"Reboot Device" = "إعادة تشغيل الجهاز";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "إصدار التمهيد الحالي غير متطابق مع إصدار تطبيق Bootstrap، أنت تحتاج كذلك إلى إعادة تشغيل الجهاز لتحديثه.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "إصدار TrollStor الذي لديك قديم جدًا، يدعم Bootstrap إصدارات 2.0 وأحدث من TrollStore فقط، يجب عليك تحديث TrollStore ثم إعادة تثبيت تطبيق Bootstrap.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "يبدو أن وضع المطور غير مفعل على جهازك.\n\nيرحى تفعيل وضع المطور وإعادة تشغيل جهازك.";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "تم تثبيت RootHide Dopamine على هذا الجهاز، تثبيت هذا التمهيد الآن قد يتسبب في تعطله!";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "لقد قمت بتثبيت إصدار تجريبي قديم، يرجى تعطيل كل أدوات التطبيقات وإعادة تشغيل جهازك لإزالته حتى يتسنى لك تثبيت الإصدار الجديد من Bootstrap.";

"openssh launch successful" = "نجح تشغيل OpenSSH";
"respring now..." = "جارِ إعادة التشغيل السريع الآن…";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "هل أنت متأكد من أنك تريد إلغاء تثبيت Bootstrap؟\n\nيرجى التأكد من تعطيلك للأدوات لكل التطبيقات قبل إلغاء التثبيت.";
Binary file modified Bootstrap/basebin/bootstrap.dylib
Binary file not shown.
Binary file modified Bootstrap/basebin/bootstrapd
Binary file not shown.
Binary file modified Bootstrap/basebin/devtest
Binary file not shown.
21 changes: 21 additions & 0 deletions Bootstrap/basebin/entitlements/com.apple.mobilemail.extra
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>platform-application</key>
<true/>
<key>get-task-allow</key>
<true/>

<key>com.apple.private.security.no-sandbox</key>
<true/>
<key>com.apple.private.security.storage.AppBundles</key>
<true/>
<key>com.apple.private.security.storage.AppDataContainers</key>
<true/>
<key>com.apple.security.iokit-user-client-class</key>
<array>
<string>IOUserClient</string>
</array>
</dict>
</plist>
7 changes: 7 additions & 0 deletions Bootstrap/basebin/entitlements/com.apple.mobilemail.strip
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<string>com.apple.private.security.container-required</string>
</array>
</plist>
Binary file modified Bootstrap/basebin/fastPathSign
Binary file not shown.
Binary file modified Bootstrap/basebin/preload
Binary file not shown.
Binary file modified Bootstrap/basebin/preload.dylib
Binary file not shown.
Binary file modified Bootstrap/basebin/rebuildapp
Binary file not shown.
Binary file modified Bootstrap/basebin/uicache
Binary file not shown.
2 changes: 2 additions & 0 deletions Bootstrap/bootstrap.h
Original file line number Diff line number Diff line change
@@ -3,6 +3,8 @@

#define BOOTSTRAP_VERSION (5)

#import <Foundation/Foundation.h>

void rebuildSignature(NSString *directoryPath);

int bootstrap();
52 changes: 45 additions & 7 deletions Bootstrap/bootstrap.m
Original file line number Diff line number Diff line change
@@ -60,7 +60,7 @@ void rebuildSignature(NSString *directoryPath)
}
}

SYSLOG("rebuild finished! machoCount=%d, libCount=%d", machoCount, libCount);
STRAPLOG("rebuild finished! machoCount=%d, libCount=%d", machoCount, libCount);

}

@@ -241,8 +241,8 @@ int InstallBootstrap(NSString* jbroot_path)
ASSERT(spawnBootstrap((char*[]){"/usr/bin/dpkg", "-i", rootfsPrefix(zebraDeb).fileSystemRepresentation, NULL}, nil, nil) == 0);
ASSERT(spawnBootstrap((char*[]){"/usr/bin/uicache", "-p", "/Applications/Zebra.app", NULL}, nil, nil) == 0);

ASSERT([[NSString stringWithFormat:@"%d",BOOTSTRAP_VERSION] writeToFile:jbroot(@"/.bootstrapped") atomically:YES encoding:NSUTF8StringEncoding error:nil]);
ASSERT([fm copyItemAtPath:jbroot(@"/.bootstrapped") toPath:[jbroot_secondary stringByAppendingPathComponent:@".bootstrapped"] error:nil]);
ASSERT([[NSString stringWithFormat:@"%d",BOOTSTRAP_VERSION] writeToFile:jbroot(@"/.thebootstrapped") atomically:YES encoding:NSUTF8StringEncoding error:nil]);
ASSERT([fm copyItemAtPath:jbroot(@"/.thebootstrapped") toPath:[jbroot_secondary stringByAppendingPathComponent:@".thebootstrapped"] error:nil]);

STRAPLOG("Status: Bootstrap Installed");

@@ -306,6 +306,32 @@ int ReRandomizeBootstrap()
return 0;
}

void fixMobileDirectories()
{
NSFileManager* fm = NSFileManager.defaultManager;
NSDirectoryEnumerator<NSURL *> *directoryEnumerator = [fm enumeratorAtURL:[NSURL fileURLWithPath:jbroot(@"/var/mobile/") isDirectory:YES] includingPropertiesForKeys:@[NSURLIsDirectoryKey] options:0 errorHandler:nil];

for (NSURL *enumURL in directoryEnumerator) {
@autoreleasepool {

if([enumURL.path containsString:@"/var/mobile/Library/pkgmirror/"]
|| [enumURL.path hasSuffix:@"/var/mobile/Library/pkgmirror"])
continue;

struct stat st={0};
if(lstat(enumURL.path.fileSystemRepresentation, &st)==0)
{
if((st.st_mode&S_IFDIR)==0) continue;

// SYSLOG("fixMobileDirectory %d:%d %@", st.st_uid, st.st_gid, enumURL); usleep(1000*10);
if(st.st_uid == 0) {
chown(enumURL.path.fileSystemRepresentation, 501, st.st_gid==0 ? 501 : st.st_gid);
}
}
}
}
}

int bootstrap()
{
ASSERT(getuid()==0);
@@ -331,7 +357,7 @@ int bootstrap()

ASSERT(InstallBootstrap(jbroot_path) == 0);

} else if(![fm fileExistsAtPath:jbroot(@"/.bootstrapped")]) {
} else if(![fm fileExistsAtPath:jbroot(@"/.bootstrapped")] && ![fm fileExistsAtPath:jbroot(@"/.thebootstrapped")]) {
STRAPLOG("remove unfinished bootstrap %@", jbroot_path);

uint64_t prev_jbrand = jbrand();
@@ -351,15 +377,26 @@ int bootstrap()
} else {
STRAPLOG("device is strapped: %@", jbroot_path);

if([fm fileExistsAtPath:jbroot(@"/.bootstrapped")]) //beta version to public version
ASSERT([fm moveItemAtPath:jbroot(@"/.bootstrapped") toPath:jbroot(@"/.thebootstrapped") error:nil]);

STRAPLOG("Status: Rerandomize jbroot");

ASSERT(ReRandomizeBootstrap() == 0);

fixMobileDirectories();
}

ASSERT(disableRootHideBlacklist()==0);

STRAPLOG("Status: Rebuilding Apps");
ASSERT(spawnBootstrap((char*[]){"/bin/sh", "/basebin/rebuildapps.sh", NULL}, nil, nil) == 0);

NSString* log=nil;
NSString* err=nil;
if(spawnBootstrap((char*[]){"/bin/sh", "/basebin/rebuildapps.sh", NULL}, &log, &err) != 0) {
STRAPLOG("%@\nERR:%@", log, err);
ABORT();
}

NSDictionary* bootinfo = @{@"bootsession":getBootSession(), @"bootversion":NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"]};
ASSERT([bootinfo writeToFile:jbroot(@"/basebin/.bootinfo.plist") atomically:YES]);
@@ -374,7 +411,7 @@ int unbootstrap()
STRAPLOG("unbootstrap...");

//try
spawnRoot(jbroot(@"/basebin/bootstrapd"), @[@"exit"], nil, nil);
spawnRoot(jbroot(@"/basebin/bootstrapd"), @[@"stop"], nil, nil);

//jbroot unavailable now

@@ -433,7 +470,8 @@ bool isBootstrapInstalled()
if(!find_jbroot())
return NO;

if(![NSFileManager.defaultManager fileExistsAtPath:jbroot(@"/.bootstrapped")])
if(![NSFileManager.defaultManager fileExistsAtPath:jbroot(@"/.bootstrapped")]
&& ![NSFileManager.defaultManager fileExistsAtPath:jbroot(@"/.thebootstrapped")])
return NO;

return YES;
2 changes: 1 addition & 1 deletion Bootstrap/common.h
Original file line number Diff line number Diff line change
@@ -5,6 +5,6 @@
#include "utils.h"
#include "seh.h"

#define Localized(x) x
#define Localized(x) NSLocalizedString(x,nil)

#endif /* common_h */
9 changes: 7 additions & 2 deletions Bootstrap/credits.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
#ifndef credits_h
#define credits_h
// dictionary will be sorted alphabetically
NSDictionary* CREDITS = @{
static NSDictionary* CREDITS = @{
@"TheAlphaStream" : @"https://twitter.com/kutarin_",
@"Nick Chan" : @"https://github.com/asdfugil",
@"opa334" : @"http://github.com/opa334",
@"hayden" : @"https://procursus.social/@hayden",
@@ -23,8 +24,9 @@ NSDictionary* CREDITS = @{
@"TheosTeam" : @"https://theos.dev",
@"kirb" : @"http://github.com/kirb",
@"Amy While" : @"http://github.com/elihwyma",
@"roothide" : @"http://github.com/RootHide",
@"roothide" : @"http://github.com/roothide",
@"Shadow-" : @"http://iosjb.top/",
@"Summit" : @"https://github.com/dbmz502",
@"SeanIsTethered" : @"https://github.com/jailbreakmerebooted",
@"Huy Nguyen" : @"https://twitter.com/little_34306",
@"haxi0" : @"https://haxi0.space",
@@ -71,6 +73,9 @@ NSDictionary* CREDITS = @{
@"Ellie" : @"https://twitter.com/elliessurviving",
@"tigisoftware" : @"https://twitter.com/tigisoftware",
@"Kevin" : @"https://github.com/iodes",
@"i_82" : @"https://github.com/Lessica",
@"Lakr" : @"https://github.com/Lakr233",
@"olivertzeng" : @"https://github.com/olivertzeng",
};

#endif /* credits_h */
70 changes: 70 additions & 0 deletions Bootstrap/de.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"Settings" = "Einstellungen";
"Tweak Enable" = "Tweak aktivieren";
"OpenSSH" = "OpenSSH";
"Respring" = "Respring";
"Rebuild Apps" = "Apps neu aufbauen";
"Rebuild Icon Cache" = "Icon-Cache neu aufbauen";
"Reinstall Sileo & Zebra" = "Sileo & Zebra neu installieren";
"Uninstall" = "Entfernen";
"Credits" = "Danksagungen";
"New Version Available" = "Neue Version verfügbar";
"Bootstrapped" = "Bootstrapped";
"Update" = "Update";
"Install" = "Installieren";
"Unsupported" = "Nicht unterstützt";
"App List" = "App-Liste";


"OK" = "Okay";
"Error" = "Fehler";
"Warning" = "Warnung";
"Applying" = "Anwenden";
"Cancel" = "Abbrechen";
"Bootstrapping" = "Bootstrapping";
"Uninstalling" = "Entferne";
"bootstrap uninstalled" = "Bootstrap entfernt";

"Enable Tweak for App" = "Tweak für App aktivieren";
"name or identifier" = "Name oder Identifikator";

"Server Not Running" = "Server läuft nicht";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "Aus unbekannten Gründen läuft der Bootstrap-Server nicht. Das Einzige, was wir tun können, ist, ihn jetzt neu zu starten.";

"Restart Server" = "Server neu starten";
"bootstrap server restart successful" = "Neustart des Bootstrap-Servers erfolgreich";

"Rebuilding" = "Neuaufbau";
"Don't exit Bootstrap app until show the lock screen" = "Beenden Sie die Bootstrap-App erst, wenn der Sperrbildschirm angezeigt wird.";

"bootstrap installed" = "Bootstrap installiert";
"bootstrap not installed" = "Bootstrap nicht installiert";
"system bootstrapped" = "System gebootstrappt";
"system not bootstrapped" = "System nicht gebootstrappt";
"bootstrap server check successful" = "Überprüfung des Bootstrap-Servers erfolgreich.";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "Es scheint, dass Sie die Filza-App installiert haben, die möglicherweise als Jailbreak erkannt wird. Sie können den Tweak aktivieren, um Filza verstecken.";

"Status: Rebuilding Apps" = "Status: Apps werden neu aufgebaut";
"Status: Reinstalling Sileo" = "Status: Sileo wird neu installiert";
"Status: Reinstalling Zebra" = "Status: Zebra wird neu installiert";
"Sileo and Zebra reinstalled!" = "Sileo und Zebra neu installiert!";
"Status: Rebuilding Icon Cache" = "Status: Icon-Cache wird neu aufgebaut";

"openssh package is not installed" = "Das OpenSSH-Paket ist nicht installiert.";

"Reboot Device" = "Gerät neustarten";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "Die aktuelle Bootstrap-Version stimmt nicht mit der Bootstrap-App-Version überein. Sie müssen das Gerät neu starten, um es zu aktualisieren.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "Ihre Trollstore-Version ist zu alt, Bootstrap unterstützt nur Trollstore>=2.0. Sie müssen Trollstore aktualisieren und dann die Bootstrap-App neu installieren.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "Auf Ihrem Gerät scheint der Entwicklermodus nicht aktiviert zu sein.\n\nBitte aktivieren Sie den Entwicklermodus und starten Sie das Gerät neu.";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "Roothide Dopamine wurde auf diesem Gerät installiert. Wenn Bootstrap installiert wird, können Fehler auftreten!";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "Sie haben eine alte Beta-Version installiert. Bitte deaktivieren Sie alle App-Tweaks und starten Sie das Gerät neu, um diese zu deinstallieren, damit Sie eine neue Bootstrap Version installieren können.";

"openssh launch successful" = "OpenSSH-Start erfolgreich";
"respring now..." = "Respring ...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "Möchten Sie Bootstrap wirklich deinstallieren?\n\nBitte stellen Sie vor der Deinstallation sicher, dass Sie die Tweaks für alle Apps deaktiviert haben.";
76 changes: 76 additions & 0 deletions Bootstrap/en.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"Settings" = "Settings";
"Tweak Enable" = "Tweak Enable";
"OpenSSH" = "OpenSSH";
"Respring" = "Respring";
"Rebuild Apps" = "Rebuild Apps";
"Rebuild Icon Cache" = "Rebuild Icon Cache";
"Reinstall Sileo & Zebra" = "Reinstall Sileo & Zebra";
"Uninstall" = "Uninstall";
"Credits" = "Credits";
"New Version Available" = "New Version Available";
"Bootstrapped" = "Bootstrapped";
"Update" = "Update";
"Install" = "Install";
"Unsupported" = "Unsupported";
"App List" = "App List";


"OK" = "OK";
"Error" = "Error";
"Warning" = "Warning";
"Applying" = "Applying";
"Cancel" = "Cancel";
"Bootstrapping" = "Bootstrapping";
"Uninstalling" = "Uninstalling";
"bootstrap uninstalled" = "bootstrap uninstalled";

"Enable Tweak for App" = "Enable Tweak for App";
"name or identifier" = "Search by name or identifier";

"Server Not Running" = "Server isn't running";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now.";

"Restart Server" = "Restart Server";
"bootstrap server restart successful" = "bootstrap server restart successful";

"Rebuilding" = "Rebuilding";
"Don't exit Bootstrap app until show the lock screen" = "Don't exit the app until you land on the lock screen";

"bootstrap installed" = "bootstrap installed";
"bootstrap not installed" = "bootstrap not installed";
"system bootstrapped" = "system bootstrapped";
"system not bootstrapped" = "system not bootstrapped";
"bootstrap server check successful" = "bootstrap server check successful";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "It seems that you have Filza installed, which may be detected as jailbroken. You can enable a Tweak for it to hide its presence.";

"Status: Rebuilding Apps" = "Status: Rebuilding Apps";
"Status: Reinstalling Sileo" = "Status: Reinstalling Sileo";
"Status: Reinstalling Zebra" = "Status: Reinstalling Zebra";
"Sileo and Zebra reinstalled!" = "Sileo and Zebra reinstalled!";
"Status: Rebuilding Icon Cache" = "Status: Rebuilding Icon Cache";

"openssh package is not installed" = "openssh package is not installed";

"Reboot Device" = "Reboot Device";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "The current bootstrapped version is inconsistent with the Bootstrap app version. Please reboot your device to update it.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "Your TrollStore version is too old, Bootstrap only supports TrollStore 2.0 and higher. Please update it and then reinstall the Bootstrap app.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device.";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "roothide dopamine has been installed on this device, installing this bootstrap may break it!";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap.";

"openssh launch successful" = "openssh launch successful";
"respring now..." = "respring now...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling.";

"ios-version: %@" = "ios-version: %@";
"device-model: %s" = "device-model: %s";
"app-version: %@" = "app-version: %@";
"boot-session: %@" = "boot-session: %@";
"UI made with love by haxi0. ♡" = "UI made with love by haxi0. ♡";
70 changes: 70 additions & 0 deletions Bootstrap/es.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"Settings" = "Ajustes";
"Tweak Enable" = "Activar Tweak";
"OpenSSH" = "OpenSSH";
"Respring" = "Respring";
"Rebuild Apps" = "Reconstruir Apps";
"Rebuild Icon Cache" = "Reconstruir Icon Cache";
"Reinstall Sileo & Zebra" = "Reinstalar Sileo & Zebra";
"Uninstall" = "Desinstalar";
"Credits" = "Creditos";
"New Version Available" = "Nueva Version Disponible";
"Bootstrapped" = "Bootstrapped";
"Update" = "Actualizacion";
"Install" = "Instalar";
"Unsupported" = "No Soportado";
"App List" = "Lista De Apps";


"OK" = "OK";
"Error" = "Error";
"Warning" = "Advertencia";
"Applying" = "Aplicando";
"Cancel" = "Cancelar";
"Bootstrapping" = "Bootstrapping";
"Uninstalling" = "Desinstalando";
"bootstrap uninstalled" = "bootstrap desinstalado";

"Enable Tweak for App" = "Activar Tweak Para App";
"name or identifier" = "nombre o identifier";

"Server Not Running" = "El Servidor No Esta Funcionando";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "Por razones desconocidas el servidor bootstrap no esta funcionando, La unica solucion es reiniciarlo ahora.";

"Restart Server" = "Reiniciar Servidor";
"bootstrap server restart successful" = "el servidor bootstrap fue reiniciado exitosamente";

"Rebuilding" = "Reconstruyendo";
"Don't exit Bootstrap app until show the lock screen" = "No salgas de la app Bootstrap hasta que sea vea la pantalla de bloqueo";

"bootstrap installed" = "bootstrap instalado";
"bootstrap not installed" = "bootstrap no esta instalado";
"system bootstrapped" = "Sistema con bootstrap";
"system not bootstrapped" = "El sistema no tiene bootstrap";
"bootstrap server check successful" = "El servidor bootstrap fue revisado exitosamente";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "Parece que tienes la app de Filza instalada, La cual puede ser detectada como Jailbroken. Puedes activar el tweak para ocultarla.";

"Status: Rebuilding Apps" = "Estado: Reconstruyendo Apps";
"Status: Reinstalling Sileo" = "Estado: Reinstalando Sileo";
"Status: Reinstalling Zebra" = "Estado: Reinstalando Zebra";
"Sileo and Zebra reinstalled!" = "Sileo Y Zebra Reinstalados!";
"Status: Rebuilding Icon Cache" = "Estado: Reconstruyendo Icon Cache";

"openssh package is not installed" = "El paquete openssh no esta instalado";

"Reboot Device" = "Reiniciar Dispositivo";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "La version bootstrap instalada actualmente es inconsistente con la app bootstrap, Necesitas reiniciar el dispositivo para actualizarla.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "Tu version de Trollstore es muy antigua, Bootstrap solo soporta Trollstore>=2.0, Tienes que actualizar Trollstore y luego reinstalar la app Bootstrap.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "Tu dispositivo no parece tener el modo desarrollador activado. \n\nPorfavor activa el modo desarrollador y reinicia tu dispositivo.";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "roothide dopamine fue instalado en tu dispositivo, instalando este bootstrap podria romperlo!";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "Has instalado una version beta antigua, porfavor desactiva todos los app tweaks y reinicia tu dispositivo para desinstalarlo y poder instalar la nueva version de bootstrap.";

"openssh launch successful" = "openssh activacion exitosa";
"respring now..." = "respring ahora...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "Estas seguro que quieres desinstalar bootstrap?\n\nPorfavor asegurate que desactivaste todos los app tweaks antes de desinstalar.";
71 changes: 71 additions & 0 deletions Bootstrap/fr.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
"Settings" = "Paramètres";
"Tweak Enable" = "Activer Tweak";
"OpenSSH" = "OpenSSH";
"Respring" = "Respring";
"Rebuild Apps" = "Reconstruire les Applications";
"Rebuild Icon Cache" = "Reconstruire le cache des icônes";
"Reinstall Sileo & Zebra" = "Réinstaller Sileo & Zebra";
"Uninstall" = "Désintaller";
"Credits" = "Crédits";
"New Version Available" = "Nouvelle Version Disponible";
"Bootstrapped" = "Bootstrappé";
"Update" = "Mettre à jour";
"Install" = "Installer";

"Unsupported" = "Non supporté";
"App List" = "Liste des applications";


"OK" = "OK";
"Error" = "Erreur";
"Warning" = "Attention";
"Applying" = "Application";
"Cancel" = "Annuler";
"Bootstrapping" = "Démarrage";
"Uninstalling" = "Désinstallation";
"bootstrap uninstalled" = "bootstrap désinstallé";

"Enable Tweak for App" = "Activer les tweaks pour une app";
"name or identifier" = "nom ou identifieur";

"Server Not Running" = "Serveur non démarré";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "pour des raisons inconnues, le serveur de boostrap n'est pas en cours d'exécution, la seule chose que vous pouvez faire est de le redémarrer maintenant.";

"Restart Server" = "Redémarrer le serveur";
"bootstrap server restart successful" = "Le serveur du boostrap a bien redémarré";

"Rebuilding" = "Reconstruire";
"Don't exit Bootstrap app until show the lock screen" = "Ne quittez pas l'application Bootstrap tant que l'écran de verrouillage n'est pas affiché";

"bootstrap installed" = "bootstrap installé";
"bootstrap not installed" = "bootstrap non installé";
"system bootstrapped" = "système bootstrappé";
"system not bootstrapped" = "système non bootstrappé";
"bootstrap server check successful" = "vérification du serveur bootstrap réussi";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "Il semble que vous ayez l'application Filza installée, ce qui peut rendre votre appareil détecté comme étant jailbreak. Vous pouvez activer les tweaks sur l'app pour le cacher.";

"Status: Rebuilding Apps" = "Statut: Reconstruction des Apps";
"Status: Reinstalling Sileo" = "Statut: Réinstallation de Sileo";
"Status: Reinstalling Zebra" = "Statut: Réinstallation de Zebra";
"Sileo and Zebra reinstalled!" = "Sileo et Zebra réinstallés !";
"Status: Rebuilding Icon Cache" = "Statut: Reconstruction du cache des icônes";

"openssh package is not installed" = "Le paquet openssh n'est pas installé";

"Reboot Device" = "Redémarrer l'appareil";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "La version actuelle du bootstrap est incohérente avec la version de l'application Bootstrap, vous devez redémarrer l'appareil pour la mettre à jour.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "Votre version de TrollStore est trop ancienne, Bootstrap ne supporte que TrollStore >= 2.0, vous devez mettre à jour TrollStore puis réinstaller l'application Bootstrap.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "Votre appareil ne semble pas avoir le mode développeur activé.\n\nVeuillez activer le mode développeur et redémarrer votre appareil.";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "roothide dopamine a été installé sur cet appareil, installer ce bootstrap maintenant risque de le casser !";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "Vous avez installé une ancienne version bêta, veuillez désactiver tous les tweaks d'application et redémarrer l'appareil pour le désinstaller afin de pouvoir installer la nouvelle version du bootstrap.";

"openssh launch successful" = "openssh démarré correctement";
"respring now..." = "respring maintenant...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "Êtes-vous sûr de vouloir désinstaller bootstrap ?\n\nAssurez-vous d'avoir désactivé les tweaks pour toutes les applications avant de le désinstaller.";
69 changes: 69 additions & 0 deletions Bootstrap/id.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
"Settings" = "Pengaturan";
"Tweak Enable" = "Aktifkan Tweak";
"OpenSSH" = "OpenSSH";
"Respring" = "Respring";
"Rebuild Apps" = "Rebuild Aplikasi";
"Rebuild Icon Cache" = "Rebuild Icon Cache";
"Reinstall Sileo & Zebra" = "Pasang Ulang Sileo & Zebra";
"Uninstall" = "Hapus";
"Credits" = "Kredit";
"New Version Available" = "Versi Baru Tersedia";
"Bootstrapped" = "Bootstrapped";
"Update" = "Perbarui";
"Install" = "Pasang";
"Unsupported" = "Tidak Didukung";
"App List" = "Daftar Aplikasi";

"OK" = "OK";
"Error" = "Kesalahan";
"Warning" = "Peringatan";
"Applying" = "Menerapkan";
"Cancel" = "Batal";
"Bootstrapping" = "Bootstrapping";
"Uninstalling" = "Menghapus";
"bootstrap uninstalled" = "bootstrap dihapus";

"Enable Tweak for App" = "Aktifkan Tweak untuk Aplikasi";
"name or identifier" = "nama atau pengenal";

"Server Not Running" = "Server Tidak Berjalan";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "dengan alasan yang tidak diketahui server bootstrap tidak berjalan, satu-satunya yang dapat kita lakukan adalah me-mulai ulang sekarang.";

"Restart Server" = "Mulai Ulang Server";
"bootstrap server restart successful" = "mulai ulang server bootstrap berhasil";

"Rebuilding" = "Membangun Kembali";
"Don't exit Bootstrap app until show the lock screen" = "Jangan keluar dari aplikasi Bootstrap sampai muncul layar kunci";

"bootstrap installed" = "bootstrap terpasang";
"bootstrap not installed" = "bootstrap tidak terpasang";
"system bootstrapped" = "sistem terbootstrap";
"system not bootstrapped" = "sistem tidak terbootstrap";
"bootstrap server check successful" = "cek server bootstrap berhasil";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "Sepertinya Anda telah menginstal aplikasi Filza, yang mungkin terdeteksi sebagai perangkat jailbroken. Anda dapat mengaktifkan Tweak untuk menyembunyikannya.";

"Status: Rebuilding Apps" = "Status: Membangun Ulang Aplikasi";
"Status: Reinstalling Sileo" = "Status: Pasang Ulang Sileo";
"Status: Reinstalling Zebra" = "Status: Pasang Ulang Zebra";
"Sileo and Zebra reinstalled!" = "Sileo dan Zebra dipasang ulang!";
"Status: Rebuilding Icon Cache" = "Status: Membangun Ulang Icon Cache";

"openssh package is not installed" = "paket openssh tidak terpasang";

"Reboot Device" = "Reboot Perangkat";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "Versi bootstrap saat ini tidak konsisten dengan versi aplikasi Bootstrap, dan Anda perlu me-reboot perangkat untuk memperbarui.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "Versi trollstore Anda terlalu usang, Bootstrap hanya mendukung trollstore>=2.0, Anda harus memperbarui trollstore Anda kemudian menginstal ulang aplikasi Bootstrap.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "Perangkat Anda sepertinya tidak memiliki mode pengembang yang diaktifkan.\n\nAktifkan mode pengembang dan reboot perangkat Anda.";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "roothide dopamine telah terinstal di perangkat ini, sekarang menginstal bootstrap ini mungkin merusaknya!";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "Anda telah menginstal versi beta lama, harap nonaktifkan semua tweak aplikasi dan reboot perangkat untuk menghapusnya sehingga Anda dapat menginstal bootstrap versi baru.";

"openssh launch successful" = "peluncuran openssh berhasil";
"respring now..." = "respring sekarang...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "Apakah Anda yakin ingin menghapus bootstrap?\n\nPastikan Anda telah menonaktifkan tweak untuk semua aplikasi sebelum menghapusnya.";
71 changes: 71 additions & 0 deletions Bootstrap/it.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
"Settings" = "Impostazioni";
"Tweak Enable" = "Abilita Tweak";
"OpenSSH" = "OpenSSH";
"Respring" = "Respring";
"Rebuild Apps" = "Ricostruisci le App";
"Rebuild Icon Cache" = "Ricostruisci la Cache delle Icone";
"Reinstall Sileo & Zebra" = "Reinstalla Sileo e Zebra";
"Uninstall" = "Disinstalla";
"Credits" = "Riconoscimenti";
"New Version Available" = "Nuova Versione Disponibile";
"Bootstrapped" = "Bootstrap Abilitato";
"Update" = "Aggiorna";
"Install" = "Installa";
"Unsupported" = "Non Supportato";
"App List" = "Lista delle App";


"OK" = "OK";
"Error" = "Errore";
"Warning" = "Attenzione";
"Applying" = "Applicazione in corso";
"Cancel" = "Annulla";
"Bootstrapping" = "Eseguendo il Bootstrap";
"Uninstalling" = "Disinstallazione in corso";
"bootstrap uninstalled" = "bootstrap disinstallato";

"Enable Tweak for App" = "Abilita Tweak per le App";
"name or identifier" = "name or ID";

"Server Not Running" = "Server Non in Esecuzione";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "per ragioni sconosciute il server di bootstrap non è in esecuzione, l’unica cosa che possiamo fare è riavviarlo adesso.";

"Restart Server" = "Riavvia il Server";
"bootstrap server restart successful" = "il server di bootstrap è stato riavviato con successo";

"Rebuilding" = "Ricostruzione in corso";
"Don't exit Bootstrap app until show the lock screen" = "Non uscire dall’app di Bootstrap fino a quando non compare la schermata di blocco";

"bootstrap installed" = "bootstrap installato";
"bootstrap not installed" = "bootstrap non installato";
"system bootstrapped" = "il sistema è bootstrappato";
"system not bootstrapped" = "il sistema non è bootstrappato";
"bootstrap server check successful" = "controllo del server di bootstrap riuscito";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = " Sembra che tu abbia l’app di Filza installata, che potrebbe risultare in un rilevamento del Jailbreak. Puoi abilitare un Tweak per nasconderla.";

"Status: Rebuilding Apps" = "Status: Ricostruzione delle App in corso";
"Status: Reinstalling Sileo" = "Status: Reinstallazione di Sileo in corso";
"Status: Reinstalling Zebra" = "Status: Reinstallazione di Zebra in corso";
"Sileo and Zebra reinstalled!" = "Sileo e Zebra sono stati reinstallati!";
"Status: Rebuilding Icon Cache" = "Status: Ricostruzione della Cache delle Icone in corso";

"openssh package is not installed" = "il pacchetto di openssh non è installato";

"Reboot Device" = "Riavvia Dispositivo";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "La versione di bootstrap installata nel sistema è inconsistente con la versione dell’app di Bootstrap, e devi riavviare il dispositivo per aggiornarla.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "La versione di trollstore installata è troppo vecchia, Bootstrap supporta solo trollstore>=2.0, devi aggiornare trollstore e poi reinstallare l’app di Bootstrap.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "Il dispositivo non sembra avere la modalità sviluppatore abilitata.\n\nPerfavore abilita la modalità sviluppatore e riavvia il dispositivo .";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "dopamine roothide è stato installato su questo dispositivo, installare adesso questo bootstrap potrebbe corrompere l’installazione!";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "È installata una versione beta vecchia, perfavore disabilita i tweak per tutte le app e riavvia il dispositivo per disinstallare la versione vecchia e installare il bootstrap della nuova versione.";

"openssh launch successful" = "avvio di openssh riuscito";
"respring now..." = "respring in corso...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "Sei sicuro di voler disinstallare il bootstrap?\n\nPerfavore assicurati di aver disabilitato i tweak per tutte le app prima di procedere.";

71 changes: 71 additions & 0 deletions Bootstrap/ja.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
"Settings" = "設定";
"Tweak Enable" = "Tweakを有効にする";
"OpenSSH" = "OpenSSH";
"Respring" = "Respring";
"Rebuild Apps" = "アプリの再構築";
"Rebuild Icon Cache" = "アイコンキャッシュの再構築";
"Reinstall Sileo & Zebra" = "Sileo と Zebra を再インストールする";
"Uninstall" = "アンインストール";
"Credits" = "クレジット";
"New Version Available" = "新しいバージョンが利用可能です";
"Bootstrapped" = "Bootstrapped";
"Update" = "アップデート";
"Install" = "インストール";
"Unsupported" = "サポートされていません";
"App List" = "アプリ一覧";


"OK" = "はい";
"Error" = "エラー";
"Warning" = "警告";
"Applying" = "適用中";
"Cancel" = "キャンセル";
"Bootstrapping" = "Bootstrapping";
"Uninstalling" = "アンインストール中";
"bootstrap uninstalled" = "bootstrapはアンインストールされました";

"Enable Tweak for App" = "アプリのtweakを有効にする";
"name or identifier" = "名前またはidentifier";

"Server Not Running" = "サーバーが動作していません";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "bootstrapサーバーの実行に失敗しました。再起動後にもう一度お試しください。";

"Restart Server" = "サーバーを再起動";
"bootstrap server restart successful" = "bootstrapサーバーの再起動に成功しました";

"Rebuilding" = "再構築中";
"Don't exit Bootstrap app until show the lock screen" = "ロック画面が表示されるまで、Bootstrapアプリを終了しないでください。";

"bootstrap installed" = "bootstrapがインストールされました";
"bootstrap not installed" = "bootstrapはインストールされていません";
"system bootstrapped" = "システムはbootstrapされました";
"system not bootstrapped" = "システムはbootstrapされていません";
"bootstrap server check successful" = "bootstrapサーバーのチェックに成功しました";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "Filzaがインストールされているため、脱獄として検知される可能性があります。Tweakを有効にすると、隠すことができます。";

"Status: Rebuilding Apps" = "ステータス: アプリを再構築中";
"Status: Reinstalling Sileo" = "ステータス: Sileoを再インストール中";
"Status: Reinstalling Zebra" = "ステータス: Zebraを再インストール中";
"Sileo and Zebra reinstalled!" = "SileoとZebraが再インストールされました!";
"Status: Rebuilding Icon Cache" = "ステータス: アイコンキャッシュを再構築中";

"openssh package is not installed" = "opensshパッケージがインストールされていません";

"Reboot Device" = "デバイスを再起動";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "現在インストール済みのbootstrapのバージョンは、このアプリのbootstrapのバージョンと一致しないため、更新するにはデバイスを再起動する必要があります。";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "trollstoreのバージョンが古すぎます。Bootstrapはtrollstore>=2.0のみをサポートしています。trollstoreを更新してから、Bootstrapアプリを再インストールする必要があります。";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "お使いのデバイスでは開発者モードが有効になっていないようです。\n\n開発者モードを有効にしてデバイスを再起動してください。";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "競合する可能性のあるdopamineのroothideがこのデバイスに既にインストールされています。このbootstrapをインストールするとデバイスが壊れる可能性があります。";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "古いベータバージョンがインストールされています。新しいバージョンのブートストラップをインストールできるように、すべてのアプリのtweakを無効にし、デバイスを再起動してアンインストールしてください。";

"openssh launch successful" = "opensshの起動に成功しました";
"respring now..." = "デバイスはまもなくRespringされます...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "bootstrapをアンインストールしてもよろしいですか?\n\nアンインストールする前に、すべてのアプリのtweakが無効になっていることを確認してください。";

70 changes: 70 additions & 0 deletions Bootstrap/jv-ID.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
"Settings" = "Setelan";
"Tweak Enable" = "Tweak Aktif";
"OpenSSH" = "OpenSSH";
"Respring" = "Respring";
"Rebuild Apps" = "Mulihake Aplikasi";
"Rebuild Icon Cache" = "Mulihake Icon Cache";
"Reinstall Sileo & Zebra" = "Pasang Ulang Sileo & Zebra";
"Uninstall" = "Busek";
"Credits" = "Kridit";
"New Version Available" = "Enek Versi Anyar";
"Bootstrapped" = "Bootstrapped";
"Update" = "Perbarui";
"Install" = "Pasang";
"Unsupported" = "Ora Didukung";
"App List" = "Daftar Aplikasi";

"OK" = "OK";
"Error" = "Kesalahan";
"Warning" = "Peringatan";
"Applying" = "Ngelakoni";
"Cancel" = "Batal";
"Bootstrapping" = "Bootstrapping";
"Uninstalling" = "Ngebusek";
"bootstrap uninstalled" = "ngebusek bootstrap";

"Enable Tweak for App" = "Aktifake Tweak kanggo Aplikasi";
"name or identifier" = "jeneng utawa pengenal";

"Server Not Running" = "Server Ora Mlaku";

"For unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "Kanggo alasan sing ora dikenal, server bootstrap ora mlaku, sing iso awake dewe ya ngrestart saiki.";

"Restart Server" = "Restart Server";
"bootstrap server restart successful" = "restarting server bootstrap sukses";

"Rebuilding" = "Mulihake";
"Don't exit Bootstrap app until show the lock screen" = "Ojo metu saka aplikasi Bootstrap sampek muncul lock screen";

"bootstrap installed" = "bootstrap wis dipasang";
"bootstrap not installed" = "bootstrap durung dipasang";
"system bootstrapped" = "sistem wis dibootstrapped";
"system not bootstrapped" = "sistem durung dibootstrapped";
"bootstrap server check successful" = "ngecek server bootstrap sukses";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "Koyok e sampeyan ngepasang aplikasi Filza, sing mungkin iso ngedeteksi lak perangkatmu nang kondisi Jailbreak. Sampeyan iso ngaktifane Tweak kanggo ndelikne.";

"Status: Rebuilding Apps" = "Status: Mulihake Aplikasi";
"Status: Reinstalling Sileo" = "Status: Pasang Ulang Sileo";
"Status: Reinstalling Zebra" = "Status: Pasang Ulang Zebra";
"Sileo and Zebra reinstalled!" = "Sileo karo Zebra dipasang ulang!";
"Status: Rebuilding Icon Cache" = "Status: Mulihake Icon Cache";

"openssh package is not installed" = "paket openssh ora dipasang";

"Reboot Device" = "Reboot Perangkat";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "Versi bootstrapped saiki ora konsisten karo versi aplikasi Bootstrap, lan sampeyan perlu reboot perangkat kanggo nganyari iki.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "Versi trollstore sampeyan terlalu lawas, Bootstrap mung ngedukung trollstore>=2.0, sampeyan kudu nge update versi trolstore mari ngono ngepasang ulang Bootstrap app maneh.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "Mode pengembang neng perangkat e sampeyan mungkin durung aktif.\n\nAktifake mode pengembang lan reboot perangkat e sampeyan.";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "roothide dopamine wis dipasang neng perangkat iki, masang bootstrap saiki iso ngerusak!";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "Sampeyan wis nginstal versi beta lawas, mangga nonaktifne kabeh tweak aplikasi lan reboot perangkat kanggo nginstal e supaya sampeyan bisa nginstal bootstrap versi anyar.";

"openssh launch successful" = "peluncuran openssh sukses";
"respring now..." = "respring saiki...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "Sampeyan yakin pengen uninstall bootstrap?\n\nMangga pastekno sampeyan wis nonaktifne tweak kanggo kabeh aplikasi sakdurunge nguninstall.";

71 changes: 71 additions & 0 deletions Bootstrap/ko.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
"Settings" = "설정";
"Tweak Enable" = "트윅 활성화";
"OpenSSH" = "OpenSSH";
"Respring" = "SpringBoard 재시작";
"Rebuild Apps" = "앱 재구축";
"Rebuild Icon Cache" = "아이콘 캐시 재구축";
"Reinstall Sileo & Zebra" = "Sileo & Zebra 재설치";
"Uninstall" = "제거";
"Credits" = "크레딧";
"New Version Available" = "새 버전을 상ㅅㅇ할 수 있습니다";
"Bootstrapped" = "부트스트랩됨";
"Update" = "업데이트";
"Install" = "설치";
"Unsupported" = "미지원";
"App List" = "앱 리스트";


"OK" = "확인";
"Error" = "에러";
"Warning" = "주의";
"Applying" = "적용중";
"Cancel" = "취소";
"Bootstrapping" = "부트스트랩중";
"Uninstalling" = "제거중";
"bootstrap uninstalled" = "부트스트랩 제거됨";

"Enable Tweak for App" = "앱 트윅 활성화";
"name or identifier" = "이름 또는 식별자";

"Server Not Running" = "서버가 활성화되지 않았습니다";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "부트스트랩 서버가 실행되고 있지 않습니다. 우리가 할 수 있는 것은 재시작 하는 것입니다..";

"Restart Server" = "서버 재시작";
"bootstrap server restart successful" = "부트스트랩 서버 재시작 성공";

"Rebuilding" = "재구축중";
"Don't exit Bootstrap app until show the lock screen" = "잠금 화면이 표시될 때까지 부트스트랩 앱을 종료하지 마세요.";

"bootstrap installed" = "부트스트랩 설치됨";
"bootstrap not installed" = "부트스트랩 설치 안됨";
"system bootstrapped" = "부트스트랩됨";
"system not bootstrapped" = "부트스트랩 되지 않음";
"bootstrap server check successful" = "부트스트랩 서버 확인 됨";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "Filza 앱이 설치된 것 같습니다. 이는 탈옥 감지로 이어질 수 있고 숨기기 위해 Tweak을 활성화할 수 있습니다.";

"Status: Rebuilding Apps" = "상태: 앱 재구축중";
"Status: Reinstalling Sileo" = "상태 : Sileo 재설치중";
"Status: Reinstalling Zebra" = "상태 : Zebra 재설치중";
"Sileo and Zebra reinstalled!" = "Sileo와 Zebra 재설치됨!";
"Status: Rebuilding Icon Cache" = "상태 : 아이콘 캐시 재구축중";

"openssh package is not installed" = "openssh 패키지가 설치되지 않았습니다";

"Reboot Device" = "장치 재부팅";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "현재 부트스트랩 버전은 부트스트랩 앱 버전과 일치하지 않으며, 업데이트하려면 장치를 재부팅해야 합니다.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "TrollStore 버전이 너무 오래되었고, 부트스트랩은 TrollStore 2.0 이상만 지원하며, TrollStore를 업데이트한 다음 부트스트랩 앱을 다시 설치해야 합니다.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "장치에 개발자 모드가 활성화되어 있지 않은 것 같습니다.\n\n개발자 모드를 활성화하고 장치를 재부팅하십시오.";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "Roothide Dopamine이 이 장치에 설치되어있습니다. 부트스트랩을 설치하면 망가질 수 있습니다!";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "이전 베타 버전을 설치되었습니다. 모든 앱 트윅을 비활성화하고 장치를 재부팅하여 제거하여 새 버전 부트스트랩을 설치할 수 있습니다.";

"openssh launch successful" = "OpenSSH 작동 성공";
"respring now..." = "SpringBoard 재시작 중...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "부트스트랩을 제거하시겠습니까? \n\n제거하기 전에 모든 앱 트윅을 비활성화했는지 확인하세요.";

2 changes: 1 addition & 1 deletion Bootstrap/main.m
Original file line number Diff line number Diff line change
@@ -45,7 +45,7 @@ int main(int argc, char * argv[]) {
}
@catch (NSException *exception)
{
SYSLOG("***exception: %@", exception);
STRAPLOG("***exception: %@", exception);
exit(-1);
}
}
71 changes: 71 additions & 0 deletions Bootstrap/nl.lproj/Localizable.strings
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
"Settings" = "Instellingen";
"Tweak Enable" = "Tweak Aanzetten";
"OpenSSH" = "OpenSSH";
"Respring" = "Respring";
"Rebuild Apps" = "Apps Herbouwen";
"Rebuild Icon Cache" = "Icon Cache Herbouwen";
"Reinstall Sileo & Zebra" = "Sileo & Zebra Herinstalleren";
"Uninstall" = "Deïnstalleren";
"Credits" = "Credits";
"New Version Available" = "Nieuwe Versie Beschikbaar";
"Bootstrapped" = "Gebootstrapt";
"Update" = "Update";
"Install" = "Installeren";
"Unsupported" = "Niet Ondersteund";
"App List" = "App-lijst";


"OK" = "OK";
"Error" = "Fout";
"Warning" = "Waarschuwing";
"Applying" = "Toepassen";
"Cancel" = "Annuleren";
"Bootstrapping" = "Bootstrappen";
"Uninstalling" = "Deïnstalleren";
"bootstrap uninstalled" = "bootstrap gedeïnstalleerd";

"Enable Tweak for App" = "Tweak inschakelen voor App";
"name or identifier" = "naam of identifier";

"Server Not Running" = "Server Niet Actief";

"for unknown reasons the bootstrap server is not running, the only thing we can do is to restart it now." = "om onbekende is de bootstrap-server niet actief; het enige wat we kunnen doen, is het nu herstarten.";

"Restart Server" = "Server Herstarten";
"bootstrap server restart successful" = "bootstrap server herstarten succesvol";

"Rebuilding" = "Herbouwen";
"Don't exit Bootstrap app until show the lock screen" = "Verlaat de Bootstrap-app niet totdat het vergrendelingsscherm wordt weergegeven";

"bootstrap installed" = "bootstrap geïnstalleerd";
"bootstrap not installed" = "bootstrap niet geïnstalleerd";
"system bootstrapped" = "systeem gebootstrapt";
"system not bootstrapped" = "systeem niet gebootstrapt";
"bootstrap server check successful" = "bootstrap server controle succesvol";

"It seems that you have the Filza app installed, which may be detected as jailbroken. You can enable Tweak for it to hide it." = "Het lijkt erop dat je de Filza-app hebt geïnstalleerd, deze wordt mogelijk gedetecteerd als jailbreak. Je kunt Tweaks ervoor inschakelen om het te verbergen.";

"Status: Rebuilding Apps" = "Status: Apps Herbouwen";
"Status: Reinstalling Sileo" = "Status: Sileo Herinstalleren";
"Status: Reinstalling Zebra" = "Status: Zebra Herinstalleren";
"Sileo and Zebra reinstalled!" = "Sileo en Zebra opnieuw geïnstalleerd!";
"Status: Rebuilding Icon Cache" = "Status: Icon Cache Herbouwen";

"openssh package is not installed" = "openssh-pakket is niet geïnstalleerd";

"Reboot Device" = "Apparaat Herstarten";
"The current bootstrapped version is inconsistent with the Bootstrap app version, and you need to reboot the device to update it." = "De huidige gebootstrappede versie is niet in overeenstemming met de Bootstrap-app-versie, je moet het apparaat herstarten om het bij te werken.";

"Your trollstore version is too old, Bootstrap only supports trollstore>=2.0, you have to update your trollstore then reinstall Bootstrap app." = "Je trollstore-versie is te oud, Bootstrap ondersteunt alleen trollstore>=2.0, je moet je trollstore bijwerken en vervolgens de Bootstrap-app opnieuw installeren.";

"Your device does not seem to have developer mode enabled.\n\nPlease enable developer mode and reboot your device." = "Je apparaat lijkt geen ontwikkelaarsmodus ingeschakeld te hebben.\n\nSchakel ontwikkelaarsmodus in en herstart je apparaat.";

"roothide dopamine has been installed on this device, now install this bootstrap may break it!" = "roothide dopamine is geïnstalleerd op dit apparaat, het installeren van deze bootstrap kan het mogelijk breken!";

"You have installed an old beta version, please disable all app tweaks and reboot the device to uninstall it so that you can install the new version bootstrap." = "Je hebt een oude bètaversie geïnstalleerd, schakel alsjeblieft alle app-tweaks uit en herstart het apparaat om het te deïnstalleren, zodat je de nieuwe bootstrap versie kunt installeren.";

"openssh launch successful" = "openssh-lancering succesvol";
"respring now..." = "respring nu...";

"Are you sure to uninstall bootstrap?\n\nPlease make sure you have disabled tweak for all apps before uninstalling." = "Weet je zeker dat je bootstrap wilt deïnstalleren?\n\nZorg ervoor dat je tweak injectie hebt uitgeschakeld voor alle apps voordat je deïnstalleert.";

Loading

0 comments on commit 568da93

Please sign in to comment.