commit 3a768e35bb0407040de29b4db82d657f5d9d8ffa
Author: leszek <leszek@koltunski.pl>
Date:   Sun Jan 5 12:40:36 2025 +0100

    Move all the strings from objlib to the app.
    Upgrade AGP from 8.1.4 to 8.3.2

diff --git a/build.gradle b/build.gradle
index e3da8903..2c573449 100644
--- a/build.gradle
+++ b/build.gradle
@@ -43,7 +43,7 @@ buildscript {
         mavenCentral()
     }
     dependencies{
-        classpath 'com.android.tools.build:gradle:8.1.4'
+        classpath 'com.android.tools.build:gradle:8.3.2'
         classpath 'com.google.gms:google-services:4.4.2'
         classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2'
     }
diff --git a/src/main/java/org/distorted/dialogs/DialogSolverView.java b/src/main/java/org/distorted/dialogs/DialogSolverView.java
index 15acb34c..d066491d 100644
--- a/src/main/java/org/distorted/dialogs/DialogSolverView.java
+++ b/src/main/java/org/distorted/dialogs/DialogSolverView.java
@@ -19,7 +19,7 @@ import org.distorted.main.R;
 import org.distorted.objectlib.helpers.OperatingSystemInterface;
 import org.distorted.objectlib.main.TwistyObject;
 import org.distorted.objectlib.solvers.verifiers.SolverAbstract;
-import org.distorted.objectlib.solvers.verifiers.SolvingList;
+import org.distorted.objectlib.solvers.verifiers.ImplementedVerifierList;
 import org.distorted.solvers.ScreenList;
 import org.distorted.solvers.ScreenSetupPosition;
 import org.distorted.solvers.SolverActivity;
@@ -55,7 +55,7 @@ public class DialogSolverView
       public void onClick(View v)
         {
         dialog.dismiss();
-        SolvingList list = SolvingList.getSolver(solverOrdinal);
+        ImplementedVerifierList list = ImplementedVerifierList.getSolver(solverOrdinal);
         OperatingSystemInterface os = act.getInterface();
         TwistyObject object = act.getObject();
         SolverAbstract solver = list.create(os,object);
diff --git a/src/main/java/org/distorted/dialogs/DialogSolvers.java b/src/main/java/org/distorted/dialogs/DialogSolvers.java
index 410d6b05..cf7fac40 100644
--- a/src/main/java/org/distorted/dialogs/DialogSolvers.java
+++ b/src/main/java/org/distorted/dialogs/DialogSolvers.java
@@ -23,7 +23,8 @@ import androidx.fragment.app.FragmentActivity;
 import org.distorted.main.R;
 import org.distorted.objectlib.metadata.ListObjects;
 import org.distorted.solvers.SolverActivity;
-import org.distorted.objectlib.solvers.verifiers.SolvingList;
+import org.distorted.objectlib.solvers.verifiers.ImplementedVerifierList;
+import org.distorted.solvers.SolverDescriptions;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -85,17 +86,21 @@ public class DialogSolvers extends DialogAbstract
 
     SolverActivity sact = (SolverActivity) getContext();
     int objectOrdinal = ListObjects.getObjectIndex(mArgument);
-    int[] solverOrdinals = SolvingList.getSolverOrdinals(objectOrdinal);
+    int[] solverOrdinals = ImplementedVerifierList.getSolverOrdinals(objectOrdinal);
     int len = solverOrdinals==null ? 0 : solverOrdinals.length;
 
     for(int o=0; o<len; o++ )
       {
       int ord = solverOrdinals[o];
-      SolvingList solver = SolvingList.getSolver(ord);
-      int title  = solver.getTitle();
-      int description = solver.getDescription();
-      DialogSolverView pane = new DialogSolverView(sact,this,ord,title,description, padd, font, (o==len-1?pL:pV),pT,pB);
-      layout.addView(pane.getView());
+      SolverDescriptions description = SolverDescriptions.getDescription(ord);
+
+      if( description!=null )
+        {
+        int title=description.getTitle();
+        int desc=description.getDescription();
+        DialogSolverView pane=new DialogSolverView(sact, this, ord, title, desc, padd, font, (o == len - 1 ? pL : pV), pT, pB);
+        layout.addView(pane.getView());
+        }
       }
     }
   }
