diff --git a/ShiftOS.Frontend/Apps/Terminal.cs b/ShiftOS.Frontend/Apps/Terminal.cs index c554957..a5d465e 100644 --- a/ShiftOS.Frontend/Apps/Terminal.cs +++ b/ShiftOS.Frontend/Apps/Terminal.cs @@ -90,6 +90,7 @@ namespace ShiftOS.Frontend.Apps { Text = ""; Index = 0; + _vertOffset = 0; Invalidate(); } @@ -106,7 +107,7 @@ namespace ShiftOS.Frontend.Apps { Engine.Desktop.InvokeOnWorkerThread(() => { - Text += text; + Text += Localization.Parse(text); SelectBottom(); Index += text.Length; RecalculateLayout(); @@ -175,21 +176,26 @@ namespace ShiftOS.Frontend.Apps int vertMeasure = 2; int horizMeasure = 2; var textSize = gfx.SmartMeasureString(Text, LoadedSkin.TerminalFont, Width - 4); - for(int i = 0; i <= Index && i < Text.Length; i++) + int lineindex = 0; + int line = GetCurrentLine(); + for (int l = 0; l < line; l++) { - var size = gfx.SmartMeasureString((Text[i] == '\n') ? " " : Text[i].ToString(), LoadedSkin.TerminalFont); - if (Text[i] == '\n' || horizMeasure > Width - 4) - { - horizMeasure = 2; - vertMeasure += (int)Math.Ceiling(size.Height); - continue; - } + lineindex += Lines[l].Length; + var stringMeasure = gfx.SmartMeasureString(Lines[l], LoadedSkin.TerminalFont, Width - 4); + vertMeasure += (int)stringMeasure.Height; - horizMeasure += (int)Math.Floor(size.Width); } + var lnMeasure = gfx.SmartMeasureString(Text.Substring(lineindex, Index - lineindex), LoadedSkin.TerminalFont); + int w = (int)Math.Floor(lnMeasure.Width); + if (w > Width - 4) + w = w - (Width - 4); + horizMeasure = w; return new Point(horizMeasure, vertMeasure); } + private PointF CaretPosition = new PointF(2, 2); + private Size CaretSize = new Size(2, 15); + protected override void OnKeyEvent(KeyEvent a) { if (a.Key == Keys.Enter) @@ -206,7 +212,7 @@ namespace ShiftOS.Frontend.Apps var text2 = text[text.Length - 1]; var text3 = ""; var text4 = Regex.Replace(text2, @"\t|\n|\r", ""); - + WriteLine(""); { if (TerminalBackend.PrefixEnabled) { @@ -300,28 +306,25 @@ namespace ShiftOS.Frontend.Apps Text = Text.Insert(Index, a.KeyChar.ToString()); Index++; AppearanceManager.CurrentPosition++; - RecalculateLayout(); +// RecalculateLayout(); InvalidateTopLevel(); } } } - protected override void OnPaint(Graphics gfx) + protected override void OnPaint(GraphicsContext gfx) { - gfx.Clear(LoadedSkin.TerminalBackColorCC.ToColor()); + gfx.Clear(LoadedSkin.TerminalBackColorCC.ToColor().ToMonoColor()); if (!string.IsNullOrEmpty(Text)) { //Draw the caret. - var caretPos = GetPointAtIndex(gfx); - var caretSize = gfx.SmartMeasureString(Text[Index - 1].ToString(), LoadedSkin.TerminalFont); if (IsFocusedControl) { - gfx.FillRectangle(new SolidBrush(LoadedSkin.TerminalForeColorCC.ToColor()), new RectangleF(new PointF(caretPos.X, caretPos.Y - _vertOffset), new SizeF(2, caretSize.Height))); +// gfx.FillRectangle(new SolidBrush(LoadedSkin.TerminalForeColorCC.ToColor()), new RectangleF(new PointF(CaretPosition.X, CaretPosition.Y - _vertOffset), new SizeF(2, CaretSize.Height))); }//Draw the text - var textMeasure = gfx.MeasureString(Text, LoadedSkin.TerminalFont, Width - 4); - gfx.DrawString(Text, LoadedSkin.TerminalFont, new SolidBrush(LoadedSkin.TerminalForeColorCC.ToColor()), 2, 2 - _vertOffset); - + + gfx.DrawString(Text, 2, 2 - (int)Math.Floor(_vertOffset), LoadedSkin.TerminalForeColorCC.ToColor().ToMonoColor(), LoadedSkin.TerminalFont, Width - 4); } } @@ -380,7 +383,7 @@ namespace ShiftOS.Frontend.Apps textformat.FormatFlags = StringFormatFlags.MeasureTrailingSpaces; textformat.Trimming = StringTrimming.None; var measure = gfx.MeasureString(s, font, width, textformat); - return new SizeF((float)Math.Floor(measure.Width), (float)Math.Floor(measure.Height)); + return new SizeF((float)Math.Ceiling(measure.Width), (float)Math.Ceiling(measure.Height)); } public static SizeF SmartMeasureString(this Graphics gfx, string s, Font font) @@ -391,7 +394,7 @@ namespace ShiftOS.Frontend.Apps textformat.FormatFlags = StringFormatFlags.MeasureTrailingSpaces; textformat.Trimming = StringTrimming.None; var measure = gfx.MeasureString(s, font, int.MaxValue, textformat); - return new SizeF((float)Math.Floor(measure.Width), (float)Math.Floor(measure.Height)); + return new SizeF((float)Math.Ceiling(measure.Width), (float)Math.Floor(measure.Height)); } } diff --git a/ShiftOS.Frontend/Desktop/WindowManager.cs b/ShiftOS.Frontend/Desktop/WindowManager.cs index 1fa5cfb..2ed1873 100644 --- a/ShiftOS.Frontend/Desktop/WindowManager.cs +++ b/ShiftOS.Frontend/Desktop/WindowManager.cs @@ -1,9 +1,12 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Drawing; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; +using Microsoft.Xna.Framework.Graphics; using ShiftOS.Engine; using ShiftOS.Frontend.GraphicsSubsystem; using static ShiftOS.Engine.SkinEngine; @@ -252,8 +255,8 @@ namespace ShiftOS.Frontend.Desktop } } } - - protected override void OnPaint(Graphics gfx) + [DebuggerStepThrough] + protected override void OnPaint(GraphicsContext gfx) { int titleheight = LoadedSkin.TitlebarHeight; int leftborderwidth = LoadedSkin.LeftBorderWidth; @@ -298,48 +301,44 @@ namespace ShiftOS.Frontend.Desktop //draw left corner if(leftimage != null) { - var resized = ResizeImage(leftimage, leftwidth, titleheight); - gfx.DrawImage(resized, 0, 0); + gfx.DrawRectangle(0, 0, leftwidth, titleheight, leftimage.ToTexture2D(gfx.Device)); } else { - gfx.FillRectangle(new SolidBrush(leftcolor), new Rectangle(0, 0, leftwidth, titleheight)); + gfx.DrawRectangle(0, 0, leftwidth, titleheight, leftcolor.ToMonoColor()); } //draw right corner if (rightimage != null) { - var resized = ResizeImage(rightimage, rightwidth, titleheight); - gfx.DrawImage(resized, titlebarleft+titlebarwidth, 0); + gfx.DrawRectangle(titlebarleft + titlebarwidth, 0, rightwidth, titleheight, rightimage.ToTexture2D(gfx.Device)); } else { - gfx.FillRectangle(new SolidBrush(rightcolor), new Rectangle(titlebarleft+titlebarwidth, 0, rightwidth, titleheight)); + gfx.DrawRectangle(titlebarleft + titlebarwidth, 0, rightwidth, titleheight, rightcolor.ToMonoColor()); } } if (titlebarbg == null) { //draw the title bg - gfx.FillRectangle(new SolidBrush(titlebarcolor), new Rectangle(titlebarleft, 0, titlebarwidth, titleheight)); - + gfx.DrawRectangle(titlebarleft, 0, titlebarwidth, titleheight, titlebarcolor.ToMonoColor()); } else { - var resized = ResizeImage(titlebarbg, titlebarwidth, titleheight); - gfx.DrawImage(resized, titlebarleft, 0); + gfx.DrawRectangle(titlebarleft, 0, titlebarwidth, titleheight, titlebarbg.ToTexture2D(gfx.Device)); } //Now we draw the title text. var textMeasure = gfx.MeasureString(_text, titlefont); PointF textloc; if (titletextcentered) - textloc = new PointF((titlebarwidth - textMeasure.Width) / 2, + textloc = new PointF((titlebarwidth - textMeasure.X) / 2, titletextleft.Y); else textloc = new PointF(titlebarleft + titletextleft.X, titletextleft.Y); - gfx.DrawString(_text, titlefont, new SolidBrush(titletextcolor), textloc); + gfx.DrawString(_text, (int)textloc.X, (int)textloc.Y, titletextcolor.ToMonoColor(), titlefont); var tbuttonpos = LoadedSkin.TitleButtonPosition; @@ -354,12 +353,11 @@ namespace ShiftOS.Frontend.Desktop var img = GetImage("closebutton"); if (img == null) { - gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); + gfx.DrawRectangle(closebuttonright.X, closebuttonright.Y, closebuttonsize.Width, closebuttonsize.Height, closebuttoncolor.ToMonoColor()); } else { - var resized = ResizeImage(img, closebuttonsize.Width, closebuttonsize.Height); - gfx.DrawImage(resized, closebuttonright); + gfx.DrawRectangle(closebuttonright.X, closebuttonright.Y, closebuttonsize.Width, closebuttonsize.Height, img.ToTexture2D(gfx.Device)); } } //Draw maximize button @@ -371,16 +369,14 @@ namespace ShiftOS.Frontend.Desktop if (LoadedSkin.TitleButtonPosition == 0) closebuttonright = new Point(Width - closebuttonsize.Width - closebuttonright.X, closebuttonright.Y); - gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); var img = GetImage("maximizebutton"); if (img == null) { - gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); + gfx.DrawRectangle(closebuttonright.X, closebuttonright.Y, closebuttonsize.Width, closebuttonsize.Height, closebuttoncolor.ToMonoColor()); } else { - var resized = ResizeImage(img, closebuttonsize.Width, closebuttonsize.Height); - gfx.DrawImage(resized, closebuttonright); + gfx.DrawRectangle(closebuttonright.X, closebuttonright.Y, closebuttonsize.Width, closebuttonsize.Height, img.ToTexture2D(gfx.Device)); } } @@ -395,12 +391,11 @@ namespace ShiftOS.Frontend.Desktop var img = GetImage("minimizebutton"); if (img == null) { - gfx.FillRectangle(new SolidBrush(closebuttoncolor), new Rectangle(closebuttonright, closebuttonsize)); + gfx.DrawRectangle(closebuttonright.X, closebuttonright.Y, closebuttonsize.Width, closebuttonsize.Height, closebuttoncolor.ToMonoColor()); } else { - var resized = ResizeImage(img, closebuttonsize.Width, closebuttonsize.Height); - gfx.DrawImage(resized, closebuttonright); + gfx.DrawRectangle(closebuttonright.X, closebuttonright.Y, closebuttonsize.Width, closebuttonsize.Height, img.ToTexture2D(gfx.Device)); } @@ -433,59 +428,60 @@ namespace ShiftOS.Frontend.Desktop var bottomlimg = GetImage("bottomlborder"); if (bottomlimg == null) { - gfx.FillRectangle(new SolidBrush(borderbleftcolor), new Rectangle(0, bottomlocy, leftborderwidth, bottomborderwidth)); + gfx.DrawRectangle(0, bottomlocy, leftborderwidth, bottomborderwidth, borderbleftcolor.ToMonoColor()); } else { - bottomlimg = ResizeImage(bottomlimg, leftborderwidth, bottomborderwidth); - gfx.DrawImage(bottomlimg, 0, bottomlocy); + gfx.DrawRectangle(0, bottomlocy, leftborderwidth, bottomborderwidth, bottomlimg.ToTexture2D(gfx.Device)); } //BOTTOM RIGHT var bottomrimg = GetImage("bottomrborder"); if (bottomrimg == null) { - gfx.FillRectangle(new SolidBrush(borderbrightcolor), new Rectangle(brightlocx, bottomlocy, rightborderwidth, bottomborderwidth)); + gfx.DrawRectangle(brightlocx, bottomlocy, rightborderwidth, bottomborderwidth, borderbrightcolor.ToMonoColor()); } else { - bottomrimg = ResizeImage(bottomrimg, rightborderwidth, bottomborderwidth); - gfx.DrawImage(bottomrimg, brightlocx, bottomlocy); + gfx.DrawRectangle(brightlocx, bottomlocy, rightborderwidth, bottomborderwidth, bottomrimg.ToTexture2D(gfx.Device)); } //BOTTOM var bottomimg = GetImage("bottomborder"); if (bottomimg == null) - gfx.FillRectangle(new SolidBrush(borderbottomcolor), new Rectangle(bottomlocx, bottomlocy, bottomwidth, bottomborderwidth)); + { + gfx.DrawRectangle(leftborderwidth, bottomlocy, bottomwidth, bottomborderwidth, borderbottomcolor.ToMonoColor()); + } else { - bottomimg = ResizeImage(bottomimg, bottomwidth, bottomborderwidth); - gfx.DrawImage(bottomimg, bottomlocx, bottomlocy); + gfx.DrawRectangle(leftborderwidth, bottomlocy, bottomwidth, bottomborderwidth, bottomimg.ToTexture2D(gfx.Device)); } //LEFT var leftimg = GetImage("leftborder"); if (leftimg == null) - gfx.FillRectangle(new SolidBrush(borderleftcolor), new Rectangle(0, titleheight, leftborderwidth, Height - titleheight - bottomborderwidth)); + { + gfx.DrawRectangle(0, titleheight, leftborderwidth, Height - titleheight - bottomborderwidth, borderleftcolor.ToMonoColor()); + } else { - leftimg = ResizeImage(leftimg, leftborderwidth, Height - bottomborderwidth - titleheight); - gfx.DrawImage(leftimg, 0, titleheight); + gfx.DrawRectangle(0, titleheight, leftborderwidth, Height - titleheight - bottomborderwidth, leftimg.ToTexture2D(gfx.Device)); } //RIGHT var rightimg = GetImage("rightborder"); if (rightimg == null) { - gfx.FillRectangle(new SolidBrush(borderrightcolor), new Rectangle(brightlocx, titleheight, rightborderwidth, Height - titleheight - bottomborderwidth)); + gfx.DrawRectangle(brightlocx, titleheight, rightborderwidth, Height - titleheight - bottomborderwidth, borderrightcolor.ToMonoColor()); } else { - rightimg = ResizeImage(rightimg, rightborderwidth, Height - titleheight - bottomborderwidth); - gfx.DrawImage(rightimg, brightlocx, titleheight); + gfx.DrawRectangle(brightlocx, titleheight, rightborderwidth, Height - titleheight - bottomborderwidth, rightimg.ToTexture2D(gfx.Device)); } + } + gfx.DrawRectangle(leftborderwidth, titleheight, Width - leftborderwidth - rightborderwidth, Height - titleheight - bottomborderwidth, LoadedSkin.ControlColor.ToMonoColor()); //So here's what we're gonna do now. //Now that we have a titlebar and window borders... //We're going to composite the hosted window @@ -495,4 +491,26 @@ namespace ShiftOS.Frontend.Desktop } } + + public static class ImageExtensioons + { + public static Texture2D ToTexture2D(this Image image, GraphicsDevice device) + { + var bmp = (Bitmap)image; + var lck = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + var data = new byte[Math.Abs(lck.Stride) * lck.Height]; + Marshal.Copy(lck.Scan0, data, 0, data.Length); + bmp.UnlockBits(lck); + for(int i = 0; i < data.Length; i += 4) + { + byte r = data[i]; + byte b = data[i + 2]; + data[i] = b; + data[i + 2] = r; + } + var tex2 = new Texture2D(device, bmp.Width, bmp.Height); + tex2.SetData(data); + return tex2; + } + } } diff --git a/ShiftOS.Frontend/GUI/Button.cs b/ShiftOS.Frontend/GUI/Button.cs index 551d0d4..7d6804a 100644 --- a/ShiftOS.Frontend/GUI/Button.cs +++ b/ShiftOS.Frontend/GUI/Button.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using ShiftOS.Engine; +using ShiftOS.Frontend.GraphicsSubsystem; namespace ShiftOS.Frontend.GUI { @@ -31,19 +32,17 @@ namespace ShiftOS.Frontend.GUI } } - protected override void OnPaint(Graphics gfx) + protected override void OnPaint(GraphicsContext gfx) { - Color bgCol = SkinEngine.LoadedSkin.ButtonBackgroundColor; - Color fgCol = SkinEngine.LoadedSkin.ControlTextColor; + var bgCol = SkinEngine.LoadedSkin.ButtonBackgroundColor.ToMonoColor(); + var fgCol = SkinEngine.LoadedSkin.ControlTextColor.ToMonoColor(); if (ContainsMouse) - bgCol = SkinEngine.LoadedSkin.ButtonHoverColor; + bgCol = SkinEngine.LoadedSkin.ButtonHoverColor.ToMonoColor(); if (MouseLeftDown) - bgCol = SkinEngine.LoadedSkin.ButtonPressedColor; + bgCol = SkinEngine.LoadedSkin.ButtonPressedColor.ToMonoColor(); - gfx.Clear(bgCol); - gfx.DrawRectangle(new Pen(new SolidBrush(fgCol), SkinEngine.LoadedSkin.ButtonBorderWidth), new Rectangle(0, 0, Width, Height)); base.OnPaint(gfx); - + base.OnPaint(gfx); } } } diff --git a/ShiftOS.Frontend/GUI/Control.cs b/ShiftOS.Frontend/GUI/Control.cs index 32afecc..31a3dd0 100644 --- a/ShiftOS.Frontend/GUI/Control.cs +++ b/ShiftOS.Frontend/GUI/Control.cs @@ -362,9 +362,9 @@ namespace ShiftOS.Frontend.GUI public virtual void MouseStateChanged() { } - protected virtual void OnPaint(Graphics gfx) + protected virtual void OnPaint(GraphicsContext gfx) { - gfx.Clear(Engine.SkinEngine.LoadedSkin.ControlColor); + gfx.Clear(Engine.SkinEngine.LoadedSkin.ControlColor.ToMonoColor()); } public void InvalidateTopLevel() @@ -375,46 +375,29 @@ namespace ShiftOS.Frontend.GUI parent.Invalidate(); } - public void Paint(System.Drawing.Graphics gfx) + public void Paint(GraphicsContext gfx) { if (_visible == true) { - if (_invalidated) + OnPaint(gfx); + int draw_x = gfx.X; + int draw_y = gfx.Y; + int draw_width = gfx.Width; + int draw_height = gfx.Height; + foreach (var ctrl in _children) { - _texCache = new Bitmap(Width, Height); - using (var cGfx = Graphics.FromImage(_texCache)) + if (ctrl.Visible == true) { - OnPaint(cGfx); + gfx.X = draw_x + ctrl.X; + gfx.Y = draw_y + ctrl.Y; + gfx.Width = ctrl.Width; + gfx.Height = ctrl.Height; + ctrl.Paint(gfx); } - _invalidated = false; + gfx.Width = draw_width; + gfx.Height = draw_height; } - foreach (var child in _children) - { - if (child.Visible) - { - if (child._invalidated) - { - var cBmp = new Bitmap(child.Width, child.Height); - child.Paint(System.Drawing.Graphics.FromImage(cBmp)); - cBmp.SetOpacity((float)child.Opacity); - using(var cGfx = Graphics.FromImage(_texCache)) - { - cGfx.DrawImage(child.TextureCache, child.X, child.Y); - } - child._invalidated = false; - child._texCache = cBmp; - gfx.DrawImage(cBmp, new System.Drawing.Point(child.X, child.Y)); - - - - } - else - { - gfx.DrawImage(child._texCache, child.X, child.Y); - } - } - } - gfx.DrawImage(_texCache, 0, 0); + _invalidated = false; } } diff --git a/ShiftOS.Frontend/GUI/PictureBox.cs b/ShiftOS.Frontend/GUI/PictureBox.cs index 9a234d4..91735aa 100644 --- a/ShiftOS.Frontend/GUI/PictureBox.cs +++ b/ShiftOS.Frontend/GUI/PictureBox.cs @@ -7,6 +7,7 @@ using System.Text; using System.Threading.Tasks; using ShiftOS.Engine; using System.Drawing.Imaging; +using ShiftOS.Frontend.GraphicsSubsystem; namespace ShiftOS.Frontend.GUI { @@ -50,38 +51,8 @@ namespace ShiftOS.Frontend.GUI } } - protected override void OnPaint(Graphics gfx) + protected override void OnPaint(GraphicsContext gfx) { - if(img != null) - switch (_layout) - { - case ImageLayout.None: - //Just draw the image. - gfx.DrawImage(img, new PointF(0, 0)); - break; - case ImageLayout.Stretch: - //Stretch the image, with no regard for aspect ratio. - var stretched = ResizeImage(img, Width, Height); - gfx.DrawImage(stretched, 0, 0); - break; - case ImageLayout.Fit: - //Resize image to fit the control but keep aspect ratio. - var fitted = FixedSize(img, Width, Height); - gfx.DrawImage(fitted, 0, 0); - break; - case ImageLayout.Tile: - //Keep original size but tile the image. - - for(int x = 0; x < Width; x += img.Width) - { - for (int y = 0; y < Height; y += img.Height) - { - gfx.DrawImage(img, x, y); - } - } - - break; - } } //Again, thanks StackOverflow diff --git a/ShiftOS.Frontend/GUI/ProgressBar.cs b/ShiftOS.Frontend/GUI/ProgressBar.cs index e35dc27..a13bbf8 100644 --- a/ShiftOS.Frontend/GUI/ProgressBar.cs +++ b/ShiftOS.Frontend/GUI/ProgressBar.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; +using ShiftOS.Frontend.GraphicsSubsystem; using static ShiftOS.Engine.SkinEngine; namespace ShiftOS.Frontend.GUI @@ -37,11 +38,11 @@ namespace ShiftOS.Frontend.GUI } } - protected override void OnPaint(Graphics gfx) + protected override void OnPaint(GraphicsContext gfx) { - gfx.Clear(LoadedSkin.ProgressBarBackgroundColor); + gfx.Clear(LoadedSkin.ProgressBarBackgroundColor.ToMonoColor()); int w = (int)linear(_value, 0, _maximum, 0, Width); - gfx.FillRectangle(new SolidBrush(LoadedSkin.ProgressColor), new Rectangle(0, 0, w, Height)); + gfx.DrawRectangle(0, 0, w, Height, LoadedSkin.ProgressColor.ToMonoColor()); } static public double linear(double x, double x0, double x1, double y0, double y1) diff --git a/ShiftOS.Frontend/GUI/TextControl.cs b/ShiftOS.Frontend/GUI/TextControl.cs index 9bc70e8..f1bbef1 100644 --- a/ShiftOS.Frontend/GUI/TextControl.cs +++ b/ShiftOS.Frontend/GUI/TextControl.cs @@ -4,6 +4,7 @@ using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; +using ShiftOS.Frontend.GraphicsSubsystem; namespace ShiftOS.Frontend.GUI { @@ -53,19 +54,19 @@ namespace ShiftOS.Frontend.GUI set { _textAlign = value; } } - protected override void OnPaint(Graphics gfx) + protected override void OnPaint(GraphicsContext gfx) { var sMeasure = gfx.MeasureString(_text, _font, Width); PointF loc = new PointF(2, 2); - float centerH = (Width - sMeasure.Width) / 2; - float centerV = (Height - sMeasure.Height) / 2; + float centerH = (Width - sMeasure.X) / 2; + float centerV = (Height - sMeasure.Y) / 2; switch (_textAlign) { case TextAlign.TopCenter: loc.X = centerH; break; case TextAlign.TopRight: - loc.X = Width - sMeasure.Width; + loc.X = Width - sMeasure.X; break; case TextAlign.MiddleLeft: loc.Y = centerV; @@ -76,23 +77,23 @@ namespace ShiftOS.Frontend.GUI break; case TextAlign.MiddleRight: loc.Y = centerV; - loc.X = (Width - sMeasure.Width); + loc.X = (Width - sMeasure.Y); break; case TextAlign.BottomLeft: - loc.Y = (Height - sMeasure.Height); + loc.Y = (Height - sMeasure.Y); break; case TextAlign.BottomCenter: - loc.Y = (Height - sMeasure.Height); + loc.Y = (Height - sMeasure.Y); loc.X = centerH; break; case TextAlign.BottomRight: - loc.Y = (Height - sMeasure.Height); - loc.X = (Width - sMeasure.Width); + loc.Y = (Height - sMeasure.Y); + loc.X = (Width - sMeasure.X); break; } - gfx.DrawString(_text, _font, new SolidBrush(Engine.SkinEngine.LoadedSkin.ControlTextColor), new RectangleF(loc.X, loc.Y, sMeasure.Width, sMeasure.Height)); + gfx.DrawString(_text, 0, 0, Engine.SkinEngine.LoadedSkin.ControlTextColor.ToMonoColor(), _font, this.Width); } } diff --git a/ShiftOS.Frontend/GUI/TextInput.cs b/ShiftOS.Frontend/GUI/TextInput.cs index 13ee596..73954ef 100644 --- a/ShiftOS.Frontend/GUI/TextInput.cs +++ b/ShiftOS.Frontend/GUI/TextInput.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using System.Drawing; + using System.Linq; using System.Text; using System.Threading.Tasks; @@ -15,7 +15,7 @@ namespace ShiftOS.Frontend.GUI private string _label = "Type here!"; private string _text = ""; private int _index = 0; - private Font _font = new Font("Tahoma", 9f); + private System.Drawing.Font _font = new System.Drawing.Font("Tahoma", 9f); public int Index { @@ -96,7 +96,7 @@ namespace ShiftOS.Frontend.GUI protected void CalculateVisibleText() { - using(var gfx = Graphics.FromImage(new Bitmap(1, 1))) + using(var gfx = System.Drawing.Graphics.FromImage(new System.Drawing.Bitmap(1, 1))) { string toCaret = _text.Substring(0, _index); var measure = gfx.MeasureString(toCaret, _font); @@ -115,25 +115,24 @@ namespace ShiftOS.Frontend.GUI private float _textDrawOffset = 0; - protected override void OnPaint(Graphics gfx) + protected override void OnPaint(GraphicsContext gfx) { - gfx.Clear(LoadedSkin.ControlColor); - gfx.DrawString(_text, _font, new SolidBrush(LoadedSkin.ControlTextColor), 2 - _textDrawOffset, 2); + gfx.Clear(LoadedSkin.ControlColor.ToMonoColor()); + gfx.DrawString(_text, 2 - (int)Math.Floor(_textDrawOffset), 2, LoadedSkin.ControlTextColor.ToMonoColor(), _font); if (IsFocusedControl) { //Draw caret. - gfx.FillRectangle(new SolidBrush(LoadedSkin.ControlTextColor), new RectangleF(caretPos - _textDrawOffset, 2, 2, Height - 4)); + + + gfx.DrawRectangle((int)(Math.Floor(caretPos) - Math.Floor(_textDrawOffset)), 2, 2, Height - 4, LoadedSkin.ControlTextColor.ToMonoColor()); } else { if (string.IsNullOrEmpty(_text)) { - gfx.DrawString(_label, _font, Brushes.Gray, 2, 2); + gfx.DrawString(_label, 2, 2, Color.Gray, _font); } } - gfx.DrawRectangle(new Pen(new SolidBrush(LoadedSkin.ControlTextColor), 1), new System.Drawing.Rectangle(0, 0, Width - 1, Height - 1)); - - } } } diff --git a/ShiftOS.Frontend/GraphicsSubsystem/GraphicsContext.cs b/ShiftOS.Frontend/GraphicsSubsystem/GraphicsContext.cs new file mode 100644 index 0000000..173a024 --- /dev/null +++ b/ShiftOS.Frontend/GraphicsSubsystem/GraphicsContext.cs @@ -0,0 +1,179 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using ShiftOS.Frontend.Apps; + +namespace ShiftOS.Frontend.GraphicsSubsystem +{ + public class GraphicsContext + { + public GraphicsDevice Device + { + get + { + return _graphicsDevice; + } + } + + private int _startx = 0; + private int _starty = 0; + + private int _maxwidth = 1; + private int _maxheight = 1; + + public int X + { + get + { + return _startx; + } + set + { + _startx = value; + } + } + + public int Y + { + get + { + return _starty; + } + set + { + _starty = value; + } + } + + public int Width + { + get + { + return _maxwidth; + } + set + { + _maxwidth = value; + } + } + + public int Height + { + get + { + return _maxheight; + } + set + { + _maxheight = value; + } + } + + + private GraphicsDevice _graphicsDevice; + private SpriteBatch _spritebatch; + + public GraphicsContext(GraphicsDevice device, SpriteBatch batch, int x, int y, int width, int height) + { + _graphicsDevice = device; + _spritebatch = batch; + _maxwidth = width; + _maxheight = height; + _startx = x; + _starty = y; + } + + public void Clear(Color c) + { + DrawRectangle(_startx, _starty, _maxwidth, _maxheight, c); + } + + public void DrawLine(int x, int y, int x1, int y1, int thickness, Texture2D tex2) + { + x += _startx; + y += _starty; + int distance = (int)Vector2.Distance(new Vector2(x, y), new Vector2(x1, y1)); + float rotation = getRotation(x, y, x1, y1); + _spritebatch.Draw(tex2, new Rectangle(x, y, distance, thickness), null, Color.White, rotation, Vector2.Zero, SpriteEffects.None, 0); + } + + public void DrawLine(int x, int y, int x1, int y1, int thickness, Color color) + { + x += _startx; + y += _starty; + var tex2 = new Texture2D(_graphicsDevice, 1, 1, false, SurfaceFormat.Color); + byte[] colordata = new byte[] { color.B, color.G, color.R, color.A }; + tex2.SetData(colordata); + int distance = (int)Vector2.Distance(new Vector2(x, y), new Vector2(x1, y1)); + float rotation = getRotation(x, y, x1, y1); + _spritebatch.Draw(tex2, new Rectangle(x, y, distance, thickness), null, color, rotation, Vector2.Zero, SpriteEffects.None, 0); + } + + public void DrawRectangle(int x, int y, int width, int height, Color color) + { + x += _startx; + y += _starty; + var tex2 = new Texture2D(_graphicsDevice, 1, 1, false, SurfaceFormat.Color); + byte[] colordata = new byte[] { color.B, color.G, color.R, color.A }; + tex2.SetData(colordata); + _spritebatch.Draw(tex2, new Rectangle(x, y, width, height), color); + } + + public void DrawRectangle(int x, int y, int width, int height, Texture2D tex2) + { + x += _startx; + y += _starty; + _spritebatch.Draw(tex2, new Rectangle(x, y, width, height), Color.White); + } + + public Vector2 MeasureString(string text, System.Drawing.Font font, int wrapWidth = int.MaxValue) + { + using(var gfx = System.Drawing.Graphics.FromImage(new System.Drawing.Bitmap(1, 1))) + { + var s = gfx.SmartMeasureString(text, font, wrapWidth); + return new Vector2((float)Math.Ceiling(s.Width), (float)Math.Ceiling(s.Height)); + } + } + + public void DrawString(string text, int x, int y, Color color, System.Drawing.Font font, int wrapWidth = 0) + { + x += _startx; + y += _starty; + Vector2 measure; + if (wrapWidth == 0) + measure = MeasureString(text, font); + else + measure = MeasureString(text, font, wrapWidth); + using(var bmp = new System.Drawing.Bitmap((int)measure.X, (int)measure.Y)) + { + using(var gfx = System.Drawing.Graphics.FromImage(bmp)) + { + gfx.DrawString(text, font, new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B)), 0, 0); + } + var lck = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + var data = new byte[Math.Abs(lck.Stride) * lck.Height]; + System.Runtime.InteropServices.Marshal.Copy(lck.Scan0, data, 0, data.Length); + bmp.UnlockBits(lck); + var tex2 = new Texture2D(_graphicsDevice, bmp.Width, bmp.Height); + tex2.SetData(data); + _spritebatch.Draw(tex2, new Rectangle(x, y, bmp.Width, bmp.Height), Color.White); + } + } + + private float getRotation(float x, float y, float x2, float y2) + { + float adj = x - x2; + float opp = y - y2; + float tan = opp / adj; + float res = MathHelper.ToDegrees((float)Math.Atan2(opp, adj)); + res = (res - 180) % 360; + if (res < 0) { res += 360; } + res = MathHelper.ToRadians(res); + return res; + } + } +} diff --git a/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs b/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs index b87dd32..bd173d2 100644 --- a/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs +++ b/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs @@ -40,26 +40,56 @@ namespace ShiftOS.Frontend.GraphicsSubsystem t.Start(); } - public static Dictionary TextureCaches = new Dictionary(); + public static Dictionary TextureCaches = new Dictionary(); - public static void DrawControls(GraphicsDevice graphics, SpriteBatch batch) + public static void DrawTArgets(SpriteBatch batch) { - foreach (var ctrl in topLevels.ToArray()) + foreach(var ctrl in topLevels) { + if (ctrl.Visible == true) + { + int hc = ctrl.GetHashCode(); + var _target = TextureCaches[hc]; + batch.Draw(_target, new Rectangle(ctrl.X, ctrl.Y, ctrl.Width, ctrl.Height), Color.White); + } + } + } + + public static void DrawControlsToTargets(GraphicsDevice graphics, SpriteBatch batch, int width, int height) + { + foreach (var ctrl in topLevels.ToArray().Where(x=>x.Visible==true)) + { + RenderTarget2D _target; int hc = ctrl.GetHashCode(); + if (!TextureCaches.ContainsKey(hc)) + { + _target = new RenderTarget2D( + graphics, + ctrl.Width, + ctrl.Height, + false, + graphics.PresentationParameters.BackBufferFormat, + DepthFormat.Depth24); + TextureCaches.Add(hc, _target); + } + else + { + _target = TextureCaches[hc]; + } if (ctrl.RequiresPaint) { - var bmp = new System.Drawing.Bitmap(ctrl.Width, ctrl.Height); - ctrl.Paint(System.Drawing.Graphics.FromImage(bmp)); - if (TextureCaches.ContainsKey(hc)) - { - TextureCaches[hc].Dispose(); - TextureCaches.Remove(hc); - } - TextureCaches.Add(hc, new Texture2D(graphics, ctrl.Width, ctrl.Height)); - TextureCaches[hc].SetData(ctrl.PaintCache); + graphics.SetRenderTarget(_target); + graphics.DepthStencilState = new DepthStencilState() { DepthBufferEnable = true }; + batch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, + SamplerState.LinearClamp, DepthStencilState.Default, + RasterizerState.CullNone); + var gfxContext = new GraphicsContext(graphics, batch, 0, 0, _target.Width, _target.Height); + ctrl.Paint(gfxContext); + + graphics.SetRenderTarget(null); + TextureCaches[hc] = _target; + batch.End(); } - batch.Draw(TextureCaches[hc], new Rectangle(ctrl.X, ctrl.Y, ctrl.Width, ctrl.Height), Color.White); } } diff --git a/ShiftOS.Frontend/MonoGameLanguageProvider.cs b/ShiftOS.Frontend/MonoGameLanguageProvider.cs new file mode 100644 index 0000000..9010cfa --- /dev/null +++ b/ShiftOS.Frontend/MonoGameLanguageProvider.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using ShiftOS.Engine; + +namespace ShiftOS.Frontend +{ + public class MonoGameLanguageProvider : ILanguageProvider + { + private string resourcesPath + { + get + { + return System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ShiftOS", "languages"); + } + } + + public string[] GetAllLanguages() + { + if (!System.IO.Directory.Exists(resourcesPath)) + { + System.IO.Directory.CreateDirectory(resourcesPath); + } + return System.IO.Directory.GetFiles(resourcesPath).Where(x => x.ToLower().EndsWith(".lang")).ToArray(); + + } + + public string GetCurrentTranscript() + { + string lang = Objects.UserConfig.Get().Language; + if (string.IsNullOrWhiteSpace(lang)) + { + lang = "english"; + var conf = Objects.UserConfig.Get(); + conf.Language = lang; + System.IO.File.WriteAllText("servers.json", JsonConvert.SerializeObject(conf, Formatting.Indented)); + } + string foundPath = GetAllLanguages().FirstOrDefault(x => x.ToLower().EndsWith(lang + ".lang")); + //Update the english file. + System.IO.File.WriteAllText(System.IO.Path.Combine(resourcesPath, "english.lang"), Properties.Resources.strings_en); + //Update the french language pack. + System.IO.File.WriteAllText(System.IO.Path.Combine(resourcesPath, "french.lang"), Properties.Resources.strings_fr); + + if (!System.IO.File.Exists(foundPath)) + { + lang = "english"; + var conf = Objects.UserConfig.Get(); + conf.Language = lang; + System.IO.File.WriteAllText("servers.json", JsonConvert.SerializeObject(conf, Formatting.Indented)); + return Properties.Resources.strings_en; + } + else + { + return System.IO.File.ReadAllText(foundPath); + } + + } + + public string GetLanguagePath() + { + var lang = Objects.UserConfig.Get().Language; + if (string.IsNullOrWhiteSpace(lang) || !System.IO.File.Exists(System.IO.Path.Combine(resourcesPath, lang + ".lang"))) + { + lang = "english"; + var conf = Objects.UserConfig.Get(); + conf.Language = lang; + System.IO.File.WriteAllText("servers.json", JsonConvert.SerializeObject(conf, Formatting.Indented)); + System.IO.File.WriteAllText(System.IO.Path.Combine(resourcesPath, lang + ".lang"), Properties.Resources.strings_en); + } + return GetAllLanguages().FirstOrDefault(x => x.ToLower().EndsWith(lang + ".lang")); + } + + public List GetJSONTranscripts() + { + var strings = new List(); + foreach (var path in GetAllLanguages()) + strings.Add(System.IO.File.ReadAllText(path)); + return strings; + } + + public void WriteDefaultTranscript() + { + if (!System.IO.Directory.Exists(resourcesPath)) + System.IO.Directory.CreateDirectory(resourcesPath); + + //Update the english file. + System.IO.File.WriteAllText(System.IO.Path.Combine(resourcesPath, "english.lang"), Properties.Resources.strings_en); + //Update the french language pack. + System.IO.File.WriteAllText(System.IO.Path.Combine(resourcesPath, "french.lang"), Properties.Resources.strings_fr); + } + + public void WriteTranscript() + { + System.IO.File.WriteAllText(GetLanguagePath(), GetCurrentTranscript()); + } + + private string getDefault() + { + return Properties.Resources.strings_en; + } + + } +} diff --git a/ShiftOS.Frontend/Properties/Resources.Designer.cs b/ShiftOS.Frontend/Properties/Resources.Designer.cs index fc35525..38c6ee8 100644 --- a/ShiftOS.Frontend/Properties/Resources.Designer.cs +++ b/ShiftOS.Frontend/Properties/Resources.Designer.cs @@ -79,5 +79,71 @@ namespace ShiftOS.Frontend.Properties { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Looks up a localized string similar to { + /// "{SUBMIT}":"Bestätigen", + /// + ///"{TERMINAL_TUTORIAL_1}":"Wilkommen zum ShiftOS Terminal. Hier wirst du die meiste Zeit in ShiftOS verbringen. + /// + ///Eine kurze Erklärung wie du das Terminal benutzt lautet wiefolgt. Du kannst das command 'sos.help' benutzen um eine Liste aller commands aufzurufen. Schreib es + ///einfach in das Terminal und drücke <enter> um alle commands anzuzeigen. + /// + ///Commands können mit argumenten versehen werden, indem du ein key-value Paar in einem {} Block hinter dem command angibst. Zum Be [rest of string was truncated]";. + /// + internal static string strings_de { + get { + return ResourceManager.GetString("strings_de", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to /* + /// * ShiftOS English Language Pack + /// * + /// * This is the default language pack distributed within the game. + /// */ + /// + ///{ + /// //General strings + /// //These strings can be used anywhere in the UI where language context isn't necessary. + /// "{GEN_PROGRAMS}": "Programs", + /// "{GEN_COMMANDS}": "Commands", + /// "{GEN_OBJECTIVES}": "Objectives", + /// "{GEN_CURRENTPROCESSES}": "Current processes", + /// "{GEN_WELCOME}": "Welcome to ShiftOS.", + /// "{GEN_SYSTEMNAME}": "System name", + /// "{GEN_PASSWORD}": "Password", + /// "{GEN_LPROMPT [rest of string was truncated]";. + /// + internal static string strings_en { + get { + return ResourceManager.GetString("strings_en", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to /* + /// * ShiftOS French Language Pack + /// * + /// * This is a default language pack distributed within the game. + /// */ + /// + ///{ + /// //General strings + /// //These strings can be used anywhere in the UI where language context isn't necessary. + /// "{GEN_PROGRAMS}": "Les programmes", + /// "{GEN_COMMANDS}": "Les ordres", + /// "{GEN_OBJECTIVES}": "Les objectifs", + /// "{GEN_CURRENTPROCESSES}": "Les procèdures actuelles", + /// "{GEN_WELCOME}": "Bienvenue au ShiftOS.", + /// "{GEN_SYSTEMNAME}": "Nom de système", + /// "{GEN_PASSWORD}": "Mot de [rest of string was truncated]";. + /// + internal static string strings_fr { + get { + return ResourceManager.GetString("strings_fr", resourceCulture); + } + } } } diff --git a/ShiftOS.Frontend/Properties/Resources.resx b/ShiftOS.Frontend/Properties/Resources.resx index e309997..e77c745 100644 --- a/ShiftOS.Frontend/Properties/Resources.resx +++ b/ShiftOS.Frontend/Properties/Resources.resx @@ -124,4 +124,13 @@ ..\Resources\justthes.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\strings_de.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\strings_en.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + ..\Resources\strings_fr.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + \ No newline at end of file diff --git a/ShiftOS.Frontend/Resources/strings_de.txt b/ShiftOS.Frontend/Resources/strings_de.txt new file mode 100644 index 0000000..139ed69 --- /dev/null +++ b/ShiftOS.Frontend/Resources/strings_de.txt @@ -0,0 +1,245 @@ +{ + "{SUBMIT}":"Bestätigen", + +"{TERMINAL_TUTORIAL_1}":"Wilkommen zum ShiftOS Terminal. Hier wirst du die meiste Zeit in ShiftOS verbringen. + +Eine kurze Erklärung wie du das Terminal benutzt lautet wiefolgt. Du kannst das command 'sos.help' benutzen um eine Liste aller commands aufzurufen. Schreib es +einfach in das Terminal und drücke um alle commands anzuzeigen. + +Commands können mit argumenten versehen werden, indem du ein key-value Paar in einem {} Block hinter dem command angibst. Zum Beispiel: + +some.command{print:\"Guten Tag!\"} +math.add{op1:1, op2:2} +set.value{key:\"somekey\", value:true} + +Dir wurden 50 Codepoints als Startgeld gegeben - benutz dein Wissen um mit ihnen das MUD Fundamentals Shiftorium Upgrade zu kaufen. Das ganze mit dem Terminal. +Um das MUD Fundamentals Upgrade zu kaufen, tippe shiftorium.buy{upgrade:\"mud_fundamentals\"} in das Terminal. Das ganze funktioniert auch mit anderen Upgrades die +du kaufen willst, ersetze mud_fundamentals einfach mit einem anderen Upgradenamen. +", + + + "{TERMINAL_TUTORIAL_2}":"Du hast den Test erfolgreich bestanden. ShiftOS wird seine Grundfunktionen installieren.", + "{ABOUT}":"Über", + "{START_SYSTEM_SCAN}":"Starte systemweiten Scan", + "{SCAN_HOME}":"Scanne 0:/home", + "{SCAN_SYSTEM}":"Scanne 0:/system", + "{RESULTS}":"Ergebnisse", + "{VIRUSSCANNER_ABOUT}":"Wilkommen zum ShiftOS Virenscanner. + +Der ShiftOS Virenscanner ist ein Werkzeug welches dir erlaubt jede/s Datei oder System zu scannen und herauszufinden +ob es ein Virus ist. Wenn ein Virus erkannt wird, hast do die Option ihn danach zu löschen indem du 'Entfernen' +klickst. + +Wenn eine Systemdatei von dem Virenscanner erkannt wird, wird sie ersetzt.", + "{PLAY}":"Spielen", + "{APPLICATIONS}":"Anwendungen", + "{TERMINAL}":"Terminal", + "{PONG}":"Pong", + "{CODEPOINTS}":"Codepoints", + "{SHIFTORIUM}":"Shiftorium", + "{HACK}":"Hack", + "{SHIFTER}":"Shifter", + "{MUD_SHORT}":"MUD", + "{MUD}":"Multi-user domain", + "{DESKTOP}":"Desktop", + "{WINDOW}":"Fenster", + "{WINDOW_MANAGER}":"Fenstermanager", + "{UPGRADE}":"Upgrade", + "{UPGRADES}":"Upgrades", + "{APPLICATION}":"Anwendung", + "{SCRIPT}":"Skript", + "{ERROR}":"Fehler", + "{SCRIPTS}":"Skripts", + "{NULL}":"null", + "{ID}":"ID Num", + "{SYSTEM_INITIATED}":"System initialisiert", + "{PASSWORD}":"Passwort", + "{CRACK}":"Crack", + "{ARTPAD_UNDO_ERROR}":"Artpad - Fehler rückgängig machen", + "{ARTPAD_NEXT_STEP_WILL_KILL_CANVAS_JUST_FLIPPING_CLICK_NEW}":"You cannot undo the previous action as it would delete the canvas. If you'd like to clear the canvas, click New.", + "{ARTPAD_REDO_ERROR}":"Artpad - Wiederherstellungserror", + "{ARTPAD_NOTHING_TO_REDO}":"Artpad kann nichts wiederherstellen! Behalte im Kopf, dass wenn du etwas rückgängig machst und dann zeichnest, das der Verlauf gelöscht wird.", + "{ARTPAD_MAGNIFIER_ERROR}": "Artpad - Magnifier Error", + "{ARTPAD_MAGNIFICATION_ERROR_EXP_2}": "Artpad kann nicht weiter ranzoomen!", + "{ARTPAD_MAGNIFICATION_ERROR_EXP}": "Artpad kann nicht weiter ranzoomen. Naja, es kann, aber es will nicht.", + "{SHUTDOWN}":"Herunterfahren", + "{CONNECTING_TO_MUD}":"Verbinde mit dem Multi-User Domain...", + "{READING_FS}":"Lese Dateisystem...", + "{INIT_KERNEL}":"Initialisiere Kernel...", + "{START_DESKTOP}":"Starte Desktop-Session...", + "{DONE}": "Fertig", + "{READING_CONFIG}":"Lese Konfiguration...", + "{ID_TAKEN}":"ID Existiert bereits! Benutze chat.join um diesen Chat zu betreten.", + "{CHAT_NOT_FOUND_OR_TOO_MANY_MEMBERS}":"Dieser Chat existiert entweder nicht oder er ist voll.", + "{CHAT_NOT_FOUND_OR_NOT_IN_CHAT}":"Du bist zurzeit nicht in diesem Chat.", + "{CHAT_PLEASE_PROVIDE_VALID_CHANNEL_DATA}":"Du hast keine gültige Chat-Metadata angegeben! Bitte benutze chat.create{id:\"deine_id\", name:\"Dein Chatname\", topic:\"Thema deines Channels\"}.", + "{UPGRADE_PROGRESS}":"Upgrade progress""Upgrade Fortschritt", + "{WIN_PROVIDEID}":"Bitte gib eine gültige Fenster ID von win.list an.", + "{WIN_CANTCLOSETERMINAL}":"Du kannst dieses Terminal nicht schließen.", + "{WELCOME_TO_SHIFTORIUM}":"Willkommen zum Shiftorium!", + "{SUCCESSFULLY_CREATED_CHAT}":"Chat erfolgreich erstellt. Benutze chat.join{id:\"chat_id_hier\"} um ihm beizutreten.", + "{CHAT_HAS_JOINED}":"hat den Chat betreten.", + "{HAS_LEFT_CHAT}":"hat den Chat verlassen.", + "{SHIFTORIUM_EXP}":"The Shiftorium is your one-stop-shop for ShiftOS system enhancements, upgrades and applications. + + You can buy upgrades in the Shiftorium using a currency called Codepoints, which you can earn by doing various tasks within ShiftOS, such as playing Pong, stealing them from other users, and finding ways to make your own. It's up to you how you get your Codepoints. + + You can then use them to buy new applications, features, enhancements and upgrades for ShiftOS that make the user experience a lot better. Be careful though, buying too many system enhancements without buying new ways of earning Codepoints first can leave you in the dust and unable to upgrade the system. + + Anyways, feel free to browse from our wonderful selection! You can see a list of available upgrades on the left, as well as a progress bar showing how much you've upgraded the system compared to how much you still can.", + "{PONG_WELCOME}":"Welcome to Pong.", + "{PONG_DESC}":"Pong is an arcade game where your goal is to get the ball past the opponent paddle while keeping it from getting past yours. + + In ShiftOS, Pong is modified - you only have one chance, the game is divided into 60 second levels, and you can earn Codepoints by surviving a level, and beating the opponent.", + "{NO_APP_TO_OPEN}":"No app found for this file!", + "{NO_APP_TO_OPEN_EXP}":"File Skimmer could not find an application that can open this file.", + "{CLIENT_DIAGNOSTICS}":"Client diagnostics", + "{GUID}":"GUID", + "{CLIENT_DATA}":"Client data", + "{CLOSE}":"Schließen", + "{LOAD_DEFAULT}":"Load default", + "{IMPORT}":"Einführen", + "{EXPORT}":"Export", + "{APPLY}":"Apply", + "{TEMPLATE}":"Vorlage", + "{H_VEL}":"Horizontal velocity", + "{V_VEL}":"Vertical velocity", + "{LEVEL}":"Ebene", + "{UPGRADE_DEVELOPMENT}":"Development Upgrade", + "{UPGRADE_DEVELOPMENT_DESCRIPTION}":"Development Upgrade Don't Buy", + "{SECONDS_LEFT}":"sekunden übrig", + "{CASH_OUT_WITH_CODEPOINTS}":"Cash out with your codepoints", + "{PONG_PLAY_ON_FOR_MORE}":"Spiel für mehr!", + "{YOU_REACHED_LEVEL}":"You've reached level", + "{PONG_BEAT_AI_REWARD}":"Reward for beating AI (CP)", + "{PONG_BEAT_AI_REWARD_SECONDARY}":"Codepoints for beating AI:", + "{CODEPOINTS_FOR_BEATING_LEVEL}":"Codepoints for beating level", + "{YOU_WON}":"Du gewinnst", + "{YOU_LOSE}":"Du verlierst", + "{TRY_AGAIN}":"Try again", + "{CODEPOINTS_SHORT}":"CP", + "{TERMINAL_FORMATTING_DRIVE}":"Formatting drive... %percent %", + "{INSTALLING_SHIFTOS}":"Installing ShiftOS on %domain.", + "{YOU_MISSED_OUT_ON}":"You missed out on", + "{BUT_YOU_GAINED}":"Aber du hast gewonnen", + "{PONG_PLAYON_DESC}":"Or do you want to try your luck on the next level to increase your reward?", + "{PONG_CASHOUT_DESC}":"Would you like the end the game now and cash out with your reward?", + "{INITIAL_H_VEL}":"Initial H Vel", + "{INITIAL_V_VEL}":"Initial V Vel", + "{INC_H_VEL}":"Increment H Vel", + "{INC_V_VEL}":"Increment V Vel", + "{MULTIPLAYER_ONLY}":"Program not compatible with single-user domain.", + "{MULTIPLAYER_ONLY_EXP}":"This program cannot run within a single-user domain. You must be within a multi-user domain to use this program.", + "{SHIFTER_SKIN_APPLIED}":"Shifter - Settings applied!", + "{YOU_HAVE_EARNED}":"Du hast bekommen", + "{CREATING_PATH}":"Creating directory: %path", + "{CREATING_FILE}":"Creating file: %path", + "{SHIFTORIUM_HELP_DESCRIPTION}": "Help Descriptions", + "{CREATING_USER}":"Creating user %username", + "{SEPERATOR}":" - ", + "{NAMESPACE}":"Namespace ", + "{COMMAND}": "| Befehl ", + "{SHIFTOS_HAS_BEEN_INSTALLED}":"ShiftOS has been installed on %domain.", + "{WARN}": "WARN: ", + "{ERROR}": "!ERROR! ", + "{OBSOLETE_CHEATS_FREECP}": "The %ns.%cmd command is obsolete and has been replaced with %newcommand", + "{REBOOTING_SYSTEM}":"Rebooting system in %i seconds...", + "{ERROR_ARGUMENT_REQUIRED}": "You must supply an %argument value", + "{ERROR_ARGUMENT_REQUIRED_NO_USAGE}": "You are missing some arguments.", + "{GENERATING_PATHS}":"Generating paths...", + "{ERROR_COMMAND_WRONG}": "Check your syntax and try again", + "{LOGIN_EXP}": "Login as the admin of the multi user domain.", + + "{USAGE}": "Verwendung: ", + + "{NAMESPACE_SOS_DESCRIPTION}":"The ShiftOS Namespace", + "{COMMAND_HELP_USAGE}":"%ns.%cmd{[topic:]}", + "{COMMAND_HELP_DESCRIPTION}":"Listet alle Befehle auf", + "{COMMAND_SOS_SHUTDOWN_USAGE}":"%ns.%cmd", + "{COMMAND_SOS_SHUTDOWN_DESCRIPTION}":"Saves and shuts down ShiftOS", + "{COMMAND_SOS_STATUS_USAGE}":"%ns.%cmd", + "{COMMAND_SOS_STATUS_DESCRIPTION}":"Displays how many codepoints you have", + "{COMMAND_SOS_LANG_USAGE}":"%ns.%cmd{[language:\"english\"]}", + "{COMMAND_SOS_LANG_DESCRIPTION}":"Sprache ändern.", + "{COMMAND_DEV_CRASH_USAGE}":"%ns.%cmd", + "{COMMAND_DEV_CRASH_DESCRIPTION}":"Shuts down ShiftOS forcefully", + "{COMMAND_DEV_UNLOCKEVERYTHING_USAGE}":"%ns.%cmd", + "{COMMAND_DEV_UNLOCKEVERYTHING_DESCRIPTION}":"Unlocks all shiftorium upgrades", + "{COMMAND_DEV_FREECP_USAGE}":"%ns.%cmd{[amount:1000]}", + "{COMMAND_DEV_FREECP_DESCRIPTION}":"Gives [ammount] codepoints", + "{COMMAND_TRM_CLEAR_USAGE}":"%ns.%cmd", + "{COMMAND_TRM_CLEAR_DESCRIPTION}":"Clears the terminal", + "{COMMAND_SHIFTORIUM_BUY_USAGE}":"%ns.%cmd{upgrade:}", + "{COMMAND_SHIFTORIUM_BUY_DESCRIPTION}":"Buys [upgrade]", + "{COMMAND_SHIFTORIUM_LIST_USAGE}":"%ns.%cmd", + "{COMMAND_SHIFTORIUM_LIST_DESCRIPTION}":"Lists the upgrades that you can get", + "{COMMAND_SHIFTORIUM_INFO_USAGE}":"%ns.%cmd{upgrade:}", + "{COMMAND_SHIFTORIUM_INFO_DESCRIPTION}":"Gives a description about an upgrade", + "{COMMAND_DEV_MULTARG_USAGE}":"%ns.%cmd{id:,name:,type:}", + "{COMMAND_DEV_MULTARG_DESCRIPTION}":"A command which requiers multiple arguments", + + "{ERR_COMMAND_NOT_FOUND}":"Befehl nicht gefunden.", + "{MUD_ERROR}":"MUD error", + + "{PROLOGUE_NO_USER_DETECTED}":"No user detected. Please enter a username.", + "{PROLOGUE_BADUSER}":"Invalid username detected.", + "{PROLOGUE_NOSPACES}":"Usernames must not contain spaces.", + "{PROLOGUE_PLEASE_ENTER_USERNAME}":"Please enter a valid username. Blank usernames are not permitted.", + + "{SHIFTORIUM_NOTENOUGHCP}":"Not enough codepoints: ", + "{SHIFTORIUM_TRANSFERRED_FROM}":"Received Codepoints from", + "{SHIFTORIUM_TRANSFERRED_TO}":"Transferred Codepoints to", + + "{SE_SAVING}":"Saving game to disk", + "{SE_TIPOFADVICE}":"Tip of advice: ShiftOS will always save your game after big events or when you shut down the operating system. You can also invoke a save yourself using 'sos.save'.", + + "{STORY_WELCOME}":"Welcome to ShiftOS", + "{STORY_SENTIENCEUNKNOWN}":"Your sentience is currently unknown. Please strike the Enter key to prove you are alive.", + + "{SENTIENCE_BASIC}":"Sentience: Basic - User can respond to basic instructions.", + "{SENTIENCE_BASICPLUS}":"Sentience: Basic+ - User can invoke commands within the ecosystem.", + "{SENTIENCE_POSSIBLEHUMAN}":"Sentience: Possible human - user can perform actions based on a choice.", + "{SENTIENCE_POSSIBLEHUMANPLUS}":"Sentience: Possible human+ - user can infer, and can pass arguments.", + "{SENTIENCE_HUMAN}":"Sentience: Human. Thanks for your patience.", + "{SENTIENCE_INVALIDPASSWORD}":"Das eingegebene Passwort ist ungültig.", + + "{ARGS_PASSWORD}":"password", + + "{SHIFTOS_PLUS_MOTTO}":"ShiftOS, Shift it YOUR way.", + "{SHIFTOS_VERSION_INFO}":"ShiftOS Version: ", + "{USER_NAME}":"Benutzername", + "{DISCOURSE_INTEGRATION}":"Discourse Integration", + "{SYSTEM_NAME}":"System Name", + "{USER_INFO}":"User Information", + "{SELECT_LANG}":"Select language", + "{WELCOME_TO_SHIFTOS}":"Welcome to ShiftOS Alpha!", + "{CREATE}":"Erstellen", + "{INSTALL}":"Installieren", + "{ALIAS}":"Alias:", + "{OBSOLETE_SYS_SHUTDOWN}":"sys.shutdown is obsolete", + "{PY_EXCEPTION}":"There was an error running python code.", + "{LUA_ERROR}":"There was an error running lua code.", + "{LANGUAGE_CHANGED}":"Die Sprache wurde geändert. Bitte ändern Sie ShiftOS neu, damit Änderungen voll wirksam werden.", + + "{TERMINAL_NAME}":"Terminal", + "{ARTPAD_NAME}":"Artpad", + "{PONG_NAME}":"Pong", + "{WAV_PLAYER_NAME}":"WAV Player", + "{SHIFTORIUM_NAME}":"Shiftorium", + "{TEXTPAD_NAME}":"TextPad", + "{VIRUS_SCANNER_NAME}":"Virus Scanner", + "{SKIN_LOADER_NAME}":"Skin Loader", + "{SHIFTER_NAME}":"Shifter", + "{NAME_CHANGER_NAME}":"Name Changer", + "{MUD_PASSWORD_CRACKER_NAME}":"Multi-User Domain Password Cracker v1.0", + "{MUD_CONTROL_CENTRE_NAME}":"MUD Control Centre", + "{MUD_AUTHENTICATOR_NAME}":"Multi-User Domain Admin Panel", + "{GRAPHIC_PICKER_NAME}":"Graphic Picker", + "{FILE_SKIMMER_NAME}":"File Skimmer", + "{FILE_DIALOG_NAME}":"File Dialog", + "{DIALOG_NAME}":"Dialog", + "{COLOR_PICKER_NAME}":"Color Picker", + "{CHAT_NAME}":"Chat", + "{NOTIFICATIONS}":"Benachrichtigungen", + "{GERMAN_SECRET}":"guten tag polen ist anschluss", +} \ No newline at end of file diff --git a/ShiftOS.Frontend/Resources/strings_en.txt b/ShiftOS.Frontend/Resources/strings_en.txt new file mode 100644 index 0000000..d6816c1 --- /dev/null +++ b/ShiftOS.Frontend/Resources/strings_en.txt @@ -0,0 +1,286 @@ +/* + * ShiftOS English Language Pack + * + * This is the default language pack distributed within the game. + */ + +{ + //General strings + //These strings can be used anywhere in the UI where language context isn't necessary. + "{GEN_PROGRAMS}": "Programs", + "{GEN_COMMANDS}": "Commands", + "{GEN_OBJECTIVES}": "Objectives", + "{GEN_CURRENTPROCESSES}": "Current processes", + "{GEN_WELCOME}": "Welcome to ShiftOS.", + "{GEN_SYSTEMNAME}": "System name", + "{GEN_PASSWORD}": "Password", + "{GEN_LPROMPT}": "%sysname login: ", + "{GEN_SYSTEMSTATUS}": "System status", + "{GEN_USERS}": "Users", + "{GEN_CODEPOINTS}": "Codepoints", + "{GEN_LOADING}": "Loading...", + "{GEN_SAVE}": "Save", + "{GEN_LOAD}": "Load", + "{GEN_APPLY}": "Apply", + "{GEN_RESET}": "Reset", + "{GEN_LOADDEFAULT}": "Load default", + "{GEN_ROOTPASSWORD}":"Root password", + "{GEN_CANCEL}": "Cancel", + "{GEN_CONTINUE}": "Continue", + "{GEN_BACK}": "Back", + "{GEN_YES}": "Yes", + "{GEN_NO}": "No", + "{GEN_OK}": "OK", + "{GEN_SETTINGS}": "Settings", + "{GEN_ABOUT}": "About", + "{GEN_EXIT}": "Exit", + "{GEN_CLOSE}": "Close", + + //General errors + //Syntax errors, command errors, you name it.. + "{ERR_BADBOOL}": "The value you entered must be either true or false.", + "{ERR_BADPERCENT}": "The value you entered must be a value from 0 to 100.", + "{ERR_NOLANG}": "The language you entered does not exist!", + "{ERR_NOTENOUGHCODEPOINTS}": "You don't have enough Codepoints to do that.", + "{ERR_NOUPGRADE}": "We couldn't find that upgrade.", + "{ERR_GENERAL}": "An error has occurred performing this operation.", + "{ERR_EMPTYCATEGORY}": "The category you specified either has no items in it, or was not found.", + "{ERR_NOMOREUPGRADES}": "There are no more Shiftorium Upgrades to show!", + "{ERR_BADWINID}": "You must specify a value between 0 and %max.", + "{ERR_USERFOUND}": "That user already exists.", + "{ERR_NOUSER}": "That user was not found.", + "{ERR_REMOVEYOU}": "You can't remove your own user account.", + "{ERR_BADACL}": "You must specify a value between 0 (guest) and 3 (root) for a user permission.", + "{ERR_ACLHIGHERVALUE}": "You can't set a user's permissions to a value higher than your own.", + "{ERR_HIGHERPERMS}": "That user has more rights than you!", + "{ERR_PASSWD_MISMATCH}": "Passwords don't match!", + "{ERR_SYNTAXERROR}": "Syntax error.", + "{ERR_COMMANDNOTFOUND}": "Command not found.", + + //Command results + "{RES_ACLUPDATED}": "User permissions updated.", + "{RES_LANGUAGE_CHANGED}": "System language changed successfully.", + "{RES_NOOBJECTIVES}": "No objectives to display! Check back for more.", + "{RES_UPGRADEINSTALLED}": "Upgrade installed!", + "{RES_WINDOWCLOSED}": "The window was closed.", + "{RES_CREATINGUSER}": "Creating new user with username %name.", + "{RES_REMOVINGUSER}": "Removing user with username %name from your system.", + "{RES_DENIED}": "Access denied.", + "{RES_GRANTED}": "Access granted.", + "{RES_PASSWD_SET}": "Password set successfully.", + + //Shiftorium messages. + "{SHFM_UPGRADE}": "%id - %cost Codepoints", + "{SHFM_CATEGORY}": " - %name: %available upgrades left.", + "{SHFM_QUERYERROR}": "Shiftorium Query Error", + "{SHFM_NOUPGRADES}": "No upgrades!", + + //Command data strings + "{COM_STATUS}": "ShiftOS build %version\r\n\r\nCodepoints: %cp \r\n Upgrades: %installed installed, %available available\r\n\r\n", + "{COM_UPGRADEINFO}": "%category: %name - %cost Codepoints.\r\n\r\n%description\r\n\r\nUpgrade ID: %id", + + //Terminal Command Descriptions + //These strings show up when running the "commands" command in your Terminal. + "{DESC_CLEAR}": "Clears the screen of the current Terminal.", + "{DESC_SETSFXENABLED}": "Sets whether or not system sounds are enabled.", + "{DESC_SETMUSICENABLED}": "Sets whether or not music is enabled in ShiftOS.", + "{DESC_SETVOLUME}": "Sets the volume of sounds and music if they're enabled.", + "{DESC_SHUTDOWN}": "Safely shuts down your computer.", + "{DESC_LANG}": "Change the system language of ShiftOS.", + "{DESC_COMMANDS}": "Shows a list of Terminal commands inside ShiftOS.", + "{DESC_HELP}": "Type this command to get general help with using ShiftOS.", + "{DESC_SAVE}": "Saves the in-memory configuration of ShiftOS.", + "{DESC_STATUS}": "Shows basic status information such as how many Codepoints you have and your current objective.", + "{DESC_BUY}": "Buys the specified Shiftorium upgrade.", + "{DESC_BULKBUY}": "Buys the specified Shiftorium upgrades in bulk.", + "{DESC_UPGRADEINFO}": "Shows information about the specified Shiftorium upgrade.", + "{DESC_UPGRADECATEGORIES}": "Shows all the available Shiftorium categories and how many upgrades are available in them.", + "{DESC_UPGRADES}": "Shows a list of available Shiftorium upgrades.", + "{DESC_PROCESSES}": "Shows a list of currently running app processes.", + "{DESC_PROGRAMS}": "Shows a list of programs you can run.", + "{DESC_CLOSE}": "Closes the specified application window.", + "{DESC_ADDUSER}": "Add a user to your system.", + "{DESC_REMOVEUSER}": "Remove a user from your computer.", + "{DESC_SETUSERPERMISSIONS}": "Set the permissions of a user.", + "{DESC_USERS}": "Lists all users on your computer.", + "{DESC_SU}": "Change your identity to another user's.", + "{DESC_PASSWD}": "Change your user account password.", + "{DESC_NAMECHANGER}": "Change the name of virtually any program within ShiftOS!", + "{DESC_FILENOTFOUND}": "The file you requested could not be found.", + + //Window titles. + "{TITLE_FILENOTFOUND}": "File not found.", + "{TITLE_SKINAPPLIED}":"Shifter - Skin applied.", + "{TITLE_PONG_YOULOSE}": "You lose", + "{TITLE_CODEPOINTSTRANSFERRED}": "Codepoints transferred.", + "{TITLE_INVALIDPORT}": "Invalid port number.", + "{TITLE_ENTERSYSNAME}": "Enter system name", + "{TITLE_INVALIDNAME}": "Invalid name", + "{TITLE_VALUETOOSMALL}": "Value too small.", + "{TITLE_TEMPLATE}": "Template", + "{TITLE_SKINLOADER}": "Skin loader", + "{TITLE_NAMECHANGER}": "Name Changer", + "{TITLE_ADDRESSBOOK}": "Address Book", + "{TITLE_ARTPAD}": "ArtPad", + "{TITLE_SIMPLESRC}": "SimpleSRC Client", + "{TITLE_INFOBOX}": "Information", + "{TITLE_COLORPICKER}": "Choose color", + "{TITLE_AUDIOPLAYER}": "Audio Player", + "{TITLE_CALCULATOR}": "Calculator", + "{TITLE_DOWNLOADER}": "Downloader", + "{TITLE_ABOUT}": "About ShiftOS", + "{TITLE_FILESKIMMER}": "File Skimmer", + "{TITLE_CHOOSEGRAPHIC}": "Choose graphic", + "{TITLE_ICONMANAGER}": "Icon Manager", + "{TITLE_INSTALLER}": "Installer", + "{TITLE_MINDBLOW}": "MindBlow", + "{TITLE_SYSTEMPREPARATION}": "System preparation", + "{TITLE_PONG}": "Pong", + "{TITLE_SHIFTER}": "Shifter", + "{TITLE_SHIFTLETTERS}": "ShiftLetters", + "{TITLE_SHIFTLOTTO}": "ShiftLotto", + "{TITLE_SHIFTNET}": "Shiftnet", + "{TITLE_SHIFTORIUM}": "Shiftorium", + "{TITLE_SHIFTSWEEPER}": "ShiftSweeper", + "{TITLE_TERMINAL}": "Terminal", + "{TITLE_TEXTPAD}": "TextPad", + "{TITLE_RESTARTREQUIRED}": "Restart required.", + + + //App Launcher categories + "{AL_PROGRAMMING}": "Programming", + "{AL_CUSTOMIZATION}": "Customization", + "{AL_NETWORKING}": "Networking", + "{AL_UTILITIES}": "Utilities", + "{AL_GRAPHICS}": "Graphics", + "{AL_ACCESSORIES}": "Accessories", + "{AL_ENTERTAINMENT}": "Entertainment", + "{AL_OFFICE}": "Office", + "{AL_GAMES}": "Games", + + //Infobox prompt messages + "{PROMPT_SKINAPPLIED}": "New skin values applied! You have earned %cp Codepoints.", + "{PROMPT_PONGLOST}": "You lost this game of Pong. Guess you should've cashed out...", + "{PROMPT_CODEPOINTSTRANSFERRED}": "%transferrer has transferred %amount Codepoints to your system.", + "{PROMPT_INVALIDPORT}": "The Digital Society Port must be a valid whole number between 0 and 65535.", + "{PROMPT_ENTERSYSNAME}": "Please enter a system name for your computer.", + "{PROMPT_INVALIDNAME}": "The name you entered cannot be blank. Please enter another name.", + "{PROMPT_SMALLSYSNAME}": "Your system name must have at least 5 characters in it.", + "{PROMPT_RESTARTREQUIRED}": "For the changes you made to take effect, a restart of ShiftOS is required.", + + //Pong + "{PONG_LEVELREACHED}": "You've reached level %level!", + "{PONG_BEATAI}": "You've beaten the opponent! %amount Codepoints!", + "{PONG_STATUSCP}": "Codepoints: %cp", + "{PONG_STATUSLEVEL}": "Level %level. %time seconds to go!", + "{PONG_PLAY}": "Play some Pong!", + "{PONG_DESC}": "Pong is the modern-day recreation of the classic 70s game called, you guessed it, Pong.\r\n\r\nIn Pong, you must try your best to keep the fast-moving ball from going past your side of the screen using your mouse to move your paddle in the way of the ball, while getting the ball to go past the opponent's paddle.\r\n\r\nOnce you start Pong, you have 60 seconds to beat the opponent and survive as much as possible. The game will get faster as you play, and the more 60-second levels you play, the more Codepoints you'll earn. If you lose the level, you will start back at Level 1 with 0 Codepoints. At the end of the level, you may choose to cash out or play on.", + "{PONG_WELCOME}": "Welcome to Pong.", + "{PONG_BEATLEVELDESC}": "You have survived this level of Pong. You now have a chance to cash out your Codepoints or play on for more.", + "{PONG_PLAYON}": "Play on", + "{PONG_CASHOUT}": "Cash out", + + //Main menu tip messages + "{MAINMENU_TIPTEXT_0}": "Press CTRL+T to open a Terminal from any application within ShiftOS.", + "{MAINMENU_TIPTEXT_1}": "Codepoints can be used in the Shiftorium to buy upgrades for your system using the \"buy\" command.", + "{MAINMENU_TIPTEXT_2}": "The Shifter is a VERY powerful application. Not only can you customize ShiftOS to look however you want, but you'll earn heaps of Codepoints while you do so.", + "{MAINMENU_TIPTEXT_3}": "Not the language you want? Head over to \"Settings\" to choose the proper language for you. You may need to head to the forums if your language isn't supported.", + "{MAINMENU_TIPTEXT_4}": "Sandbox Mode is a nice way to use ShiftOS without having to progress through the main campaign. There's no Codepoints, no upgrades, and everything's unlocked.", + "{MAINMENU_TIPTEXT_5}": "The Skin Loader is an essential application. It can load in skins from anywhere - from your personal collection and from the forums, and you can even generate your own sharable skins for others to use!", + "{MAINMENU_TIPTEXT_6}": "ArtPad not cutting it for you? You can use any image editor you like on your host system and just import the assets into the ShiftOS Shared Folder to use in your skins.", + "{MAINMENU_TIPTEXT_7}": "What is that \"System Color Key-OUt\" you speak of, Shifter? Well, when composing skin assets, use that color to mark areas to be rendered as transparent!", + "{MAINMENU_TIPTEXT_8}": "Use the Format Editor to change the way Terminal commands are interpreted.", + "{MAINMENU_TIPTEXT_9}": "The Shiftnet is a wonderland of applications, games and services - only available in ShiftOS. Feel free to explore!", + + //Main menu - Settings + "{MAINMENU_DSADDRESS}": "Digital Society address: ", + "{MAINMENU_DSPORT": "Digital Society port: ", + "{MAINMENU_LANGUAGE}": "Language:", + + //Main Menu - General text + "{MAINMENU_TITLE}": "Main menu", + "{MAINMENU_CAMPAIGN}": "Campaign", + "{MAINMENU_SANDBOX}": "Sandbox", + "{MAINMENU_NEWGAME}": "New game", + + //Miscelaneous strings + "{MISC_KERNELVERSION}": "ShiftKernel - v0.9.4", + "{MISC_KERNELBOOTED}": "[sys] Kernel startup completed.", + "{MISC_SHIFTFSDRV}": "[sfs] ShiftFS core driver, version 2.7", + "{MISC_SHIFTFSBLOCKSREAD}": "[sfs] Driver initiated. 4096 blocks read.", + "{MISC_LOADINGCONFIG}": "[confd] Loading system configuration... success", + "{MISC_BUILDINGCMDS}": "[termdb] Terminal database is being parsed...", + "{MISC_CONNECTINGTONETWORK}": "[inetd] Connecting to network...", + "{MISC_CONNECTIONSUCCESSFUL}": "[inetd] Connection successful.", + "{MISC_DHCPHANDSHAKEFINISHED}": "[inetd] DHCP handshake finished.", + "{MISC_NONETWORK}": "[inetd] No network access points found.", + "{MISC_SANDBOXMODE}": "[sos] Sandbox Mode initiating...", + "{MISC_ACCEPTINGLOGINS}": "[systemd] Accepting logins on local tty1.", + + //ShiftOS engine strings + "{ENGINE_CANNOTLOADSAVE}": "[sos] Error. Cannot load user save file.", + + //Pre-connection loading messages + "{LOADINGMSG1_0}": "[systemd] The light is so bright...", + "{LOADINGMSG1_1}": "[systemd] Hold your colors...", + "{LOADINGMSG1_2}": "[systemd] Time to shift it my way...", + "{LOADINGMSG1_3}": "[systemd] Does anybody even read this?", + "{LOADINGMSG1_4}": "[systemd] I....just wanna play it right... We're....gonna get there tonight...", + "{LOADINGMSG1_5}": "[systemd] I'm a computer.", + "{LOADINGMSG1_6}": "[systemd] What ya gonna do, what ya gonna do, when DevX comes for you?", + "{LOADINGMSG1_7}": "[systemd] Artificial intelligence do everything now.", + "{LOADINGMSG1_8}": "[systemd] Nobody is really here.", + "{LOADINGMSG1_9}": "[systemd] I so want a giant cake for breakfast.", + + //Post-connection loading messages + "{LOADINGMSG2_0}": "[systemd] It's all yours, Shifter.", + "{LOADINGMSG2_1}": "[systemd] That's a nice network you got there...", + "{LOADINGMSG2_2}": "[systemd] Leave me alone and go earn some Codepoints.", + "{LOADINGMSG2_3}": "[systemd] I'm hungry... Cake would be appreciated.", + "{LOADINGMSG2_4}": "[systemd] SEVERE: CAKE NOT FOUND. PLEASE INSERT CAKE INTO DRIVE 1:/ AND PRESS ANY KEY TO CONTINUE.", + "{LOADINGMSG2_5}": "[systemd] Now SCREAM!", + "{LOADINGMSG2_6}": "[systemd] Yes, I'd like to order a giant 6-mile-long tripple-chocolate ice cream cake?", + "{LOADINGMSG2_7}": "[systemd] There's no antidote...", + "{LOADINGMSG2_8}": "[systemd] Can I at least have a muffin?", + "{LOADINGMSG2_9}": "[systemd] System initiated, but I still want a cake.", + "{LOADINGMSG2_10}": "[sysvinit] Your init system has been upgraded.", + + //Format editor + "{FORMATEDITOR_COMMAND_LOWER}": "command", + "{FORMATEDITOR_ARGUMENT_LOWER}": "argument", + "{FORMATEDITOR_VALUE_LOWER}": "value", + "{FORMATEDITOR_ENTERSYNTAX}": "Enter syntax here", + + //Program commands + "{WO_ABOUT}": "about", + "{WO_ADDRESSBOOK}": "address_book", + "{WO_ARTPAD}": "artpad", + "{WO_AUDIOPLAYER}": "audio_player", + "{WO_CALCULATOR}": "calculator", + "{WO_DOWNLOADER}": "downloader", + "{WO_FILESKIMMER}": "file_skimmer", + "{WO_INSTALLER}": "installer", + "{WO_MINDBLOW}": "mindblow", + "{WO_NAMECHANGER}": "name_changer", + "{WO_PONG}": "pong", + "{WO_SHIFTER}": "shifter", + "{WO_SHIFTLETTERS}": "shiftletters", + "{WO_SHIFTLOTTO}": "shiftlotto", + "{WO_SHIFTNET}": "shiftnet", + "{WO_SHIFTORIUM}": "shiftorium", + "{WO_SHIFTSWEEPER}": "shiftsweeper", + "{WO_SIMPLESRC}": "simplesrc", + "{WO_TERMINAL}": "terminal", + "{WO_TEXTPAD}": "textpad", + + //BIOS screen text + "{MISC_BIOSCOPYRIGHT}": "AMIBIOS (C) %year Australian Microtrends, Plc", + "{MISC_BIOSVERSION}": "Shiftsoft 480-L ACPI BIOS Revision 1002", + "{MISC_BIOSCPU}": "CPU : VTC 210-N %cores CPU 1.33GHz", + "{MISC_CLOCKSPEED}": " Speed : 1.337Ghz", + "{MISC_RUNSETUP}": "Press DEL to run Setup", + "{MISC_BBSPOPUP}": "Press for BBS POPUP", + "{MISC_RAMFREQ}": "DDR3 Frequency 1337MHz, Dual Channel, Linear Mode", + "{MISC_CHECKINGNVRAM}": "Checking NVRAM", + "{MISC_RAM}": "1337 MB OK", +} \ No newline at end of file diff --git a/ShiftOS.Frontend/Resources/strings_fr.txt b/ShiftOS.Frontend/Resources/strings_fr.txt new file mode 100644 index 0000000..1986bcf --- /dev/null +++ b/ShiftOS.Frontend/Resources/strings_fr.txt @@ -0,0 +1,259 @@ +/* + * ShiftOS French Language Pack + * + * This is a default language pack distributed within the game. + */ + +{ + //General strings + //These strings can be used anywhere in the UI where language context isn't necessary. + "{GEN_PROGRAMS}": "Les programmes", + "{GEN_COMMANDS}": "Les ordres", + "{GEN_OBJECTIVES}": "Les objectifs", + "{GEN_CURRENTPROCESSES}": "Les procèdures actuelles", + "{GEN_WELCOME}": "Bienvenue au ShiftOS.", + "{GEN_SYSTEMNAME}": "Nom de système", + "{GEN_PASSWORD}": "Mot de passe", + "{GEN_LPROMPT}": "ouverture de session de %sysname: ", + "{GEN_SYSTEMSTATUS}": "État de système", + "{GEN_USERS}": "Personnes", + "{GEN_CODEPOINTS}": "Codepoints", + "{GEN_LOADING}": "Remplissons...", + "{GEN_SAVE}": "Garder", + "{GEN_LOAD}": "Remplir", + "{GEN_APPLY}": "Appliquer", + "{GEN_RESET}": "Rerégler", + "{GEN_LOADDEFAULT}": "Remplir la valeur par défault", + "{GEN_CANCEL}": "Annuter", + "{GEN_CONTINUE}": "Continuer", + "{GEN_BACK}": "Retourner", + "{GEN_YES}": "Oui", + "{GEN_NO}": "Non", + "{GEN_OK}": "D'accord", + "{GEN_SETTINGS}": "Les paramêtres", + "{GEN_ABOUT}": "Les détails", + "{GEN_EXIT}": "Sortir", + "{GEN_CLOSE}": "Se fermer", + + //General errors + //Syntax errors, command errors, you name it.. + "{ERR_BADBOOL}": "La valeur tu es entré faut qu'être solt \"true\", solt \"false\".", + "{ERR_BADPERCENT}": "La valeur tu es entré faut qu'être une valeur entre 0 et 100.", + "{ERR_NOLANG}": "La langue tu es entré n'exister pas!", + "{ERR_NOTENOUGHCODEPOINTS}": "Tu n'as pas assez de Codepoints à faire cela.", + "{ERR_NOUPGRADE}": "Nous ne pouvons pas trouver cela mise à jour.", + "{ERR_GENERAL}": "Une erreur a appairé en faisons l'opération.", + "{ERR_EMPTYCATEGORY}": "La catégorie tu as précisé solt n'a pas d'objets en la catégorie, solt n'a trouvé pas.", + "{ERR_NOMOREUPGRADES}": "Nous ne sommes pas de mises de jours!", + "{ERR_BADWINID}": "Préciser une valeur en 0 et %max, s'il vous plait.", + "{ERR_USERFOUND}": "Ça personne déjà existe.", + "{ERR_NOUSER}": "Ça personne n'a trouvé.", + "{ERR_REMOVEYOU}": "Tu ne peux pas enlever ton compte de système.", + "{ERR_BADACL}": "Préciser une valeur en 0 (invité) et 3 (dieu) pour une permission de personne.", + "{ERR_ACLHIGHERVALUE}": "Tu ne peux pas mettre une permission de personne au une valeur meilleure que ta permission.", + "{ERR_HIGHERPERMS}": "Ça personne a meilleure permissions que toi!", + "{ERR_PASSWD_MISMATCH}": "Les mots de passe n'asscocier pas!", + "{ERR_SYNTAXERROR}": "Erreur de syntaxe.", + + //Command results + "{RES_ACLUPDATED}": "Permissions de personne ont appliqué.", + "{RES_LANGUAGE_CHANGED}": "La langue de système a changé.", + "{RES_NOOBJECTIVES}": "Nous ne sommes pas des objectifs afficher!", + "{RES_UPGRADEINSTALLED}": "Mise de jour a appliqué!", + "{RES_WINDOWCLOSED}": "La programme a se fermé.", + "{RES_CREATINGUSER}": "Nous créons une nouvelle compte avec le nom %name.", + "{RES_REMOVINGUSER}": "Nous sortissons la compte avec le nom %name depuis ton système.", + "{RES_DENIED}": "L'accès a démenti.", + "{RES_GRANTED}": "L'accès a accordé.", + "{RES_PASSWD_SET}": "Le mot de passe a appliqué.", + + //Shiftorium messages. + "{SHFM_UPGRADE}": "%id - %cost Codepoints", + "{SHFM_CATEGORY}": " - %name: %available mises de jours restants.", + "{SHFM_QUERYERROR}": "Erreur en mettre en doubte de Shiftorium.", + "{SHFM_NOUPGRADES}": "Zèro mises de jours restants!", + + //Command data strings + "{COM_STATUS}": "ShiftOS build %version\r\n\r\nCodepoints: %cp \r\n Upgrades: %installed installed, %available available\r\n\r\n", + "{COM_UPGRADEINFO}": "%category: %name - %cost Codepoints.\r\n\r\n%description\r\n\r\nUpgrade ID: %id", + + //Terminal Command Descriptions + //These strings show up when running the "commands" command in your Terminal. + "{DESC_CLEAR}": "Clears the screen of the current Terminal.", + "{DESC_SETSFXENABLED}": "Sets whether or not system sounds are enabled.", + "{DESC_SETMUSICENABLED}": "Sets whether or not music is enabled in ShiftOS.", + "{DESC_SETVOLUME}": "Sets the volume of sounds and music if they're enabled.", + "{DESC_SHUTDOWN}": "Safely shuts down your computer.", + "{DESC_LANG}": "Change the system language of ShiftOS.", + "{DESC_COMMANDS}": "Shows a list of Terminal commands inside ShiftOS.", + "{DESC_HELP}": "Type this command to get general help with using ShiftOS.", + "{DESC_SAVE}": "Saves the in-memory configuration of ShiftOS.", + "{DESC_STATUS}": "Shows basic status information such as how many Codepoints you have and your current objective.", + "{DESC_BUY}": "Buys the specified Shiftorium upgrade.", + "{DESC_BULKBUY}": "Buys the specified Shiftorium upgrades in bulk.", + "{DESC_UPGRADEINFO}": "Shows information about the specified Shiftorium upgrade.", + "{DESC_UPGRADECATEGORIES}": "Shows all the available Shiftorium categories and how many upgrades are available in them.", + "{DESC_UPGRADES}": "Shows a list of available Shiftorium upgrades.", + "{DESC_PROCESSES}": "Shows a list of currently running app processes.", + "{DESC_PROGRAMS}": "Shows a list of programs you can run.", + "{DESC_CLOSE}": "Closes the specified application window.", + "{DESC_ADDUSER}": "Add a user to your system.", + "{DESC_REMOVEUSER}": "Remove a user from your computer.", + "{DESC_SETUSERPERMISSIONS}": "Set the permissions of a user.", + "{DESC_USERS}": "Lists all users on your computer.", + "{DESC_SU}": "Change your identity to another user's.", + "{DESC_PASSWD}": "Change your user account password.", + "{DESC_NAMECHANGER}": "Change the name of virtually any program within ShiftOS!", + "{DESC_FILENOTFOUND}": "The file you requested could not be found.", + + //Window titles. + "{TITLE_FILENOTFOUND}": "File not found.", + "{TITLE_PONG_YOULOSE}": "You lose", + "{TITLE_CODEPOINTSTRANSFERRED}": "Codepoints transferred.", + "{TITLE_INVALIDPORT}": "Invalid port number.", + "{TITLE_ENTERSYSNAME}": "Enter system name", + "{TITLE_INVALIDNAME}": "Invalid name", + "{TITLE_VALUETOOSMALL}": "Value too small.", + "{TITLE_TEMPLATE}": "Template", + "{TITLE_SKINLOADER}": "Skin loader", + "{TITLE_NAMECHANGER}": "Name Changer", + "{TITLE_ADDRESSBOOK}": "Address Book", + "{TITLE_ARTPAD}": "ArtPad", + "{TITLE_SIMPLESRC}": "SimpleSRC Client", + "{TITLE_INFOBOX}": "Information", + "{TITLE_COLORPICKER}": "Choose color", + "{TITLE_AUDIOPLAYER}": "Audio Player", + "{TITLE_CALCULATOR}": "Calculator", + "{TITLE_DOWNLOADER}": "Downloader", + "{TITLE_ABOUT}": "About ShiftOS", + "{TITLE_FILESKIMMER}": "File Skimmer", + "{TITLE_CHOOSEGRAPHIC}": "Choose graphic", + "{TITLE_ICONMANAGER}": "Icon Manager", + "{TITLE_INSTALLER}": "Installer", + "{TITLE_MINDBLOW}": "MindBlow", + "{TITLE_PONG}": "Pong", + "{TITLE_SHIFTER}": "Shifter", + "{TITLE_SHIFTLETTERS}": "ShiftLetters", + "{TITLE_SHIFTLOTTO}": "ShiftLotto", + "{TITLE_SHIFTNET}": "Shiftnet", + "{TITLE_SHIFTORIUM}": "Shiftorium", + "{TITLE_SHIFTSWEEPER}": "ShiftSweeper", + "{TITLE_TERMINAL}": "Terminal", + "{TITLE_TEXTPAD}": "TextPad", + "{TITLE_RESTARTREQUIRED}": "Restart required.", + + + //App Launcher categories + "{AL_PROGRAMMING}": "Programming", + "{AL_CUSTOMIZATION}": "Customization", + "{AL_NETWORKING}": "Networking", + "{AL_UTILITIES}": "Utilities", + "{AL_GRAPHICS}": "Graphics", + "{AL_ACCESSORIES}": "Accessories", + "{AL_ENTERTAINMENT}": "Entertainment", + "{AL_OFFICE}": "Office", + "{AL_GAMES}": "Games", + + //Infobox prompt messages + "{PROMPT_PONGLOST}": "You lost this game of Pong. Guess you should've cashed out...", + "{PROMPT_CODEPOINTSTRANSFERRED}": "%transferrer has transferred %amount Codepoints to your system.", + "{PROMPT_INVALIDPORT}": "The Digital Society Port must be a valid whole number between 0 and 65535.", + "{PROMPT_ENTERSYSNAME}": "Please enter a system name for your computer.", + "{PROMPT_INVALIDNAME}": "The name you entered cannot be blank. Please enter another name.", + "{PROMPT_SMALLSYSNAME}": "Your system name must have at least 5 characters in it.", + "{PROMPT_RESTARTREQUIRED}": "For the changes you made to take effect, a restart of ShiftOS is required.", + + //Pong + "{PONG_LEVELREACHED}": "You've reached level %level!", + "{PONG_BEATAI}": "You've beaten the opponent! %amount Codepoints!", + "{PONG_STATUSCP}": "Codepoints: %cp", + "{PONG_STATUSLEVEL}": "Level %level. %time seconds to go!", + "{PONG_PLAY}": "Play some Pong!", + "{PONG_DESC}": "Pong is the modern-day recreation of the classic 70s game called, you guessed it, Pong.\r\n\r\nIn Pong, you must try your best to keep the fast-moving ball from going past your side of the screen using your mouse to move your paddle in the way of the ball, while getting the ball to go past the opponent's paddle.\r\n\r\nOnce you start Pong, you have 60 seconds to beat the opponent and survive as much as possible. The game will get faster as you play, and the more 60-second levels you play, the more Codepoints you'll earn. If you lose the level, you will start back at Level 1 with 0 Codepoints. At the end of the level, you may choose to cash out or play on.", + "{PONG_WELCOME}": "Welcome to Pong.", + "{PONG_BEATLEVELDESC}": "You have survived this level of Pong. You now have a chance to cash out your Codepoints or play on for more.", + "{PONG_PLAYON}": "Play on", + "{PONG_CASHOUT}": "Cash out", + + //Main menu tip messages + "{MAINMENU_TIPTEXT_0}": "Press CTRL+T to open a Terminal from any application within ShiftOS.", + "{MAINMENU_TIPTEXT_1}": "Codepoints can be used in the Shiftorium to buy upgrades for your system using the \"buy\" command.", + "{MAINMENU_TIPTEXT_2}": "The Shifter is a VERY powerful application. Not only can you customize ShiftOS to look however you want, but you'll earn heaps of Codepoints while you do so.", + "{MAINMENU_TIPTEXT_3}": "Not the language you want? Head over to \"Settings\" to choose the proper language for you. You may need to head to the forums if your language isn't supported.", + "{MAINMENU_TIPTEXT_4}": "Sandbox Mode is a nice way to use ShiftOS without having to progress through the main campaign. There's no Codepoints, no upgrades, and everything's unlocked.", + "{MAINMENU_TIPTEXT_5}": "The Skin Loader is an essential application. It can load in skins from anywhere - from your personal collection and from the forums, and you can even generate your own sharable skins for others to use!", + "{MAINMENU_TIPTEXT_6}": "ArtPad not cutting it for you? You can use any image editor you like on your host system and just import the assets into the ShiftOS Shared Folder to use in your skins.", + "{MAINMENU_TIPTEXT_7}": "What is that \"System Color Key-OUt\" you speak of, Shifter? Well, when composing skin assets, use that color to mark areas to be rendered as transparent!", + "{MAINMENU_TIPTEXT_8}": "Use the Format Editor to change the way Terminal commands are interpreted.", + "{MAINMENU_TIPTEXT_9}": "The Shiftnet is a wonderland of applications, games and services - only available in ShiftOS. Feel free to explore!", + + //Main menu - Settings + "{MAINMENU_DSADDRESS}": "Digital Society address: ", + "{MAINMENU_DSPORT": "Digital Society port: ", + "{MAINMENU_LANGUAGE}": "Language:", + + //Main Menu - General text + "{MAINMENU_TITLE}": "Main menu", + "{MAINMENU_CAMPAIGN}": "Campaign", + "{MAINMENU_SANDBOX}": "Sandbox", + "{MAINMENU_NEWGAME}": "New game", + + //Miscelaneous strings + "{MISC_KERNELVERSION}": "ShiftKernel - v0.9.4", + "{MISC_KERNELBOOTED}": "[sys] Kernel startup completed.", + "{MISC_SHIFTFSDRV}": "[sfs] ShiftFS core driver, version 2.7", + "{MISC_SHIFTFSBLOCKSREAD}": "[sfs] Driver initiated. 4096 blocks read.", + "{MISC_LOADINGCONFIG}": "[confd] Loading system configuration... success", + "{MISC_BUILDINGCMDS}": "[termdb] Terminal database is being parsed...", + "{MISC_CONNECTINGTONETWORK}": "[inetd] Connecting to network...", + "{MISC_CONNECTIONSUCCESSFUL}": "[inetd] Connection successful.", + "{MISC_DHCPHANDSHAKEFINISHED}": "[inetd] DHCP handshake finished.", + "{MISC_NONETWORK}": "[inetd] No network access points found.", + "{MISC_SANDBOXMODE}": "[sos] Sandbox Mode initiating...", + "{MISC_ACCEPTINGLOGINS}": "[systemd] Accepting logins on local tty1.", + + //ShiftOS engine strings + "{ENGINE_CANNOTLOADSAVE}": "[sos] Error. Cannot load user save file.", + + //Pre-connection loading messages + "{LOADINGMSG1_0}": "[systemd] The light is so bright...", + "{LOADINGMSG1_1}": "[systemd] Hold your colors...", + "{LOADINGMSG1_2}": "[systemd] Time to shift it my way...", + "{LOADINGMSG1_3}": "[systemd] Does anybody even read this?", + "{LOADINGMSG1_4}": "[systemd] I....just wanna play it right... We're....gonna get there tonight...", + "{LOADINGMSG1_5}": "[systemd] I'm a computer.", + "{LOADINGMSG1_6}": "[systemd] What ya gonna do, what ya gonna do, when DevX comes for you?", + "{LOADINGMSG1_7}": "[systemd] Artificial intelligence do everything now.", + "{LOADINGMSG1_8}": "[systemd] Nobody is really here.", + "{LOADINGMSG1_9}": "[systemd] I so want a giant cake for breakfast.", + + //Post-connection loading messages + "{LOADINGMSG2_0}": "[systemd] It's all yours, Shifter.", + "{LOADINGMSG2_1}": "[systemd] That's a nice network you got there...", + "{LOADINGMSG2_2}": "[systemd] Leave me alone and go earn some Codepoints.", + "{LOADINGMSG2_3}": "[systemd] I'm hungry... Cake would be appreciated.", + "{LOADINGMSG2_4}": "[systemd] SEVERE: CAKE NOT FOUND. PLEASE INSERT CAKE INTO DRIVE 1:/ AND PRESS ANY KEY TO CONTINUE.", + "{LOADINGMSG2_5}": "[systemd] Now SCREAM!", + "{LOADINGMSG2_6}": "[systemd] Yes, I'd like to order a giant 6-mile-long tripple-chocolate ice cream cake?", + "{LOADINGMSG2_7}": "[systemd] There's no antidote...", + "{LOADINGMSG2_8}": "[systemd] Can I at least have a muffin?", + "{LOADINGMSG2_9}": "[systemd] System initiated, but I still want a cake.", + "{LOADINGMSG2_10}": "[sysvinit] Your init system has been upgraded.", + + //Format editor + "{FORMATEDITOR_COMMAND_LOWER}": "command", + "{FORMATEDITOR_ARGUMENT_LOWER}": "argument", + "{FORMATEDITOR_VALUE_LOWER}": "value", + "{FORMATEDITOR_ENTERSYNTAX}": "Enter syntax here", + + //BIOS screen text + "{MISC_BIOSCOPYRIGHT}": "AMIBIOS (C) %year Australian Microtrends, Plc", + "{MISC_BIOSVERSION}": "Shiftsoft 480-L ACPI BIOS Revision 1002", + "{MISC_BIOSCPU}": "CPU : VTC 210-N %cores CPU 1.33GHz", + "{MISC_CLOCKSPEED}": " Speed : 1.337Ghz", + "{MISC_RUNSETUP}": "Press DEL to run Setup", + "{MISC_BBSPOPUP}": "Press for BBS POPUP", + "{MISC_RAMFREQ}": "DDR3 Frequency 1337MHz, Dual Channel, Linear Mode", + "{MISC_CHECKINGNVRAM}": "Checking NVRAM", + "{MISC_RAM}": "1337 MB OK", +} \ No newline at end of file diff --git a/ShiftOS.Frontend/ShiftOS.Frontend.csproj b/ShiftOS.Frontend/ShiftOS.Frontend.csproj index 6ef27e1..86eb736 100644 --- a/ShiftOS.Frontend/ShiftOS.Frontend.csproj +++ b/ShiftOS.Frontend/ShiftOS.Frontend.csproj @@ -46,6 +46,7 @@ + @@ -55,6 +56,7 @@ + True True @@ -152,6 +154,15 @@ + + + + + + + + +