diff --git a/src/main/java/org/distorted/helpers/RubikNetwork.java b/src/main/java/org/distorted/helpers/RubikNetwork.java
index eb3090f8..c1f9d5ce 100644
--- a/src/main/java/org/distorted/helpers/RubikNetwork.java
+++ b/src/main/java/org/distorted/helpers/RubikNetwork.java
@@ -363,7 +363,7 @@ public class RubikNetwork
       return false;
       }
 
-    if( mScores.length()==0 )
+    if( mScores.isEmpty() )
       {
       receiver.message("Failed to download scores");
       return false;
@@ -455,7 +455,7 @@ public class RubikNetwork
 
   private boolean gottaDownload()
     {
-    return ((mScores.length()==0) && !mRunning);
+    return ( mScores.isEmpty() && !mRunning);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/RubikObject.java b/src/main/java/org/distorted/objects/RubikObject.java
index 7f006a38..04a3ee2f 100644
--- a/src/main/java/org/distorted/objects/RubikObject.java
+++ b/src/main/java/org/distorted/objects/RubikObject.java
@@ -27,7 +27,7 @@ import org.distorted.main.R;
 import org.distorted.objectlib.metadata.ListObjects;
 import org.distorted.objectlib.metadata.Metadata;
 import org.distorted.objectlib.patterns.RubikPatternList;
-import org.distorted.objectlib.solvers.verifiers.SolvingList;
+import org.distorted.objectlib.solvers.verifiers.ImplementedVerifierList;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -39,7 +39,7 @@ public class RubikObject
   private final int mIconID;
   private final String[][] mPatterns;
   private final int mPrice;
-  private final int[] mSolverOrdinals;
+  private final int mNumSolvers;
   private final int mObjectOrdinal;
   private final boolean mIsLocal;
   private final int mCategory, mYear;
@@ -81,7 +81,8 @@ public class RubikObject
     int patternOrdinal  = RubikPatternList.getOrdinal(mObjectIndex);
     mPatterns = RubikPatternList.getPatterns(patternOrdinal);
 
-    mSolverOrdinals= SolvingList.getSolverOrdinals(mObjectOrdinal);
+    int[] solverOrdinals= ImplementedVerifierList.getSolverOrdinals(mObjectOrdinal);
+    mNumSolvers = solverOrdinals==null ? 0 : solverOrdinals.length;
     mExtrasOrdinal = -1;
 
     mObjectVersion = meta.objectVersion();
@@ -110,7 +111,7 @@ public class RubikObject
 
     mPatterns      = null;
     mExtrasOrdinal = -1;
-    mSolverOrdinals= null;
+    mNumSolvers    = 0;
     mObjectOrdinal = -1;
     mIsLocal       = true;
 
@@ -168,84 +169,9 @@ public class RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void setExtrasOrdinal(int ordinal)
-    {
-    mExtrasOrdinal = ordinal;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getExtrasOrdinal()
-    {
-    return mExtrasOrdinal;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 
-  public String getLowerName()
-    {
-    return mLowerName;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public String getUpperName()
-    {
-    return mUpperName;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getNumScramble()
-    {
-    return mNumScramble;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getPrice()
-    {
-    return mPrice;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public boolean isFree()
-    {
-    return (!RubikObjectList.USE_IAP || mIsFree);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void markFree()
-    {
-    mIsFree=true;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getObjectVersion()
-    {
-    return mObjectVersion;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getExtrasVersion()
-    {
-    return mExtrasVersion;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public boolean supportsAdjustableColors()
-    {
-    return mAdjColors;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
   public void setIconTo(Activity act,ImageButton button)
     {
     Drawable icon = createIconDrawable(act);
@@ -311,78 +237,26 @@ public class RubikObject
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public int getCategory()
-    {
-    return mCategory;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getIndex()
-    {
-    return mObjectIndex;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public float getDifficulty()
-    {
-    return mDifficulty;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getYearOfInvention()
-    {
-    return mYear;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public String getAuthor()
-    {
-    return mAuthor;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public boolean hasExtras()
-    {
-    return mExtrasID!=0;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int numSolvers()
-    {
-    return mSolverOrdinals!=null ? mSolverOrdinals.length : 0;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getObjectOrdinal()
-    {
-    return mObjectOrdinal;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public boolean isLocal()
-    {
-    return mIsLocal;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public boolean hasPatterns()
-    {
-    return mPatterns!=null;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public String[][] getPatterns()
-    {
-    return mPatterns;
-    }
+  public int getCategory()                  { return mCategory; }
+  public int getIndex()                     { return mObjectIndex; }
+  public float getDifficulty()              { return mDifficulty; }
+  public int getYearOfInvention()           { return mYear; }
+  public String getAuthor()                 { return mAuthor; }
+  public boolean hasExtras()                { return mExtrasID!=0; }
+  public int numSolvers()                   { return mNumSolvers; }
+  public int getObjectOrdinal()             { return mObjectOrdinal; }
+  public boolean isLocal()                  { return mIsLocal; }
+  public boolean hasPatterns()              { return mPatterns!=null; }
+  public String[][] getPatterns()           { return mPatterns; }
+  public String getLowerName()              { return mLowerName; }
+  public String getUpperName()              { return mUpperName; }
+  public int getNumScramble()               { return mNumScramble; }
+  public int getPrice()                     { return mPrice; }
+  public boolean isFree()                   { return (!RubikObjectList.USE_IAP || mIsFree); }
+  public void markFree()                    { mIsFree=true; }
+  public int getObjectVersion()             { return mObjectVersion; }
+  public int getExtrasVersion()             { return mExtrasVersion; }
+  public void setExtrasOrdinal(int ordinal) { mExtrasOrdinal = ordinal; }
+  public int getExtrasOrdinal()             { return mExtrasOrdinal; }
+  public boolean supportsAdjustableColors() { return mAdjColors; }
 }
diff --git a/src/main/java/org/distorted/solvers/ScreenSetupPosition.java b/src/main/java/org/distorted/solvers/ScreenSetupPosition.java
index 7e0981cb..0e142558 100644
--- a/src/main/java/org/distorted/solvers/ScreenSetupPosition.java
+++ b/src/main/java/org/distorted/solvers/ScreenSetupPosition.java
@@ -39,7 +39,7 @@ import org.distorted.objectlib.metadata.ListObjects;
 import org.distorted.objectlib.shape.*;
 import org.distorted.objectlib.solvers.verifiers.ResultScreen;
 import org.distorted.objectlib.solvers.verifiers.SolverAbstract;
-import org.distorted.objectlib.solvers.verifiers.SolvingList;
+import org.distorted.objectlib.solvers.verifiers.ImplementedVerifierList;
 
 import java.lang.ref.WeakReference;
 import java.util.Timer;
@@ -291,11 +291,11 @@ public class ScreenSetupPosition extends ScreenAbstract implements ResultScreen
 
   private void pressSolve(SolverActivity act)
     {
-    int[] solverOrdinals = SolvingList.getSolverOrdinals(mObjectOrdinal);
+    int[] solverOrdinals = ImplementedVerifierList.getSolverOrdinals(mObjectOrdinal);
 
     if( solverOrdinals!=null  )
       {
-      SolvingList slvList = SolvingList.getSolver(solverOrdinals[0]);
+      ImplementedVerifierList slvList = ImplementedVerifierList.getSolver(solverOrdinals[0]);
       OperatingSystemInterface os = act.getInterface();
       TwistyObject object = act.getObject();
       SolverAbstract solver = slvList.create(os,object);
diff --git a/src/main/java/org/distorted/solvers/SolverDescriptions.java b/src/main/java/org/distorted/solvers/SolverDescriptions.java
new file mode 100644
index 00000000..8dae0b7c
--- /dev/null
+++ b/src/main/java/org/distorted/solvers/SolverDescriptions.java
@@ -0,0 +1,83 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is proprietary software licensed under an EULA which you should have received      //
+// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.solvers;
+
+import static org.distorted.objectlib.solvers.verifiers.ImplementedVerifierList.*;
+
+import org.distorted.main.R;
+import org.distorted.objectlib.solvers.verifiers.*;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public enum SolverDescriptions
+{
+  DESC_CUBE2          ( CUBE2         , R.string.solver_cube2_title, R.string.solver_cube2_description),
+  DESC_CU232          ( CU232         , R.string.solver_cu232_title, R.string.solver_cu232_description),
+  DESC_CU323          ( CU323         , R.string.solver_cu323_title, R.string.solver_cu323_description),
+  DESC_PYRAMINX       ( PYRAMINX      , R.string.solver_pyra3_title, R.string.solver_pyra3_description),
+  DESC_SKEWB          ( SKEWB         , R.string.solver_skew2_title, R.string.solver_skew2_description),
+  DESC_PYRAMINX_DUO   ( PYRAMINX_DUO  , R.string.solver_pduo2_title, R.string.solver_pduo2_description),
+  DESC_IVY            ( IVY           , R.string.solver_ivy_title  , R.string.solver_ivy_description  ),
+  DESC_DIAMOND        ( DIAMOND       , R.string.solver_diam2_title, R.string.solver_diam2_description),
+  DESC_JING2          ( JING2         , R.string.solver_jing2_title, R.string.solver_jing2_description),
+  DESC_DINO6          ( DINO6         , R.string.solver_dino6_title, R.string.solver_dino6_description),
+  DESC_DINO4          ( DINO4         , R.string.solver_dino4_title, R.string.solver_dino4_description),
+  DESC_PDIA           ( PDIA          , R.string.solver_pdia_title , R.string.solver_pdia_description ),
+
+  DESC_CUBE3_KOCIEMBA ( CUBE3_KOCIEMBA, R.string.solver_cube3_title, R.string.solver_cube3_description),
+
+  DESC_CUBE3_ALGO     ( CUBE3_ALGO    , R.string.solver_3algo_title, R.string.solver_3algo_description),
+  DESC_KILO3_ALGO     ( KILO3_ALGO    , R.string.solver_kilo3_title, R.string.solver_kilo3_description),
+  ;
+
+  public static final int NUM_OBJECTS = values().length;
+
+  private final ImplementedVerifierList mSolver;
+  private final int mTitle;
+  private final int mDescription;
+
+  private static final SolverDescriptions[] objects;
+
+  static
+    {
+    objects = new SolverDescriptions[NUM_OBJECTS];
+    int i=0;
+
+    for( SolverDescriptions object: SolverDescriptions.values())
+      {
+      objects[i++] = object;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  SolverDescriptions(ImplementedVerifierList solver, int title, int descripton)
+    {
+    mSolver      = solver;
+    mTitle       = title;
+    mDescription = descripton;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static SolverDescriptions getDescription(int ordinal)
+    {
+    for(int i=0; i<NUM_OBJECTS; i++)
+      if( objects[i].mSolver.ordinal()==ordinal ) return objects[i];
+
+    return null;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public ImplementedVerifierList getSolver() { return mSolver; }
+  public int getTitle() { return mTitle; }
+  public int getDescription() { return mDescription; }
+}
diff --git a/src/main/java/org/distorted/solvers/SolverObjectLibInterface.java b/src/main/java/org/distorted/solvers/SolverObjectLibInterface.java
index a56ed208..035d15a5 100644
--- a/src/main/java/org/distorted/solvers/SolverObjectLibInterface.java
+++ b/src/main/java/org/distorted/solvers/SolverObjectLibInterface.java
@@ -18,7 +18,7 @@ import org.distorted.objectlib.helpers.ObjectLibInterface;
 import org.distorted.objectlib.main.ObjectControl;
 import org.distorted.objects.RubikObject;
 import org.distorted.objects.RubikObjectList;
-import org.distorted.objectlib.solvers.verifiers.SolvingList;
+import org.distorted.objectlib.solvers.verifiers.ImplementedVerifierList;
 
 import java.lang.ref.WeakReference;
 
@@ -173,7 +173,7 @@ public class SolverObjectLibInterface implements ObjectLibInterface
     ScreenSetupPosition solver = (ScreenSetupPosition) ScreenList.SVER.getScreenClass();
     int color = solver.getCurrentColor();
     int currObject = act.getObjectOrdinal();
-    mLastCubitColor = SolvingList.cubitIsLocked(currObject,cubit);
+    mLastCubitColor = ImplementedVerifierList.cubitIsLocked(currObject,cubit);
     mLastCubit = cubit;
     mLastCubitFace = face;
     ObjectControl control = act.getControl();
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 1e361111..603d3667 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -232,7 +232,6 @@
     <string name="color_dgreen7">dunkelgrüne</string>
 
     <string name="solver_cube3_description">Ein nahezu perfekter, sofortiger, zweiphasiger 3x3-Löser.\nAutor: Herbert Kociemba.</string>
-    <string name="solver_3algo_description">Implementierung des Anfängeralgorithmus. 7 Phasen. Erzeugt Lösungen mit etwa 100 Zügen.\nAutor: Leszek Koltunski.</string>
     <string name="solver_pduo2_description">Ein perfekter, sofortiger Löser.\nAutor: Leszek Koltunski.</string>
     <string name="solver_ivy_description">Ein perfekter, sofortiger Löser.\nAutor: Leszek Koltunski.</string>
     <string name="solver_cu232_description">Ein perfekter, sofortiger Löser.\nAutor: Leszek Koltunski.</string>
@@ -245,6 +244,8 @@
     <string name="solver_dino4_description">Ein perfekter, sofortiger Löser.\nAutor: Leszek Koltunski.</string>
     <string name="solver_pdia_description">Ein perfekter, sofortiger Löser.\nAutor: Leszek Koltunski.</string>
     <string name="solver_cu323_description">Ein perfekter, sofortiger Löser.\nAutor: Leszek Koltunski.</string>
+    <string name="solver_3algo_description">Implementierung des Anfängeralgorithmus. 7 Phasen. Erzeugt Lösungen mit etwa 100 Zügen.\nAutor: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">Implementierung des Anfängeralgorithmus. 5 Phasen. Erzeugt Lösungen mit etwa 70 Zügen.\nAutor: Leszek Koltunski.</string>
 
     <string name="creators">Schöpfer</string>
 
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 1a8d6065..1ce15e2f 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -232,7 +232,6 @@
     <string name="color_dgreen7">verdes oscuro</string>
 
     <string name="solver_cube3_description">Un 3x3x3 solucionador casi perfecto, instantáneo, de dos fases.\nAutor: Herbert Kociemba.</string>
-    <string name="solver_3algo_description">Implementación del algoritmo para principiantes. 7 fases. Produce soluciones de aproximadamente 100 movimientos.\nAutor: Leszek Koltunski.</string>
     <string name="solver_pduo2_description">Un solucionador perfecto e instantáneo.\nAutor: Leszek Koltunski.</string>
     <string name="solver_ivy_description">Un solucionador perfecto e instantáneo.\nAutor: Leszek Koltunski.</string>
     <string name="solver_cu232_description">Un solucionador perfecto e instantáneo.\nAutor: Leszek Koltunski.</string>
@@ -245,6 +244,8 @@
     <string name="solver_dino4_description">Un solucionador perfecto e instantáneo.\nAutor: Leszek Koltunski.</string>
     <string name="solver_pdia_description">Un solucionador perfecto e instantáneo.\nAutor: Leszek Koltunski.</string>
     <string name="solver_cu323_description">Un solucionador perfecto e instantáneo.\nAutor: Leszek Koltunski.</string>
+    <string name="solver_3algo_description">Implementación del algoritmo para principiantes. 7 fases. Produce soluciones de aproximadamente 100 movimientos.\nAutor: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">Implementación del algoritmo para principiantes. 5 fases. Produce soluciones de aproximadamente 70 movimientos.\nAutor: Leszek Koltunski.</string>
 
     <string name="creators">Creadores</string>
 
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 3ba53052..55590865 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -232,7 +232,6 @@
     <string name="color_dgreen7">vertes foncé</string>
 
     <string name="solver_cube3_description">Un solveur 3x3 biphasé presque parfait, instantané.\nAuteur: Herbert Kociemba.</string>
-    <string name="solver_3algo_description">Mise en œuvre de l\'algorithme pour débutants. 7 phases. Produit des solutions longues d\'environ 100 coups.\nAuteur: Leszek Koltunski.</string>
     <string name="solver_pduo2_description">Un solveur parfait et instantané.\nAuteur: Leszek Koltunski.</string>
     <string name="solver_ivy_description">Un solveur parfait et instantané.\nAuteur: Leszek Koltunski.</string>
     <string name="solver_cu232_description">Un solveur parfait et instantané.\nAuteur: Leszek Koltunski.</string>
@@ -245,6 +244,8 @@
     <string name="solver_dino4_description">Un solveur parfait et instantané.\nAuteur: Leszek Koltunski.</string>
     <string name="solver_pdia_description">Un solveur parfait et instantané.\nAuteur: Leszek Koltunski.</string>
     <string name="solver_cu323_description">Un solveur parfait et instantané.\nAuteur: Leszek Koltunski.</string>
+    <string name="solver_3algo_description">Mise en œuvre de l\'algorithme pour débutants. 7 phases. Produit des solutions longues d\'environ 100 coups.\nAuteur: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">Mise en œuvre de l\'algorithme pour débutants. 5 phases. Produit des solutions longues d\'environ 70 coups.\nAuteur: Leszek Koltunski.</string>
 
     <string name="creators">Créateurs</string>
 
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index e7e8552a..bafe6930 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -232,7 +232,6 @@
     <string name="color_dgreen7">濃い緑</string>
 
     <string name="solver_cube3_description">ほぼ完璧で瞬間的な 2 フェーズ 3x3x3 ソルバー。\n著者: Herbert Kociemba.</string>
-    <string name="solver_3algo_description">初心者向けアルゴリズムの実装。7 フェーズ。約 100 手の長さのソリューションを生成します。\n著者: Leszek Koltunski.</string>
     <string name="solver_pduo2_description">完璧で瞬時のソルバー。\n著者: Leszek Koltunski.</string>
     <string name="solver_ivy_description">完璧で瞬時のソルバー。\n著者: Leszek Koltunski.</string>
     <string name="solver_cu232_description">完璧で瞬時のソルバー。\n著者: Leszek Koltunski.</string>
@@ -245,6 +244,8 @@
     <string name="solver_dino4_description">完璧で瞬時のソルバー。\n著者: Leszek Koltunski.</string>
     <string name="solver_pdia_description">完璧で瞬時のソルバー。\n著者: Leszek Koltunski.</string>
     <string name="solver_cu323_description">完璧で瞬時のソルバー。\n著者: Leszek Koltunski.</string>
+    <string name="solver_3algo_description">初心者向けアルゴリズムの実装。7 フェーズ。約 100 手の長さのソリューションを生成します。\n著者: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">初心者向けアルゴリズムの実装。5 フェーズ。約 70 手の長さのソリューションを生成します。\n著者: Leszek Koltunski.</string>
 
     <string name="creators">クリエイター</string>
 
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index 65560e80..9d1c9a97 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -232,7 +232,6 @@
     <string name="color_dgreen7">진한 녹색</string>
 
     <string name="solver_cube3_description">거의 완벽하고 즉각적인 2상 3x3x3 솔버입니다.\n작가: Herbert Kociemba.</string>
-    <string name="solver_3algo_description">초보자 알고리즘 구현. 7단계. 약 100-이동 길이의 솔루션을 생성합니다.\n작가: Leszek Koltunski.</string>
     <string name="solver_pduo2_description">완벽하고 즉각적인 솔버.\n작가: Leszek Koltunski.</string>
     <string name="solver_ivy_description">완벽하고 즉각적인 솔버.\n작가: Leszek Koltunski.</string>
     <string name="solver_cu232_description">완벽하고 즉각적인 솔버.\n작가: Leszek Koltunski.</string>
@@ -245,6 +244,8 @@
     <string name="solver_dino4_description">완벽하고 즉각적인 솔버.\n작가: Leszek Koltunski.</string>
     <string name="solver_pdia_description">완벽하고 즉각적인 솔버.\n작가: Leszek Koltunski.</string>
     <string name="solver_cu323_description">완벽하고 즉각적인 솔버.\n작가: Leszek Koltunski.</string>
+    <string name="solver_3algo_description">초보자 알고리즘 구현. 7단계. 약 100-이동 길이의 솔루션을 생성합니다.\n작가: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">초보자 알고리즘 구현. 5단계. 약 70-이동 길이의 솔루션을 생성합니다.\n작가: Leszek Koltunski.</string>
 
     <string name="creators">크리에이터</string>
 
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 590fc9af..af04c473 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -232,7 +232,6 @@
     <string name="color_dgreen7">ciemnozielone</string>
 
     <string name="solver_cube3_description">Natychmiastowy, prawie optymalny rozwiązywacz kostki 3x3x3.\nAutor: Herbert Kociemba.</string>
-    <string name="solver_3algo_description">Implementacja algorytmu dla początkujących. 7 faz. Tworzy rozwiązania o długości około 100 ruchów.\nAutor: Leszek Koltunski.</string>
     <string name="solver_pduo2_description">Optymalny, natychmiastowy rozwiązywacz.\nAutor: Leszek Koltunski.</string>
     <string name="solver_ivy_description">Optymalny, natychmiastowy rozwiązywacz.\nAutor: Leszek Koltunski.</string>
     <string name="solver_cu232_description">Optymalny, natychmiastowy rozwiązywacz.\nAutor: Leszek Koltunski.</string>
@@ -245,6 +244,8 @@
     <string name="solver_dino4_description">Optymalny, natychmiastowy rozwiązywacz.\nAutor: Leszek Koltunski.</string>
     <string name="solver_pdia_description">Optymalny, natychmiastowy rozwiązywacz.\nAutor: Leszek Koltunski.</string>
     <string name="solver_cu323_description">Optymalny, natychmiastowy rozwiązywacz.\nAutor: Leszek Koltunski.</string>
+    <string name="solver_3algo_description">Implementacja algorytmu dla początkujących. 7 faz. Tworzy rozwiązania o długości około 100 ruchów.\nAutor: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">Implementacja algorytmu dla początkujących. 5 faz. Tworzy rozwiązania o długości około 70 ruchów.\nAutor: Leszek Koltunski.</string>
 
     <string name="creators">Kreatory</string>
 
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 6c66d60f..1f467988 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -245,6 +245,7 @@
     <string name="solver_dino4_description">Идеальный, мгновенный решатель.\nАвтор: Leszek Koltunski.</string>
     <string name="solver_pdia_description">Идеальный, мгновенный решатель.\nАвтор: Leszek Koltunski.</string>
     <string name="solver_cu323_description">Идеальный, мгновенный решатель.\nАвтор: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">Реализация алгоритма для начинающих. 5 фаз. Выдает решения длиной около 70 ходов.\nАвтор: Leszek Koltunski.</string>
 
     <string name="creators">Создатели</string>
 
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index d38cd3cf..72c3e534 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -238,7 +238,6 @@
     <string name="color_dgreen7">深绿色的</string>
 
     <string name="solver_cube3_description">一个几乎完美的、瞬时的、两相的3x3x3解算器。\n作者: Herbert Kociemba.</string>
-    <string name="solver_3algo_description">初学者算法的实现。7 个阶段。产生大约 100 步长的解决方案。\n作者: Leszek Koltunski.</string>
     <string name="solver_pduo2_description">完美的即时求解器。\n作者: Leszek Koltunski.</string>
     <string name="solver_ivy_description">完美的即时求解器。\n作者: Leszek Koltunski.</string>
     <string name="solver_cu232_description">完美的即时求解器。\n作者: Leszek Koltunski.</string>
@@ -251,6 +250,8 @@
     <string name="solver_dino4_description">完美的即时求解器。\n作者: Leszek Koltunski.</string>
     <string name="solver_pdia_description">完美的即时求解器。\n作者: Leszek Koltunski.</string>
     <string name="solver_cu323_description">完美的即时求解器。\n作者: Leszek Koltunski.</string>
+    <string name="solver_3algo_description">初学者算法的实现。7 个阶段。产生大约 100 步长的解决方案。\n作者: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">初学者算法的实现。5 个阶段。产生大约 70 步长的解决方案。\n作者: Leszek Koltunski.</string>
 
     <string name="creators">创作者</string>
 
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index fab3cb39..c4128a4f 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -232,7 +232,6 @@
     <string name="color_dgreen7">深綠色的</string>
 
     <string name="solver_cube3_description">一個近乎完美的瞬時兩相 3x3x3 求解器。\n作者: Herbert Kociemba.</string>
-    <string name="solver_3algo_description">初學者演算法的實作。 7 個階段。產生大約 100 個動作的長解。\n作者: Leszek Koltunski.</string>
     <string name="solver_pduo2_description">完美的即時求解器。\n作者: Leszek Koltunski.</string>
     <string name="solver_ivy_description">完美的即時求解器。\n作者: Leszek Koltunski.</string>
     <string name="solver_cu232_description">完美的即時求解器。\n作者: Leszek Koltunski.</string>
@@ -245,6 +244,8 @@
     <string name="solver_dino4_description">完美的即時求解器。\n作者: Leszek Koltunski.</string>
     <string name="solver_pdia_description">完美的即時求解器。\n作者: Leszek Koltunski.</string>
     <string name="solver_cu323_description">完美的即時求解器。\n作者: Leszek Koltunski.</string>
+    <string name="solver_3algo_description">初學者演算法的實作。 7 個階段。產生大約 100 個動作的長解。\n作者: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">初學者演算法的實作。 5 個階段。產生大約 70 個動作的長解。\n作者: Leszek Koltunski.</string>
 
     <string name="creators">創作者</string>
 
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index caf5d6df..361914f7 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -137,6 +137,37 @@
     <string name="webview_error" translatable="false">Error Loading WebView</string>
     <string name="opengl_error" translatable="false">Error</string>
     <string name="opengl_error_text" translatable="false">This device does not support OpenGL 3.0</string>
+    <string name="solver_cube3_title" translatable="false">Kociemba Solver</string>
+    <string name="solver_3algo_title" translatable="false">3x3 Beginner</string>
+    <string name="solver_pduo2_title" translatable="false">Pyraminx Duo Solver</string>
+    <string name="solver_pyra3_title" translatable="false">Pyraminx Solver</string>
+    <string name="solver_ivy_title" translatable="false">Ivy Solver</string>
+    <string name="solver_cu232_title" translatable="false">2x2x3 Cuboid Solver</string>
+    <string name="solver_cu323_title" translatable="false">3x3x2 Cuboid Solver</string>
+    <string name="solver_diam2_title" translatable="false">Skewb Diamond Solver</string>
+    <string name="solver_cube2_title" translatable="false">2x2 Cube Solver</string>
+    <string name="solver_skew2_title" translatable="false">Skewb Solver</string>
+    <string name="solver_jing2_title" translatable="false">Jing Pyraminx Solver</string>
+    <string name="solver_dino6_title" translatable="false">6-color Dino Solver</string>
+    <string name="solver_dino4_title" translatable="false">4-color Dino Solver</string>
+    <string name="solver_pdia_title" translatable="false">Pyraminx Diamond Solver</string>
+    <string name="solver_kilo3_title" translatable="false">Kilominx Solver</string>
+
+    <string name="solver_cube3_description">A near-perfect, instantaneous, two-phase 3x3x3 solver.\nAuthor: Herbert Kociemba.</string>
+    <string name="solver_pduo2_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_ivy_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_cu232_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_pyra3_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_diam2_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_cube2_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_skew2_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_jing2_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_dino6_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_dino4_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_pdia_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_cu323_description">A perfect, instantaneous solver.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_3algo_description">Implementation of the beginner algorithm. 7 phases. Produces solutions that are about 100 moves long.\nAuthor: Leszek Koltunski.</string>
+    <string name="solver_kilo3_description">Implementation of the beginner algorithm. 5 phases. Produces solutions that are about 70 moves long.\nAuthor: Leszek Koltunski.</string>
 
     <string name="impossible_position">Impossible</string>
     <string name="solver_generic_not_implemented">Solver for this object not implemented yet!</string>
